]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Bump version to 2.1.5 and build 2760/head
authorEvert Timberg <evert.timberg+github@gmail.com>
Sun, 12 Jun 2016 17:14:56 +0000 (13:14 -0400)
committerEvert Timberg <evert.timberg+github@gmail.com>
Sun, 12 Jun 2016 17:14:56 +0000 (13:14 -0400)
README.md
bower.json
dist/Chart.bundle.js
dist/Chart.bundle.min.js
dist/Chart.js
dist/Chart.min.js
package.json

index c40df39d4a502c6d4ca5a43c3773f349a383bb37..f4ca82e41ceab62d3e3f61439db7fa3cd30bd3e6 100644 (file)
--- a/README.md
+++ b/README.md
@@ -16,7 +16,7 @@ To install via npm / bower:
 npm install chart.js --save
 bower install Chart.js --save
 ```
-CDN: https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.4/Chart.min.js
+CDN: https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.5/Chart.min.js
 
 ## Documentation
 
index 1802ae6e7be19e15a59aee152cd1577a2145edc0..1bb495ea1181979305cd587314d540ef154e09ef 100644 (file)
@@ -1,6 +1,6 @@
 {
   "name": "Chart.js",
-  "version": "2.1.4",
+  "version": "2.1.5",
   "description": "Simple HTML5 Charts using the canvas element",
   "homepage": "https://github.com/chartjs/Chart.js",
   "author": "nnnick",
index ec077f95f4c19f2548ad0d65604dea98aa7521c8..7ecfc55cbf40edd8580e2b0e9ad221ea2895850e 100644 (file)
@@ -1,15 +1,15 @@
 /*!
  * Chart.js
  * http://chartjs.org/
- * Version: 2.1.4
+ * Version: 2.1.5
  *
  * Copyright 2016 Nick Downie
  * Released under the MIT license
  * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md
  */
-(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Chart = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
 /* MIT license */\r
-var colorNames = require('color-name');\r
+var colorNames = require(5);\r
 \r
 module.exports = {\r
    getRgba: getRgba,\r
@@ -230,10 +230,10 @@ for (var name in colorNames) {
    reverseNames[colorNames[name]] = name;\r
 }\r
 
-},{"color-name":5}],2:[function(require,module,exports){
+},{"5":5}],2:[function(require,module,exports){
 /* MIT license */\r
-var convert = require('color-convert');\r
-var string = require('chartjs-color-string');\r
+var convert = require(4);\r
+var string = require(1);\r
 \r
 var Color = function (obj) {\r
        if (obj instanceof Color) {\r
@@ -715,7 +715,7 @@ if (typeof window !== 'undefined') {
 \r
 module.exports = Color;\r
 
-},{"chartjs-color-string":1,"color-convert":4}],3:[function(require,module,exports){
+},{"1":1,"4":4}],3:[function(require,module,exports){
 /* MIT license */
 
 module.exports = {
@@ -1416,7 +1416,7 @@ for (var key in cssKeywords) {
 }
 
 },{}],4:[function(require,module,exports){
-var conversions = require("./conversions");
+var conversions = require(3);
 
 var convert = function() {
    return new Converter();
@@ -1508,7 +1508,7 @@ Converter.prototype.getValues = function(space) {
 });
 
 module.exports = convert;
-},{"./conversions":3}],5:[function(require,module,exports){
+},{"3":3}],5:[function(require,module,exports){
 module.exports = {\r
        "aliceblue": [240, 248, 255],\r
        "antiquewhite": [250, 235, 215],\r
@@ -5701,52 +5701,56 @@ module.exports = {
 
 }));
 },{}],7:[function(require,module,exports){
-var Chart = require('./core/core.js')();\r
-\r
-require('./core/core.helpers')(Chart);\r
-require('./core/core.element')(Chart);\r
-require('./core/core.animation')(Chart);\r
-require('./core/core.controller')(Chart);\r
-require('./core/core.datasetController')(Chart);\r
-require('./core/core.layoutService')(Chart);\r
-require('./core/core.legend')(Chart);\r
-require('./core/core.plugin.js')(Chart);\r
-require('./core/core.scale')(Chart);\r
-require('./core/core.scaleService')(Chart);\r
-require('./core/core.title')(Chart);\r
-require('./core/core.tooltip')(Chart);\r
-\r
-require('./elements/element.arc')(Chart);\r
-require('./elements/element.line')(Chart);\r
-require('./elements/element.point')(Chart);\r
-require('./elements/element.rectangle')(Chart);\r
-\r
-require('./scales/scale.category')(Chart);\r
-require('./scales/scale.linear')(Chart);\r
-require('./scales/scale.logarithmic')(Chart);\r
-require('./scales/scale.radialLinear')(Chart);\r
-require('./scales/scale.time')(Chart);\r
+/**\r
+ * @namespace Chart\r
+ */\r
+var Chart = require(26)();\r
+\r
+require(25)(Chart);\r
+require(24)(Chart);\r
+require(21)(Chart);\r
+require(22)(Chart);\r
+require(23)(Chart);\r
+require(27)(Chart);\r
+require(31)(Chart);\r
+require(29)(Chart);\r
+require(30)(Chart);\r
+require(32)(Chart);\r
+require(28)(Chart);\r
+require(33)(Chart);\r
+\r
+require(34)(Chart);\r
+require(35)(Chart);\r
+require(36)(Chart);\r
+require(37)(Chart);\r
+\r
+require(40)(Chart);\r
+require(38)(Chart);\r
+require(39)(Chart);\r
+require(41)(Chart);\r
+require(42)(Chart);\r
+require(43)(Chart);\r
 \r
 // Controllers must be loaded after elements\r
 // See Chart.core.datasetController.dataElementType\r
-require('./controllers/controller.bar')(Chart);\r
-require('./controllers/controller.bubble')(Chart);\r
-require('./controllers/controller.doughnut')(Chart);\r
-require('./controllers/controller.line')(Chart);\r
-require('./controllers/controller.polarArea')(Chart);\r
-require('./controllers/controller.radar')(Chart);\r
-\r
-require('./charts/Chart.Bar')(Chart);\r
-require('./charts/Chart.Bubble')(Chart);\r
-require('./charts/Chart.Doughnut')(Chart);\r
-require('./charts/Chart.Line')(Chart);\r
-require('./charts/Chart.PolarArea')(Chart);\r
-require('./charts/Chart.Radar')(Chart);\r
-require('./charts/Chart.Scatter')(Chart);\r
+require(15)(Chart);\r
+require(16)(Chart);\r
+require(17)(Chart);\r
+require(18)(Chart);\r
+require(19)(Chart);\r
+require(20)(Chart);\r
+\r
+require(8)(Chart);\r
+require(9)(Chart);\r
+require(10)(Chart);\r
+require(11)(Chart);\r
+require(12)(Chart);\r
+require(13)(Chart);\r
+require(14)(Chart);\r
 \r
 window.Chart = module.exports = Chart;\r
 
-},{"./charts/Chart.Bar":8,"./charts/Chart.Bubble":9,"./charts/Chart.Doughnut":10,"./charts/Chart.Line":11,"./charts/Chart.PolarArea":12,"./charts/Chart.Radar":13,"./charts/Chart.Scatter":14,"./controllers/controller.bar":15,"./controllers/controller.bubble":16,"./controllers/controller.doughnut":17,"./controllers/controller.line":18,"./controllers/controller.polarArea":19,"./controllers/controller.radar":20,"./core/core.animation":21,"./core/core.controller":22,"./core/core.datasetController":23,"./core/core.element":24,"./core/core.helpers":25,"./core/core.js":26,"./core/core.layoutService":27,"./core/core.legend":28,"./core/core.plugin.js":29,"./core/core.scale":30,"./core/core.scaleService":31,"./core/core.title":32,"./core/core.tooltip":33,"./elements/element.arc":34,"./elements/element.line":35,"./elements/element.point":36,"./elements/element.rectangle":37,"./scales/scale.category":38,"./scales/scale.linear":39,"./scales/scale.logarithmic":40,"./scales/scale.radialLinear":41,"./scales/scale.time":42}],8:[function(require,module,exports){
+},{"10":10,"11":11,"12":12,"13":13,"14":14,"15":15,"16":16,"17":17,"18":18,"19":19,"20":20,"21":21,"22":22,"23":23,"24":24,"25":25,"26":26,"27":27,"28":28,"29":29,"30":30,"31":31,"32":32,"33":33,"34":34,"35":35,"36":36,"37":37,"38":38,"39":39,"40":40,"41":41,"42":42,"43":43,"8":8,"9":9}],8:[function(require,module,exports){
 "use strict";\r
 \r
 module.exports = function(Chart) {\r
@@ -5911,50 +5915,53 @@ module.exports = function(Chart) {
 \r
                // Get the number of datasets that display bars. We use this to correctly calculate the bar width\r
                getBarCount: function getBarCount() {\r
+                       var me = this;\r
                        var barCount = 0;\r
-                       helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) {\r
-                               var meta = this.chart.getDatasetMeta(datasetIndex);\r
-                               if (meta.bar && this.chart.isDatasetVisible(datasetIndex)) {\r
+                       helpers.each(me.chart.data.datasets, function(dataset, datasetIndex) {\r
+                               var meta = me.chart.getDatasetMeta(datasetIndex);\r
+                               if (meta.bar && me.chart.isDatasetVisible(datasetIndex)) {\r
                                        ++barCount;\r
                                }\r
-                       }, this);\r
+                       }, me);\r
                        return barCount;\r
                },\r
 \r
                update: function update(reset) {\r
-                       helpers.each(this.getMeta().data, function(rectangle, index) {\r
-                               this.updateElement(rectangle, index, reset);\r
-                       }, this);\r
+                       var me = this;\r
+                       helpers.each(me.getMeta().data, function(rectangle, index) {\r
+                               me.updateElement(rectangle, index, reset);\r
+                       }, me);\r
                },\r
 \r
                updateElement: function updateElement(rectangle, index, reset) {\r
-                       var meta = this.getMeta();\r
-                       var xScale = this.getScaleForId(meta.xAxisID);\r
-                       var yScale = this.getScaleForId(meta.yAxisID);\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var xScale = me.getScaleForId(meta.xAxisID);\r
+                       var yScale = me.getScaleForId(meta.yAxisID);\r
                        var scaleBase = yScale.getBasePixel();\r
-                       var rectangleElementOptions = this.chart.options.elements.rectangle;\r
+                       var rectangleElementOptions = me.chart.options.elements.rectangle;\r
                        var custom = rectangle.custom || {};\r
-                       var dataset = this.getDataset();\r
+                       var dataset = me.getDataset();\r
 \r
                        helpers.extend(rectangle, {\r
                                // Utility\r
                                _xScale: xScale,\r
                                _yScale: yScale,\r
-                               _datasetIndex: this.index,\r
+                               _datasetIndex: me.index,\r
                                _index: index,\r
 \r
                                // Desired view properties\r
                                _model: {\r
-                                       x: this.calculateBarX(index, this.index),\r
-                                       y: reset ? scaleBase : this.calculateBarY(index, this.index),\r
+                                       x: me.calculateBarX(index, me.index),\r
+                                       y: reset ? scaleBase : me.calculateBarY(index, me.index),\r
 \r
                                        // Tooltip\r
-                                       label: this.chart.data.labels[index],\r
+                                       label: me.chart.data.labels[index],\r
                                        datasetLabel: dataset.label,\r
 \r
                                        // Appearance\r
-                                       base: reset ? scaleBase : this.calculateBarBase(this.index, index),\r
-                                       width: this.calculateBarWidth(index),\r
+                                       base: reset ? scaleBase : me.calculateBarBase(me.index, index),\r
+                                       width: me.calculateBarWidth(index),\r
                                        backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor),\r
                                        borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleElementOptions.borderSkipped,\r
                                        borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor),\r
@@ -5965,12 +5972,13 @@ module.exports = function(Chart) {
                },\r
 \r
                calculateBarBase: function(datasetIndex, index) {\r
-                       var meta = this.getMeta();\r
-                       var yScale = this.getScaleForId(meta.yAxisID);\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var yScale = me.getScaleForId(meta.yAxisID);\r
                        var base = 0;\r
 \r
                        if (yScale.options.stacked) {\r
-                               var chart = this.chart;\r
+                               var chart = me.chart;\r
                                var datasets = chart.data.datasets;\r
                                var value = datasets[datasetIndex].data[index];\r
 \r
@@ -5999,9 +6007,10 @@ module.exports = function(Chart) {
                },\r
 \r
                getRuler: function(index) {\r
-                       var meta = this.getMeta();\r
-                       var xScale = this.getScaleForId(meta.xAxisID);\r
-                       var datasetCount = this.getBarCount();\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var xScale = me.getScaleForId(meta.xAxisID);\r
+                       var datasetCount = me.getBarCount();\r
 \r
                        var tickWidth;\r
 \r
@@ -6015,8 +6024,8 @@ module.exports = function(Chart) {
                        var categorySpacing = (tickWidth - (tickWidth * xScale.options.categoryPercentage)) / 2;\r
                        var fullBarWidth = categoryWidth / datasetCount;\r
 \r
-                       if (xScale.ticks.length !== this.chart.data.labels.length) {\r
-                           var perc = xScale.ticks.length / this.chart.data.labels.length;\r
+                       if (xScale.ticks.length !== me.chart.data.labels.length) {\r
+                           var perc = xScale.ticks.length / me.chart.data.labels.length;\r
                            fullBarWidth = fullBarWidth * perc;\r
                        }\r
 \r
@@ -6056,13 +6065,14 @@ module.exports = function(Chart) {
                },\r
 \r
                calculateBarX: function(index, datasetIndex) {\r
-                       var meta = this.getMeta();\r
-                       var xScale = this.getScaleForId(meta.xAxisID);\r
-                       var barIndex = this.getBarIndex(datasetIndex);\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var xScale = me.getScaleForId(meta.xAxisID);\r
+                       var barIndex = me.getBarIndex(datasetIndex);\r
 \r
-                       var ruler = this.getRuler(index);\r
-                       var leftTick = xScale.getPixelForValue(null, index, datasetIndex, this.chart.isCombo);\r
-                       leftTick -= this.chart.isCombo ? (ruler.tickWidth / 2) : 0;\r
+                       var ruler = me.getRuler(index);\r
+                       var leftTick = xScale.getPixelForValue(null, index, datasetIndex, me.chart.isCombo);\r
+                       leftTick -= me.chart.isCombo ? (ruler.tickWidth / 2) : 0;\r
 \r
                        if (xScale.options.stacked) {\r
                                return leftTick + (ruler.categoryWidth / 2) + ruler.categorySpacing;\r
@@ -6077,9 +6087,10 @@ module.exports = function(Chart) {
                },\r
 \r
                calculateBarY: function(index, datasetIndex) {\r
-                       var meta = this.getMeta();\r
-                       var yScale = this.getScaleForId(meta.yAxisID);\r
-                       var value = this.getDataset().data[index];\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var yScale = me.getScaleForId(meta.yAxisID);\r
+                       var value = me.getDataset().data[index];\r
 \r
                        if (yScale.options.stacked) {\r
 \r
@@ -6087,9 +6098,9 @@ module.exports = function(Chart) {
                                        sumNeg = 0;\r
 \r
                                for (var i = 0; i < datasetIndex; i++) {\r
-                                       var ds = this.chart.data.datasets[i];\r
-                                       var dsMeta = this.chart.getDatasetMeta(i);\r
-                                       if (dsMeta.bar && dsMeta.yAxisID === yScale.id && this.chart.isDatasetVisible(i)) {\r
+                                       var ds = me.chart.data.datasets[i];\r
+                                       var dsMeta = me.chart.getDatasetMeta(i);\r
+                                       if (dsMeta.bar && dsMeta.yAxisID === yScale.id && me.chart.isDatasetVisible(i)) {\r
                                                if (ds.data[index] < 0) {\r
                                                        sumNeg += ds.data[index] || 0;\r
                                                } else {\r
@@ -6109,13 +6120,14 @@ module.exports = function(Chart) {
                },\r
 \r
                draw: function(ease) {\r
+                       var me = this;\r
                        var easingDecimal = ease || 1;\r
-                       helpers.each(this.getMeta().data, function(rectangle, index) {\r
-                               var d = this.getDataset().data[index];\r
+                       helpers.each(me.getMeta().data, function(rectangle, index) {\r
+                               var d = me.getDataset().data[index];\r
                                if (d !== null && d !== undefined && !isNaN(d)) {\r
                                        rectangle.transition(easingDecimal).draw();\r
                                }\r
-                       }, this);\r
+                       }, me);\r
                },\r
 \r
                setHoverStyle: function(rectangle) {\r
@@ -6201,33 +6213,34 @@ module.exports = function(Chart) {
 \r
        Chart.controllers.horizontalBar = Chart.controllers.bar.extend({\r
                updateElement: function updateElement(rectangle, index, reset, numBars) {\r
-                       var meta = this.getMeta();\r
-                       var xScale = this.getScaleForId(meta.xAxisID);\r
-                       var yScale = this.getScaleForId(meta.yAxisID);\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var xScale = me.getScaleForId(meta.xAxisID);\r
+                       var yScale = me.getScaleForId(meta.yAxisID);\r
                        var scaleBase = xScale.getBasePixel();\r
                        var custom = rectangle.custom || {};\r
-                       var dataset = this.getDataset();\r
-                       var rectangleElementOptions = this.chart.options.elements.rectangle;\r
+                       var dataset = me.getDataset();\r
+                       var rectangleElementOptions = me.chart.options.elements.rectangle;\r
 \r
                        helpers.extend(rectangle, {\r
                                // Utility\r
                                _xScale: xScale,\r
                                _yScale: yScale,\r
-                               _datasetIndex: this.index,\r
+                               _datasetIndex: me.index,\r
                                _index: index,\r
 \r
                                // Desired view properties\r
                                _model: {\r
-                                       x: reset ? scaleBase : this.calculateBarX(index, this.index),\r
-                                       y: this.calculateBarY(index, this.index),\r
+                                       x: reset ? scaleBase : me.calculateBarX(index, me.index),\r
+                                       y: me.calculateBarY(index, me.index),\r
 \r
                                        // Tooltip\r
-                                       label: this.chart.data.labels[index],\r
+                                       label: me.chart.data.labels[index],\r
                                        datasetLabel: dataset.label,\r
 \r
                                        // Appearance\r
-                                       base: reset ? scaleBase : this.calculateBarBase(this.index, index),\r
-                                       height: this.calculateBarHeight(index),\r
+                                       base: reset ? scaleBase : me.calculateBarBase(me.index, index),\r
+                                       height: me.calculateBarHeight(index),\r
                                        backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor),\r
                                        borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleElementOptions.borderSkipped,\r
                                        borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor),\r
@@ -6235,7 +6248,6 @@ module.exports = function(Chart) {
                                },\r
 \r
                                draw: function () {\r
-\r
                                        var ctx = this._chart.ctx;\r
                                        var vm = this._view;\r
 \r
@@ -6310,27 +6322,28 @@ module.exports = function(Chart) {
                },\r
 \r
                calculateBarBase: function (datasetIndex, index) {\r
-                       var meta = this.getMeta();\r
-                       var xScale = this.getScaleForId(meta.xAxisID);\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var xScale = me.getScaleForId(meta.xAxisID);\r
                        var base = 0;\r
 \r
                        if (xScale.options.stacked) {\r
 \r
-                               var value = this.chart.data.datasets[datasetIndex].data[index];\r
+                               var value = me.chart.data.datasets[datasetIndex].data[index];\r
 \r
                                if (value < 0) {\r
                                        for (var i = 0; i < datasetIndex; i++) {\r
-                                               var negDS = this.chart.data.datasets[i];\r
-                                               var negDSMeta = this.chart.getDatasetMeta(i);\r
-                                               if (negDSMeta.bar && negDSMeta.xAxisID === xScale.id && this.chart.isDatasetVisible(i)) {\r
+                                               var negDS = me.chart.data.datasets[i];\r
+                                               var negDSMeta = me.chart.getDatasetMeta(i);\r
+                                               if (negDSMeta.bar && negDSMeta.xAxisID === xScale.id && me.chart.isDatasetVisible(i)) {\r
                                                        base += negDS.data[index] < 0 ? negDS.data[index] : 0;\r
                                                }\r
                                        }\r
                                } else {\r
                                        for (var j = 0; j < datasetIndex; j++) {\r
-                                               var posDS = this.chart.data.datasets[j];\r
-                                               var posDSMeta = this.chart.getDatasetMeta(j);\r
-                                               if (posDSMeta.bar && posDSMeta.xAxisID === xScale.id && this.chart.isDatasetVisible(j)) {\r
+                                               var posDS = me.chart.data.datasets[j];\r
+                                               var posDSMeta = me.chart.getDatasetMeta(j);\r
+                                               if (posDSMeta.bar && posDSMeta.xAxisID === xScale.id && me.chart.isDatasetVisible(j)) {\r
                                                        base += posDS.data[index] > 0 ? posDS.data[index] : 0;\r
                                                }\r
                                        }\r
@@ -6343,9 +6356,10 @@ module.exports = function(Chart) {
                },\r
 \r
                getRuler: function (index) {\r
-                       var meta = this.getMeta();\r
-                       var yScale = this.getScaleForId(meta.yAxisID);\r
-                       var datasetCount = this.getBarCount();\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var yScale = me.getScaleForId(meta.yAxisID);\r
+                       var datasetCount = me.getBarCount();\r
 \r
                        var tickHeight;\r
                        if (yScale.options.type === 'category') {\r
@@ -6358,8 +6372,8 @@ module.exports = function(Chart) {
                        var categorySpacing = (tickHeight - (tickHeight * yScale.options.categoryPercentage)) / 2;\r
                        var fullBarHeight = categoryHeight / datasetCount;\r
 \r
-                       if (yScale.ticks.length !== this.chart.data.labels.length) {\r
-                               var perc = yScale.ticks.length / this.chart.data.labels.length;\r
+                       if (yScale.ticks.length !== me.chart.data.labels.length) {\r
+                               var perc = yScale.ticks.length / me.chart.data.labels.length;\r
                                fullBarHeight = fullBarHeight * perc;\r
                        }\r
 \r
@@ -6378,15 +6392,17 @@ module.exports = function(Chart) {
                },\r
 \r
                calculateBarHeight: function (index) {\r
-                       var yScale = this.getScaleForId(this.getMeta().yAxisID);\r
-                       var ruler = this.getRuler(index);\r
+                       var me = this;\r
+                       var yScale = me.getScaleForId(me.getMeta().yAxisID);\r
+                       var ruler = me.getRuler(index);\r
                        return yScale.options.stacked ? ruler.categoryHeight : ruler.barHeight;\r
                },\r
 \r
                calculateBarX: function (index, datasetIndex) {\r
-                       var meta = this.getMeta();\r
-                       var xScale = this.getScaleForId(meta.xAxisID);\r
-                       var value = this.getDataset().data[index];\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var xScale = me.getScaleForId(meta.xAxisID);\r
+                       var value = me.getDataset().data[index];\r
 \r
                        if (xScale.options.stacked) {\r
 \r
@@ -6394,9 +6410,9 @@ module.exports = function(Chart) {
                                        sumNeg = 0;\r
 \r
                                for (var i = 0; i < datasetIndex; i++) {\r
-                                       var ds = this.chart.data.datasets[i];\r
-                                       var dsMeta = this.chart.getDatasetMeta(i);\r
-                                       if (dsMeta.bar && dsMeta.xAxisID === xScale.id && this.chart.isDatasetVisible(i)) {\r
+                                       var ds = me.chart.data.datasets[i];\r
+                                       var dsMeta = me.chart.getDatasetMeta(i);\r
+                                       if (dsMeta.bar && dsMeta.xAxisID === xScale.id && me.chart.isDatasetVisible(i)) {\r
                                                if (ds.data[index] < 0) {\r
                                                        sumNeg += ds.data[index] || 0;\r
                                                } else {\r
@@ -6416,13 +6432,14 @@ module.exports = function(Chart) {
                },\r
 \r
                calculateBarY: function (index, datasetIndex) {\r
-                       var meta = this.getMeta();\r
-                       var yScale = this.getScaleForId(meta.yAxisID);\r
-                       var barIndex = this.getBarIndex(datasetIndex);\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var yScale = me.getScaleForId(meta.yAxisID);\r
+                       var barIndex = me.getBarIndex(datasetIndex);\r
 \r
-                       var ruler = this.getRuler(index);\r
-                       var topTick = yScale.getPixelForValue(null, index, datasetIndex, this.chart.isCombo);\r
-                       topTick -= this.chart.isCombo ? (ruler.tickHeight / 2) : 0;\r
+                       var ruler = me.getRuler(index);\r
+                       var topTick = yScale.getPixelForValue(null, index, datasetIndex, me.chart.isCombo);\r
+                       topTick -= me.chart.isCombo ? (ruler.tickHeight / 2) : 0;\r
 \r
                        if (yScale.options.stacked) {\r
                                return topTick + (ruler.categoryHeight / 2) + ruler.categorySpacing;\r
@@ -6483,47 +6500,50 @@ module.exports = function(Chart) {
                dataElementType: Chart.elements.Point,\r
 \r
                update: function update(reset) {\r
-                       var meta = this.getMeta();\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
                        var points = meta.data;\r
 \r
                        // Update Points\r
                        helpers.each(points, function(point, index) {\r
-                               this.updateElement(point, index, reset);\r
-                       }, this);\r
+                               me.updateElement(point, index, reset);\r
+                       });\r
                },\r
 \r
                updateElement: function(point, index, reset) {\r
-                       var meta = this.getMeta();\r
-                       var xScale = this.getScaleForId(meta.xAxisID);\r
-                       var yScale = this.getScaleForId(meta.yAxisID);\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var xScale = me.getScaleForId(meta.xAxisID);\r
+                       var yScale = me.getScaleForId(meta.yAxisID);\r
 \r
                        var custom = point.custom || {};\r
-                       var dataset = this.getDataset();\r
+                       var dataset = me.getDataset();\r
                        var data = dataset.data[index];\r
-                       var pointElementOptions = this.chart.options.elements.point;\r
+                       var pointElementOptions = me.chart.options.elements.point;\r
+                       var dsIndex = me.index;\r
 \r
                        helpers.extend(point, {\r
                                // Utility\r
                                _xScale: xScale,\r
                                _yScale: yScale,\r
-                               _datasetIndex: this.index,\r
+                               _datasetIndex: dsIndex,\r
                                _index: index,\r
 \r
                                // Desired view properties\r
                                _model: {\r
-                                       x: reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(data, index, this.index, this.chart.isCombo),\r
-                                       y: reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, this.index),\r
+                                       x: reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(data, index, dsIndex, me.chart.isCombo),\r
+                                       y: reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex),\r
                                        // Appearance\r
-                                       radius: reset ? 0 : custom.radius ? custom.radius : this.getRadius(data),\r
-                                       backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, pointElementOptions.backgroundColor),\r
-                                       borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, pointElementOptions.borderColor),\r
-                                       borderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, pointElementOptions.borderWidth),\r
+                                       radius: reset ? 0 : custom.radius ? custom.radius : me.getRadius(data),\r
 \r
                                        // Tooltip\r
                                        hitRadius: custom.hitRadius ? custom.hitRadius : helpers.getValueAtIndexOrDefault(dataset.hitRadius, index, pointElementOptions.hitRadius)\r
                                }\r
                        });\r
 \r
+                       // Trick to reset the styles of the point\r
+                       Chart.DatasetController.prototype.removeHoverStyle.call(me, point, pointElementOptions);\r
+\r
                        var model = point._model;\r
                        model.skip = custom.skip ? custom.skip : (isNaN(model.x) || isNaN(model.y));\r
 \r
@@ -6535,29 +6555,26 @@ module.exports = function(Chart) {
                },\r
 \r
                setHoverStyle: function(point) {\r
-                       // Point\r
-                       var dataset = this.chart.data.datasets[point._datasetIndex];\r
+                       var me = this;\r
+                       Chart.DatasetController.prototype.setHoverStyle.call(me, point);\r
+\r
+                       // Radius\r
+                       var dataset = me.chart.data.datasets[point._datasetIndex];\r
                        var index = point._index;\r
                        var custom = point.custom || {};\r
                        var model = point._model;\r
-\r
-                       model.radius = custom.hoverRadius ? custom.hoverRadius : (helpers.getValueAtIndexOrDefault(dataset.hoverRadius, index, this.chart.options.elements.point.hoverRadius)) + this.getRadius(this.getDataset().data[point._index]);\r
-                       model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\r
-                       model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor));\r
-                       model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\r
+                       model.radius = custom.hoverRadius ? custom.hoverRadius : (helpers.getValueAtIndexOrDefault(dataset.hoverRadius, index, me.chart.options.elements.point.hoverRadius)) + me.getRadius(dataset.data[index]);\r
                },\r
 \r
                removeHoverStyle: function(point) {\r
-                       var dataset = this.chart.data.datasets[point._datasetIndex];\r
-                       var index = point._index;\r
+                       var me = this;\r
+                       Chart.DatasetController.prototype.removeHoverStyle.call(me, point, me.chart.options.elements.point);\r
+\r
+                       var dataVal = me.chart.data.datasets[point._datasetIndex].data[point._index];\r
                        var custom = point.custom || {};\r
                        var model = point._model;\r
-                       var pointElementOptions = this.chart.options.elements.point;\r
 \r
-                       model.radius = custom.radius ? custom.radius : this.getRadius(dataset.data[point._index]);\r
-                       model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, pointElementOptions.backgroundColor);\r
-                       model.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, pointElementOptions.borderColor);\r
-                       model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, pointElementOptions.borderWidth);\r
+                       model.radius = custom.radius ? custom.radius : me.getRadius(dataVal);\r
                }\r
        });\r
 };\r
@@ -6697,8 +6714,8 @@ module.exports = function(Chart) {
                },\r
 \r
                update: function update(reset) {\r
-                       var _this = this;\r
-                       var chart = _this.chart,\r
+                       var me = this;\r
+                       var chart = me.chart,\r
                                chartArea = chart.chartArea,\r
                                opts = chart.options,\r
                                arcOpts = opts.elements.arc,\r
@@ -6709,7 +6726,7 @@ module.exports = function(Chart) {
                                        x: 0,\r
                                        y: 0\r
                                },\r
-                               meta = _this.getMeta(),\r
+                               meta = me.getMeta(),\r
                                cutoutPercentage = opts.cutoutPercentage,\r
                                circumference = opts.circumference;\r
 \r
@@ -6738,19 +6755,19 @@ module.exports = function(Chart) {
                        chart.offsetX = offset.x * chart.outerRadius;\r
                        chart.offsetY = offset.y * chart.outerRadius;\r
 \r
-                       meta.total = _this.calculateTotal();\r
+                       meta.total = me.calculateTotal();\r
 \r
-                       _this.outerRadius = chart.outerRadius - (chart.radiusLength * _this.getRingIndex(_this.index));\r
-                       _this.innerRadius = _this.outerRadius - chart.radiusLength;\r
+                       me.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index));\r
+                       me.innerRadius = me.outerRadius - chart.radiusLength;\r
 \r
                        helpers.each(meta.data, function(arc, index) {\r
-                               _this.updateElement(arc, index, reset);\r
+                               me.updateElement(arc, index, reset);\r
                        });\r
                },\r
 \r
                updateElement: function(arc, index, reset) {\r
-                       var _this = this;\r
-                       var chart = _this.chart,\r
+                       var me = this;\r
+                       var chart = me.chart,\r
                                chartArea = chart.chartArea,\r
                                opts = chart.options,\r
                                animationOpts = opts.animation,\r
@@ -6759,16 +6776,16 @@ module.exports = function(Chart) {
                                centerY = (chartArea.top + chartArea.bottom) / 2,\r
                                startAngle = opts.rotation, // non reset case handled later\r
                                endAngle = opts.rotation, // non reset case handled later\r
-                               dataset = _this.getDataset(),\r
-                               circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : _this.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)),\r
-                               innerRadius = reset && animationOpts.animateScale ? 0 : _this.innerRadius,\r
-                               outerRadius = reset && animationOpts.animateScale ? 0 : _this.outerRadius,\r
+                               dataset = me.getDataset(),\r
+                               circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)),\r
+                               innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius,\r
+                               outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius,\r
                                custom = arc.custom || {},\r
                                valueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\r
 \r
                        helpers.extend(arc, {\r
                                // Utility\r
-                               _datasetIndex: _this.index,\r
+                               _datasetIndex: me.index,\r
                                _index: index,\r
 \r
                                // Desired view properties\r
@@ -6785,17 +6802,15 @@ module.exports = function(Chart) {
                        });\r
 \r
                        var model = arc._model;\r
-                       model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(dataset.backgroundColor, index, arcOpts.backgroundColor);\r
-                       model.hoverBackgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, arcOpts.hoverBackgroundColor);\r
-                       model.borderWidth = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(dataset.borderWidth, index, arcOpts.borderWidth);\r
-                       model.borderColor = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(dataset.borderColor, index, arcOpts.borderColor);\r
+                       // Resets the visual styles\r
+                       this.removeHoverStyle(arc);\r
 \r
                        // Set correct angles if not resetting\r
                        if (!reset || !animationOpts.animateRotate) {\r
                                if (index === 0) {\r
                                        model.startAngle = opts.rotation;\r
                                } else {\r
-                                       model.startAngle = _this.getMeta().data[index - 1]._model.endAngle;\r
+                                       model.startAngle = me.getMeta().data[index - 1]._model.endAngle;\r
                                }\r
 \r
                                model.endAngle = model.startAngle + model.circumference;\r
@@ -6861,6 +6876,10 @@ module.exports = function(Chart) {
                }\r
        };\r
 \r
+       function lineEnabled(dataset, options) {\r
+               return helpers.getValueOrDefault(dataset.showLine, options.showLines);\r
+       }\r
+\r
        Chart.controllers.line = Chart.DatasetController.extend({\r
 \r
                datasetElementType: Chart.elements.Line,\r
@@ -6870,11 +6889,12 @@ module.exports = function(Chart) {
                addElementAndReset: function(index) {\r
                        var me = this;\r
                        var options = me.chart.options;\r
+                       var meta = me.getMeta();\r
 \r
                        Chart.DatasetController.prototype.addElementAndReset.call(me, index);\r
 \r
                        // Make sure bezier control points are updated\r
-                       if (options.showLines && options.elements.line.tension !== 0) {\r
+                       if (lineEnabled(me.getDataset(), options) && meta.dataset._model.tension !== 0) {\r
                                me.updateBezierControlPoints();\r
                        }\r
                },\r
@@ -6887,11 +6907,12 @@ module.exports = function(Chart) {
                        var options = me.chart.options;\r
                        var lineElementOptions = options.elements.line;\r
                        var scale = me.getScaleForId(meta.yAxisID);\r
-                       var i, ilen, dataset, custom;\r
+                       var i, ilen, custom;\r
+                       var dataset = me.getDataset();\r
+                       var showLine = lineEnabled(dataset, options);\r
 \r
                        // Update Line\r
-                       if (options.showLines) {\r
-                               dataset = me.getDataset();\r
+                       if (showLine) {\r
                                custom = line.custom || {};\r
 \r
                                // Compatibility: If the properties are defined with only the old name, use those values\r
@@ -6907,6 +6928,10 @@ module.exports = function(Chart) {
                                // Model\r
                                line._model = {\r
                                        // Appearance\r
+                                       // The default behavior of lines is to break at null values, according\r
+                                       // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\r
+                                       // This option gives linse the ability to span gaps\r
+                                       spanGaps: dataset.spanGaps ? dataset.spanGaps : false,\r
                                        tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension),\r
                                        backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\r
                                        borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\r
@@ -6930,9 +6955,14 @@ module.exports = function(Chart) {
                                me.updateElement(points[i], i, reset);\r
                        }\r
 \r
-                       if (options.showLines && lineElementOptions.tension !== 0) {\r
+                       if (showLine && line._model.tension !== 0) {\r
                                me.updateBezierControlPoints();\r
                        }\r
+\r
+                       // Now pivot the point for animation\r
+                       for (i=0, ilen=points.length; i<ilen; ++i) {\r
+                               points[i].pivot();\r
+                       }\r
                },\r
 \r
                getPointBackgroundColor: function(point, index) {\r
@@ -7077,19 +7107,16 @@ module.exports = function(Chart) {
                                        meta.dataset._model.tension\r
                                );\r
 \r
-                               // Prevent the bezier going outside of the bounds of the graph\r
-                               model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, area.right), area.left);\r
-                               model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, area.bottom), area.top);\r
-                               model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, area.right), area.left);\r
-                               model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, area.bottom), area.top);\r
-\r
-                               // Now pivot the point for animation\r
-                               point.pivot();\r
+                               model.controlPointPreviousX = controlPoints.previous.x;\r
+                               model.controlPointPreviousY = controlPoints.previous.y;\r
+                               model.controlPointNextX = controlPoints.next.x;\r
+                               model.controlPointNextY = controlPoints.next.y;\r
                        }\r
                },\r
 \r
                draw: function(ease) {\r
-                       var meta = this.getMeta();\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
                        var points = meta.data || [];\r
                        var easingDecimal = ease || 1;\r
                        var i, ilen;\r
@@ -7100,7 +7127,7 @@ module.exports = function(Chart) {
                        }\r
 \r
                        // Transition and Draw the line\r
-                       if (this.chart.options.showLines) {\r
+                       if (lineEnabled(me.getDataset(), me.chart.options)) {\r
                                meta.dataset.transition(easingDecimal).draw();\r
                        }\r
 \r
@@ -7252,10 +7279,10 @@ module.exports = function(Chart) {
                linkScales: helpers.noop,\r
 \r
                update: function update(reset) {\r
-                       var _this = this;\r
-                       var chart = _this.chart;\r
+                       var me = this;\r
+                       var chart = me.chart;\r
                        var chartArea = chart.chartArea;\r
-                       var meta = this.getMeta();\r
+                       var meta = me.getMeta();\r
                        var opts = chart.options;\r
                        var arcOpts = opts.elements.arc;\r
                        var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\r
@@ -7263,21 +7290,21 @@ module.exports = function(Chart) {
                        chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\r
                        chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\r
 \r
-                       _this.outerRadius = chart.outerRadius - (chart.radiusLength * _this.index);\r
-                       _this.innerRadius = _this.outerRadius - chart.radiusLength;\r
+                       me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\r
+                       me.innerRadius = me.outerRadius - chart.radiusLength;\r
 \r
-                       meta.count = _this.countVisibleElements();\r
+                       meta.count = me.countVisibleElements();\r
 \r
                        helpers.each(meta.data, function(arc, index) {\r
-                               _this.updateElement(arc, index, reset);\r
+                               me.updateElement(arc, index, reset);\r
                        });\r
                },\r
 \r
                updateElement: function(arc, index, reset) {\r
-                       var _this = this;\r
-                       var chart = _this.chart;\r
+                       var me = this;\r
+                       var chart = me.chart;\r
                        var chartArea = chart.chartArea;\r
-                       var dataset = _this.getDataset();\r
+                       var dataset = me.getDataset();\r
                        var opts = chart.options;\r
                        var animationOpts = opts.animation;\r
                        var arcOpts = opts.elements.arc;\r
@@ -7286,62 +7313,48 @@ module.exports = function(Chart) {
                        var getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\r
                        var labels = chart.data.labels;\r
 \r
-                       var circumference = _this.calculateCircumference(dataset.data[index]);\r
+                       var circumference = me.calculateCircumference(dataset.data[index]);\r
                        var centerX = (chartArea.left + chartArea.right) / 2;\r
                        var centerY = (chartArea.top + chartArea.bottom) / 2;\r
 \r
                        // If there is NaN data before us, we need to calculate the starting angle correctly.\r
                        // We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data\r
                        var visibleCount = 0;\r
-                       var meta = _this.getMeta();\r
+                       var meta = me.getMeta();\r
                        for (var i = 0; i < index; ++i) {\r
                                if (!isNaN(dataset.data[i]) && !meta.data[i].hidden) {\r
                                        ++visibleCount;\r
                                }\r
                        }\r
 \r
-                       var distance = arc.hidden? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\r
-                       var startAngle = (-0.5 * Math.PI) + (circumference * visibleCount);\r
-                       var endAngle = startAngle + (arc.hidden? 0 : circumference);\r
-\r
-                       var resetModel = {\r
-                               x: centerX,\r
-                               y: centerY,\r
-                               innerRadius: 0,\r
-                               outerRadius: animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]),\r
-                               startAngle: animationOpts.animateRotate ? Math.PI * -0.5 : startAngle,\r
-                               endAngle: animationOpts.animateRotate ? Math.PI * -0.5 : endAngle,\r
+                       var negHalfPI = -0.5 * Math.PI;\r
+                       var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\r
+                       var startAngle = (negHalfPI) + (circumference * visibleCount);\r
+                       var endAngle = startAngle + (arc.hidden ? 0 : circumference);\r
 \r
-                               backgroundColor: custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(dataset.backgroundColor, index, arcOpts.backgroundColor),\r
-                               borderWidth: custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(dataset.borderWidth, index, arcOpts.borderWidth),\r
-                               borderColor: custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(dataset.borderColor, index, arcOpts.borderColor),\r
-\r
-                               label: getValueAtIndexOrDefault(labels, index, labels[index])\r
-                       };\r
+                       var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\r
 \r
                        helpers.extend(arc, {\r
                                // Utility\r
-                               _datasetIndex: _this.index,\r
+                               _datasetIndex: me.index,\r
                                _index: index,\r
                                _scale: scale,\r
 \r
                                // Desired view properties\r
-                               _model: reset ? resetModel : {\r
+                               _model: {\r
                                        x: centerX,\r
                                        y: centerY,\r
                                        innerRadius: 0,\r
-                                       outerRadius: distance,\r
-                                       startAngle: startAngle,\r
-                                       endAngle: endAngle,\r
-\r
-                                       backgroundColor: custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(dataset.backgroundColor, index, arcOpts.backgroundColor),\r
-                                       borderWidth: custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(dataset.borderWidth, index, arcOpts.borderWidth),\r
-                                       borderColor: custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(dataset.borderColor, index, arcOpts.borderColor),\r
-\r
+                                       outerRadius: reset ? resetRadius : distance,\r
+                                       startAngle: reset && animationOpts.animateRotate ? negHalfPI : startAngle,\r
+                                       endAngle: reset && animationOpts.animateRotate ? negHalfPI : endAngle,\r
                                        label: getValueAtIndexOrDefault(labels, index, labels[index])\r
                                }\r
                        });\r
 \r
+                       // Apply border and fill style\r
+                       me.removeHoverStyle(arc);\r
+\r
                        arc.pivot();\r
                },\r
 \r
@@ -7408,13 +7421,14 @@ module.exports = function(Chart) {
                },\r
 \r
                update: function update(reset) {\r
-                       var meta = this.getMeta();\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
                        var line = meta.dataset;\r
                        var points = meta.data;\r
                        var custom = line.custom || {};\r
-                       var dataset = this.getDataset();\r
-                       var lineElementOptions = this.chart.options.elements.line;\r
-                       var scale = this.chart.scale;\r
+                       var dataset = me.getDataset();\r
+                       var lineElementOptions = me.chart.options.elements.line;\r
+                       var scale = me.chart.scale;\r
 \r
                        // Compatibility: If the properties are defined with only the old name, use those values\r
                        if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\r
@@ -7423,7 +7437,7 @@ module.exports = function(Chart) {
 \r
                        helpers.extend(meta.dataset, {\r
                                // Utility\r
-                               _datasetIndex: this.index,\r
+                               _datasetIndex: me.index,\r
                                // Data\r
                                _children: points,\r
                                _loop: true,\r
@@ -7451,23 +7465,24 @@ module.exports = function(Chart) {
 \r
                        // Update Points\r
                        helpers.each(points, function(point, index) {\r
-                               this.updateElement(point, index, reset);\r
-                       }, this);\r
+                               me.updateElement(point, index, reset);\r
+                       }, me);\r
 \r
 \r
                        // Update bezier control points\r
-                       this.updateBezierControlPoints();\r
+                       me.updateBezierControlPoints();\r
                },\r
                updateElement: function(point, index, reset) {\r
+                       var me = this;\r
                        var custom = point.custom || {};\r
-                       var dataset = this.getDataset();\r
-                       var scale = this.chart.scale;\r
-                       var pointElementOptions = this.chart.options.elements.point;\r
+                       var dataset = me.getDataset();\r
+                       var scale = me.chart.scale;\r
+                       var pointElementOptions = me.chart.options.elements.point;\r
                        var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\r
 \r
                        helpers.extend(point, {\r
                                // Utility\r
-                               _datasetIndex: this.index,\r
+                               _datasetIndex: me.index,\r
                                _index: index,\r
                                _scale: scale,\r
 \r
@@ -7477,7 +7492,7 @@ module.exports = function(Chart) {
                                        y: reset ? scale.yCenter : pointPosition.y,\r
 \r
                                        // Appearance\r
-                                       tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.tension, this.chart.options.elements.line.tension),\r
+                                       tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.tension, me.chart.options.elements.line.tension),\r
                                        radius: custom.radius ? custom.radius : helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),\r
                                        backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),\r
                                        borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),\r
@@ -7513,7 +7528,7 @@ module.exports = function(Chart) {
 \r
                                // Now pivot the point for animation\r
                                point.pivot();\r
-                       }, this);\r
+                       });\r
                },\r
 \r
                draw: function(ease) {\r
@@ -7593,27 +7608,28 @@ module.exports = function(Chart) {
                dropFrames: 0,\r
                request: null,\r
                addAnimation: function(chartInstance, animationObject, duration, lazy) {\r
+                       var me = this;\r
 \r
                        if (!lazy) {\r
                                chartInstance.animating = true;\r
                        }\r
 \r
-                       for (var index = 0; index < this.animations.length; ++index) {\r
-                               if (this.animations[index].chartInstance === chartInstance) {\r
+                       for (var index = 0; index < me.animations.length; ++index) {\r
+                               if (me.animations[index].chartInstance === chartInstance) {\r
                                        // replacing an in progress animation\r
-                                       this.animations[index].animationObject = animationObject;\r
+                                       me.animations[index].animationObject = animationObject;\r
                                        return;\r
                                }\r
                        }\r
 \r
-                       this.animations.push({\r
+                       me.animations.push({\r
                                chartInstance: chartInstance,\r
                                animationObject: animationObject\r
                        });\r
 \r
                        // If there are no animations queued, manually kickstart a digest, for lack of a better word\r
-                       if (this.animations.length === 1) {\r
-                               this.requestAnimationFrame();\r
+                       if (me.animations.length === 1) {\r
+                               me.requestAnimationFrame();\r
                        }\r
                },\r
                // Cancel the animation for a given chart instance\r
@@ -7640,54 +7656,55 @@ module.exports = function(Chart) {
                        }\r
                },\r
                startDigest: function() {\r
+                       var me = this;\r
 \r
                        var startTime = Date.now();\r
                        var framesToDrop = 0;\r
 \r
-                       if (this.dropFrames > 1) {\r
-                               framesToDrop = Math.floor(this.dropFrames);\r
-                               this.dropFrames = this.dropFrames % 1;\r
+                       if (me.dropFrames > 1) {\r
+                               framesToDrop = Math.floor(me.dropFrames);\r
+                               me.dropFrames = me.dropFrames % 1;\r
                        }\r
 \r
                        var i = 0;\r
-                       while (i < this.animations.length) {\r
-                               if (this.animations[i].animationObject.currentStep === null) {\r
-                                       this.animations[i].animationObject.currentStep = 0;\r
+                       while (i < me.animations.length) {\r
+                               if (me.animations[i].animationObject.currentStep === null) {\r
+                                       me.animations[i].animationObject.currentStep = 0;\r
                                }\r
 \r
-                               this.animations[i].animationObject.currentStep += 1 + framesToDrop;\r
+                               me.animations[i].animationObject.currentStep += 1 + framesToDrop;\r
 \r
-                               if (this.animations[i].animationObject.currentStep > this.animations[i].animationObject.numSteps) {\r
-                                       this.animations[i].animationObject.currentStep = this.animations[i].animationObject.numSteps;\r
+                               if (me.animations[i].animationObject.currentStep > me.animations[i].animationObject.numSteps) {\r
+                                       me.animations[i].animationObject.currentStep = me.animations[i].animationObject.numSteps;\r
                                }\r
 \r
-                               this.animations[i].animationObject.render(this.animations[i].chartInstance, this.animations[i].animationObject);\r
-                               if (this.animations[i].animationObject.onAnimationProgress && this.animations[i].animationObject.onAnimationProgress.call) {\r
-                                       this.animations[i].animationObject.onAnimationProgress.call(this.animations[i].chartInstance, this.animations[i]);\r
+                               me.animations[i].animationObject.render(me.animations[i].chartInstance, me.animations[i].animationObject);\r
+                               if (me.animations[i].animationObject.onAnimationProgress && me.animations[i].animationObject.onAnimationProgress.call) {\r
+                                       me.animations[i].animationObject.onAnimationProgress.call(me.animations[i].chartInstance, me.animations[i]);\r
                                }\r
 \r
-                               if (this.animations[i].animationObject.currentStep === this.animations[i].animationObject.numSteps) {\r
-                                       if (this.animations[i].animationObject.onAnimationComplete && this.animations[i].animationObject.onAnimationComplete.call) {\r
-                                               this.animations[i].animationObject.onAnimationComplete.call(this.animations[i].chartInstance, this.animations[i]);\r
+                               if (me.animations[i].animationObject.currentStep === me.animations[i].animationObject.numSteps) {\r
+                                       if (me.animations[i].animationObject.onAnimationComplete && me.animations[i].animationObject.onAnimationComplete.call) {\r
+                                               me.animations[i].animationObject.onAnimationComplete.call(me.animations[i].chartInstance, me.animations[i]);\r
                                        }\r
 \r
                                        // executed the last frame. Remove the animation.\r
-                                       this.animations[i].chartInstance.animating = false;\r
+                                       me.animations[i].chartInstance.animating = false;\r
 \r
-                                       this.animations.splice(i, 1);\r
+                                       me.animations.splice(i, 1);\r
                                } else {\r
                                        ++i;\r
                                }\r
                        }\r
 \r
                        var endTime = Date.now();\r
-                       var dropFrames = (endTime - startTime) / this.frameDuration;\r
+                       var dropFrames = (endTime - startTime) / me.frameDuration;\r
 \r
-                       this.dropFrames += dropFrames;\r
+                       me.dropFrames += dropFrames;\r
 \r
                        // Do we have more stuff to animate?\r
-                       if (this.animations.length > 0) {\r
-                               this.requestAnimationFrame();\r
+                       if (me.animations.length > 0) {\r
+                               me.requestAnimationFrame();\r
                        }\r
                }\r
        };\r
@@ -7708,7 +7725,10 @@ module.exports = function(Chart) {
        // Controllers available for dataset visualization eg. bar, line, slice, etc.\r
        Chart.controllers = {};\r
 \r
-       // The main controller of a chart\r
+       /**\r
+        * @class Chart.Controller\r
+        * The main controller of a chart.\r
+        */\r
        Chart.Controller = function(instance) {\r
 \r
                this.chart = instance;\r
@@ -7735,29 +7755,29 @@ module.exports = function(Chart) {
                return this;\r
        };\r
 \r
-       helpers.extend(Chart.Controller.prototype, {\r
+       helpers.extend(Chart.Controller.prototype, /** @lends Chart.Controller */ {\r
 \r
                initialize: function initialize() {\r
+                       var me = this;\r
                        // Before init plugin notification\r
-                       Chart.pluginService.notifyPlugins('beforeInit', [this]);\r
+                       Chart.plugins.notify('beforeInit', [me]);\r
 \r
-                       this.bindEvents();\r
+                       me.bindEvents();\r
 \r
                        // Make sure controllers are built first so that each dataset is bound to an axis before the scales\r
                        // are built\r
-                       this.ensureScalesHaveIDs();\r
-                       this.buildOrUpdateControllers();\r
-                       this.buildScales();\r
-                       this.buildSurroundingItems();\r
-                       this.updateLayout();\r
-                       this.resetElements();\r
-                       this.initToolTip();\r
-                       this.update();\r
+                       me.ensureScalesHaveIDs();\r
+                       me.buildOrUpdateControllers();\r
+                       me.buildScales();\r
+                       me.updateLayout();\r
+                       me.resetElements();\r
+                       me.initToolTip();\r
+                       me.update();\r
 \r
                        // After init plugin notification\r
-                       Chart.pluginService.notifyPlugins('afterInit', [this]);\r
+                       Chart.plugins.notify('afterInit', [me]);\r
 \r
-                       return this;\r
+                       return me;\r
                },\r
 \r
                clear: function clear() {\r
@@ -7772,26 +7792,39 @@ module.exports = function(Chart) {
                },\r
 \r
                resize: function resize(silent) {\r
-                       var canvas = this.chart.canvas;\r
-                       var newWidth = helpers.getMaximumWidth(this.chart.canvas);\r
-                       var newHeight = (this.options.maintainAspectRatio && isNaN(this.chart.aspectRatio) === false && isFinite(this.chart.aspectRatio) && this.chart.aspectRatio !== 0) ? newWidth / this.chart.aspectRatio : helpers.getMaximumHeight(this.chart.canvas);\r
+                       var me = this;\r
+                       var chart = me.chart;\r
+                       var canvas = chart.canvas;\r
+                       var newWidth = helpers.getMaximumWidth(canvas);\r
+                       var aspectRatio = chart.aspectRatio;\r
+                       var newHeight = (me.options.maintainAspectRatio && isNaN(aspectRatio) === false && isFinite(aspectRatio) && aspectRatio !== 0) ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas);\r
+\r
+                       var sizeChanged = chart.width !== newWidth || chart.height !== newHeight;\r
 \r
-                       var sizeChanged = this.chart.width !== newWidth || this.chart.height !== newHeight;\r
+                       if (!sizeChanged) {\r
+                               return me;\r
+                       }\r
+\r
+                       canvas.width = chart.width = newWidth;\r
+                       canvas.height = chart.height = newHeight;\r
 \r
-                       if (!sizeChanged)\r
-                               return this;\r
+                       helpers.retinaScale(chart);\r
 \r
-                       canvas.width = this.chart.width = newWidth;\r
-                       canvas.height = this.chart.height = newHeight;\r
+                       // Notify any plugins about the resize\r
+                       var newSize = { width: newWidth, height: newHeight };\r
+                       Chart.plugins.notify('resize', [me, newSize]);\r
 \r
-                       helpers.retinaScale(this.chart);\r
+                       // Notify of resize\r
+                       if (me.options.onResize) {\r
+                               me.options.onResize(me, newSize);\r
+                       }\r
 \r
                        if (!silent) {\r
-                               this.stop();\r
-                               this.update(this.options.responsiveAnimationDuration);\r
+                               me.stop();\r
+                               me.update(me.options.responsiveAnimationDuration);\r
                        }\r
 \r
-                       return this;\r
+                       return me;\r
                },\r
 \r
                ensureScalesHaveIDs: function ensureScalesHaveIDs() {\r
@@ -7861,40 +7894,19 @@ module.exports = function(Chart) {
                        Chart.scaleService.addScalesToLayout(this);\r
                },\r
 \r
-               buildSurroundingItems: function() {\r
-                       if (this.options.title) {\r
-                               this.titleBlock = new Chart.Title({\r
-                                       ctx: this.chart.ctx,\r
-                                       options: this.options.title,\r
-                                       chart: this\r
-                               });\r
-\r
-                               Chart.layoutService.addBox(this, this.titleBlock);\r
-                       }\r
-\r
-                       if (this.options.legend) {\r
-                               this.legend = new Chart.Legend({\r
-                                       ctx: this.chart.ctx,\r
-                                       options: this.options.legend,\r
-                                       chart: this\r
-                               });\r
-\r
-                               Chart.layoutService.addBox(this, this.legend);\r
-                       }\r
-               },\r
-\r
                updateLayout: function() {\r
                        Chart.layoutService.update(this, this.chart.width, this.chart.height);\r
                },\r
 \r
                buildOrUpdateControllers: function buildOrUpdateControllers() {\r
+                       var me = this;\r
                        var types = [];\r
                        var newControllers = [];\r
 \r
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {\r
-                               var meta = this.getDatasetMeta(datasetIndex);\r
+                       helpers.each(me.data.datasets, function(dataset, datasetIndex) {\r
+                               var meta = me.getDatasetMeta(datasetIndex);\r
                                if (!meta.type) {\r
-                                       meta.type = dataset.type || this.config.type;\r
+                                       meta.type = dataset.type || me.config.type;\r
                                }\r
 \r
                                types.push(meta.type);\r
@@ -7902,15 +7914,15 @@ module.exports = function(Chart) {
                                if (meta.controller) {\r
                                        meta.controller.updateIndex(datasetIndex);\r
                                } else {\r
-                                       meta.controller = new Chart.controllers[meta.type](this, datasetIndex);\r
+                                       meta.controller = new Chart.controllers[meta.type](me, datasetIndex);\r
                                        newControllers.push(meta.controller);\r
                                }\r
-                       }, this);\r
+                       }, me);\r
 \r
                        if (types.length > 1) {\r
                                for (var i = 1; i < types.length; i++) {\r
                                        if (types[i] !== types[i - 1]) {\r
-                                               this.isCombo = true;\r
+                                               me.isCombo = true;\r
                                                break;\r
                                        }\r
                                }\r
@@ -7920,50 +7932,91 @@ module.exports = function(Chart) {
                },\r
 \r
                resetElements: function resetElements() {\r
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {\r
-                               this.getDatasetMeta(datasetIndex).controller.reset();\r
-                       }, this);\r
+                       var me = this;\r
+                       helpers.each(me.data.datasets, function(dataset, datasetIndex) {\r
+                               me.getDatasetMeta(datasetIndex).controller.reset();\r
+                       }, me);\r
                },\r
 \r
                update: function update(animationDuration, lazy) {\r
-                       Chart.pluginService.notifyPlugins('beforeUpdate', [this]);\r
+                       var me = this;\r
+                       Chart.plugins.notify('beforeUpdate', [me]);\r
 \r
                        // In case the entire data object changed\r
-                       this.tooltip._data = this.data;\r
+                       me.tooltip._data = me.data;\r
 \r
                        // Make sure dataset controllers are updated and new controllers are reset\r
-                       var newControllers = this.buildOrUpdateControllers();\r
+                       var newControllers = me.buildOrUpdateControllers();\r
 \r
                        // Make sure all dataset controllers have correct meta data counts\r
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {\r
-                               this.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\r
-                       }, this);\r
+                       helpers.each(me.data.datasets, function(dataset, datasetIndex) {\r
+                               me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\r
+                       }, me);\r
 \r
-                       Chart.layoutService.update(this, this.chart.width, this.chart.height);\r
+                       Chart.layoutService.update(me, me.chart.width, me.chart.height);\r
 \r
                        // Apply changes to the dataets that require the scales to have been calculated i.e BorderColor chages\r
-                       Chart.pluginService.notifyPlugins('afterScaleUpdate', [this]);\r
+                       Chart.plugins.notify('afterScaleUpdate', [me]);\r
 \r
                        // Can only reset the new controllers after the scales have been updated\r
                        helpers.each(newControllers, function(controller) {\r
                                controller.reset();\r
                        });\r
 \r
-                       // This will loop through any data and do the appropriate element update for the type\r
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {\r
-                               this.getDatasetMeta(datasetIndex).controller.update();\r
-                       }, this);\r
+                       me.updateDatasets();\r
 \r
                        // Do this before render so that any plugins that need final scale updates can use it\r
-                       Chart.pluginService.notifyPlugins('afterUpdate', [this]);\r
+                       Chart.plugins.notify('afterUpdate', [me]);\r
+\r
+                       me.render(animationDuration, lazy);\r
+               },\r
+\r
+               /**\r
+                * @method beforeDatasetsUpdate\r
+                * @description Called before all datasets are updated. If a plugin returns false,\r
+                * the datasets update will be cancelled until another chart update is triggered.\r
+                * @param {Object} instance the chart instance being updated.\r
+                * @returns {Boolean} false to cancel the datasets update.\r
+                * @memberof Chart.PluginBase\r
+                * @since version 2.1.5\r
+                * @instance\r
+                */\r
+\r
+               /**\r
+                * @method afterDatasetsUpdate\r
+                * @description Called after all datasets have been updated. Note that this\r
+                * extension will not be called if the datasets update has been cancelled.\r
+                * @param {Object} instance the chart instance being updated.\r
+                * @memberof Chart.PluginBase\r
+                * @since version 2.1.5\r
+                * @instance\r
+                */\r
+\r
+               /**\r
+                * Updates all datasets unless a plugin returns false to the beforeDatasetsUpdate\r
+                * extension, in which case no datasets will be updated and the afterDatasetsUpdate\r
+                * notification will be skipped.\r
+                * @protected\r
+                * @instance\r
+                */\r
+               updateDatasets: function() {\r
+                       var me = this;\r
+                       var i, ilen;\r
+\r
+                       if (Chart.plugins.notify('beforeDatasetsUpdate', [ me ])) {\r
+                               for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\r
+                                       me.getDatasetMeta(i).controller.update();\r
+                               }\r
 \r
-                       this.render(animationDuration, lazy);\r
+                               Chart.plugins.notify('afterDatasetsUpdate', [ me ]);\r
+                       }\r
                },\r
 \r
                render: function render(duration, lazy) {\r
-                       Chart.pluginService.notifyPlugins('beforeRender', [this]);\r
+                       var me = this;\r
+                       Chart.plugins.notify('beforeRender', [me]);\r
 \r
-                       var animationOptions = this.options.animation;\r
+                       var animationOptions = me.options.animation;\r
                        if (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) {\r
                                var animation = new Chart.Animation();\r
                                animation.numSteps = (duration || animationOptions.duration) / 16.66; //60 fps\r
@@ -7982,62 +8035,58 @@ module.exports = function(Chart) {
                                animation.onAnimationProgress = animationOptions.onProgress;\r
                                animation.onAnimationComplete = animationOptions.onComplete;\r
 \r
-                               Chart.animationService.addAnimation(this, animation, duration, lazy);\r
+                               Chart.animationService.addAnimation(me, animation, duration, lazy);\r
                        } else {\r
-                               this.draw();\r
+                               me.draw();\r
                                if (animationOptions && animationOptions.onComplete && animationOptions.onComplete.call) {\r
-                                       animationOptions.onComplete.call(this);\r
+                                       animationOptions.onComplete.call(me);\r
                                }\r
                        }\r
-                       return this;\r
+                       return me;\r
                },\r
 \r
                draw: function(ease) {\r
+                       var me = this;\r
                        var easingDecimal = ease || 1;\r
-                       this.clear();\r
+                       me.clear();\r
 \r
-                       Chart.pluginService.notifyPlugins('beforeDraw', [this, easingDecimal]);\r
+                       Chart.plugins.notify('beforeDraw', [me, easingDecimal]);\r
 \r
                        // Draw all the scales\r
-                       helpers.each(this.boxes, function(box) {\r
-                               box.draw(this.chartArea);\r
-                       }, this);\r
-                       if (this.scale) {\r
-                               this.scale.draw();\r
+                       helpers.each(me.boxes, function(box) {\r
+                               box.draw(me.chartArea);\r
+                       }, me);\r
+                       if (me.scale) {\r
+                               me.scale.draw();\r
                        }\r
 \r
-                       // Clip out the chart area so that anything outside does not draw. This is necessary for zoom and pan to function\r
-                       var context = this.chart.ctx;\r
-                       context.save();\r
-                       context.beginPath();\r
-                       context.rect(this.chartArea.left, this.chartArea.top, this.chartArea.right - this.chartArea.left, this.chartArea.bottom - this.chartArea.top);\r
-                       context.clip();\r
+                       Chart.plugins.notify('beforeDatasetsDraw', [me, easingDecimal]);\r
 \r
                        // Draw each dataset via its respective controller (reversed to support proper line stacking)\r
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {\r
-                               if (this.isDatasetVisible(datasetIndex)) {\r
-                                       this.getDatasetMeta(datasetIndex).controller.draw(ease);\r
+                       helpers.each(me.data.datasets, function(dataset, datasetIndex) {\r
+                               if (me.isDatasetVisible(datasetIndex)) {\r
+                                       me.getDatasetMeta(datasetIndex).controller.draw(ease);\r
                                }\r
-                       }, this, true);\r
+                       }, me, true);\r
 \r
-                       // Restore from the clipping operation\r
-                       context.restore();\r
+                       Chart.plugins.notify('afterDatasetsDraw', [me, easingDecimal]);\r
 \r
                        // Finally draw the tooltip\r
-                       this.tooltip.transition(easingDecimal).draw();\r
+                       me.tooltip.transition(easingDecimal).draw();\r
 \r
-                       Chart.pluginService.notifyPlugins('afterDraw', [this, easingDecimal]);\r
+                       Chart.plugins.notify('afterDraw', [me, easingDecimal]);\r
                },\r
 \r
                // Get the single element that was clicked on\r
                // @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\r
                getElementAtEvent: function(e) {\r
-                       var eventPosition = helpers.getRelativePosition(e, this.chart);\r
+                       var me = this;\r
+                       var eventPosition = helpers.getRelativePosition(e, me.chart);\r
                        var elementsArray = [];\r
 \r
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {\r
-                               if (this.isDatasetVisible(datasetIndex)) {\r
-                                       var meta = this.getDatasetMeta(datasetIndex);\r
+                       helpers.each(me.data.datasets, function(dataset, datasetIndex) {\r
+                               if (me.isDatasetVisible(datasetIndex)) {\r
+                                       var meta = me.getDatasetMeta(datasetIndex);\r
                                        helpers.each(meta.data, function(element, index) {\r
                                                if (element.inRange(eventPosition.x, eventPosition.y)) {\r
                                                        elementsArray.push(element);\r
@@ -8045,20 +8094,21 @@ module.exports = function(Chart) {
                                                }\r
                                        });\r
                                }\r
-                       }, this);\r
+                       });\r
 \r
                        return elementsArray;\r
                },\r
 \r
                getElementsAtEvent: function(e) {\r
-                       var eventPosition = helpers.getRelativePosition(e, this.chart);\r
+                       var me = this;\r
+                       var eventPosition = helpers.getRelativePosition(e, me.chart);\r
                        var elementsArray = [];\r
 \r
                        var found = (function() {\r
-                               if (this.data.datasets) {\r
-                                       for (var i = 0; i < this.data.datasets.length; i++) {\r
-                                               var meta = this.getDatasetMeta(i);\r
-                                               if (this.isDatasetVisible(i)) {\r
+                               if (me.data.datasets) {\r
+                                       for (var i = 0; i < me.data.datasets.length; i++) {\r
+                                               var meta = me.getDatasetMeta(i);\r
+                                               if (me.isDatasetVisible(i)) {\r
                                                        for (var j = 0; j < meta.data.length; j++) {\r
                                                                if (meta.data[j].inRange(eventPosition.x, eventPosition.y)) {\r
                                                                        return meta.data[j];\r
@@ -8067,18 +8117,18 @@ module.exports = function(Chart) {
                                                }\r
                                        }\r
                                }\r
-                       }).call(this);\r
+                       }).call(me);\r
 \r
                        if (!found) {\r
                                return elementsArray;\r
                        }\r
 \r
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {\r
-                               if (this.isDatasetVisible(datasetIndex)) {\r
-                                       var meta = this.getDatasetMeta(datasetIndex);\r
+                       helpers.each(me.data.datasets, function(dataset, datasetIndex) {\r
+                               if (me.isDatasetVisible(datasetIndex)) {\r
+                                       var meta = me.getDatasetMeta(datasetIndex);\r
                                        elementsArray.push(meta.data[found._index]);\r
                                }\r
-                       }, this);\r
+                       }, me);\r
 \r
                        return elementsArray;\r
                },\r
@@ -8108,14 +8158,15 @@ module.exports = function(Chart) {
                },\r
 \r
                getDatasetMeta: function(datasetIndex) {\r
-                       var dataset = this.data.datasets[datasetIndex];\r
+                       var me = this;\r
+                       var dataset = me.data.datasets[datasetIndex];\r
                        if (!dataset._meta) {\r
                                dataset._meta = {};\r
                        }\r
 \r
-                       var meta = dataset._meta[this.id];\r
+                       var meta = dataset._meta[me.id];\r
                        if (!meta) {\r
-                               meta = dataset._meta[this.id] = {\r
+                               meta = dataset._meta[me.id] = {\r
                                type: null,\r
                                data: [],\r
                                dataset: null,\r
@@ -8152,27 +8203,29 @@ module.exports = function(Chart) {
                },\r
 \r
                destroy: function destroy() {\r
-                       this.clear();\r
-                       helpers.unbindEvents(this, this.events);\r
-                       helpers.removeResizeListener(this.chart.canvas.parentNode);\r
+                       var me = this;\r
+                       me.stop();\r
+                       me.clear();\r
+                       helpers.unbindEvents(me, me.events);\r
+                       helpers.removeResizeListener(me.chart.canvas.parentNode);\r
 \r
                        // Reset canvas height/width attributes\r
-                       var canvas = this.chart.canvas;\r
-                       canvas.width = this.chart.width;\r
-                       canvas.height = this.chart.height;\r
+                       var canvas = me.chart.canvas;\r
+                       canvas.width = me.chart.width;\r
+                       canvas.height = me.chart.height;\r
 \r
                        // if we scaled the canvas in response to a devicePixelRatio !== 1, we need to undo that transform here\r
-                       if (this.chart.originalDevicePixelRatio !== undefined) {\r
-                               this.chart.ctx.scale(1 / this.chart.originalDevicePixelRatio, 1 / this.chart.originalDevicePixelRatio);\r
+                       if (me.chart.originalDevicePixelRatio !== undefined) {\r
+                               me.chart.ctx.scale(1 / me.chart.originalDevicePixelRatio, 1 / me.chart.originalDevicePixelRatio);\r
                        }\r
 \r
                        // Reset to the old style since it may have been changed by the device pixel ratio changes\r
-                       canvas.style.width = this.chart.originalCanvasStyleWidth;\r
-                       canvas.style.height = this.chart.originalCanvasStyleHeight;\r
+                       canvas.style.width = me.chart.originalCanvasStyleWidth;\r
+                       canvas.style.height = me.chart.originalCanvasStyleHeight;\r
 \r
-                       Chart.pluginService.notifyPlugins('destroy', [this]);\r
+                       Chart.plugins.notify('destroy', [me]);\r
 \r
-                       delete Chart.instances[this.id];\r
+                       delete Chart.instances[me.id];\r
                },\r
 \r
                toBase64Image: function toBase64Image() {\r
@@ -8180,17 +8233,19 @@ module.exports = function(Chart) {
                },\r
 \r
                initToolTip: function initToolTip() {\r
-                       this.tooltip = new Chart.Tooltip({\r
-                               _chart: this.chart,\r
-                               _chartInstance: this,\r
-                               _data: this.data,\r
-                               _options: this.options\r
-                       }, this);\r
+                       var me = this;\r
+                       me.tooltip = new Chart.Tooltip({\r
+                               _chart: me.chart,\r
+                               _chartInstance: me,\r
+                               _data: me.data,\r
+                               _options: me.options.tooltips\r
+                       }, me);\r
                },\r
 \r
                bindEvents: function bindEvents() {\r
-                       helpers.bindEvents(this, this.options.events, function(evt) {\r
-                               this.eventHandler(evt);\r
+                       var me = this;\r
+                       helpers.bindEvents(me, me.options.events, function(evt) {\r
+                               me.eventHandler(evt);\r
                        });\r
                },\r
 \r
@@ -8325,10 +8380,11 @@ module.exports = function(Chart) {
                dataElementType: null,\r
 \r
                initialize: function(chart, datasetIndex) {\r
-                       this.chart = chart;\r
-                       this.index = datasetIndex;\r
-                       this.linkScales();\r
-                       this.addElements();\r
+                       var me = this;\r
+                       me.chart = chart;\r
+                       me.index = datasetIndex;\r
+                       me.linkScales();\r
+                       me.addElements();\r
                },\r
 \r
                updateIndex: function(datasetIndex) {\r
@@ -8336,14 +8392,15 @@ module.exports = function(Chart) {
                },\r
 \r
                linkScales: function() {\r
-                       var meta = this.getMeta();\r
-                       var dataset = this.getDataset();\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var dataset = me.getDataset();\r
 \r
                        if (meta.xAxisID === null) {\r
-                               meta.xAxisID = dataset.xAxisID || this.chart.options.scales.xAxes[0].id;\r
+                               meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\r
                        }\r
                        if (meta.yAxisID === null) {\r
-                               meta.yAxisID = dataset.yAxisID || this.chart.options.scales.yAxes[0].id;\r
+                               meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\r
                        }\r
                },\r
 \r
@@ -8474,81 +8531,90 @@ module.exports = function(Chart) {
     helpers.extend(this, configuration);\r
     this.initialize.apply(this, arguments);\r
   };\r
+\r
   helpers.extend(Chart.Element.prototype, {\r
+\r
     initialize: function() {\r
       this.hidden = false;\r
     },\r
+\r
     pivot: function() {\r
-      if (!this._view) {\r
-        this._view = helpers.clone(this._model);\r
+      var me = this;\r
+      if (!me._view) {\r
+        me._view = helpers.clone(me._model);\r
       }\r
-      this._start = helpers.clone(this._view);\r
-      return this;\r
+      me._start = helpers.clone(me._view);\r
+      return me;\r
     },\r
+\r
     transition: function(ease) {\r
-      if (!this._view) {\r
-        this._view = helpers.clone(this._model);\r
+      var me = this;\r
+      \r
+      if (!me._view) {\r
+        me._view = helpers.clone(me._model);\r
       }\r
 \r
       // No animation -> No Transition\r
       if (ease === 1) {\r
-        this._view = this._model;\r
-        this._start = null;\r
-        return this;\r
+        me._view = me._model;\r
+        me._start = null;\r
+        return me;\r
       }\r
 \r
-      if (!this._start) {\r
-        this.pivot();\r
+      if (!me._start) {\r
+        me.pivot();\r
       }\r
 \r
-      helpers.each(this._model, function(value, key) {\r
+      helpers.each(me._model, function(value, key) {\r
 \r
         if (key[0] === '_') {\r
           // Only non-underscored properties\r
         }\r
 \r
         // Init if doesn't exist\r
-        else if (!this._view.hasOwnProperty(key)) {\r
-          if (typeof value === 'number' && !isNaN(this._view[key])) {\r
-            this._view[key] = value * ease;\r
+        else if (!me._view.hasOwnProperty(key)) {\r
+          if (typeof value === 'number' && !isNaN(me._view[key])) {\r
+            me._view[key] = value * ease;\r
           } else {\r
-            this._view[key] = value;\r
+            me._view[key] = value;\r
           }\r
         }\r
 \r
         // No unnecessary computations\r
-        else if (value === this._view[key]) {\r
+        else if (value === me._view[key]) {\r
           // It's the same! Woohoo!\r
         }\r
 \r
         // Color transitions if possible\r
         else if (typeof value === 'string') {\r
           try {\r
-            var color = helpers.color(this._model[key]).mix(helpers.color(this._start[key]), ease);\r
-            this._view[key] = color.rgbString();\r
+            var color = helpers.color(me._model[key]).mix(helpers.color(me._start[key]), ease);\r
+            me._view[key] = color.rgbString();\r
           } catch (err) {\r
-            this._view[key] = value;\r
+            me._view[key] = value;\r
           }\r
         }\r
         // Number transitions\r
         else if (typeof value === 'number') {\r
-          var startVal = this._start[key] !== undefined && isNaN(this._start[key]) === false ? this._start[key] : 0;\r
-          this._view[key] = ((this._model[key] - startVal) * ease) + startVal;\r
+          var startVal = me._start[key] !== undefined && isNaN(me._start[key]) === false ? me._start[key] : 0;\r
+          me._view[key] = ((me._model[key] - startVal) * ease) + startVal;\r
         }\r
         // Everything else\r
         else {\r
-          this._view[key] = value;\r
+          me._view[key] = value;\r
         }\r
-      }, this);\r
+      }, me);\r
 \r
-      return this;\r
+      return me;\r
     },\r
+\r
     tooltipPosition: function() {\r
       return {\r
         x: this._model.x,\r
         y: this._model.y\r
       };\r
     },\r
+\r
     hasValue: function() {\r
       return helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);\r
     }\r
@@ -8563,7 +8629,7 @@ module.exports = function(Chart) {
 /*global document: false */\r
 "use strict";\r
 \r
-var color = require('chartjs-color');\r
+var color = require(2);\r
 \r
 module.exports = function(Chart) {\r
        //Global Chart helpers object for utility methods and classes\r
@@ -8606,16 +8672,10 @@ module.exports = function(Chart) {
                return objClone;\r
        };\r
        helpers.extend = function(base) {\r
-               var len = arguments.length;\r
-               var additionalArgs = [];\r
-               for (var i = 1; i < len; i++) {\r
-                       additionalArgs.push(arguments[i]);\r
+               var setFn = function(value, key) { base[key] = value; };\r
+               for (var i = 1, ilen = arguments.length; i < ilen; i++) {\r
+                       helpers.each(arguments[i], setFn);\r
                }\r
-               helpers.each(additionalArgs, function(extensionObject) {\r
-                       helpers.each(extensionObject, function(value, key) {\r
-                               base[key] = value;\r
-                       });\r
-               });\r
                return base;\r
        };\r
        // Need a special merge function to chart configs since they are now grouped\r
@@ -8663,24 +8723,6 @@ module.exports = function(Chart) {
 \r
                return base;\r
        };\r
-       helpers.extendDeep = function(_base) {\r
-               return _extendDeep.apply(this, arguments);\r
-\r
-               function _extendDeep(dst) {\r
-                       helpers.each(arguments, function(obj) {\r
-                               if (obj !== dst) {\r
-                                       helpers.each(obj, function(value, key) {\r
-                                               if (dst[key] && dst[key].constructor && dst[key].constructor === Object) {\r
-                                                       _extendDeep(dst[key], value);\r
-                                               } else {\r
-                                                       dst[key] = value;\r
-                                               }\r
-                                       });\r
-                               }\r
-                       });\r
-                       return dst;\r
-               }\r
-       };\r
        helpers.scaleMerge = function(_base, extension) {\r
                var base = helpers.clone(_base);\r
 \r
@@ -8734,17 +8776,16 @@ module.exports = function(Chart) {
        helpers.getValueOrDefault = function(value, defaultValue) {\r
                return value === undefined ? defaultValue : value;\r
        };\r
-       helpers.indexOf = function(arrayToSearch, item) {\r
-               if (Array.prototype.indexOf) {\r
-                       return arrayToSearch.indexOf(item);\r
-               } else {\r
-                       for (var i = 0; i < arrayToSearch.length; i++) {\r
-                               if (arrayToSearch[i] === item)\r
+       helpers.indexOf = Array.prototype.indexOf?\r
+               function(array, item) { return array.indexOf(item); } :\r
+               function(array, item) {\r
+                       for (var i = 0, ilen = array.length; i < ilen; ++i) {\r
+                               if (array[i] === item) {\r
                                        return i;\r
+                               }\r
                        }\r
                        return -1;\r
-               }\r
-       };\r
+               };\r
        helpers.where = function(collection, filterCallback) {\r
                if (helpers.isArray(collection) && Array.prototype.filter) {\r
                        return collection.filter(filterCallback);\r
@@ -8760,23 +8801,17 @@ module.exports = function(Chart) {
                        return filtered;\r
                }\r
        };\r
-       helpers.findIndex = function(arrayToSearch, callback, thisArg) {\r
-               var index = -1;\r
-               if (Array.prototype.findIndex) {\r
-                       index = arrayToSearch.findIndex(callback, thisArg);\r
-               } else {\r
-                       for (var i = 0; i < arrayToSearch.length; ++i) {\r
-                               thisArg = thisArg !== undefined ? thisArg : arrayToSearch;\r
-\r
-                               if (callback.call(thisArg, arrayToSearch[i], i, arrayToSearch)) {\r
-                                       index = i;\r
-                                       break;\r
+       helpers.findIndex = Array.prototype.findIndex?\r
+               function(array, callback, scope) { return array.findIndex(callback, scope); } :\r
+               function(array, callback, scope) {\r
+                       scope = scope === undefined? array : scope;\r
+                       for (var i = 0, ilen = array.length; i < ilen; ++i) {\r
+                               if (callback.call(scope, array[i], i, array)) {\r
+                                       return i;\r
                                }\r
                        }\r
-               }\r
-\r
-               return index;\r
-       };\r
+                       return -1;\r
+               };\r
        helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {\r
                // Default to start of the array\r
                if (startIndex === undefined || startIndex === null) {\r
@@ -8831,12 +8866,6 @@ module.exports = function(Chart) {
                        return id++;\r
                };\r
        })();\r
-       helpers.warn = function(str) {\r
-               //Method for warning of errors\r
-               if (console && typeof console.warn === "function") {\r
-                       console.warn(str);\r
-               }\r
-       };\r
        //-- Math methods\r
        helpers.isNumber = function(n) {\r
                return !isNaN(parseFloat(n)) && isFinite(n);\r
@@ -8862,24 +8891,20 @@ module.exports = function(Chart) {
                        }\r
                }, Number.POSITIVE_INFINITY);\r
        };\r
-       helpers.sign = function(x) {\r
-               if (Math.sign) {\r
-                       return Math.sign(x);\r
-               } else {\r
+       helpers.sign = Math.sign?\r
+               function(x) { return Math.sign(x); } :\r
+               function(x) {\r
                        x = +x; // convert to a number\r
                        if (x === 0 || isNaN(x)) {\r
                                return x;\r
                        }\r
                        return x > 0 ? 1 : -1;\r
-               }\r
-       };\r
-       helpers.log10 = function(x) {\r
-               if (Math.log10) {\r
-                       return Math.log10(x);\r
-               } else {\r
+               };\r
+       helpers.log10 = Math.log10?\r
+               function(x) { return Math.log10(x); } :\r
+               function(x) {\r
                        return Math.log(x) / Math.LN10;\r
-               }\r
-       };\r
+               };\r
        helpers.toRadians = function(degrees) {\r
                return degrees * (Math.PI / 180);\r
        };\r
@@ -9378,7 +9403,7 @@ module.exports = function(Chart) {
        helpers.fontString = function(pixelSize, fontStyle, fontFamily) {\r
                return fontStyle + " " + pixelSize + "px " + fontFamily;\r
        };\r
-       helpers.longestText = function(ctx, font, arrayOfStrings, cache) {\r
+       helpers.longestText = function(ctx, font, arrayOfThings, cache) {\r
                cache = cache || {};\r
                var data = cache.data = cache.data || {};\r
                var gc = cache.garbageCollect = cache.garbageCollect || [];\r
@@ -9391,31 +9416,53 @@ module.exports = function(Chart) {
 \r
                ctx.font = font;\r
                var longest = 0;\r
-               helpers.each(arrayOfStrings, function(string) {\r
-                       // Undefined strings should not be measured\r
-                       if (string !== undefined && string !== null) {\r
-                               var textWidth = data[string];\r
-                               if (!textWidth) {\r
-                                       textWidth = data[string] = ctx.measureText(string).width;\r
-                                       gc.push(string);\r
-                               }\r
-\r
-                               if (textWidth > longest) {\r
-                                       longest = textWidth;\r
-                               }\r
+               helpers.each(arrayOfThings, function(thing) {\r
+                       // Undefined strings and arrays should not be measured\r
+                       if (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) {\r
+                               longest = helpers.measureText(ctx, data, gc, longest, thing);\r
+                       } else if (helpers.isArray(thing)) {\r
+                               // if it is an array lets measure each element\r
+                               // to do maybe simplify this function a bit so we can do this more recursively?\r
+                               helpers.each(thing, function(nestedThing) {\r
+                                       // Undefined strings and arrays should not be measured\r
+                                       if (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) {\r
+                                               longest = helpers.measureText(ctx, data, gc, longest, nestedThing);\r
+                                       }\r
+                               });\r
                        }\r
                });\r
 \r
                var gcLen = gc.length / 2;\r
-               if (gcLen > arrayOfStrings.length) {\r
+               if (gcLen > arrayOfThings.length) {\r
                        for (var i = 0; i < gcLen; i++) {\r
                                delete data[gc[i]];\r
                        }\r
                        gc.splice(0, gcLen);\r
                }\r
-\r
                return longest;\r
        };\r
+       helpers.measureText = function (ctx, data, gc, longest, string) {\r
+               var textWidth = data[string];\r
+               if (!textWidth) {\r
+                       textWidth = data[string] = ctx.measureText(string).width;\r
+                       gc.push(string);\r
+               }\r
+               if (textWidth > longest) {\r
+                       longest = textWidth;\r
+               }\r
+               return longest;\r
+       };\r
+       helpers.numberOfLabelLines = function(arrayOfThings) {\r
+               var numberOfLines = 1;\r
+               helpers.each(arrayOfThings, function(thing) {\r
+                       if (helpers.isArray(thing)) {\r
+                               if (thing.length > numberOfLines) {\r
+                                       numberOfLines = thing.length;\r
+                               }\r
+                       }\r
+               });\r
+               return numberOfLines;\r
+       };\r
        helpers.drawRoundedRectangle = function(ctx, x, y, width, height, radius) {\r
                ctx.beginPath();\r
                ctx.moveTo(x + radius, y);\r
@@ -9484,12 +9531,11 @@ module.exports = function(Chart) {
                        hiddenIframe.parentNode.removeChild(hiddenIframe);\r
                }\r
        };\r
-       helpers.isArray = function(obj) {\r
-               if (!Array.isArray) {\r
+       helpers.isArray = Array.isArray?\r
+               function(obj) { return Array.isArray(obj); } :\r
+               function(obj) {\r
                        return Object.prototype.toString.call(obj) === '[object Array]';\r
-               }\r
-               return Array.isArray(obj);\r
-       };\r
+               };\r
        //! @see http://stackoverflow.com/a/14853974\r
        helpers.arrayEquals = function(a0, a1) {\r
                var i, ilen, v0, v1;\r
@@ -9514,20 +9560,9 @@ module.exports = function(Chart) {
 \r
                return true;\r
        };\r
-       helpers.pushAllIfDefined = function(element, array) {\r
-               if (typeof element === "undefined") {\r
-                       return;\r
-               }\r
-\r
-               if (helpers.isArray(element)) {\r
-                       array.push.apply(array, element);\r
-               } else {\r
-                       array.push(element);\r
-               }\r
-       };\r
-       helpers.callCallback = function(fn, args, _tArg) {\r
-               if (fn && typeof fn.call === 'function') {\r
-                       fn.apply(_tArg, args);\r
+       helpers.callCallback = function(fn, args, _tArg) {\r
+               if (fn && typeof fn.call === 'function') {\r
+                       fn.apply(_tArg, args);\r
                }\r
        };\r
        helpers.getHoverColor = function(color) {\r
@@ -9538,14 +9573,16 @@ module.exports = function(Chart) {
        };\r
 };\r
 
-},{"chartjs-color":2}],26:[function(require,module,exports){
+},{"2":2}],26:[function(require,module,exports){
 "use strict";\r
 \r
 module.exports = function() {\r
 \r
        //Occupy the global variable of Chart, and create a simple base class\r
        var Chart = function(context, config) {\r
-               this.config = config;\r
+               var me = this;\r
+               var helpers = Chart.helpers;\r
+               me.config = config;\r
 \r
                // Support a jQuery'd canvas element\r
                if (context.length && context[0].getContext) {\r
@@ -9557,45 +9594,46 @@ module.exports = function() {
                        context = context.getContext("2d");\r
                }\r
 \r
-               this.ctx = context;\r
-               this.canvas = context.canvas;\r
+               me.ctx = context;\r
+               me.canvas = context.canvas;\r
+\r
+               context.canvas.style.display = context.canvas.style.display || 'block';\r
 \r
                // Figure out what the size of the chart will be.\r
                // If the canvas has a specified width and height, we use those else\r
                // we look to see if the canvas node has a CSS width and height.\r
                // If there is still no height, fill the parent container\r
-               this.width = context.canvas.width || parseInt(Chart.helpers.getStyle(context.canvas, 'width')) || Chart.helpers.getMaximumWidth(context.canvas);\r
-               this.height = context.canvas.height || parseInt(Chart.helpers.getStyle(context.canvas, 'height')) || Chart.helpers.getMaximumHeight(context.canvas);\r
+               me.width = context.canvas.width || parseInt(helpers.getStyle(context.canvas, 'width'), 10) || helpers.getMaximumWidth(context.canvas);\r
+               me.height = context.canvas.height || parseInt(helpers.getStyle(context.canvas, 'height'), 10) || helpers.getMaximumHeight(context.canvas);\r
 \r
-               this.aspectRatio = this.width / this.height;\r
+               me.aspectRatio = me.width / me.height;\r
 \r
-               if (isNaN(this.aspectRatio) || isFinite(this.aspectRatio) === false) {\r
+               if (isNaN(me.aspectRatio) || isFinite(me.aspectRatio) === false) {\r
                        // If the canvas has no size, try and figure out what the aspect ratio will be.\r
                        // Some charts prefer square canvases (pie, radar, etc). If that is specified, use that\r
                        // else use the canvas default ratio of 2\r
-                       this.aspectRatio = config.aspectRatio !== undefined ? config.aspectRatio : 2;\r
+                       me.aspectRatio = config.aspectRatio !== undefined ? config.aspectRatio : 2;\r
                }\r
 \r
                // Store the original style of the element so we can set it back\r
-               this.originalCanvasStyleWidth = context.canvas.style.width;\r
-               this.originalCanvasStyleHeight = context.canvas.style.height;\r
+               me.originalCanvasStyleWidth = context.canvas.style.width;\r
+               me.originalCanvasStyleHeight = context.canvas.style.height;\r
 \r
                // High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale.\r
-               Chart.helpers.retinaScale(this);\r
+               helpers.retinaScale(me);\r
 \r
                if (config) {\r
-                       this.controller = new Chart.Controller(this);\r
+                       me.controller = new Chart.Controller(me);\r
                }\r
 \r
                // Always bind this so that if the responsive state changes we still work\r
-               var _this = this;\r
-               Chart.helpers.addResizeListener(context.canvas.parentNode, function() {\r
-                       if (_this.controller && _this.controller.config.options.responsive) {\r
-                               _this.controller.resize();\r
+               helpers.addResizeListener(context.canvas.parentNode, function() {\r
+                       if (me.controller && me.controller.config.options.responsive) {\r
+                               me.controller.resize();\r
                        }\r
                });\r
 \r
-               return this.controller ? this.controller : this;\r
+               return me.controller ? me.controller : me;\r
 \r
        };\r
 \r
@@ -9640,6 +9678,8 @@ module.exports = function() {
                }\r
        };\r
 \r
+       Chart.Chart = Chart;\r
+\r
        return Chart;\r
 \r
 };\r
@@ -10016,7 +10056,7 @@ module.exports = function(Chart) {
                                return helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {\r
                                        return {\r
                                                text: dataset.label,\r
-                                               fillStyle: dataset.backgroundColor,\r
+                                               fillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),\r
                                                hidden: !chart.isDatasetVisible(i),\r
                                                lineCap: dataset.borderCapStyle,\r
                                                lineDash: dataset.borderDash,\r
@@ -10051,32 +10091,33 @@ module.exports = function(Chart) {
 \r
                beforeUpdate: noop,\r
                update: function(maxWidth, maxHeight, margins) {\r
+                       var me = this;\r
 \r
                        // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\r
-                       this.beforeUpdate();\r
+                       me.beforeUpdate();\r
 \r
                        // Absorb the master measurements\r
-                       this.maxWidth = maxWidth;\r
-                       this.maxHeight = maxHeight;\r
-                       this.margins = margins;\r
+                       me.maxWidth = maxWidth;\r
+                       me.maxHeight = maxHeight;\r
+                       me.margins = margins;\r
 \r
                        // Dimensions\r
-                       this.beforeSetDimensions();\r
-                       this.setDimensions();\r
-                       this.afterSetDimensions();\r
+                       me.beforeSetDimensions();\r
+                       me.setDimensions();\r
+                       me.afterSetDimensions();\r
                        // Labels\r
-                       this.beforeBuildLabels();\r
-                       this.buildLabels();\r
-                       this.afterBuildLabels();\r
+                       me.beforeBuildLabels();\r
+                       me.buildLabels();\r
+                       me.afterBuildLabels();\r
 \r
                        // Fit\r
-                       this.beforeFit();\r
-                       this.fit();\r
-                       this.afterFit();\r
+                       me.beforeFit();\r
+                       me.fit();\r
+                       me.afterFit();\r
                        //\r
-                       this.afterUpdate();\r
+                       me.afterUpdate();\r
 \r
-                       return this.minSize;\r
+                       return me.minSize;\r
                },\r
                afterUpdate: noop,\r
 \r
@@ -10084,28 +10125,29 @@ module.exports = function(Chart) {
 \r
                beforeSetDimensions: noop,\r
                setDimensions: function() {\r
+                       var me = this;\r
                        // Set the unconstrained dimension before label rotation\r
-                       if (this.isHorizontal()) {\r
+                       if (me.isHorizontal()) {\r
                                // Reset position before calculating rotation\r
-                               this.width = this.maxWidth;\r
-                               this.left = 0;\r
-                               this.right = this.width;\r
+                               me.width = me.maxWidth;\r
+                               me.left = 0;\r
+                               me.right = me.width;\r
                        } else {\r
-                               this.height = this.maxHeight;\r
+                               me.height = me.maxHeight;\r
 \r
                                // Reset position before calculating rotation\r
-                               this.top = 0;\r
-                               this.bottom = this.height;\r
+                               me.top = 0;\r
+                               me.bottom = me.height;\r
                        }\r
 \r
                        // Reset padding\r
-                       this.paddingLeft = 0;\r
-                       this.paddingTop = 0;\r
-                       this.paddingRight = 0;\r
-                       this.paddingBottom = 0;\r
+                       me.paddingLeft = 0;\r
+                       me.paddingTop = 0;\r
+                       me.paddingRight = 0;\r
+                       me.paddingBottom = 0;\r
 \r
                        // Reset minSize\r
-                       this.minSize = {\r
+                       me.minSize = {\r
                                width: 0,\r
                                height: 0\r
                        };\r
@@ -10116,9 +10158,10 @@ module.exports = function(Chart) {
 \r
                beforeBuildLabels: noop,\r
                buildLabels: function() {\r
-                       this.legendItems = this.options.labels.generateLabels.call(this, this.chart);\r
-                       if(this.options.reverse){\r
-                               this.legendItems.reverse();\r
+                       var me = this;\r
+                       me.legendItems = me.options.labels.generateLabels.call(me, me.chart);\r
+                       if(me.options.reverse){\r
+                               me.legendItems.reverse();\r
                        }\r
                },\r
                afterBuildLabels: noop,\r
@@ -10127,11 +10170,12 @@ module.exports = function(Chart) {
 \r
                beforeFit: noop,\r
                fit: function() {\r
-                       var opts = this.options;\r
+                       var me = this;\r
+                       var opts = me.options;\r
                        var labelOpts = opts.labels;\r
                        var display = opts.display;\r
 \r
-                       var ctx = this.ctx;\r
+                       var ctx = me.ctx;\r
 \r
                        var globalDefault = Chart.defaults.global,\r
                                itemOrDefault = helpers.getValueOrDefault,\r
@@ -10141,37 +10185,38 @@ module.exports = function(Chart) {
                                labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\r
 \r
                        // Reset hit boxes\r
-                       var hitboxes = this.legendHitBoxes = [];\r
+                       var hitboxes = me.legendHitBoxes = [];\r
 \r
-                       var minSize = this.minSize;\r
-                       var isHorizontal = this.isHorizontal();\r
+                       var minSize = me.minSize;\r
+                       var isHorizontal = me.isHorizontal();\r
 \r
                        if (isHorizontal) {\r
-                               minSize.width = this.maxWidth; // fill all the width\r
+                               minSize.width = me.maxWidth; // fill all the width\r
                                minSize.height = display ? 10 : 0;\r
                        } else {\r
                                minSize.width = display ? 10 : 0;\r
-                               minSize.height = this.maxHeight; // fill all the height\r
+                               minSize.height = me.maxHeight; // fill all the height\r
                        }\r
 \r
                        // Increase sizes here\r
                        if (display) {\r
+                               ctx.font = labelFont;\r
+\r
                                if (isHorizontal) {\r
                                        // Labels\r
 \r
                                        // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\r
-                                       var lineWidths = this.lineWidths = [0];\r
-                                       var totalHeight = this.legendItems.length ? fontSize + (labelOpts.padding) : 0;\r
+                                       var lineWidths = me.lineWidths = [0];\r
+                                       var totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0;\r
 \r
                                        ctx.textAlign = "left";\r
                                        ctx.textBaseline = 'top';\r
-                                       ctx.font = labelFont;\r
 \r
-                                       helpers.each(this.legendItems, function(legendItem, i) {\r
+                                       helpers.each(me.legendItems, function(legendItem, i) {\r
                                                var width = labelOpts.boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\r
-                                               if (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= this.width) {\r
+                                               if (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) {\r
                                                        totalHeight += fontSize + (labelOpts.padding);\r
-                                                       lineWidths[lineWidths.length] = this.left;\r
+                                                       lineWidths[lineWidths.length] = me.left;\r
                                                }\r
 \r
                                                // Store the hitbox width and height here. Final position will be updated in `draw`\r
@@ -10183,17 +10228,51 @@ module.exports = function(Chart) {
                                                };\r
 \r
                                                lineWidths[lineWidths.length - 1] += width + labelOpts.padding;\r
-                                       }, this);\r
+                                       });\r
 \r
                                        minSize.height += totalHeight;\r
 \r
                                } else {\r
-                                       // TODO vertical\r
+                                       var vPadding = labelOpts.padding;\r
+                                       var columnWidths = me.columnWidths = [];\r
+                                       var totalWidth = labelOpts.padding;\r
+                                       var currentColWidth = 0;\r
+                                       var currentColHeight = 0;\r
+                                       var itemHeight = fontSize + vPadding;\r
+\r
+                                       helpers.each(me.legendItems, function(legendItem, i) {\r
+                                               var itemWidth = labelOpts.boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\r
+\r
+                                               // If too tall, go to new column\r
+                                               if (currentColHeight + itemHeight > minSize.height) {\r
+                                                       totalWidth += currentColWidth + labelOpts.padding;\r
+                                                       columnWidths.push(currentColWidth); // previous column width\r
+\r
+                                                       currentColWidth = 0;\r
+                                                       currentColHeight = 0;\r
+                                               }\r
+\r
+                                               // Get max width\r
+                                               currentColWidth = Math.max(currentColWidth, itemWidth);\r
+                                               currentColHeight += itemHeight;\r
+\r
+                                               // Store the hitbox width and height here. Final position will be updated in `draw`\r
+                                               hitboxes[i] = {\r
+                                                       left: 0,\r
+                                                       top: 0,\r
+                                                       width: itemWidth,\r
+                                                       height: fontSize\r
+                                               };\r
+                                       });\r
+\r
+                                       totalWidth += currentColWidth;\r
+                                       columnWidths.push(currentColWidth);\r
+                                       minSize.width += totalWidth;\r
                                }\r
                        }\r
 \r
-                       this.width = minSize.width;\r
-                       this.height = minSize.height;\r
+                       me.width = minSize.width;\r
+                       me.height = minSize.height;\r
                },\r
                afterFit: noop,\r
 \r
@@ -10204,20 +10283,18 @@ module.exports = function(Chart) {
 \r
                // Actualy draw the legend on the canvas\r
                draw: function() {\r
-                       var opts = this.options;\r
+                       var me = this;\r
+                       var opts = me.options;\r
                        var labelOpts = opts.labels;\r
                        var globalDefault = Chart.defaults.global,\r
                                lineDefault = globalDefault.elements.line,\r
-                               legendWidth = this.width,\r
-                               lineWidths = this.lineWidths;\r
+                               legendWidth = me.width,\r
+                               legendHeight = me.height,\r
+                               lineWidths = me.lineWidths;\r
 \r
                        if (opts.display) {\r
-                               var ctx = this.ctx,\r
-                                       cursor = {\r
-                                               x: this.left + ((legendWidth - lineWidths[0]) / 2),\r
-                                               y: this.top + labelOpts.padding,\r
-                                               line: 0\r
-                                       },\r
+                               var ctx = me.ctx,\r
+                                       cursor,\r
                                        itemOrDefault = helpers.getValueOrDefault,\r
                                        fontColor = itemOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor),\r
                                        fontSize = itemOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize),\r
@@ -10225,92 +10302,127 @@ module.exports = function(Chart) {
                                        fontFamily = itemOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily),\r
                                        labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\r
 \r
-                               // Horizontal\r
-                               if (this.isHorizontal()) {\r
-                                       // Labels\r
-                                       ctx.textAlign = "left";\r
-                                       ctx.textBaseline = 'top';\r
-                                       ctx.lineWidth = 0.5;\r
-                                       ctx.strokeStyle = fontColor; // for strikethrough effect\r
-                                       ctx.fillStyle = fontColor; // render in correct colour\r
-                                       ctx.font = labelFont;\r
+                               // Canvas setup\r
+                               ctx.textAlign = "left";\r
+                               ctx.textBaseline = 'top';\r
+                               ctx.lineWidth = 0.5;\r
+                               ctx.strokeStyle = fontColor; // for strikethrough effect\r
+                               ctx.fillStyle = fontColor; // render in correct colour\r
+                               ctx.font = labelFont;\r
+\r
+                               var boxWidth = labelOpts.boxWidth,\r
+                                       hitboxes = me.legendHitBoxes;\r
+\r
+                               // current position\r
+                               var drawLegendBox = function(x, y, legendItem) {\r
+                                       // Set the ctx for the box\r
+                                       ctx.save();\r
+\r
+                                       ctx.fillStyle = itemOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\r
+                                       ctx.lineCap = itemOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\r
+                                       ctx.lineDashOffset = itemOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\r
+                                       ctx.lineJoin = itemOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\r
+                                       ctx.lineWidth = itemOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\r
+                                       ctx.strokeStyle = itemOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\r
+\r
+                                       if (ctx.setLineDash) {\r
+                                               // IE 9 and 10 do not support line dash\r
+                                               ctx.setLineDash(itemOrDefault(legendItem.lineDash, lineDefault.borderDash));\r
+                                       }\r
 \r
-                                       var boxWidth = labelOpts.boxWidth,\r
-                                               hitboxes = this.legendHitBoxes;\r
+                                       // Draw the box\r
+                                       ctx.strokeRect(x, y, boxWidth, fontSize);\r
+                                       ctx.fillRect(x, y, boxWidth, fontSize);\r
 \r
-                                       helpers.each(this.legendItems, function(legendItem, i) {\r
-                                               var textWidth = ctx.measureText(legendItem.text).width,\r
-                                                       width = boxWidth + (fontSize / 2) + textWidth,\r
-                                                       x = cursor.x,\r
-                                                       y = cursor.y;\r
+                                       ctx.restore();\r
+                               };\r
+                               var fillText = function(x, y, legendItem, textWidth) {\r
+                                       ctx.fillText(legendItem.text, boxWidth + (fontSize / 2) + x, y);\r
+\r
+                                       if (legendItem.hidden) {\r
+                                               // Strikethrough the text if hidden\r
+                                               ctx.beginPath();\r
+                                               ctx.lineWidth = 2;\r
+                                               ctx.moveTo(boxWidth + (fontSize / 2) + x, y + (fontSize / 2));\r
+                                               ctx.lineTo(boxWidth + (fontSize / 2) + x + textWidth, y + (fontSize / 2));\r
+                                               ctx.stroke();\r
+                                       }\r
+                               };\r
 \r
+                               // Horizontal\r
+                               var isHorizontal = me.isHorizontal();\r
+                               if (isHorizontal) {\r
+                                       cursor = {\r
+                                               x: me.left + ((legendWidth - lineWidths[0]) / 2),\r
+                                               y: me.top + labelOpts.padding,\r
+                                               line: 0\r
+                                       };\r
+                               } else {\r
+                                       cursor = {\r
+                                               x: me.left + labelOpts.padding,\r
+                                               y: me.top,\r
+                                               line: 0\r
+                                       };\r
+                               }\r
+\r
+                               var itemHeight = fontSize + labelOpts.padding;\r
+                               helpers.each(me.legendItems, function(legendItem, i) {\r
+                                       var textWidth = ctx.measureText(legendItem.text).width,\r
+                                               width = boxWidth + (fontSize / 2) + textWidth,\r
+                                               x = cursor.x,\r
+                                               y = cursor.y;\r
+\r
+                                       if (isHorizontal) {\r
                                                if (x + width >= legendWidth) {\r
                                                        y = cursor.y += fontSize + (labelOpts.padding);\r
                                                        cursor.line++;\r
-                                                       x = cursor.x = this.left + ((legendWidth - lineWidths[cursor.line]) / 2);\r
+                                                       x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2);\r
                                                }\r
-\r
-                                               // Set the ctx for the box\r
-                                               ctx.save();\r
-\r
-                                               ctx.fillStyle = itemOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\r
-                                               ctx.lineCap = itemOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\r
-                                               ctx.lineDashOffset = itemOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\r
-                                               ctx.lineJoin = itemOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\r
-                                               ctx.lineWidth = itemOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\r
-                                               ctx.strokeStyle = itemOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\r
-\r
-                                               if (ctx.setLineDash) {\r
-                                                       // IE 9 and 10 do not support line dash\r
-                                                       ctx.setLineDash(itemOrDefault(legendItem.lineDash, lineDefault.borderDash));\r
+                                       } else {\r
+                                               if (y + itemHeight > me.bottom) {\r
+                                                       x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\r
+                                                       y = cursor.y = me.top;\r
+                                                       cursor.line++;\r
                                                }\r
+                                       }\r
+                                       \r
 \r
-                                               // Draw the box\r
-                                               ctx.strokeRect(x, y, boxWidth, fontSize);\r
-                                               ctx.fillRect(x, y, boxWidth, fontSize);\r
-\r
-                                               ctx.restore();\r
-\r
-                                               hitboxes[i].left = x;\r
-                                               hitboxes[i].top = y;\r
+                                       drawLegendBox(x, y, legendItem);\r
 \r
-                                               // Fill the actual label\r
-                                               ctx.fillText(legendItem.text, boxWidth + (fontSize / 2) + x, y);\r
+                                       hitboxes[i].left = x;\r
+                                       hitboxes[i].top = y;\r
 \r
-                                               if (legendItem.hidden) {\r
-                                                       // Strikethrough the text if hidden\r
-                                                       ctx.beginPath();\r
-                                                       ctx.lineWidth = 2;\r
-                                                       ctx.moveTo(boxWidth + (fontSize / 2) + x, y + (fontSize / 2));\r
-                                                       ctx.lineTo(boxWidth + (fontSize / 2) + x + textWidth, y + (fontSize / 2));\r
-                                                       ctx.stroke();\r
-                                               }\r
+                                       // Fill the actual label\r
+                                       fillText(x, y, legendItem, textWidth);\r
 \r
+                                       if (isHorizontal) {\r
                                                cursor.x += width + (labelOpts.padding);\r
-                                       }, this);\r
-                               } else {\r
-\r
-                               }\r
+                                       } else {\r
+                                               cursor.y += itemHeight;\r
+                                       }\r
+                                       \r
+                               });\r
                        }\r
                },\r
 \r
                // Handle an event\r
                handleEvent: function(e) {\r
-                       var position = helpers.getRelativePosition(e, this.chart.chart),\r
+                       var me = this;\r
+                       var position = helpers.getRelativePosition(e, me.chart.chart),\r
                                x = position.x,\r
                                y = position.y,\r
-                               opts = this.options;\r
+                               opts = me.options;\r
 \r
-                       if (x >= this.left && x <= this.right && y >= this.top && y <= this.bottom) {\r
+                       if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\r
                                // See if we are touching one of the dataset boxes\r
-                               var lh = this.legendHitBoxes;\r
+                               var lh = me.legendHitBoxes;\r
                                for (var i = 0; i < lh.length; ++i) {\r
                                        var hitBox = lh[i];\r
 \r
                                        if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\r
                                                // Touching an element\r
                                                if (opts.onClick) {\r
-                                                       opts.onClick.call(this, e, this.legendItems[i]);\r
+                                                       opts.onClick.call(me, e, me.legendItems[i]);\r
                                                }\r
                                                break;\r
                                        }\r
@@ -10319,48 +10431,125 @@ module.exports = function(Chart) {
                }\r
        });\r
 \r
+       // Register the legend plugin\r
+       Chart.plugins.register({\r
+               beforeInit: function(chartInstance) {\r
+                       var opts = chartInstance.options;\r
+                       var legendOpts = opts.legend;\r
+\r
+                       if (legendOpts) {\r
+                               chartInstance.legend = new Chart.Legend({\r
+                                       ctx: chartInstance.chart.ctx,\r
+                                       options: legendOpts,\r
+                                       chart: chartInstance\r
+                               });\r
+\r
+                               Chart.layoutService.addBox(chartInstance, chartInstance.legend);\r
+                       }\r
+               }\r
+       });\r
 };\r
 
 },{}],29:[function(require,module,exports){
 "use strict";\r
 \r
 module.exports = function(Chart) {\r
-       var helpers = Chart.helpers;\r
 \r
-       // Plugins are stored here\r
-       Chart.plugins = [];\r
-       Chart.pluginService = {\r
-               // Register a new plugin\r
-               register: function(plugin) {\r
-                       var p = Chart.plugins;\r
-                       if (p.indexOf(plugin) === -1) {\r
-                               p.push(plugin);\r
-                       }\r
+       var noop = Chart.helpers.noop;\r
+\r
+       /**\r
+        * The plugin service singleton\r
+        * @namespace Chart.plugins\r
+        * @since 2.1.0\r
+        */\r
+       Chart.plugins = {\r
+               _plugins: [],\r
+\r
+               /**\r
+                * Registers the given plugin(s) if not already registered.\r
+                * @param {Array|Object} plugins plugin instance(s).\r
+                */\r
+               register: function(plugins) {\r
+                       var p = this._plugins;\r
+                       ([]).concat(plugins).forEach(function(plugin) {\r
+                               if (p.indexOf(plugin) === -1) {\r
+                                       p.push(plugin);\r
+                               }\r
+                       });\r
                },\r
 \r
-               // Remove a registered plugin\r
-               remove: function(plugin) {\r
-                       var p = Chart.plugins;\r
-                       var idx = p.indexOf(plugin);\r
-                       if (idx !== -1) {\r
-                               p.splice(idx, 1);\r
-                       }\r
+               /**\r
+                * Unregisters the given plugin(s) only if registered.\r
+                * @param {Array|Object} plugins plugin instance(s).\r
+                */\r
+               unregister: function(plugins) {\r
+                       var p = this._plugins;\r
+                       ([]).concat(plugins).forEach(function(plugin) {\r
+                               var idx = p.indexOf(plugin);\r
+                               if (idx !== -1) {\r
+                                       p.splice(idx, 1);\r
+                               }\r
+                       });\r
                },\r
 \r
-               // Iterate over all plugins\r
-               notifyPlugins: function(method, args, scope) {\r
-                       helpers.each(Chart.plugins, function(plugin) {\r
-                               if (plugin[method] && typeof plugin[method] === 'function') {\r
-                                       plugin[method].apply(scope, args);\r
+               /**\r
+                * Remove all registered p^lugins.\r
+                * @since 2.1.5\r
+                */\r
+               clear: function() {\r
+                       this._plugins = [];\r
+               },\r
+\r
+               /**\r
+                * Returns the number of registered plugins?\r
+                * @returns {Number}\r
+                * @since 2.1.5\r
+                */\r
+               count: function() {\r
+                       return this._plugins.length;\r
+               },\r
+\r
+               /**\r
+                * Returns all registered plugin intances.\r
+                * @returns {Array} array of plugin objects.\r
+                * @since 2.1.5\r
+                */\r
+               getAll: function() {\r
+                       return this._plugins;\r
+               },\r
+\r
+               /**\r
+                * Calls registered plugins on the specified extension, with the given args. This\r
+                * method immediately returns as soon as a plugin explicitly returns false. The\r
+                * returned value can be used, for instance, to interrupt the current action.\r
+                * @param {String} extension the name of the plugin method to call (e.g. 'beforeUpdate').\r
+                * @param {Array} [args] extra arguments to apply to the extension call.\r
+                * @returns {Boolean} false if any of the plugins return false, else returns true.\r
+                */\r
+               notify: function(extension, args) {\r
+                       var plugins = this._plugins;\r
+                       var ilen = plugins.length;\r
+                       var i, plugin;\r
+\r
+                       for (i=0; i<ilen; ++i) {\r
+                               plugin = plugins[i];\r
+                               if (typeof plugin[extension] === 'function') {\r
+                                       if (plugin[extension].apply(plugin, args || []) === false) {\r
+                                               return false;\r
+                                       }\r
                                }\r
-                       }, scope);\r
+                       }\r
+\r
+                       return true;\r
                }\r
        };\r
 \r
-       var noop = helpers.noop;\r
+       /**\r
+        * Plugin extension methods.\r
+        * @interface Chart.PluginBase\r
+        * @since 2.1.0\r
+        */\r
        Chart.PluginBase = Chart.Element.extend({\r
-               // Plugin methods. All functions are passed the chart instance\r
-\r
                // Called at start of chart init\r
                beforeInit: noop,\r
 \r
@@ -10382,6 +10571,14 @@ module.exports = function(Chart) {
                // Called during destroy\r
                destroy: noop\r
        });\r
+\r
+       /**\r
+        * Provided for backward compatibility, use Chart.plugins instead\r
+        * @namespace Chart.pluginService\r
+        * @deprecated since version 2.1.5\r
+        * @todo remove me at version 3\r
+        */\r
+       Chart.pluginService = Chart.plugins;\r
 };\r
 
 },{}],30:[function(require,module,exports){
@@ -10430,8 +10627,9 @@ module.exports = function(Chart) {
                        autoSkip: true,\r
                        autoSkipPadding: 0,\r
                        labelOffset: 0,\r
+                       // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\r
                        callback: function(value) {\r
-                               return '' + value;\r
+                               return helpers.isArray(value) ? value : '' + value;\r
                        }\r
                }\r
        };\r
@@ -10446,14 +10644,15 @@ module.exports = function(Chart) {
                        helpers.callCallback(this.options.beforeUpdate, [this]);\r
                },\r
                update: function(maxWidth, maxHeight, margins) {\r
+                       var me = this;\r
 \r
                        // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\r
-                       this.beforeUpdate();\r
+                       me.beforeUpdate();\r
 \r
                        // Absorb the master measurements\r
-                       this.maxWidth = maxWidth;\r
-                       this.maxHeight = maxHeight;\r
-                       this.margins = helpers.extend({\r
+                       me.maxWidth = maxWidth;\r
+                       me.maxHeight = maxHeight;\r
+                       me.margins = helpers.extend({\r
                                left: 0,\r
                                right: 0,\r
                                top: 0,\r
@@ -10461,36 +10660,36 @@ module.exports = function(Chart) {
                        }, margins);\r
 \r
                        // Dimensions\r
-                       this.beforeSetDimensions();\r
-                       this.setDimensions();\r
-                       this.afterSetDimensions();\r
+                       me.beforeSetDimensions();\r
+                       me.setDimensions();\r
+                       me.afterSetDimensions();\r
 \r
                        // Data min/max\r
-                       this.beforeDataLimits();\r
-                       this.determineDataLimits();\r
-                       this.afterDataLimits();\r
+                       me.beforeDataLimits();\r
+                       me.determineDataLimits();\r
+                       me.afterDataLimits();\r
 \r
                        // Ticks\r
-                       this.beforeBuildTicks();\r
-                       this.buildTicks();\r
-                       this.afterBuildTicks();\r
+                       me.beforeBuildTicks();\r
+                       me.buildTicks();\r
+                       me.afterBuildTicks();\r
 \r
-                       this.beforeTickToLabelConversion();\r
-                       this.convertTicksToLabels();\r
-                       this.afterTickToLabelConversion();\r
+                       me.beforeTickToLabelConversion();\r
+                       me.convertTicksToLabels();\r
+                       me.afterTickToLabelConversion();\r
 \r
                        // Tick Rotation\r
-                       this.beforeCalculateTickRotation();\r
-                       this.calculateTickRotation();\r
-                       this.afterCalculateTickRotation();\r
+                       me.beforeCalculateTickRotation();\r
+                       me.calculateTickRotation();\r
+                       me.afterCalculateTickRotation();\r
                        // Fit\r
-                       this.beforeFit();\r
-                       this.fit();\r
-                       this.afterFit();\r
+                       me.beforeFit();\r
+                       me.fit();\r
+                       me.afterFit();\r
                        //\r
-                       this.afterUpdate();\r
+                       me.afterUpdate();\r
 \r
-                       return this.minSize;\r
+                       return me.minSize;\r
 \r
                },\r
                afterUpdate: function() {\r
@@ -10503,25 +10702,26 @@ module.exports = function(Chart) {
                        helpers.callCallback(this.options.beforeSetDimensions, [this]);\r
                },\r
                setDimensions: function() {\r
+                       var me = this;\r
                        // Set the unconstrained dimension before label rotation\r
-                       if (this.isHorizontal()) {\r
+                       if (me.isHorizontal()) {\r
                                // Reset position before calculating rotation\r
-                               this.width = this.maxWidth;\r
-                               this.left = 0;\r
-                               this.right = this.width;\r
+                               me.width = me.maxWidth;\r
+                               me.left = 0;\r
+                               me.right = me.width;\r
                        } else {\r
-                               this.height = this.maxHeight;\r
+                               me.height = me.maxHeight;\r
 \r
                                // Reset position before calculating rotation\r
-                               this.top = 0;\r
-                               this.bottom = this.height;\r
+                               me.top = 0;\r
+                               me.bottom = me.height;\r
                        }\r
 \r
                        // Reset padding\r
-                       this.paddingLeft = 0;\r
-                       this.paddingTop = 0;\r
-                       this.paddingRight = 0;\r
-                       this.paddingBottom = 0;\r
+                       me.paddingLeft = 0;\r
+                       me.paddingTop = 0;\r
+                       me.paddingRight = 0;\r
+                       me.paddingBottom = 0;\r
                },\r
                afterSetDimensions: function() {\r
                        helpers.callCallback(this.options.afterSetDimensions, [this]);\r
@@ -10549,14 +10749,15 @@ module.exports = function(Chart) {
                        helpers.callCallback(this.options.beforeTickToLabelConversion, [this]);\r
                },\r
                convertTicksToLabels: function() {\r
+                       var me = this;\r
                        // Convert ticks to strings\r
-                       this.ticks = this.ticks.map(function(numericalTick, index, ticks) {\r
-                                       if (this.options.ticks.userCallback) {\r
-                                               return this.options.ticks.userCallback(numericalTick, index, ticks);\r
+                       me.ticks = me.ticks.map(function(numericalTick, index, ticks) {\r
+                                       if (me.options.ticks.userCallback) {\r
+                                               return me.options.ticks.userCallback(numericalTick, index, ticks);\r
                                        }\r
-                                       return this.options.ticks.callback(numericalTick, index, ticks);\r
+                                       return me.options.ticks.callback(numericalTick, index, ticks);\r
                                },\r
-                               this);\r
+                               me);\r
                },\r
                afterTickToLabelConversion: function() {\r
                        helpers.callCallback(this.options.afterTickToLabelConversion, [this]);\r
@@ -10568,9 +10769,10 @@ module.exports = function(Chart) {
                        helpers.callCallback(this.options.beforeCalculateTickRotation, [this]);\r
                },\r
                calculateTickRotation: function() {\r
-                       var context = this.ctx;\r
+                       var me = this;\r
+                       var context = me.ctx;\r
                        var globalDefaults = Chart.defaults.global;\r
-                       var optionTicks = this.options.ticks;\r
+                       var optionTicks = me.options.ticks;\r
 \r
                        //Get the width of each grid by calculating the difference\r
                        //between x offsets between 0 and 1.\r
@@ -10580,60 +10782,60 @@ module.exports = function(Chart) {
                        var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\r
                        context.font = tickLabelFont;\r
 \r
-                       var firstWidth = context.measureText(this.ticks[0]).width;\r
-                       var lastWidth = context.measureText(this.ticks[this.ticks.length - 1]).width;\r
+                       var firstWidth = context.measureText(me.ticks[0]).width;\r
+                       var lastWidth = context.measureText(me.ticks[me.ticks.length - 1]).width;\r
                        var firstRotated;\r
 \r
-                       this.labelRotation = optionTicks.minRotation || 0;\r
-                       this.paddingRight = 0;\r
-                       this.paddingLeft = 0;\r
+                       me.labelRotation = optionTicks.minRotation || 0;\r
+                       me.paddingRight = 0;\r
+                       me.paddingLeft = 0;\r
 \r
-                       if (this.options.display) {\r
-                               if (this.isHorizontal()) {\r
-                                       this.paddingRight = lastWidth / 2 + 3;\r
-                                       this.paddingLeft = firstWidth / 2 + 3;\r
+                       if (me.options.display) {\r
+                               if (me.isHorizontal()) {\r
+                                       me.paddingRight = lastWidth / 2 + 3;\r
+                                       me.paddingLeft = firstWidth / 2 + 3;\r
 \r
-                                       if (!this.longestTextCache) {\r
-                                               this.longestTextCache = {};\r
+                                       if (!me.longestTextCache) {\r
+                                               me.longestTextCache = {};\r
                                        }\r
-                                       var originalLabelWidth = helpers.longestText(context, tickLabelFont, this.ticks, this.longestTextCache);\r
+                                       var originalLabelWidth = helpers.longestText(context, tickLabelFont, me.ticks, me.longestTextCache);\r
                                        var labelWidth = originalLabelWidth;\r
                                        var cosRotation;\r
                                        var sinRotation;\r
 \r
                                        // Allow 3 pixels x2 padding either side for label readability\r
                                        // only the index matters for a dataset scale, but we want a consistent interface between scales\r
-                                       var tickWidth = this.getPixelForTick(1) - this.getPixelForTick(0) - 6;\r
+                                       var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\r
 \r
                                        //Max label rotation can be set or default to 90 - also act as a loop counter\r
-                                       while (labelWidth > tickWidth && this.labelRotation < optionTicks.maxRotation) {\r
-                                               cosRotation = Math.cos(helpers.toRadians(this.labelRotation));\r
-                                               sinRotation = Math.sin(helpers.toRadians(this.labelRotation));\r
+                                       while (labelWidth > tickWidth && me.labelRotation < optionTicks.maxRotation) {\r
+                                               cosRotation = Math.cos(helpers.toRadians(me.labelRotation));\r
+                                               sinRotation = Math.sin(helpers.toRadians(me.labelRotation));\r
 \r
                                                firstRotated = cosRotation * firstWidth;\r
 \r
                                                // We're right aligning the text now.\r
-                                               if (firstRotated + tickFontSize / 2 > this.yLabelWidth) {\r
-                                                       this.paddingLeft = firstRotated + tickFontSize / 2;\r
+                                               if (firstRotated + tickFontSize / 2 > me.yLabelWidth) {\r
+                                                       me.paddingLeft = firstRotated + tickFontSize / 2;\r
                                                }\r
 \r
-                                               this.paddingRight = tickFontSize / 2;\r
+                                               me.paddingRight = tickFontSize / 2;\r
 \r
-                                               if (sinRotation * originalLabelWidth > this.maxHeight) {\r
+                                               if (sinRotation * originalLabelWidth > me.maxHeight) {\r
                                                        // go back one step\r
-                                                       this.labelRotation--;\r
+                                                       me.labelRotation--;\r
                                                        break;\r
                                                }\r
 \r
-                                               this.labelRotation++;\r
+                                               me.labelRotation++;\r
                                                labelWidth = cosRotation * originalLabelWidth;\r
                                        }\r
                                }\r
                        }\r
 \r
-                       if (this.margins) {\r
-                               this.paddingLeft = Math.max(this.paddingLeft - this.margins.left, 0);\r
-                               this.paddingRight = Math.max(this.paddingRight - this.margins.right, 0);\r
+                       if (me.margins) {\r
+                               me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\r
+                               me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\r
                        }\r
                },\r
                afterCalculateTickRotation: function() {\r
@@ -10646,18 +10848,19 @@ module.exports = function(Chart) {
                        helpers.callCallback(this.options.beforeFit, [this]);\r
                },\r
                fit: function() {\r
+                       var me = this;\r
                        // Reset\r
-                       var minSize = this.minSize = {\r
+                       var minSize = me.minSize = {\r
                                width: 0,\r
                                height: 0\r
                        };\r
 \r
-                       var opts = this.options;\r
+                       var opts = me.options;\r
                        var globalDefaults = Chart.defaults.global;\r
                        var tickOpts = opts.ticks;\r
                        var scaleLabelOpts = opts.scaleLabel;\r
                        var display = opts.display;\r
-                       var isHorizontal = this.isHorizontal();\r
+                       var isHorizontal = me.isHorizontal();\r
 \r
                        var tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\r
                        var tickFontStyle = helpers.getValueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\r
@@ -10674,7 +10877,7 @@ module.exports = function(Chart) {
                        // Width\r
                        if (isHorizontal) {\r
                                // subtract the margins to line up with the chartArea if we are a full width scale\r
-                               minSize.width = this.isFullWidth() ? this.maxWidth - this.margins.left - this.margins.right : this.maxWidth;\r
+                               minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\r
                        } else {\r
                                minSize.width = display ? tickMarkLength : 0;\r
                        }\r
@@ -10683,7 +10886,7 @@ module.exports = function(Chart) {
                        if (isHorizontal) {\r
                                minSize.height = display ? tickMarkLength : 0;\r
                        } else {\r
-                               minSize.height = this.maxHeight; // fill all the height\r
+                               minSize.height = me.maxHeight; // fill all the height\r
                        }\r
 \r
                        // Are we showing a title for the scale?\r
@@ -10697,39 +10900,41 @@ module.exports = function(Chart) {
 \r
                        if (tickOpts.display && display) {\r
                                // Don't bother fitting the ticks if we are not showing them\r
-                               if (!this.longestTextCache) {\r
-                                       this.longestTextCache = {};\r
+                               if (!me.longestTextCache) {\r
+                                       me.longestTextCache = {};\r
                                }\r
 \r
-                               var largestTextWidth = helpers.longestText(this.ctx, tickLabelFont, this.ticks, this.longestTextCache);\r
+                               var largestTextWidth = helpers.longestText(me.ctx, tickLabelFont, me.ticks, me.longestTextCache);\r
+                               var tallestLabelHeightInLines = helpers.numberOfLabelLines(me.ticks);\r
+                               var lineSpace = tickFontSize * 0.5;\r
 \r
                                if (isHorizontal) {\r
                                        // A horizontal axis is more constrained by the height.\r
-                                       this.longestLabelWidth = largestTextWidth;\r
+                                       me.longestLabelWidth = largestTextWidth;\r
 \r
                                        // TODO - improve this calculation\r
-                                       var labelHeight = (Math.sin(helpers.toRadians(this.labelRotation)) * this.longestLabelWidth) + 1.5 * tickFontSize;\r
+                                       var labelHeight = (Math.sin(helpers.toRadians(me.labelRotation)) * me.longestLabelWidth) + (tickFontSize * tallestLabelHeightInLines) + (lineSpace * tallestLabelHeightInLines);\r
 \r
-                                       minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight);\r
-                                       this.ctx.font = tickLabelFont;\r
+                                       minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight);\r
+                                       me.ctx.font = tickLabelFont;\r
 \r
-                                       var firstLabelWidth = this.ctx.measureText(this.ticks[0]).width;\r
-                                       var lastLabelWidth = this.ctx.measureText(this.ticks[this.ticks.length - 1]).width;\r
+                                       var firstLabelWidth = me.ctx.measureText(me.ticks[0]).width;\r
+                                       var lastLabelWidth = me.ctx.measureText(me.ticks[me.ticks.length - 1]).width;\r
 \r
                                        // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned which means that the right padding is dominated\r
                                        // by the font height\r
-                                       var cosRotation = Math.cos(helpers.toRadians(this.labelRotation));\r
-                                       var sinRotation = Math.sin(helpers.toRadians(this.labelRotation));\r
-                                       this.paddingLeft = this.labelRotation !== 0 ? (cosRotation * firstLabelWidth) + 3 : firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\r
-                                       this.paddingRight = this.labelRotation !== 0 ? (sinRotation * (tickFontSize / 2)) + 3 : lastLabelWidth / 2 + 3; // when rotated\r
+                                       var cosRotation = Math.cos(helpers.toRadians(me.labelRotation));\r
+                                       var sinRotation = Math.sin(helpers.toRadians(me.labelRotation));\r
+                                       me.paddingLeft = me.labelRotation !== 0 ? (cosRotation * firstLabelWidth) + 3 : firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\r
+                                       me.paddingRight = me.labelRotation !== 0 ? (sinRotation * (tickFontSize / 2)) + 3 : lastLabelWidth / 2 + 3; // when rotated\r
                                } else {\r
                                        // A vertical axis is more constrained by the width. Labels are the dominant factor here, so get that length first\r
-                                       var maxLabelWidth = this.maxWidth - minSize.width;\r
+                                       var maxLabelWidth = me.maxWidth - minSize.width;\r
 \r
                                        // Account for padding\r
                                        var mirror = tickOpts.mirror;\r
                                        if (!mirror) {\r
-                                               largestTextWidth += this.options.ticks.padding;\r
+                                               largestTextWidth += me.options.ticks.padding;\r
                                        } else {\r
                                                // If mirrored text is on the inside so don't expand\r
                                                largestTextWidth = 0;\r
@@ -10740,23 +10945,23 @@ module.exports = function(Chart) {
                                                minSize.width += largestTextWidth;\r
                                        } else {\r
                                                // Expand to max size\r
-                                               minSize.width = this.maxWidth;\r
+                                               minSize.width = me.maxWidth;\r
                                        }\r
 \r
-                                       this.paddingTop = tickFontSize / 2;\r
-                                       this.paddingBottom = tickFontSize / 2;\r
+                                       me.paddingTop = tickFontSize / 2;\r
+                                       me.paddingBottom = tickFontSize / 2;\r
                                }\r
                        }\r
 \r
-                       if (this.margins) {\r
-                               this.paddingLeft = Math.max(this.paddingLeft - this.margins.left, 0);\r
-                               this.paddingTop = Math.max(this.paddingTop - this.margins.top, 0);\r
-                               this.paddingRight = Math.max(this.paddingRight - this.margins.right, 0);\r
-                               this.paddingBottom = Math.max(this.paddingBottom - this.margins.bottom, 0);\r
+                       if (me.margins) {\r
+                               me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\r
+                               me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\r
+                               me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\r
+                               me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\r
                        }\r
 \r
-                       this.width = minSize.width;\r
-                       this.height = minSize.height;\r
+                       me.width = minSize.width;\r
+                       me.height = minSize.height;\r
 \r
                },\r
                afterFit: function() {\r
@@ -10806,35 +11011,37 @@ module.exports = function(Chart) {
 \r
                // Used for tick location, should\r
                getPixelForTick: function(index, includeOffset) {\r
-                       if (this.isHorizontal()) {\r
-                               var innerWidth = this.width - (this.paddingLeft + this.paddingRight);\r
-                               var tickWidth = innerWidth / Math.max((this.ticks.length - ((this.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\r
-                               var pixel = (tickWidth * index) + this.paddingLeft;\r
+                       var me = this;\r
+                       if (me.isHorizontal()) {\r
+                               var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\r
+                               var tickWidth = innerWidth / Math.max((me.ticks.length - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\r
+                               var pixel = (tickWidth * index) + me.paddingLeft;\r
 \r
                                if (includeOffset) {\r
                                        pixel += tickWidth / 2;\r
                                }\r
 \r
-                               var finalVal = this.left + Math.round(pixel);\r
-                               finalVal += this.isFullWidth() ? this.margins.left : 0;\r
+                               var finalVal = me.left + Math.round(pixel);\r
+                               finalVal += me.isFullWidth() ? me.margins.left : 0;\r
                                return finalVal;\r
                        } else {\r
-                               var innerHeight = this.height - (this.paddingTop + this.paddingBottom);\r
-                               return this.top + (index * (innerHeight / (this.ticks.length - 1)));\r
+                               var innerHeight = me.height - (me.paddingTop + me.paddingBottom);\r
+                               return me.top + (index * (innerHeight / (me.ticks.length - 1)));\r
                        }\r
                },\r
 \r
                // Utility for getting the pixel location of a percentage of scale\r
                getPixelForDecimal: function(decimal /*, includeOffset*/ ) {\r
-                       if (this.isHorizontal()) {\r
-                               var innerWidth = this.width - (this.paddingLeft + this.paddingRight);\r
-                               var valueOffset = (innerWidth * decimal) + this.paddingLeft;\r
+                       var me = this;\r
+                       if (me.isHorizontal()) {\r
+                               var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\r
+                               var valueOffset = (innerWidth * decimal) + me.paddingLeft;\r
 \r
-                               var finalVal = this.left + Math.round(valueOffset);\r
-                               finalVal += this.isFullWidth() ? this.margins.left : 0;\r
+                               var finalVal = me.left + Math.round(valueOffset);\r
+                               finalVal += me.isFullWidth() ? me.margins.left : 0;\r
                                return finalVal;\r
                        } else {\r
-                               return this.top + (decimal * this.height);\r
+                               return me.top + (decimal * me.height);\r
                        }\r
                },\r
 \r
@@ -10853,23 +11060,22 @@ module.exports = function(Chart) {
                // Actualy draw the scale on the canvas\r
                // @param {rectangle} chartArea : the area of the chart to draw full grid lines on\r
                draw: function(chartArea) {\r
-                       var options = this.options;\r
+                       var me = this;\r
+                       var options = me.options;\r
                        if (!options.display) {\r
                                return;\r
                        }\r
 \r
-                       var context = this.ctx;\r
+                       var context = me.ctx;\r
                        var globalDefaults = Chart.defaults.global;\r
                        var optionTicks = options.ticks;\r
                        var gridLines = options.gridLines;\r
                        var scaleLabel = options.scaleLabel;\r
 \r
-                       var setContextLineSettings;\r
-                       var isRotated = this.labelRotation !== 0;\r
+                       var isRotated = me.labelRotation !== 0;\r
                        var skipRatio;\r
-                       var scaleLabelX;\r
-                       var scaleLabelY;\r
                        var useAutoskipper = optionTicks.autoSkip;\r
+                       var isHorizontal = me.isHorizontal();\r
 \r
                        // figure out the maximum number of gridlines to show\r
                        var maxTicks;\r
@@ -10890,19 +11096,18 @@ module.exports = function(Chart) {
                        var scaleLabelFontFamily = helpers.getValueOrDefault(scaleLabel.fontFamily, globalDefaults.defaultFontFamily);\r
                        var scaleLabelFont = helpers.fontString(scaleLabelFontSize, scaleLabelFontStyle, scaleLabelFontFamily);\r
 \r
-                       var labelRotationRadians = helpers.toRadians(this.labelRotation);\r
+                       var labelRotationRadians = helpers.toRadians(me.labelRotation);\r
                        var cosRotation = Math.cos(labelRotationRadians);\r
                        var sinRotation = Math.sin(labelRotationRadians);\r
-                       var longestRotatedLabel = this.longestLabelWidth * cosRotation;\r
+                       var longestRotatedLabel = me.longestLabelWidth * cosRotation;\r
                        var rotatedLabelHeight = tickFontSize * sinRotation;\r
 \r
                        // Make sure we draw text in the correct color and font\r
                        context.fillStyle = tickFontColor;\r
 \r
-                       if (this.isHorizontal()) {\r
-                               setContextLineSettings = true;\r
-                               var yTickStart = options.position === "bottom" ? this.top : this.bottom - tl;\r
-                               var yTickEnd = options.position === "bottom" ? this.top + tl : this.bottom;\r
+                       var itemsToDraw = [];\r
+\r
+                       if (isHorizontal) {\r
                                skipRatio = false;\r
 \r
                 // Only calculate the skip ratio with the half width of longestRotateLabel if we got an actual rotation\r
@@ -10911,14 +11116,14 @@ module.exports = function(Chart) {
                     longestRotatedLabel /= 2;\r
                 }\r
 \r
-                               if ((longestRotatedLabel + optionTicks.autoSkipPadding) * this.ticks.length > (this.width - (this.paddingLeft + this.paddingRight))) {\r
-                                       skipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * this.ticks.length) / (this.width - (this.paddingLeft + this.paddingRight)));\r
+                               if ((longestRotatedLabel + optionTicks.autoSkipPadding) * me.ticks.length > (me.width - (me.paddingLeft + me.paddingRight))) {\r
+                                       skipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * me.ticks.length) / (me.width - (me.paddingLeft + me.paddingRight)));\r
                                }\r
 \r
                                // if they defined a max number of optionTicks,\r
                                // increase skipRatio until that number is met\r
-                               if (maxTicks && this.ticks.length > maxTicks) {\r
-                                       while (!skipRatio || this.ticks.length / (skipRatio || 1) > maxTicks) {\r
+                               if (maxTicks && me.ticks.length > maxTicks) {\r
+                                       while (!skipRatio || me.ticks.length / (skipRatio || 1) > maxTicks) {\r
                                                if (!skipRatio) {\r
                                                        skipRatio = 1;\r
                                                }\r
@@ -10929,189 +11134,196 @@ module.exports = function(Chart) {
                                if (!useAutoskipper) {\r
                                        skipRatio = false;\r
                                }\r
+                       }\r
 \r
-                               helpers.each(this.ticks, function (label, index) {\r
-                                       // Blank optionTicks\r
-                                       var isLastTick = this.ticks.length === index + 1;\r
 \r
-                                       // Since we always show the last tick,we need may need to hide the last shown one before\r
-                                       var shouldSkip = (skipRatio > 1 && index % skipRatio > 0) || (index % skipRatio === 0 && index + skipRatio >= this.ticks.length);\r
-                                       if (shouldSkip && !isLastTick || (label === undefined || label === null)) {\r
-                                               return;\r
-                                       }\r
-                                       var xLineValue = this.getPixelForTick(index); // xvalues for grid lines\r
-                                       var xLabelValue = this.getPixelForTick(index, gridLines.offsetGridLines); // x values for optionTicks (need to consider offsetLabel option)\r
-\r
-                                       if (gridLines.display) {\r
-                                               if (index === (typeof this.zeroLineIndex !== 'undefined' ? this.zeroLineIndex : 0)) {\r
-                                                       // Draw the first index specially\r
-                                                       context.lineWidth = gridLines.zeroLineWidth;\r
-                                                       context.strokeStyle = gridLines.zeroLineColor;\r
-                                                       setContextLineSettings = true; // reset next time\r
-                                               } else if (setContextLineSettings) {\r
-                                                       context.lineWidth = gridLines.lineWidth;\r
-                                                       context.strokeStyle = gridLines.color;\r
-                                                       setContextLineSettings = false;\r
-                                               }\r
+                       var xTickStart = options.position === "right" ? me.left : me.right - tl;\r
+                       var xTickEnd = options.position === "right" ? me.left + tl : me.right;\r
+                       var yTickStart = options.position === "bottom" ? me.top : me.bottom - tl;\r
+                       var yTickEnd = options.position === "bottom" ? me.top + tl : me.bottom;\r
 \r
-                                               xLineValue += helpers.aliasPixel(context.lineWidth);\r
+                       helpers.each(me.ticks, function(label, index) {\r
+                               // If the callback returned a null or undefined value, do not draw this line\r
+                               if (label === undefined || label === null) {\r
+                                       return;\r
+                               }\r
 \r
-                                               // Draw the label area\r
-                                               context.beginPath();\r
+                               var isLastTick = me.ticks.length === index + 1;\r
 \r
-                                               if (gridLines.drawTicks) {\r
-                                                       context.moveTo(xLineValue, yTickStart);\r
-                                                       context.lineTo(xLineValue, yTickEnd);\r
-                                               }\r
+                               // Since we always show the last tick,we need may need to hide the last shown one before\r
+                               var shouldSkip = (skipRatio > 1 && index % skipRatio > 0) || (index % skipRatio === 0 && index + skipRatio >= me.ticks.length);\r
+                               if (shouldSkip && !isLastTick || (label === undefined || label === null)) {\r
+                                       return;\r
+                               }\r
 \r
-                                               // Draw the chart area\r
-                                               if (gridLines.drawOnChartArea) {\r
-                                                       context.moveTo(xLineValue, chartArea.top);\r
-                                                       context.lineTo(xLineValue, chartArea.bottom);\r
-                                               }\r
+                               var lineWidth, lineColor;\r
+                               if (index === (typeof me.zeroLineIndex !== 'undefined' ? me.zeroLineIndex : 0)) {\r
+                                       // Draw the first index specially\r
+                                       lineWidth = gridLines.zeroLineWidth;\r
+                                       lineColor = gridLines.zeroLineColor;\r
+                               } else  {\r
+                                       lineWidth = helpers.getValueAtIndexOrDefault(gridLines.lineWidth, index);\r
+                                       lineColor = helpers.getValueAtIndexOrDefault(gridLines.color, index);\r
+                               }\r
 \r
-                                               // Need to stroke in the loop because we are potentially changing line widths & colours\r
-                                               context.stroke();\r
-                                       }\r
+                               // Common properties\r
+                               var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY;\r
+                               var textAlign, textBaseline = 'middle';\r
 \r
-                                       if (optionTicks.display) {\r
-                                               context.save();\r
-                                               context.translate(xLabelValue + optionTicks.labelOffset, (isRotated) ? this.top + 12 : options.position === "top" ? this.bottom - tl : this.top + tl);\r
-                                               context.rotate(labelRotationRadians * -1);\r
-                                               context.font = tickLabelFont;\r
-                                               context.textAlign = (isRotated) ? "right" : "center";\r
-                                               context.textBaseline = (isRotated) ? "middle" : options.position === "top" ? "bottom" : "top";\r
-                                               context.fillText(label, 0, 0);\r
-                                               context.restore();\r
+                               if (isHorizontal) {\r
+                                       if (!isRotated) {\r
+                                               textBaseline = options.position === 'top' ? 'bottom' : 'top';\r
                                        }\r
-                               }, this);\r
-\r
-                               if (scaleLabel.display) {\r
-                                       // Draw the scale label\r
-                                       context.textAlign = "center";\r
-                                       context.textBaseline = 'middle';\r
-                                       context.fillStyle = scaleLabelFontColor; // render in correct colour\r
-                                       context.font = scaleLabelFont;\r
 \r
-                                       scaleLabelX = this.left + ((this.right - this.left) / 2); // midpoint of the width\r
-                                       scaleLabelY = options.position === 'bottom' ? this.bottom - (scaleLabelFontSize / 2) : this.top + (scaleLabelFontSize / 2);\r
+                                       textAlign = isRotated ? 'right' : 'center';\r
 \r
-                                       context.fillText(scaleLabel.labelString, scaleLabelX, scaleLabelY);\r
-                               }\r
+                                       var xLineValue = me.getPixelForTick(index) + helpers.aliasPixel(lineWidth); // xvalues for grid lines\r
+                                       labelX = me.getPixelForTick(index, gridLines.offsetGridLines) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option)\r
+                                       labelY = (isRotated) ? me.top + 12 : options.position === 'top' ? me.bottom - tl : me.top + tl;\r
 \r
-                       } else {\r
-                               setContextLineSettings = true;\r
-                               var xTickStart = options.position === "right" ? this.left : this.right - 5;\r
-                               var xTickEnd = options.position === "right" ? this.left + 5 : this.right;\r
-\r
-                               helpers.each(this.ticks, function (label, index) {\r
-                                       // If the callback returned a null or undefined value, do not draw this line\r
-                                       if (label === undefined || label === null) {\r
-                                               return;\r
-                                       }\r
-\r
-                                       var yLineValue = this.getPixelForTick(index); // xvalues for grid lines\r
-\r
-                                       if (gridLines.display) {\r
-                                               if (index === (typeof this.zeroLineIndex !== 'undefined' ? this.zeroLineIndex : 0)) {\r
-                                                       // Draw the first index specially\r
-                                                       context.lineWidth = gridLines.zeroLineWidth;\r
-                                                       context.strokeStyle = gridLines.zeroLineColor;\r
-                                                       setContextLineSettings = true; // reset next time\r
-                                               } else if (setContextLineSettings) {\r
-                                                       context.lineWidth = gridLines.lineWidth;\r
-                                                       context.strokeStyle = gridLines.color;\r
-                                                       setContextLineSettings = false;\r
+                                       tx1 = tx2 = x1 = x2 = xLineValue;\r
+                                       ty1 = yTickStart;\r
+                                       ty2 = yTickEnd;\r
+                                       y1 = chartArea.top;\r
+                                       y2 = chartArea.bottom;\r
+                               } else {\r
+                                       if (options.position === 'left') {\r
+                                               if (optionTicks.mirror) {\r
+                                                       labelX = me.right + optionTicks.padding;\r
+                                                       textAlign = 'left';\r
+                                               } else {\r
+                                                       labelX = me.right - optionTicks.padding;\r
+                                                       textAlign = 'right';\r
                                                }\r
+                                       } else {\r
+                                               // right side\r
+                                               if (optionTicks.mirror) {\r
+                                                       labelX = me.left - optionTicks.padding;\r
+                                                       textAlign = 'right';\r
+                                               } else {\r
+                                                       labelX = me.left + optionTicks.padding;\r
+                                                       textAlign = 'left';\r
+                                               }\r
+                                       }\r
 \r
-                                               yLineValue += helpers.aliasPixel(context.lineWidth);\r
-\r
-                                               // Draw the label area\r
-                                               context.beginPath();\r
+                                       var yLineValue = me.getPixelForTick(index); // xvalues for grid lines\r
+                                       yLineValue += helpers.aliasPixel(lineWidth);\r
+                                       labelY = me.getPixelForTick(index, gridLines.offsetGridLines);\r
+\r
+                                       tx1 = xTickStart;\r
+                                       tx2 = xTickEnd;\r
+                                       x1 = chartArea.left;\r
+                                       x2 = chartArea.right;\r
+                                       ty1 = ty2 = y1 = y2 = yLineValue;\r
+                               }\r
+\r
+                               itemsToDraw.push({\r
+                                       tx1: tx1,\r
+                                       ty1: ty1,\r
+                                       tx2: tx2,\r
+                                       ty2: ty2,\r
+                                       x1: x1,\r
+                                       y1: y1,\r
+                                       x2: x2,\r
+                                       y2: y2,\r
+                                       labelX: labelX,\r
+                                       labelY: labelY,\r
+                                       glWidth: lineWidth,\r
+                                       glColor: lineColor,\r
+                                       rotation: -1 * labelRotationRadians,\r
+                                       label: label,\r
+                                       textBaseline: textBaseline,\r
+                                       textAlign: textAlign\r
+                               });\r
+                       });\r
 \r
-                                               if (gridLines.drawTicks) {\r
-                                                       context.moveTo(xTickStart, yLineValue);\r
-                                                       context.lineTo(xTickEnd, yLineValue);\r
-                                               }\r
+                       // Draw all of the tick labels, tick marks, and grid lines at the correct places\r
+                       helpers.each(itemsToDraw, function(itemToDraw) {\r
+                               if (gridLines.display) {\r
+                                       context.lineWidth = itemToDraw.glWidth;\r
+                                       context.strokeStyle = itemToDraw.glColor;\r
 \r
-                                               // Draw the chart area\r
-                                               if (gridLines.drawOnChartArea) {\r
-                                                       context.moveTo(chartArea.left, yLineValue);\r
-                                                       context.lineTo(chartArea.right, yLineValue);\r
-                                               }\r
+                                       context.beginPath();\r
 \r
-                                               // Need to stroke in the loop because we are potentially changing line widths & colours\r
-                                               context.stroke();\r
+                                       if (gridLines.drawTicks) {\r
+                                               context.moveTo(itemToDraw.tx1, itemToDraw.ty1);\r
+                                               context.lineTo(itemToDraw.tx2, itemToDraw.ty2);\r
                                        }\r
 \r
-                                       if (optionTicks.display) {\r
-                                               var xLabelValue;\r
-                                               var yLabelValue = this.getPixelForTick(index, gridLines.offsetGridLines); // x values for optionTicks (need to consider offsetLabel option)\r
+                                       if (gridLines.drawOnChartArea) {\r
+                                               context.moveTo(itemToDraw.x1, itemToDraw.y1);\r
+                                               context.lineTo(itemToDraw.x2, itemToDraw.y2);\r
+                                       }\r
 \r
-                                               context.save();\r
+                                       context.stroke();\r
+                               }\r
 \r
-                                               if (options.position === "left") {\r
-                                                       if (optionTicks.mirror) {\r
-                                                               xLabelValue = this.right + optionTicks.padding;\r
-                                                               context.textAlign = "left";\r
-                                                       } else {\r
-                                                               xLabelValue = this.right - optionTicks.padding;\r
-                                                               context.textAlign = "right";\r
-                                                       }\r
-                                               } else {\r
-                                                       // right side\r
-                                                       if (optionTicks.mirror) {\r
-                                                               xLabelValue = this.left - optionTicks.padding;\r
-                                                               context.textAlign = "right";\r
-                                                       } else {\r
-                                                               xLabelValue = this.left + optionTicks.padding;\r
-                                                               context.textAlign = "left";\r
-                                                       }\r
+                               if (optionTicks.display) {\r
+                                       context.save();\r
+                                       context.translate(itemToDraw.labelX, itemToDraw.labelY);\r
+                                       context.rotate(itemToDraw.rotation);\r
+                                       context.font = tickLabelFont;\r
+                                       context.textBaseline = itemToDraw.textBaseline;\r
+                                       context.textAlign = itemToDraw.textAlign;\r
+\r
+                                       var label = itemToDraw.label;\r
+                                       if (helpers.isArray(label)) {\r
+                                               for (var i = 0, y = 0; i < label.length; ++i) {\r
+                                                       // We just make sure the multiline element is a string here..\r
+                                                       context.fillText('' + label[i], 0, y);\r
+                                                       // apply same lineSpacing as calculated @ L#320\r
+                                                       y += (tickFontSize * 1.5);\r
                                                }\r
-\r
-                                               context.translate(xLabelValue, yLabelValue + optionTicks.labelOffset);\r
-                                               context.rotate(labelRotationRadians * -1);\r
-                                               context.font = tickLabelFont;\r
-                                               context.textBaseline = "middle";\r
+                                       } else {\r
                                                context.fillText(label, 0, 0);\r
-                                               context.restore();\r
                                        }\r
-                               }, this);\r
-\r
-                               if (scaleLabel.display) {\r
-                                       // Draw the scale label\r
-                                       scaleLabelX = options.position === 'left' ? this.left + (scaleLabelFontSize / 2) : this.right - (scaleLabelFontSize / 2);\r
-                                       scaleLabelY = this.top + ((this.bottom - this.top) / 2);\r
-                                       var rotation = options.position === 'left' ? -0.5 * Math.PI : 0.5 * Math.PI;\r
-\r
-                                       context.save();\r
-                                       context.translate(scaleLabelX, scaleLabelY);\r
-                                       context.rotate(rotation);\r
-                                       context.textAlign = "center";\r
-                                       context.fillStyle = scaleLabelFontColor; // render in correct colour\r
-                                       context.font = scaleLabelFont;\r
-                                       context.textBaseline = 'middle';\r
-                                       context.fillText(scaleLabel.labelString, 0, 0);\r
                                        context.restore();\r
                                }\r
+                       });\r
+\r
+                       if (scaleLabel.display) {\r
+                               // Draw the scale label\r
+                               var scaleLabelX;\r
+                               var scaleLabelY;\r
+                               var rotation = 0;\r
+\r
+                               if (isHorizontal) {\r
+                                       scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width\r
+                                       scaleLabelY = options.position === 'bottom' ? me.bottom - (scaleLabelFontSize / 2) : me.top + (scaleLabelFontSize / 2);\r
+                               } else {\r
+                                       var isLeft = options.position === 'left';\r
+                                       scaleLabelX = isLeft ? me.left + (scaleLabelFontSize / 2) : me.right - (scaleLabelFontSize / 2);\r
+                                       scaleLabelY = me.top + ((me.bottom - me.top) / 2);\r
+                                       rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\r
+                               }\r
+                               \r
+                               context.save();\r
+                               context.translate(scaleLabelX, scaleLabelY);\r
+                               context.rotate(rotation);\r
+                               context.textAlign = 'center';\r
+                               context.textBaseline = 'middle';\r
+                               context.fillStyle = scaleLabelFontColor; // render in correct colour\r
+                               context.font = scaleLabelFont;\r
+                               context.fillText(scaleLabel.labelString, 0, 0);\r
+                               context.restore();\r
                        }\r
 \r
                        if (gridLines.drawBorder) {\r
                                // Draw the line at the edge of the axis\r
-                               context.lineWidth = gridLines.lineWidth;\r
-                               context.strokeStyle = gridLines.color;\r
-                               var x1 = this.left,\r
-                                       x2 = this.right,\r
-                                       y1 = this.top,\r
-                                       y2 = this.bottom;\r
+                               context.lineWidth = helpers.getValueAtIndexOrDefault(gridLines.lineWidth, 0);\r
+                               context.strokeStyle = helpers.getValueAtIndexOrDefault(gridLines.color, 0);\r
+                               var x1 = me.left,\r
+                                       x2 = me.right,\r
+                                       y1 = me.top,\r
+                                       y2 = me.bottom;\r
 \r
                                var aliasPixel = helpers.aliasPixel(context.lineWidth);\r
-                               if (this.isHorizontal()) {\r
-                                       y1 = y2 = options.position === 'top' ? this.bottom : this.top;\r
+                               if (isHorizontal) {\r
+                                       y1 = y2 = options.position === 'top' ? me.bottom : me.top;\r
                                        y1 += aliasPixel;\r
                                        y2 += aliasPixel;\r
                                } else {\r
-                                       x1 = x2 = options.position === 'left' ? this.right : this.left;\r
+                                       x1 = x2 = options.position === 'left' ? me.right : me.left;\r
                                        x1 += aliasPixel;\r
                                        x2 += aliasPixel;\r
                                }\r
@@ -11189,43 +11401,50 @@ module.exports = function(Chart) {
        Chart.Title = Chart.Element.extend({\r
 \r
                initialize: function(config) {\r
-                       helpers.extend(this, config);\r
-                       this.options = helpers.configMerge(Chart.defaults.global.title, config.options);\r
+                       var me = this;\r
+                       helpers.extend(me, config);\r
+                       me.options = helpers.configMerge(Chart.defaults.global.title, config.options);\r
 \r
                        // Contains hit boxes for each dataset (in dataset order)\r
-                       this.legendHitBoxes = [];\r
+                       me.legendHitBoxes = [];\r
                },\r
 \r
                // These methods are ordered by lifecyle. Utilities then follow.\r
 \r
-               beforeUpdate: noop,\r
+               beforeUpdate: function () {\r
+                       var chartOpts = this.chart.options;\r
+                       if (chartOpts && chartOpts.title) {\r
+                               this.options = helpers.configMerge(Chart.defaults.global.title, chartOpts.title);\r
+                       }\r
+               },\r
                update: function(maxWidth, maxHeight, margins) {\r
+                       var me = this;\r
 \r
                        // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\r
-                       this.beforeUpdate();\r
+                       me.beforeUpdate();\r
 \r
                        // Absorb the master measurements\r
-                       this.maxWidth = maxWidth;\r
-                       this.maxHeight = maxHeight;\r
-                       this.margins = margins;\r
+                       me.maxWidth = maxWidth;\r
+                       me.maxHeight = maxHeight;\r
+                       me.margins = margins;\r
 \r
                        // Dimensions\r
-                       this.beforeSetDimensions();\r
-                       this.setDimensions();\r
-                       this.afterSetDimensions();\r
+                       me.beforeSetDimensions();\r
+                       me.setDimensions();\r
+                       me.afterSetDimensions();\r
                        // Labels\r
-                       this.beforeBuildLabels();\r
-                       this.buildLabels();\r
-                       this.afterBuildLabels();\r
+                       me.beforeBuildLabels();\r
+                       me.buildLabels();\r
+                       me.afterBuildLabels();\r
 \r
                        // Fit\r
-                       this.beforeFit();\r
-                       this.fit();\r
-                       this.afterFit();\r
+                       me.beforeFit();\r
+                       me.fit();\r
+                       me.afterFit();\r
                        //\r
-                       this.afterUpdate();\r
+                       me.afterUpdate();\r
 \r
-                       return this.minSize;\r
+                       return me.minSize;\r
 \r
                },\r
                afterUpdate: noop,\r
@@ -11234,28 +11453,29 @@ module.exports = function(Chart) {
 \r
                beforeSetDimensions: noop,\r
                setDimensions: function() {\r
+                       var me = this;\r
                        // Set the unconstrained dimension before label rotation\r
-                       if (this.isHorizontal()) {\r
+                       if (me.isHorizontal()) {\r
                                // Reset position before calculating rotation\r
-                               this.width = this.maxWidth;\r
-                               this.left = 0;\r
-                               this.right = this.width;\r
+                               me.width = me.maxWidth;\r
+                               me.left = 0;\r
+                               me.right = me.width;\r
                        } else {\r
-                               this.height = this.maxHeight;\r
+                               me.height = me.maxHeight;\r
 \r
                                // Reset position before calculating rotation\r
-                               this.top = 0;\r
-                               this.bottom = this.height;\r
+                               me.top = 0;\r
+                               me.bottom = me.height;\r
                        }\r
 \r
                        // Reset padding\r
-                       this.paddingLeft = 0;\r
-                       this.paddingTop = 0;\r
-                       this.paddingRight = 0;\r
-                       this.paddingBottom = 0;\r
+                       me.paddingLeft = 0;\r
+                       me.paddingTop = 0;\r
+                       me.paddingRight = 0;\r
+                       me.paddingBottom = 0;\r
 \r
                        // Reset minSize\r
-                       this.minSize = {\r
+                       me.minSize = {\r
                                width: 0,\r
                                height: 0\r
                        };\r
@@ -11273,25 +11493,25 @@ module.exports = function(Chart) {
                beforeFit: noop,\r
                fit: function() {\r
 \r
-                       var _this = this,\r
-                               ctx = _this.ctx,\r
+                       var me = this,\r
+                               ctx = me.ctx,\r
                                valueOrDefault = helpers.getValueOrDefault,\r
-                               opts = _this.options,\r
+                               opts = me.options,\r
                                globalDefaults = Chart.defaults.global,\r
                                display = opts.display,\r
                                fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize),\r
-                               minSize = _this.minSize;\r
+                               minSize = me.minSize;\r
 \r
-                       if (_this.isHorizontal()) {\r
-                               minSize.width = _this.maxWidth; // fill all the width\r
+                       if (me.isHorizontal()) {\r
+                               minSize.width = me.maxWidth; // fill all the width\r
                                minSize.height = display ? fontSize + (opts.padding * 2) : 0;\r
                        } else {\r
                                minSize.width = display ? fontSize + (opts.padding * 2) : 0;\r
-                               minSize.height = _this.maxHeight; // fill all the height\r
+                               minSize.height = me.maxHeight; // fill all the height\r
                        }\r
 \r
-                       _this.width = minSize.width;\r
-                       _this.height = minSize.height;\r
+                       me.width = minSize.width;\r
+                       me.height = minSize.height;\r
 \r
                },\r
                afterFit: noop,\r
@@ -11304,10 +11524,10 @@ module.exports = function(Chart) {
 \r
                // Actualy draw the title block on the canvas\r
                draw: function() {\r
-                       var _this = this,\r
-                               ctx = _this.ctx,\r
+                       var me = this,\r
+                               ctx = me.ctx,\r
                                valueOrDefault = helpers.getValueOrDefault,\r
-                               opts = _this.options,\r
+                               opts = me.options,\r
                                globalDefaults = Chart.defaults.global;\r
 \r
                        if (opts.display) {\r
@@ -11316,18 +11536,18 @@ module.exports = function(Chart) {
                                        fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily),\r
                                        titleFont = helpers.fontString(fontSize, fontStyle, fontFamily),\r
                                        rotation = 0,\r
-                                       titleX, \r
+                                       titleX,\r
                                        titleY,\r
-                                       top = _this.top,\r
-                                       left = _this.left,\r
-                                       bottom = _this.bottom,\r
-                                       right = _this.right;\r
+                                       top = me.top,\r
+                                       left = me.left,\r
+                                       bottom = me.bottom,\r
+                                       right = me.right;\r
 \r
                                ctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour\r
                                ctx.font = titleFont;\r
 \r
                                // Horizontal\r
-                               if (_this.isHorizontal()) {\r
+                               if (me.isHorizontal()) {\r
                                        titleX = left + ((right - left) / 2); // midpoint of the width\r
                                        titleY = top + ((bottom - top) / 2); // midpoint of the height\r
                                } else {\r
@@ -11346,7 +11566,26 @@ module.exports = function(Chart) {
                        }\r
                }\r
        });\r
-};
+\r
+       // Register the title plugin\r
+       Chart.plugins.register({\r
+               beforeInit: function(chartInstance) {\r
+                       var opts = chartInstance.options;\r
+                       var titleOpts = opts.title;\r
+\r
+                       if (titleOpts) {\r
+                               chartInstance.titleBlock = new Chart.Title({\r
+                                       ctx: chartInstance.chart.ctx,\r
+                                       options: titleOpts,\r
+                                       chart: chartInstance\r
+                               });\r
+\r
+                               Chart.layoutService.addBox(chartInstance, chartInstance.titleBlock);\r
+                       }\r
+               }\r
+       });\r
+};\r
+
 },{}],33:[function(require,module,exports){
 "use strict";\r
 \r
@@ -11362,15 +11601,15 @@ module.exports = function(Chart) {
                titleFontStyle: "bold",\r
                titleSpacing: 2,\r
                titleMarginBottom: 6,\r
-               titleColor: "#fff",\r
+               titleFontColor: "#fff",\r
                titleAlign: "left",\r
                bodySpacing: 2,\r
-               bodyColor: "#fff",\r
+               bodyFontColor: "#fff",\r
                bodyAlign: "left",\r
                footerFontStyle: "bold",\r
                footerSpacing: 2,\r
                footerMarginTop: 6,\r
-               footerColor: "#fff",\r
+               footerFontColor: "#fff",\r
                footerAlign: "left",\r
                yPadding: 6,\r
                xPadding: 6,\r
@@ -11385,12 +11624,16 @@ module.exports = function(Chart) {
                        title: function(tooltipItems, data) {\r
                                // Pick first xLabel for now\r
                                var title = '';\r
+                               var labels = data.labels;\r
+                               var labelCount = labels ? labels.length : 0;\r
 \r
                                if (tooltipItems.length > 0) {\r
-                                       if (tooltipItems[0].xLabel) {\r
-                                               title = tooltipItems[0].xLabel;\r
-                                       } else if (data.labels.length > 0 && tooltipItems[0].index < data.labels.length) {\r
-                                               title = data.labels[tooltipItems[0].index];\r
+                                       var item = tooltipItems[0];\r
+\r
+                                       if (item.xLabel) {\r
+                                               title = item.xLabel;\r
+                                       } else if (labelCount > 0 && item.index < labelCount) {\r
+                                               title = labels[item.index];\r
                                        }\r
                                }\r
 \r
@@ -11407,6 +11650,15 @@ module.exports = function(Chart) {
                                var datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';\r
                                return datasetLabel + ': ' + tooltipItem.yLabel;\r
                        },\r
+                       labelColor: function(tooltipItem, chartInstance) {\r
+                               var meta = chartInstance.getDatasetMeta(tooltipItem.datasetIndex);\r
+                               var activeElement = meta.data[tooltipItem.index];\r
+                               var view = activeElement._view;\r
+                               return {\r
+                                       borderColor: view.borderColor,\r
+                                       backgroundColor: view.backgroundColor\r
+                               };\r
+                       },\r
                        afterLabel: helpers.noop,\r
 \r
                        // Args are: (tooltipItems, data)\r
@@ -11432,52 +11684,101 @@ module.exports = function(Chart) {
                return base;\r
        }\r
 \r
+       function getAveragePosition(elements) {\r
+               if (!elements.length) {\r
+                       return false;\r
+               }\r
+\r
+               var i, len;\r
+               var xPositions = [];\r
+               var yPositions = [];\r
+\r
+               for (i = 0, len = elements.length; i < len; ++i) {\r
+                       var el = elements[i];\r
+                       if (el && el.hasValue()){\r
+                               var pos = el.tooltipPosition();\r
+                               xPositions.push(pos.x);\r
+                               yPositions.push(pos.y);\r
+                       }\r
+               }\r
+\r
+               var x = 0,\r
+                       y = 0;\r
+               for (i = 0, len - xPositions.length; i < len; ++i) {\r
+                       x += xPositions[i];\r
+                       y += yPositions[i];\r
+               }\r
+\r
+               return {\r
+                       x: Math.round(x / xPositions.length),\r
+                       y: Math.round(y / xPositions.length)\r
+               };\r
+       }\r
+\r
+       // Private helper to create a tooltip iteam model\r
+       // @param element : the chart element (point, arc, bar) to create the tooltip item for\r
+       // @return : new tooltip item\r
+       function createTooltipItem(element) {\r
+               var xScale = element._xScale;\r
+               var yScale = element._yScale || element._scale; // handle radar || polarArea charts\r
+               var index = element._index,\r
+                       datasetIndex = element._datasetIndex;\r
+\r
+               return {\r
+                       xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\r
+                       yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\r
+                       index: index,\r
+                       datasetIndex: datasetIndex\r
+               };\r
+       }\r
+\r
        Chart.Tooltip = Chart.Element.extend({\r
                initialize: function() {\r
+                       var me = this;\r
                        var globalDefaults = Chart.defaults.global;\r
-                       var options = this._options;\r
-                       var tooltips = options.tooltips;\r
+                       var tooltipOpts = me._options;\r
+                       var getValueOrDefault = helpers.getValueOrDefault;\r
 \r
-                       helpers.extend(this, {\r
+                       helpers.extend(me, {\r
                                _model: {\r
                                        // Positioning\r
-                                       xPadding: tooltips.xPadding,\r
-                                       yPadding: tooltips.yPadding,\r
-                                       xAlign : tooltips.yAlign,\r
-                                       yAlign : tooltips.xAlign,\r
+                                       xPadding: tooltipOpts.xPadding,\r
+                                       yPadding: tooltipOpts.yPadding,\r
+                                       xAlign : tooltipOpts.yAlign,\r
+                                       yAlign : tooltipOpts.xAlign,\r
 \r
                                        // Body\r
-                                       bodyColor: tooltips.bodyColor,\r
-                                       _bodyFontFamily: helpers.getValueOrDefault(tooltips.bodyFontFamily, globalDefaults.defaultFontFamily),\r
-                                       _bodyFontStyle: helpers.getValueOrDefault(tooltips.bodyFontStyle, globalDefaults.defaultFontStyle),\r
-                                       _bodyAlign: tooltips.bodyAlign,\r
-                                       bodyFontSize: helpers.getValueOrDefault(tooltips.bodyFontSize, globalDefaults.defaultFontSize),\r
-                                       bodySpacing: tooltips.bodySpacing,\r
+                                       bodyFontColor: tooltipOpts.bodyFontColor,\r
+                                       _bodyFontFamily: getValueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\r
+                                       _bodyFontStyle: getValueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\r
+                                       _bodyAlign: tooltipOpts.bodyAlign,\r
+                                       bodyFontSize: getValueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\r
+                                       bodySpacing: tooltipOpts.bodySpacing,\r
 \r
                                        // Title\r
-                                       titleColor: tooltips.titleColor,\r
-                                       _titleFontFamily: helpers.getValueOrDefault(tooltips.titleFontFamily, globalDefaults.defaultFontFamily),\r
-                                       _titleFontStyle: helpers.getValueOrDefault(tooltips.titleFontStyle, globalDefaults.defaultFontStyle),\r
-                                       titleFontSize: helpers.getValueOrDefault(tooltips.titleFontSize, globalDefaults.defaultFontSize),\r
-                                       _titleAlign: tooltips.titleAlign,\r
-                                       titleSpacing: tooltips.titleSpacing,\r
-                                       titleMarginBottom: tooltips.titleMarginBottom,\r
+                                       titleFontColor: tooltipOpts.titleFontColor,\r
+                                       _titleFontFamily: getValueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\r
+                                       _titleFontStyle: getValueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\r
+                                       titleFontSize: getValueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\r
+                                       _titleAlign: tooltipOpts.titleAlign,\r
+                                       titleSpacing: tooltipOpts.titleSpacing,\r
+                                       titleMarginBottom: tooltipOpts.titleMarginBottom,\r
 \r
                                        // Footer\r
-                                       footerColor: tooltips.footerColor,\r
-                                       _footerFontFamily: helpers.getValueOrDefault(tooltips.footerFontFamily, globalDefaults.defaultFontFamily),\r
-                                       _footerFontStyle: helpers.getValueOrDefault(tooltips.footerFontStyle, globalDefaults.defaultFontStyle),\r
-                                       footerFontSize: helpers.getValueOrDefault(tooltips.footerFontSize, globalDefaults.defaultFontSize),\r
-                                       _footerAlign: tooltips.footerAlign,\r
-                                       footerSpacing: tooltips.footerSpacing,\r
-                                       footerMarginTop: tooltips.footerMarginTop,\r
+                                       footerFontColor: tooltipOpts.footerFontColor,\r
+                                       _footerFontFamily: getValueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\r
+                                       _footerFontStyle: getValueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\r
+                                       footerFontSize: getValueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\r
+                                       _footerAlign: tooltipOpts.footerAlign,\r
+                                       footerSpacing: tooltipOpts.footerSpacing,\r
+                                       footerMarginTop: tooltipOpts.footerMarginTop,\r
 \r
                                        // Appearance\r
-                                       caretSize: tooltips.caretSize,\r
-                                       cornerRadius: tooltips.cornerRadius,\r
-                                       backgroundColor: tooltips.backgroundColor,\r
+                                       caretSize: tooltipOpts.caretSize,\r
+                                       cornerRadius: tooltipOpts.cornerRadius,\r
+                                       backgroundColor: tooltipOpts.backgroundColor,\r
                                        opacity: 0,\r
-                                       legendColorBackground: tooltips.multiKeyBackground\r
+                                       legendColorBackground: tooltipOpts.multiKeyBackground\r
                                }\r
                        });\r
                },\r
@@ -11485,9 +11786,13 @@ module.exports = function(Chart) {
                // Get the title\r
                // Args are: (tooltipItem, data)\r
                getTitle: function() {\r
-                       var beforeTitle = this._options.tooltips.callbacks.beforeTitle.apply(this, arguments),\r
-                               title = this._options.tooltips.callbacks.title.apply(this, arguments),\r
-                               afterTitle = this._options.tooltips.callbacks.afterTitle.apply(this, arguments);\r
+                       var me = this;\r
+                       var opts = me._options;\r
+                       var callbacks = opts.callbacks;\r
+\r
+                       var beforeTitle = callbacks.beforeTitle.apply(me, arguments),\r
+                               title = callbacks.title.apply(me, arguments),\r
+                               afterTitle = callbacks.afterTitle.apply(me, arguments);\r
 \r
                        var lines = [];\r
                        lines = pushOrConcat(lines, beforeTitle);\r
@@ -11499,35 +11804,47 @@ module.exports = function(Chart) {
 \r
                // Args are: (tooltipItem, data)\r
                getBeforeBody: function() {\r
-                       var lines = this._options.tooltips.callbacks.beforeBody.apply(this, arguments);\r
+                       var lines = this._options.callbacks.beforeBody.apply(this, arguments);\r
                        return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\r
                },\r
 \r
                // Args are: (tooltipItem, data)\r
                getBody: function(tooltipItems, data) {\r
-                       var lines = [];\r
+                       var me = this;\r
+                       var callbacks = me._options.callbacks;\r
+                       var bodyItems = [];\r
+\r
+                       helpers.each(tooltipItems, function(tooltipItem) {\r
+                               var bodyItem = {\r
+                                       before: [],\r
+                                       lines: [],\r
+                                       after: []\r
+                               };\r
+                               pushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data));\r
+                               pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\r
+                               pushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data));\r
 \r
-                       helpers.each(tooltipItems, function(bodyItem) {\r
-                               helpers.pushAllIfDefined(this._options.tooltips.callbacks.beforeLabel.call(this, bodyItem, data), lines);\r
-                               helpers.pushAllIfDefined(this._options.tooltips.callbacks.label.call(this, bodyItem, data), lines);\r
-                               helpers.pushAllIfDefined(this._options.tooltips.callbacks.afterLabel.call(this, bodyItem, data), lines);\r
-                       }, this);\r
+                               bodyItems.push(bodyItem);\r
+                       });\r
 \r
-                       return lines;\r
+                       return bodyItems;\r
                },\r
 \r
                // Args are: (tooltipItem, data)\r
                getAfterBody: function() {\r
-                       var lines = this._options.tooltips.callbacks.afterBody.apply(this, arguments);\r
+                       var lines = this._options.callbacks.afterBody.apply(this, arguments);\r
                        return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\r
                },\r
 \r
                // Get the footer and beforeFooter and afterFooter lines\r
                // Args are: (tooltipItem, data)\r
                getFooter: function() {\r
-                       var beforeFooter = this._options.tooltips.callbacks.beforeFooter.apply(this, arguments);\r
-                       var footer = this._options.tooltips.callbacks.footer.apply(this, arguments);\r
-                       var afterFooter = this._options.tooltips.callbacks.afterFooter.apply(this, arguments);\r
+                       var me = this;\r
+                       var callbacks = me._options.callbacks;\r
+\r
+                       var beforeFooter = callbacks.beforeFooter.apply(me, arguments);\r
+                       var footer = callbacks.footer.apply(me, arguments);\r
+                       var afterFooter = callbacks.afterFooter.apply(me, arguments);\r
 \r
                        var lines = [];\r
                        lines = pushOrConcat(lines, beforeFooter);\r
@@ -11537,98 +11854,47 @@ module.exports = function(Chart) {
                        return lines;\r
                },\r
 \r
-               getAveragePosition: function(elements) {\r
-\r
-                       if (!elements.length) {\r
-                               return false;\r
-                       }\r
-\r
-                       var xPositions = [];\r
-                       var yPositions = [];\r
-\r
-                       helpers.each(elements, function(el) {\r
-                               if (el && el.hasValue()){\r
-                                       var pos = el.tooltipPosition();\r
-                                       xPositions.push(pos.x);\r
-                                       yPositions.push(pos.y);\r
-                               }\r
-                       });\r
-\r
-                       var x = 0,\r
-                               y = 0;\r
-                       for (var i = 0; i < xPositions.length; i++) {\r
-                               x += xPositions[i];\r
-                               y += yPositions[i];\r
-                       }\r
+               update: function(changed) {\r
+                       var me = this;\r
+                       var opts = me._options;\r
+                       var model = me._model;\r
+                       var active = me._active;\r
 \r
-                       return {\r
-                               x: Math.round(x / xPositions.length),\r
-                               y: Math.round(y / xPositions.length)\r
-                       };\r
+                       var data = me._data;\r
+                       var chartInstance = me._chartInstance;\r
 \r
-               },\r
+                       var i, len;\r
 \r
-               update: function(changed) {\r
-                       if (this._active.length) {\r
-                               this._model.opacity = 1;\r
+                       if (active.length) {\r
+                               model.opacity = 1;\r
 \r
-                               var element = this._active[0],\r
-                                       labelColors = [],\r
-                                       tooltipPosition;\r
+                               var labelColors = [],\r
+                                       tooltipPosition = getAveragePosition(active);\r
 \r
                                var tooltipItems = [];\r
+                               for (i = 0, len = active.length; i < len; ++i) {\r
+                                       tooltipItems.push(createTooltipItem(active[i]));\r
+                               }\r
 \r
-                               if (this._options.tooltips.mode === 'single') {\r
-                                       var yScale = element._yScale || element._scale; // handle radar || polarArea charts\r
-                                       tooltipItems.push({\r
-                                               xLabel: element._xScale ? element._xScale.getLabelForIndex(element._index, element._datasetIndex) : '',\r
-                                               yLabel: yScale ? yScale.getLabelForIndex(element._index, element._datasetIndex) : '',\r
-                                               index: element._index,\r
-                                               datasetIndex: element._datasetIndex\r
-                                       });\r
-                                       tooltipPosition = this.getAveragePosition(this._active);\r
-                               } else {\r
-                                       helpers.each(this._data.datasets, function(dataset, datasetIndex) {\r
-                                               if (!this._chartInstance.isDatasetVisible(datasetIndex)) {\r
-                                                       return;\r
-                                               }\r
-\r
-                                               var meta = this._chartInstance.getDatasetMeta(datasetIndex);\r
-                                               var currentElement = meta.data[element._index];\r
-                                               if (currentElement) {\r
-                                                       var yScale = element._yScale || element._scale; // handle radar || polarArea charts\r
-\r
-                                                       tooltipItems.push({\r
-                                                               xLabel: currentElement._xScale ? currentElement._xScale.getLabelForIndex(currentElement._index, currentElement._datasetIndex) : '',\r
-                                                               yLabel: yScale ? yScale.getLabelForIndex(currentElement._index, currentElement._datasetIndex) : '',\r
-                                                               index: element._index,\r
-                                                               datasetIndex: datasetIndex\r
-                                                       });\r
-                                               }\r
-                                       }, this);\r
-\r
-                                       helpers.each(this._active, function(active) {\r
-                                               if (active) {\r
-                                                       labelColors.push({\r
-                                                               borderColor: active._view.borderColor,\r
-                                                               backgroundColor: active._view.backgroundColor\r
-                                                       });\r
-                                               }\r
-                                       }, null);\r
+                               // If the user provided a sorting function, use it to modify the tooltip items\r
+                               if (opts.itemSort) {\r
+                                       tooltipItems = tooltipItems.sort(opts.itemSort);\r
+                               }\r
 \r
-                                       tooltipPosition = this.getAveragePosition(this._active);\r
+                               // If there is more than one item, show color items\r
+                               if (active.length > 1) {\r
+                                       helpers.each(tooltipItems, function(tooltipItem) {\r
+                                               labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, chartInstance));\r
+                                       });\r
                                }\r
 \r
                                // Build the Text Lines\r
-                               helpers.extend(this._model, {\r
-                                       title: this.getTitle(tooltipItems, this._data),\r
-                                       beforeBody: this.getBeforeBody(tooltipItems, this._data),\r
-                                       body: this.getBody(tooltipItems, this._data),\r
-                                       afterBody: this.getAfterBody(tooltipItems, this._data),\r
-                                       footer: this.getFooter(tooltipItems, this._data)\r
-                               });\r
-\r
-                               helpers.extend(this._model, {\r
+                               helpers.extend(model, {\r
+                                       title: me.getTitle(tooltipItems, data),\r
+                                       beforeBody: me.getBeforeBody(tooltipItems, data),\r
+                                       body: me.getBody(tooltipItems, data),\r
+                                       afterBody: me.getAfterBody(tooltipItems, data),\r
+                                       footer: me.getFooter(tooltipItems, data),\r
                                        x: Math.round(tooltipPosition.x),\r
                                        y: Math.round(tooltipPosition.y),\r
                                        caretPadding: helpers.getValueOrDefault(tooltipPosition.padding, 2),\r
@@ -11636,19 +11902,19 @@ module.exports = function(Chart) {
                                });\r
 \r
                                // We need to determine alignment of\r
-                               var tooltipSize = this.getTooltipSize(this._model);\r
-                               this.determineAlignment(tooltipSize); // Smart Tooltip placement to stay on the canvas\r
+                               var tooltipSize = me.getTooltipSize(model);\r
+                               me.determineAlignment(tooltipSize); // Smart Tooltip placement to stay on the canvas\r
 \r
-                               helpers.extend(this._model, this.getBackgroundPoint(this._model, tooltipSize));\r
+                               helpers.extend(model, me.getBackgroundPoint(model, tooltipSize));\r
                        } else {\r
-                               this._model.opacity = 0;\r
+                               me._model.opacity = 0;\r
                        }\r
 \r
-                       if (changed && this._options.tooltips.custom) {\r
-                               this._options.tooltips.custom.call(this, this._model);\r
+                       if (changed && opts.custom) {\r
+                               opts.custom.call(me, model);\r
                        }\r
 \r
-                       return this;\r
+                       return me;\r
                },\r
                getTooltipSize: function getTooltipSize(vm) {\r
                        var ctx = this._chart.ctx;\r
@@ -11657,54 +11923,81 @@ module.exports = function(Chart) {
                                height: vm.yPadding * 2, // Tooltip Padding\r
                                width: 0\r
                        };\r
-                       var combinedBodyLength = vm.body.length + vm.beforeBody.length + vm.afterBody.length;\r
 \r
-                       size.height += vm.title.length * vm.titleFontSize; // Title Lines\r
-                       size.height += (vm.title.length - 1) * vm.titleSpacing; // Title Line Spacing\r
-                       size.height += vm.title.length ? vm.titleMarginBottom : 0; // Title's bottom Margin\r
-                       size.height += combinedBodyLength * vm.bodyFontSize; // Body Lines\r
+                       // Count of all lines in the body\r
+                       var body = vm.body;\r
+                       var combinedBodyLength = body.reduce(function(count, bodyItem) {\r
+                               return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\r
+                       }, 0);\r
+                       combinedBodyLength += vm.beforeBody.length + vm.afterBody.length;\r
+\r
+                       var titleLineCount = vm.title.length;\r
+                       var footerLineCount = vm.footer.length;\r
+                       var titleFontSize = vm.titleFontSize,\r
+                               bodyFontSize = vm.bodyFontSize,\r
+                               footerFontSize = vm.footerFontSize;\r
+\r
+                       size.height += titleLineCount * titleFontSize; // Title Lines\r
+                       size.height += (titleLineCount - 1) * vm.titleSpacing; // Title Line Spacing\r
+                       size.height += titleLineCount ? vm.titleMarginBottom : 0; // Title's bottom Margin\r
+                       size.height += combinedBodyLength * bodyFontSize; // Body Lines\r
                        size.height += combinedBodyLength ? (combinedBodyLength - 1) * vm.bodySpacing : 0; // Body Line Spacing\r
-                       size.height += vm.footer.length ? vm.footerMarginTop : 0; // Footer Margin\r
-                       size.height += vm.footer.length * (vm.footerFontSize); // Footer Lines\r
-                       size.height += vm.footer.length ? (vm.footer.length - 1) * vm.footerSpacing : 0; // Footer Line Spacing\r
+                       size.height += footerLineCount ? vm.footerMarginTop : 0; // Footer Margin\r
+                       size.height += footerLineCount * (footerFontSize); // Footer Lines\r
+                       size.height += footerLineCount ? (footerLineCount - 1) * vm.footerSpacing : 0; // Footer Line Spacing\r
+\r
+                       // Title width\r
+                       var widthPadding = 0;\r
+                       var maxLineWidth = function(line) {\r
+                               size.width = Math.max(size.width, ctx.measureText(line).width + widthPadding);\r
+                       };\r
 \r
-                       // Width\r
-                       ctx.font = helpers.fontString(vm.titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\r
-                       helpers.each(vm.title, function(line) {\r
-                               size.width = Math.max(size.width, ctx.measureText(line).width);\r
-                       });\r
+                       ctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\r
+                       helpers.each(vm.title, maxLineWidth);\r
 \r
-                       ctx.font = helpers.fontString(vm.bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\r
-                       helpers.each(vm.beforeBody.concat(vm.afterBody), function(line) {\r
-                               size.width = Math.max(size.width, ctx.measureText(line).width);\r
-                       });\r
-                       helpers.each(vm.body, function(line) {\r
-                               size.width = Math.max(size.width, ctx.measureText(line).width + (this._options.tooltips.mode !== 'single' ? (vm.bodyFontSize + 2) : 0));\r
-                       }, this);\r
+                       // Body width\r
+                       ctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\r
+                       helpers.each(vm.beforeBody.concat(vm.afterBody), maxLineWidth);\r
 \r
-                       ctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\r
-                       helpers.each(vm.footer, function(line) {\r
-                               size.width = Math.max(size.width, ctx.measureText(line).width);\r
+                       // Body lines may include some extra width due to the color box\r
+                       widthPadding = body.length > 1 ? (bodyFontSize + 2) : 0;\r
+                       helpers.each(body, function(bodyItem) {\r
+                               helpers.each(bodyItem.before, maxLineWidth);\r
+                               helpers.each(bodyItem.lines, maxLineWidth);\r
+                               helpers.each(bodyItem.after, maxLineWidth);\r
                        });\r
+\r
+                       // Reset back to 0\r
+                       widthPadding = 0;\r
+\r
+                       // Footer width\r
+                       ctx.font = helpers.fontString(footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\r
+                       helpers.each(vm.footer, maxLineWidth);\r
+\r
+                       // Add padding\r
                        size.width += 2 * vm.xPadding;\r
 \r
                        return size;\r
                },\r
                determineAlignment: function determineAlignment(size) {\r
-                       if (this._model.y < size.height) {\r
-                               this._model.yAlign = 'top';\r
-                       } else if (this._model.y > (this._chart.height - size.height)) {\r
-                               this._model.yAlign = 'bottom';\r
+                       var me = this;\r
+                       var model = me._model;\r
+                       var chart = me._chart;\r
+                       var chartArea = me._chartInstance.chartArea;\r
+\r
+                       if (model.y < size.height) {\r
+                               model.yAlign = 'top';\r
+                       } else if (model.y > (chart.height - size.height)) {\r
+                               model.yAlign = 'bottom';\r
                        }\r
 \r
                        var lf, rf; // functions to determine left, right alignment\r
                        var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\r
                        var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\r
-                       var _this = this;\r
-                       var midX = (this._chartInstance.chartArea.left + this._chartInstance.chartArea.right) / 2;\r
-                       var midY = (this._chartInstance.chartArea.top + this._chartInstance.chartArea.bottom) / 2;\r
+                       var midX = (chartArea.left + chartArea.right) / 2;\r
+                       var midY = (chartArea.top + chartArea.bottom) / 2;\r
 \r
-                       if (this._model.yAlign === 'center') {\r
+                       if (model.yAlign === 'center') {\r
                                lf = function(x) {\r
                                        return x <= midX;\r
                                };\r
@@ -11716,12 +12009,12 @@ module.exports = function(Chart) {
                                        return x <= (size.width / 2);\r
                                };\r
                                rf = function(x) {\r
-                                       return x >= (_this._chart.width - (size.width / 2));\r
+                                       return x >= (chart.width - (size.width / 2));\r
                                };\r
                        }\r
 \r
                        olf = function(x) {\r
-                               return x + size.width > _this._chart.width;\r
+                               return x + size.width > chart.width;\r
                        };\r
                        orf = function(x) {\r
                                return x - size.width < 0;\r
@@ -11730,21 +12023,21 @@ module.exports = function(Chart) {
                                return y <= midY ? 'top' : 'bottom';\r
                        };\r
 \r
-                       if (lf(this._model.x)) {\r
-                               this._model.xAlign = 'left';\r
+                       if (lf(model.x)) {\r
+                               model.xAlign = 'left';\r
 \r
                                // Is tooltip too wide and goes over the right side of the chart.?\r
-                               if (olf(this._model.x)) {\r
-                                       this._model.xAlign = 'center';\r
-                                       this._model.yAlign = yf(this._model.y);\r
+                               if (olf(model.x)) {\r
+                                       model.xAlign = 'center';\r
+                                       model.yAlign = yf(model.y);\r
                                }\r
-                       } else if (rf(this._model.x)) {\r
-                               this._model.xAlign = 'right';\r
+                       } else if (rf(model.x)) {\r
+                               model.xAlign = 'right';\r
 \r
                                // Is tooltip too wide and goes outside left edge of canvas?\r
-                               if (orf(this._model.x)) {\r
-                                       this._model.xAlign = 'center';\r
-                                       this._model.yAlign = yf(this._model.y);\r
+                               if (orf(model.x)) {\r
+                                       model.xAlign = 'center';\r
+                                       model.yAlign = yf(model.y);\r
                                }\r
                        }\r
                },\r
@@ -11755,31 +12048,39 @@ module.exports = function(Chart) {
                                y: vm.y\r
                        };\r
 \r
-                       if (vm.xAlign === 'right') {\r
+                       var caretSize = vm.caretSize,\r
+                               caretPadding = vm.caretPadding,\r
+                               cornerRadius = vm.cornerRadius,\r
+                               xAlign = vm.xAlign,\r
+                               yAlign = vm.yAlign,\r
+                               paddingAndSize = caretSize + caretPadding,\r
+                               radiusAndPadding = cornerRadius + caretPadding;\r
+\r
+                       if (xAlign === 'right') {\r
                                pt.x -= size.width;\r
-                       } else if (vm.xAlign === 'center') {\r
+                       } else if (xAlign === 'center') {\r
                                pt.x -= (size.width / 2);\r
                        }\r
 \r
-                       if (vm.yAlign === 'top') {\r
-                               pt.y += vm.caretPadding + vm.caretSize;\r
-                       } else if (vm.yAlign === 'bottom') {\r
-                               pt.y -= size.height + vm.caretPadding + vm.caretSize;\r
+                       if (yAlign === 'top') {\r
+                               pt.y += paddingAndSize;\r
+                       } else if (yAlign === 'bottom') {\r
+                               pt.y -= size.height + paddingAndSize;\r
                        } else {\r
                                pt.y -= (size.height / 2);\r
                        }\r
 \r
-                       if (vm.yAlign === 'center') {\r
-                               if (vm.xAlign === 'left') {\r
-                                       pt.x += vm.caretPadding + vm.caretSize;\r
-                               } else if (vm.xAlign === 'right') {\r
-                                       pt.x -= vm.caretPadding + vm.caretSize;\r
+                       if (yAlign === 'center') {\r
+                               if (xAlign === 'left') {\r
+                                       pt.x += paddingAndSize;\r
+                               } else if (xAlign === 'right') {\r
+                                       pt.x -= paddingAndSize;\r
                                }\r
                        } else {\r
-                               if (vm.xAlign === 'left') {\r
-                                       pt.x -= vm.cornerRadius + vm.caretPadding;\r
-                               } else if (vm.xAlign === 'right') {\r
-                                       pt.x += vm.cornerRadius + vm.caretPadding;\r
+                               if (xAlign === 'left') {\r
+                                       pt.x -= radiusAndPadding;\r
+                               } else if (xAlign === 'right') {\r
+                                       pt.x += radiusAndPadding;\r
                                }\r
                        }\r
 \r
@@ -11790,44 +12091,52 @@ module.exports = function(Chart) {
                        var ctx = this._chart.ctx;\r
                        var x1, x2, x3;\r
                        var y1, y2, y3;\r
-\r
-                       if (vm.yAlign === 'center') {\r
+                       var caretSize = vm.caretSize;\r
+                       var cornerRadius = vm.cornerRadius;\r
+                       var xAlign = vm.xAlign,\r
+                               yAlign = vm.yAlign;\r
+                       var ptX = tooltipPoint.x,\r
+                               ptY = tooltipPoint.y;\r
+                       var width = size.width,\r
+                               height = size.height;\r
+\r
+                       if (yAlign === 'center') {\r
                                // Left or right side\r
-                               if (vm.xAlign === 'left') {\r
-                                       x1 = tooltipPoint.x;\r
-                                       x2 = x1 - vm.caretSize;\r
+                               if (xAlign === 'left') {\r
+                                       x1 = ptX;\r
+                                       x2 = x1 - caretSize;\r
                                        x3 = x1;\r
                                } else {\r
-                                       x1 = tooltipPoint.x + size.width;\r
-                                       x2 = x1 + vm.caretSize;\r
+                                       x1 = ptX + width;\r
+                                       x2 = x1 + caretSize;\r
                                        x3 = x1;\r
                                }\r
 \r
-                               y2 = tooltipPoint.y + (size.height / 2);\r
-                               y1 = y2 - vm.caretSize;\r
-                               y3 = y2 + vm.caretSize;\r
+                               y2 = ptY + (height / 2);\r
+                               y1 = y2 - caretSize;\r
+                               y3 = y2 + caretSize;\r
                        } else {\r
-                               if (vm.xAlign === 'left') {\r
-                                       x1 = tooltipPoint.x + vm.cornerRadius;\r
-                                       x2 = x1 + vm.caretSize;\r
-                                       x3 = x2 + vm.caretSize;\r
-                               } else if (vm.xAlign === 'right') {\r
-                                       x1 = tooltipPoint.x + size.width - vm.cornerRadius;\r
-                                       x2 = x1 - vm.caretSize;\r
-                                       x3 = x2 - vm.caretSize;\r
+                               if (xAlign === 'left') {\r
+                                       x1 = ptX + cornerRadius;\r
+                                       x2 = x1 + caretSize;\r
+                                       x3 = x2 + caretSize;\r
+                               } else if (xAlign === 'right') {\r
+                                       x1 = ptX + width - cornerRadius;\r
+                                       x2 = x1 - caretSize;\r
+                                       x3 = x2 - caretSize;\r
                                } else {\r
-                                       x2 = tooltipPoint.x + (size.width / 2);\r
-                                       x1 = x2 - vm.caretSize;\r
-                                       x3 = x2 + vm.caretSize;\r
+                                       x2 = ptX + (width / 2);\r
+                                       x1 = x2 - caretSize;\r
+                                       x3 = x2 + caretSize;\r
                                }\r
 \r
-                               if (vm.yAlign === 'top') {\r
-                                       y1 = tooltipPoint.y;\r
-                                       y2 = y1 - vm.caretSize;\r
+                               if (yAlign === 'top') {\r
+                                       y1 = ptY;\r
+                                       y2 = y1 - caretSize;\r
                                        y3 = y1;\r
                                } else {\r
-                                       y1 = tooltipPoint.y + size.height;\r
-                                       y2 = y1 + vm.caretSize;\r
+                                       y1 = ptY + height;\r
+                                       y2 = y1 + caretSize;\r
                                        y3 = y1;\r
                                }\r
                        }\r
@@ -11842,83 +12151,106 @@ module.exports = function(Chart) {
                        ctx.fill();\r
                },\r
                drawTitle: function drawTitle(pt, vm, ctx, opacity) {\r
-                       if (vm.title.length) {\r
+                       var title = vm.title;\r
+\r
+                       if (title.length) {\r
                                ctx.textAlign = vm._titleAlign;\r
                                ctx.textBaseline = "top";\r
 \r
-                               var titleColor = helpers.color(vm.titleColor);\r
-                               ctx.fillStyle = titleColor.alpha(opacity * titleColor.alpha()).rgbString();\r
-                               ctx.font = helpers.fontString(vm.titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\r
+                               var titleFontSize = vm.titleFontSize,\r
+                                       titleSpacing = vm.titleSpacing;\r
+\r
+                               var titleFontColor = helpers.color(vm.titleFontColor);\r
+                               ctx.fillStyle = titleFontColor.alpha(opacity * titleFontColor.alpha()).rgbString();\r
+                               ctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\r
 \r
-                               helpers.each(vm.title, function(title, i) {\r
-                                       ctx.fillText(title, pt.x, pt.y);\r
-                                       pt.y += vm.titleFontSize + vm.titleSpacing; // Line Height and spacing\r
+                               var i, len;\r
+                               for (i = 0, len = title.length; i < len; ++i) {\r
+                                       ctx.fillText(title[i], pt.x, pt.y);\r
+                                       pt.y += titleFontSize + titleSpacing; // Line Height and spacing\r
 \r
-                                       if (i + 1 === vm.title.length) {\r
-                                               pt.y += vm.titleMarginBottom - vm.titleSpacing; // If Last, add margin, remove spacing\r
+                                       if (i + 1 === title.length) {\r
+                                               pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\r
                                        }\r
-                               });\r
+                               }\r
                        }\r
                },\r
                drawBody: function drawBody(pt, vm, ctx, opacity) {\r
+                       var bodyFontSize = vm.bodyFontSize;\r
+                       var bodySpacing = vm.bodySpacing;\r
+                       var body = vm.body;\r
+\r
                        ctx.textAlign = vm._bodyAlign;\r
                        ctx.textBaseline = "top";\r
 \r
-                       var bodyColor = helpers.color(vm.bodyColor);\r
-                       ctx.fillStyle = bodyColor.alpha(opacity * bodyColor.alpha()).rgbString();\r
-                       ctx.font = helpers.fontString(vm.bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\r
+                       var bodyFontColor = helpers.color(vm.bodyFontColor);\r
+                       var textColor = bodyFontColor.alpha(opacity * bodyFontColor.alpha()).rgbString();\r
+                       ctx.fillStyle = textColor;\r
+                       ctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\r
 \r
                        // Before Body\r
-                       helpers.each(vm.beforeBody, function(beforeBody) {\r
-                               ctx.fillText(beforeBody, pt.x, pt.y);\r
-                               pt.y += vm.bodyFontSize + vm.bodySpacing;\r
-                       });\r
+                       var xLinePadding = 0;\r
+                       var fillLineOfText = function(line) {\r
+                               ctx.fillText(line, pt.x + xLinePadding, pt.y);\r
+                               pt.y += bodyFontSize + bodySpacing;\r
+                       };\r
 \r
-                       helpers.each(vm.body, function(body, i) {\r
-                               // Draw Legend-like boxes if needed\r
-                               if (this._options.tooltips.mode !== 'single') {\r
-                                       // Fill a white rect so that colours merge nicely if the opacity is < 1\r
-                                       ctx.fillStyle = helpers.color(vm.legendColorBackground).alpha(opacity).rgbaString();\r
-                                       ctx.fillRect(pt.x, pt.y, vm.bodyFontSize, vm.bodyFontSize);\r
+                       // Before body lines\r
+                       helpers.each(vm.beforeBody, fillLineOfText);\r
 \r
-                                       // Border\r
-                                       ctx.strokeStyle = helpers.color(vm.labelColors[i].borderColor).alpha(opacity).rgbaString();\r
-                                       ctx.strokeRect(pt.x, pt.y, vm.bodyFontSize, vm.bodyFontSize);\r
+                       var drawColorBoxes = body.length > 1;\r
+                       xLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0;\r
 \r
-                                       // Inner square\r
-                                       ctx.fillStyle = helpers.color(vm.labelColors[i].backgroundColor).alpha(opacity).rgbaString();\r
-                                       ctx.fillRect(pt.x + 1, pt.y + 1, vm.bodyFontSize - 2, vm.bodyFontSize - 2);\r
+                       // Draw body lines now\r
+                       helpers.each(body, function(bodyItem, i) {\r
+                               helpers.each(bodyItem.before, fillLineOfText);\r
 \r
-                                       ctx.fillStyle = helpers.color(vm.bodyColor).alpha(opacity).rgbaString(); // Return fill style for text\r
-                               }\r
+                               helpers.each(bodyItem.lines, function(line) {\r
+                                       // Draw Legend-like boxes if needed\r
+                                       if (drawColorBoxes) {\r
+                                               // Fill a white rect so that colours merge nicely if the opacity is < 1\r
+                                               ctx.fillStyle = helpers.color(vm.legendColorBackground).alpha(opacity).rgbaString();\r
+                                               ctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\r
+\r
+                                               // Border\r
+                                               ctx.strokeStyle = helpers.color(vm.labelColors[i].borderColor).alpha(opacity).rgbaString();\r
+                                               ctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\r
 \r
-                               // Body Line\r
-                               ctx.fillText(body, pt.x + (this._options.tooltips.mode !== 'single' ? (vm.bodyFontSize + 2) : 0), pt.y);\r
+                                               // Inner square\r
+                                               ctx.fillStyle = helpers.color(vm.labelColors[i].backgroundColor).alpha(opacity).rgbaString();\r
+                                               ctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\r
 \r
-                               pt.y += vm.bodyFontSize + vm.bodySpacing;\r
-                       }, this);\r
+                                               ctx.fillStyle = textColor;\r
+                                       }\r
 \r
-                       // After Body\r
-                       helpers.each(vm.afterBody, function(afterBody) {\r
-                               ctx.fillText(afterBody, pt.x, pt.y);\r
-                               pt.y += vm.bodyFontSize;\r
+                                       fillLineOfText(line);\r
+                               });\r
+\r
+                               helpers.each(bodyItem.after, fillLineOfText);\r
                        });\r
 \r
-                       pt.y -= vm.bodySpacing; // Remove last body spacing\r
+                       // Reset back to 0 for after body\r
+                       xLinePadding = 0;\r
+\r
+                       // After body lines\r
+                       helpers.each(vm.afterBody, fillLineOfText);\r
+                       pt.y -= bodySpacing; // Remove last body spacing\r
                },\r
                drawFooter: function drawFooter(pt, vm, ctx, opacity) {\r
-                       if (vm.footer.length) {\r
+                       var footer = vm.footer;\r
+\r
+                       if (footer.length) {\r
                                pt.y += vm.footerMarginTop;\r
 \r
                                ctx.textAlign = vm._footerAlign;\r
                                ctx.textBaseline = "top";\r
 \r
-                               var footerColor = helpers.color(vm.footerColor);\r
-                               ctx.fillStyle = footerColor.alpha(opacity * footerColor.alpha()).rgbString();\r
+                               var footerFontColor = helpers.color(vm.footerFontColor);\r
+                               ctx.fillStyle = footerFontColor.alpha(opacity * footerFontColor.alpha()).rgbString();\r
                                ctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\r
 \r
-                               helpers.each(vm.footer, function(footer) {\r
-                                       ctx.fillText(footer, pt.x, pt.y);\r
+                               helpers.each(footer, function(line) {\r
+                                       ctx.fillText(line, pt.x, pt.y);\r
                                        pt.y += vm.footerFontSize + vm.footerSpacing;\r
                                });\r
                        }\r
@@ -11931,7 +12263,6 @@ module.exports = function(Chart) {
                                return;\r
                        }\r
 \r
-                       var caretPadding = vm.caretPadding;\r
                        var tooltipSize = this.getTooltipSize(vm);\r
                        var pt = {\r
                                x: vm.x,\r
@@ -11941,7 +12272,7 @@ module.exports = function(Chart) {
                        // IE11/Edge does not like very small opacities, so snap to 0\r
                        var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\r
 \r
-                       if (this._options.tooltips.enabled) {\r
+                       if (this._options.enabled) {\r
                                // Draw Background\r
                                var bgColor = helpers.color(vm.backgroundColor);\r
                                ctx.fillStyle = bgColor.alpha(opacity * bgColor.alpha()).rgbString();\r
@@ -11949,7 +12280,7 @@ module.exports = function(Chart) {
                                ctx.fill();\r
 \r
                                // Draw Caret\r
-                               this.drawCaret(pt, tooltipSize, opacity, caretPadding);\r
+                               this.drawCaret(pt, tooltipSize, opacity, vm.caretPadding);\r
 \r
                                // Draw Title, Body, and Footer\r
                                pt.x += vm.xPadding;\r
@@ -12085,12 +12416,14 @@ module.exports = function(Chart) {
 \r
        Chart.elements.Line = Chart.Element.extend({\r
                lineToNextPoint: function(previousPoint, point, nextPoint, skipHandler, previousSkipHandler) {\r
-                       var ctx = this._chart.ctx;\r
+                       var me = this;\r
+                       var ctx = me._chart.ctx;\r
+                       var spanGaps = me._view ? me._view.spanGaps : false;\r
 \r
-                       if (point._view.skip) {\r
-                               skipHandler.call(this, previousPoint, point, nextPoint);\r
-                       } else if (previousPoint._view.skip) {\r
-                               previousSkipHandler.call(this, previousPoint, point, nextPoint);\r
+                       if (point._view.skip && !spanGaps) {\r
+                               skipHandler.call(me, previousPoint, point, nextPoint);\r
+                       } else if (previousPoint._view.skip && !spanGaps) {\r
+                               previousSkipHandler.call(me, previousPoint, point, nextPoint);\r
                        } else if (point._view.tension === 0) {\r
                                ctx.lineTo(point._view.x, point._view.y);\r
                        } else {\r
@@ -12107,12 +12440,12 @@ module.exports = function(Chart) {
                },\r
 \r
                draw: function() {\r
-                       var _this = this;\r
+                       var me = this;\r
 \r
-                       var vm = this._view;\r
-                       var ctx = this._chart.ctx;\r
-                       var first = this._children[0];\r
-                       var last = this._children[this._children.length - 1];\r
+                       var vm = me._view;\r
+                       var ctx = me._chart.ctx;\r
+                       var first = me._children[0];\r
+                       var last = me._children[me._children.length - 1];\r
 \r
                        function loopBackToStart(drawLineToCenter) {\r
                                if (!first._view.skip && !last._view.skip) {\r
@@ -12127,59 +12460,59 @@ module.exports = function(Chart) {
                                        );\r
                                } else if (drawLineToCenter) {\r
                                        // Go to center\r
-                                       ctx.lineTo(_this._view.scaleZero.x, _this._view.scaleZero.y);\r
+                                       ctx.lineTo(me._view.scaleZero.x, me._view.scaleZero.y);\r
                                }\r
                        }\r
 \r
                        ctx.save();\r
 \r
                        // If we had points and want to fill this line, do so.\r
-                       if (this._children.length > 0 && vm.fill) {\r
+                       if (me._children.length > 0 && vm.fill) {\r
                                // Draw the background first (so the border is always on top)\r
                                ctx.beginPath();\r
 \r
-                               helpers.each(this._children, function(point, index) {\r
-                                       var previous = helpers.previousItem(this._children, index);\r
-                                       var next = helpers.nextItem(this._children, index);\r
+                               helpers.each(me._children, function(point, index) {\r
+                                       var previous = helpers.previousItem(me._children, index);\r
+                                       var next = helpers.nextItem(me._children, index);\r
 \r
                                        // First point moves to it's starting position no matter what\r
                                        if (index === 0) {\r
-                                               if (this._loop) {\r
+                                               if (me._loop) {\r
                                                        ctx.moveTo(vm.scaleZero.x, vm.scaleZero.y);\r
                                                } else {\r
                                                        ctx.moveTo(point._view.x, vm.scaleZero);\r
                                                }\r
 \r
                                                if (point._view.skip) {\r
-                                                       if (!this._loop) {\r
-                                                               ctx.moveTo(next._view.x, this._view.scaleZero);\r
+                                                       if (!me._loop) {\r
+                                                               ctx.moveTo(next._view.x, me._view.scaleZero);\r
                                                        }\r
                                                } else {\r
                                                        ctx.lineTo(point._view.x, point._view.y);\r
                                                }\r
                                        } else {\r
-                                               this.lineToNextPoint(previous, point, next, function(previousPoint, point, nextPoint) {\r
-                                                       if (this._loop) {\r
+                                               me.lineToNextPoint(previous, point, next, function(previousPoint, point, nextPoint) {\r
+                                                       if (me._loop) {\r
                                                                // Go to center\r
-                                                               ctx.lineTo(this._view.scaleZero.x, this._view.scaleZero.y);\r
+                                                               ctx.lineTo(me._view.scaleZero.x, me._view.scaleZero.y);\r
                                                        } else {\r
-                                                               ctx.lineTo(previousPoint._view.x, this._view.scaleZero);\r
-                                                               ctx.moveTo(nextPoint._view.x, this._view.scaleZero);\r
+                                                               ctx.lineTo(previousPoint._view.x, me._view.scaleZero);\r
+                                                               ctx.moveTo(nextPoint._view.x, me._view.scaleZero);\r
                                                        }\r
                                                }, function(previousPoint, point) {\r
                                                        // If we skipped the last point, draw a line to ourselves so that the fill is nice\r
                                                        ctx.lineTo(point._view.x, point._view.y);\r
                                                });\r
                                        }\r
-                               }, this);\r
+                               }, me);\r
 \r
                                // For radial scales, loop back around to the first point\r
-                               if (this._loop) {\r
+                               if (me._loop) {\r
                                        loopBackToStart(true);\r
                                } else {\r
                                        //Round off the line by going to the base of the chart, back to the start, then fill.\r
-                                       ctx.lineTo(this._children[this._children.length - 1]._view.x, vm.scaleZero);\r
-                                       ctx.lineTo(this._children[0]._view.x, vm.scaleZero);\r
+                                       ctx.lineTo(me._children[me._children.length - 1]._view.x, vm.scaleZero);\r
+                                       ctx.lineTo(me._children[0]._view.x, vm.scaleZero);\r
                                }\r
 \r
                                ctx.fillStyle = vm.backgroundColor || globalDefaults.defaultColor;\r
@@ -12202,23 +12535,23 @@ module.exports = function(Chart) {
                        ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\r
                        ctx.beginPath();\r
 \r
-                       helpers.each(this._children, function(point, index) {\r
-                               var previous = helpers.previousItem(this._children, index);\r
-                               var next = helpers.nextItem(this._children, index);\r
+                       helpers.each(me._children, function(point, index) {\r
+                               var previous = helpers.previousItem(me._children, index);\r
+                               var next = helpers.nextItem(me._children, index);\r
 \r
                                if (index === 0) {\r
                                        ctx.moveTo(point._view.x, point._view.y);\r
                                } else {\r
-                                       this.lineToNextPoint(previous, point, next, function(previousPoint, point, nextPoint) {\r
+                                       me.lineToNextPoint(previous, point, next, function(previousPoint, point, nextPoint) {\r
                                                ctx.moveTo(nextPoint._view.x, nextPoint._view.y);\r
                                        }, function(previousPoint, point) {\r
                                                // If we skipped the last point, move up to our point preventing a line from being drawn\r
                                                ctx.moveTo(point._view.x, point._view.y);\r
                                        });\r
                                }\r
-                       }, this);\r
+                       }, me);\r
 \r
-                       if (this._loop && this._children.length > 0) {\r
+                       if (me._loop && me._children.length > 0) {\r
                                loopBackToStart();\r
                        }\r
 \r
@@ -12318,12 +12651,14 @@ module.exports = function(Chart) {
                                ctx.strokeRect(x - size, y - size, 2 * size, 2 * size);\r
                                break;\r
                        case 'rectRot':\r
-                               ctx.translate(x, y);\r
-                               ctx.rotate(Math.PI / 4);\r
                                size = 1 / Math.SQRT2 * radius;\r
-                               ctx.fillRect(-size, -size, 2 * size, 2 * size);\r
-                               ctx.strokeRect(-size, -size, 2 * size, 2 * size);\r
-                               ctx.setTransform(1, 0, 0, 1, 0, 0);\r
+                               ctx.beginPath();\r
+                               ctx.moveTo(x - size, y);\r
+                               ctx.lineTo(x, y + size);\r
+                               ctx.lineTo(x + size, y);\r
+                               ctx.lineTo(x, y - size);\r
+                               ctx.closePath();\r
+                               ctx.fill();\r
                                break;\r
                        case 'cross':\r
                                ctx.beginPath();\r
@@ -12485,29 +12820,31 @@ module.exports = function(Chart) {
        var DatasetScale = Chart.Scale.extend({\r
                // Implement this so that \r
                determineDataLimits: function() {\r
-                       this.minIndex = 0;\r
-                       this.maxIndex = this.chart.data.labels.length - 1;\r
+                       var me = this;\r
+                       me.minIndex = 0;\r
+                       me.maxIndex = me.chart.data.labels.length - 1;\r
                        var findIndex;\r
 \r
-                       if (this.options.ticks.min !== undefined) {\r
+                       if (me.options.ticks.min !== undefined) {\r
                                // user specified min value\r
-                               findIndex = helpers.indexOf(this.chart.data.labels, this.options.ticks.min);\r
-                               this.minIndex = findIndex !== -1 ? findIndex : this.minIndex;\r
+                               findIndex = helpers.indexOf(me.chart.data.labels, me.options.ticks.min);\r
+                               me.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\r
                        }\r
 \r
-                       if (this.options.ticks.max !== undefined) {\r
+                       if (me.options.ticks.max !== undefined) {\r
                                // user specified max value\r
-                               findIndex = helpers.indexOf(this.chart.data.labels, this.options.ticks.max);\r
-                               this.maxIndex = findIndex !== -1 ? findIndex : this.maxIndex;\r
+                               findIndex = helpers.indexOf(me.chart.data.labels, me.options.ticks.max);\r
+                               me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\r
                        }\r
 \r
-                       this.min = this.chart.data.labels[this.minIndex];\r
-                       this.max = this.chart.data.labels[this.maxIndex];\r
+                       me.min = me.chart.data.labels[me.minIndex];\r
+                       me.max = me.chart.data.labels[me.maxIndex];\r
                },\r
 \r
                buildTicks: function(index) {\r
+                       var me = this;\r
                        // If we are viewing some subset of labels, slice the original array\r
-                       this.ticks = (this.minIndex === 0 && this.maxIndex === this.chart.data.labels.length - 1) ? this.chart.data.labels : this.chart.data.labels.slice(this.minIndex, this.maxIndex + 1);\r
+                       me.ticks = (me.minIndex === 0 && me.maxIndex === me.chart.data.labels.length - 1) ? me.chart.data.labels : me.chart.data.labels.slice(me.minIndex, me.maxIndex + 1);\r
                },\r
 \r
                getLabelForIndex: function(index, datasetIndex) {\r
@@ -12516,45 +12853,47 @@ module.exports = function(Chart) {
 \r
                // Used to get data value locations.  Value can either be an index or a numerical value\r
                getPixelForValue: function(value, index, datasetIndex, includeOffset) {\r
+                       var me = this;\r
                        // 1 is added because we need the length but we have the indexes\r
-                       var offsetAmt = Math.max((this.maxIndex + 1 - this.minIndex - ((this.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\r
+                       var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\r
 \r
-                       if (this.isHorizontal()) {\r
-                               var innerWidth = this.width - (this.paddingLeft + this.paddingRight);\r
+                       if (me.isHorizontal()) {\r
+                               var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\r
                                var valueWidth = innerWidth / offsetAmt;\r
-                               var widthOffset = (valueWidth * (index - this.minIndex)) + this.paddingLeft;\r
+                               var widthOffset = (valueWidth * (index - me.minIndex)) + me.paddingLeft;\r
 \r
-                               if (this.options.gridLines.offsetGridLines && includeOffset) {\r
+                               if (me.options.gridLines.offsetGridLines && includeOffset) {\r
                                        widthOffset += (valueWidth / 2);\r
                                }\r
 \r
-                               return this.left + Math.round(widthOffset);\r
+                               return me.left + Math.round(widthOffset);\r
                        } else {\r
-                               var innerHeight = this.height - (this.paddingTop + this.paddingBottom);\r
+                               var innerHeight = me.height - (me.paddingTop + me.paddingBottom);\r
                                var valueHeight = innerHeight / offsetAmt;\r
-                               var heightOffset = (valueHeight * (index - this.minIndex)) + this.paddingTop;\r
+                               var heightOffset = (valueHeight * (index - me.minIndex)) + me.paddingTop;\r
 \r
-                               if (this.options.gridLines.offsetGridLines && includeOffset) {\r
+                               if (me.options.gridLines.offsetGridLines && includeOffset) {\r
                                        heightOffset += (valueHeight / 2);\r
                                }\r
 \r
-                               return this.top + Math.round(heightOffset);\r
+                               return me.top + Math.round(heightOffset);\r
                        }\r
                },\r
                getPixelForTick: function(index, includeOffset) {\r
                        return this.getPixelForValue(this.ticks[index], index + this.minIndex, null, includeOffset);\r
                },\r
                getValueForPixel: function(pixel) {\r
-                       var value\r
-;                      var offsetAmt = Math.max((this.ticks.length - ((this.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\r
-                       var horz = this.isHorizontal();\r
-                       var innerDimension = horz ? this.width - (this.paddingLeft + this.paddingRight) : this.height - (this.paddingTop + this.paddingBottom);\r
+                       var me = this;\r
+                       var value;\r
+                       var offsetAmt = Math.max((me.ticks.length - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\r
+                       var horz = me.isHorizontal();\r
+                       var innerDimension = horz ? me.width - (me.paddingLeft + me.paddingRight) : me.height - (me.paddingTop + me.paddingBottom);\r
                        var valueDimension = innerDimension / offsetAmt;\r
 \r
-                       if (this.options.gridLines.offsetGridLines) {\r
+                       if (me.options.gridLines.offsetGridLines) {\r
                                pixel -= (valueDimension / 2);\r
                        }\r
-                       pixel -= horz ? this.paddingLeft : this.paddingTop;\r
+                       pixel -= horz ? me.paddingLeft : me.paddingTop;\r
 \r
                        if (pixel <= 0) {\r
                                value = 0;\r
@@ -12607,23 +12946,23 @@ module.exports = function(Chart) {
                }\r
        };\r
 \r
-       var LinearScale = Chart.Scale.extend({\r
+       var LinearScale = Chart.LinearScaleBase.extend({\r
                determineDataLimits: function() {\r
-                       var _this = this;\r
-                       var opts = _this.options;\r
+                       var me = this;\r
+                       var opts = me.options;\r
                        var tickOpts = opts.ticks;\r
-                       var chart = _this.chart;\r
+                       var chart = me.chart;\r
                        var data = chart.data;\r
                        var datasets = data.datasets;\r
-                       var isHorizontal = _this.isHorizontal();\r
+                       var isHorizontal = me.isHorizontal();\r
 \r
                        function IDMatches(meta) {\r
-                               return isHorizontal ? meta.xAxisID === _this.id : meta.yAxisID === _this.id;\r
+                               return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\r
                        }\r
 \r
                        // First Calculate the range\r
-                       _this.min = null;\r
-                       _this.max = null;\r
+                       me.min = null;\r
+                       me.max = null;\r
 \r
                        if (opts.stacked) {\r
                                var valuesPerType = {};\r
@@ -12645,7 +12984,7 @@ module.exports = function(Chart) {
 \r
                                        if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\r
                                                helpers.each(dataset.data, function(rawValue, index) {\r
-                                                       var value = +_this.getRightValue(rawValue);\r
+                                                       var value = +me.getRightValue(rawValue);\r
                                                        if (isNaN(value) || meta.data[index].hidden) {\r
                                                                return;\r
                                                        }\r
@@ -12672,8 +13011,8 @@ module.exports = function(Chart) {
                                        var values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\r
                                        var minVal = helpers.min(values);\r
                                        var maxVal = helpers.max(values);\r
-                                       _this.min = _this.min === null ? minVal : Math.min(_this.min, minVal);\r
-                                       _this.max = _this.max === null ? maxVal : Math.max(_this.max, maxVal);\r
+                                       me.min = me.min === null ? minVal : Math.min(me.min, minVal);\r
+                                       me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\r
                                });\r
 \r
                        } else {\r
@@ -12681,86 +13020,163 @@ module.exports = function(Chart) {
                                        var meta = chart.getDatasetMeta(datasetIndex);\r
                                        if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\r
                                                helpers.each(dataset.data, function(rawValue, index) {\r
-                                                       var value = +_this.getRightValue(rawValue);\r
+                                                       var value = +me.getRightValue(rawValue);\r
                                                        if (isNaN(value) || meta.data[index].hidden) {\r
                                                                return;\r
                                                        }\r
 \r
-                                                       if (_this.min === null) {\r
-                                                               _this.min = value;\r
-                                                       } else if (value < _this.min) {\r
-                                                               _this.min = value;\r
+                                                       if (me.min === null) {\r
+                                                               me.min = value;\r
+                                                       } else if (value < me.min) {\r
+                                                               me.min = value;\r
                                                        }\r
 \r
-                                                       if (_this.max === null) {\r
-                                                               _this.max = value;\r
-                                                       } else if (value > _this.max) {\r
-                                                               _this.max = value;\r
+                                                       if (me.max === null) {\r
+                                                               me.max = value;\r
+                                                       } else if (value > me.max) {\r
+                                                               me.max = value;\r
                                                        }\r
                                                });\r
                                        }\r
                                });\r
                        }\r
 \r
+                       // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\r
+                       this.handleTickRangeOptions();\r
+               },\r
+               getTickLimit: function() {\r
+                       var maxTicks;\r
+                       var me = this;\r
+                       var tickOpts = me.options.ticks;\r
+\r
+                       if (me.isHorizontal()) {\r
+                               maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));\r
+                       } else {\r
+                               // The factor of 2 used to scale the font size has been experimentally determined.\r
+                               var tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, Chart.defaults.global.defaultFontSize);\r
+                               maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));\r
+                       }\r
+\r
+                       return maxTicks;\r
+               },\r
+               // Called after the ticks are built. We need \r
+               handleDirectionalChanges: function() {\r
+                       if (!this.isHorizontal()) {\r
+                               // We are in a vertical orientation. The top value is the highest. So reverse the array\r
+                               this.ticks.reverse();\r
+                       }\r
+               },\r
+               getLabelForIndex: function(index, datasetIndex) {\r
+                       return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\r
+               },\r
+               // Utils\r
+               getPixelForValue: function(value, index, datasetIndex, includeOffset) {\r
+                       // This must be called after fit has been run so that\r
+                       //      this.left, this.top, this.right, and this.bottom have been defined\r
+                       var me = this;\r
+                       var paddingLeft = me.paddingLeft;\r
+                       var paddingBottom = me.paddingBottom;\r
+                       var start = me.start;\r
+\r
+                       var rightValue = +me.getRightValue(value);\r
+                       var pixel;\r
+                       var innerDimension;\r
+                       var range = me.end - start;\r
+\r
+                       if (me.isHorizontal()) {\r
+                               innerDimension = me.width - (paddingLeft + me.paddingRight);\r
+                               pixel = me.left + (innerDimension / range * (rightValue - start));\r
+                               return Math.round(pixel + paddingLeft);\r
+                       } else {\r
+                               innerDimension = me.height - (me.paddingTop + paddingBottom);\r
+                               pixel = (me.bottom - paddingBottom) - (innerDimension / range * (rightValue - start));\r
+                               return Math.round(pixel);\r
+                       }\r
+               },\r
+               getValueForPixel: function(pixel) {\r
+                       var me = this;\r
+                       var isHorizontal = me.isHorizontal();\r
+                       var paddingLeft = me.paddingLeft;\r
+                       var paddingBottom = me.paddingBottom;\r
+                       var innerDimension = isHorizontal ? me.width - (paddingLeft + me.paddingRight) : me.height - (me.paddingTop + paddingBottom);\r
+                       var offset = (isHorizontal ? pixel - me.left - paddingLeft : me.bottom - paddingBottom - pixel) / innerDimension;\r
+                       return me.start + ((me.end - me.start) * offset);\r
+               },\r
+               getPixelForTick: function(index, includeOffset) {\r
+                       return this.getPixelForValue(this.ticksAsNumbers[index], null, null, includeOffset);\r
+               }\r
+       });\r
+       Chart.scaleService.registerScaleType("linear", LinearScale, defaultConfig);\r
+\r
+};
+},{}],40:[function(require,module,exports){
+"use strict";\r
+\r
+module.exports = function(Chart) {\r
+\r
+       var helpers = Chart.helpers,\r
+               noop = helpers.noop;\r
+\r
+       Chart.LinearScaleBase = Chart.Scale.extend({\r
+               handleTickRangeOptions: function() {\r
+                       var me = this;\r
+                       var opts = me.options;\r
+                       var tickOpts = opts.ticks;\r
+\r
                        // If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\r
                        // do nothing since that would make the chart weird. If the user really wants a weird chart\r
                        // axis, they can manually override it\r
                        if (tickOpts.beginAtZero) {\r
-                               var minSign = helpers.sign(_this.min);\r
-                               var maxSign = helpers.sign(_this.max);\r
+                               var minSign = helpers.sign(me.min);\r
+                               var maxSign = helpers.sign(me.max);\r
 \r
                                if (minSign < 0 && maxSign < 0) {\r
                                        // move the top up to 0\r
-                                       _this.max = 0;\r
+                                       me.max = 0;\r
                                } else if (minSign > 0 && maxSign > 0) {\r
                                        // move the botttom down to 0\r
-                                       _this.min = 0;\r
+                                       me.min = 0;\r
                                }\r
                        }\r
 \r
                        if (tickOpts.min !== undefined) {\r
-                               _this.min = tickOpts.min;\r
+                               me.min = tickOpts.min;\r
                        } else if (tickOpts.suggestedMin !== undefined) {\r
-                               _this.min = Math.min(_this.min, tickOpts.suggestedMin);\r
+                               me.min = Math.min(me.min, tickOpts.suggestedMin);\r
                        }\r
 \r
                        if (tickOpts.max !== undefined) {\r
-                               _this.max = tickOpts.max;\r
+                               me.max = tickOpts.max;\r
                        } else if (tickOpts.suggestedMax !== undefined) {\r
-                               _this.max = Math.max(_this.max, tickOpts.suggestedMax);\r
+                               me.max = Math.max(me.max, tickOpts.suggestedMax);\r
                        }\r
 \r
-                       if (_this.min === _this.max) {\r
-                               _this.max++;\r
+                       if (me.min === me.max) {\r
+                               me.max++;\r
 \r
                                if (!tickOpts.beginAtZero) {\r
-                                       _this.min--;\r
+                                       me.min--;\r
                                }\r
                        }\r
                },\r
+               getTickLimit: noop,\r
+               handleDirectionalChanges: noop,\r
+\r
                buildTicks: function() {\r
-                       var _this = this;\r
-                       var opts = _this.options;\r
+                       var me = this;\r
+                       var opts = me.options;\r
                        var tickOpts = opts.ticks;\r
                        var getValueOrDefault = helpers.getValueOrDefault;\r
-                       var isHorizontal = _this.isHorizontal();\r
+                       var isHorizontal = me.isHorizontal();\r
 \r
-                       var ticks = _this.ticks = [];\r
+                       var ticks = me.ticks = [];\r
 \r
                        // Figure out what the max number of ticks we can support it is based on the size of\r
                        // the axis area. For now, we say that the minimum tick spacing in pixels must be 50\r
                        // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\r
                        // the graph\r
 \r
-                       var maxTicks;\r
-\r
-                       if (isHorizontal) {\r
-                               maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(_this.width / 50));\r
-                       } else {\r
-                               // The factor of 2 used to scale the font size has been experimentally determined.\r
-                               var tickFontSize = getValueOrDefault(tickOpts.fontSize, Chart.defaults.global.defaultFontSize);\r
-                               maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(_this.height / (2 * tickFontSize)));\r
-                       }\r
+                       var maxTicks = me.getTickLimit();\r
 \r
                        // Make sure we always have at least 2 ticks\r
                        maxTicks = Math.max(2, maxTicks);\r
@@ -12774,11 +13190,11 @@ module.exports = function(Chart) {
                        if (fixedStepSizeSet) {\r
                                spacing = getValueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize);\r
                        } else {\r
-                               var niceRange = helpers.niceNum(_this.max - _this.min, false);\r
+                               var niceRange = helpers.niceNum(me.max - me.min, false);\r
                                spacing = helpers.niceNum(niceRange / (maxTicks - 1), true);\r
                        }\r
-                       var niceMin = Math.floor(_this.min / spacing) * spacing;\r
-                       var niceMax = Math.ceil(_this.max / spacing) * spacing;\r
+                       var niceMin = Math.floor(me.min / spacing) * spacing;\r
+                       var niceMax = Math.ceil(me.max / spacing) * spacing;\r
                        var numSpaces = (niceMax - niceMin) / spacing;\r
 \r
                        // If very close to our rounded value, use it.\r
@@ -12795,77 +13211,33 @@ module.exports = function(Chart) {
                        }\r
                        ticks.push(tickOpts.max !== undefined ? tickOpts.max : niceMax);\r
 \r
-                       if (!isHorizontal) {\r
-                               // We are in a vertical orientation. The top value is the highest. So reverse the array\r
-                               ticks.reverse();\r
-                       }\r
+                       me.handleDirectionalChanges();\r
 \r
                        // At this point, we need to update our max and min given the tick values since we have expanded the\r
                        // range of the scale\r
-                       _this.max = helpers.max(ticks);\r
-                       _this.min = helpers.min(ticks);\r
+                       me.max = helpers.max(ticks);\r
+                       me.min = helpers.min(ticks);\r
 \r
                        if (tickOpts.reverse) {\r
                                ticks.reverse();\r
 \r
-                               _this.start = _this.max;\r
-                               _this.end = _this.min;\r
+                               me.start = me.max;\r
+                               me.end = me.min;\r
                        } else {\r
-                               _this.start = _this.min;\r
-                               _this.end = _this.max;\r
+                               me.start = me.min;\r
+                               me.end = me.max;\r
                        }\r
                },\r
-               getLabelForIndex: function(index, datasetIndex) {\r
-                       return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\r
-               },\r
                convertTicksToLabels: function() {\r
-                       var _this = this;\r
-                       _this.ticksAsNumbers = _this.ticks.slice();\r
-                       _this.zeroLineIndex = _this.ticks.indexOf(0);\r
-\r
-                       Chart.Scale.prototype.convertTicksToLabels.call(_this);\r
-               },\r
-               // Utils\r
-               getPixelForValue: function(value, index, datasetIndex, includeOffset) {\r
-                       // This must be called after fit has been run so that\r
-                       //      this.left, this.top, this.right, and this.bottom have been defined\r
-                       var _this = this;\r
-                       var paddingLeft = _this.paddingLeft;\r
-                       var paddingBottom = _this.paddingBottom;\r
-                       var start = _this.start;\r
-\r
-                       var rightValue = +_this.getRightValue(value);\r
-                       var pixel;\r
-                       var innerDimension;\r
-                       var range = _this.end - start;\r
+                       var me = this;\r
+                       me.ticksAsNumbers = me.ticks.slice();\r
+                       me.zeroLineIndex = me.ticks.indexOf(0);\r
 \r
-                       if (_this.isHorizontal()) {\r
-                               innerDimension = _this.width - (paddingLeft + _this.paddingRight);\r
-                               pixel = _this.left + (innerDimension / range * (rightValue - start));\r
-                               return Math.round(pixel + paddingLeft);\r
-                       } else {\r
-                               innerDimension = _this.height - (_this.paddingTop + paddingBottom);\r
-                               pixel = (_this.bottom - paddingBottom) - (innerDimension / range * (rightValue - start));\r
-                               return Math.round(pixel);\r
-                       }\r
-               },\r
-               getValueForPixel: function(pixel) {\r
-                       var _this = this;\r
-                       var isHorizontal = _this.isHorizontal();\r
-                       var paddingLeft = _this.paddingLeft;\r
-                       var paddingBottom = _this.paddingBottom;\r
-                       var innerDimension = isHorizontal ? _this.width - (paddingLeft + _this.paddingRight) : _this.height - (_this.paddingTop + paddingBottom);\r
-                       var offset = (isHorizontal ? pixel - _this.left - paddingLeft : _this.bottom - paddingBottom - pixel) / innerDimension;\r
-                       return _this.start + ((_this.end - _this.start) * offset);\r
+                       Chart.Scale.prototype.convertTicksToLabels.call(me);\r
                },\r
-               getPixelForTick: function(index, includeOffset) {\r
-                       return this.getPixelForValue(this.ticksAsNumbers[index], null, null, includeOffset);\r
-               }\r
        });\r
-       Chart.scaleService.registerScaleType("linear", LinearScale, defaultConfig);\r
-\r
 };
-},{}],40:[function(require,module,exports){
+},{}],41:[function(require,module,exports){
 "use strict";\r
 \r
 module.exports = function(Chart) {\r
@@ -12891,21 +13263,21 @@ module.exports = function(Chart) {
 \r
        var LogarithmicScale = Chart.Scale.extend({\r
                determineDataLimits: function() {\r
-                       var _this = this;\r
-                       var opts = _this.options;\r
+                       var me = this;\r
+                       var opts = me.options;\r
                        var tickOpts = opts.ticks;\r
-                       var chart = _this.chart;\r
+                       var chart = me.chart;\r
                        var data = chart.data;\r
                        var datasets = data.datasets;\r
                        var getValueOrDefault = helpers.getValueOrDefault;\r
-                       var isHorizontal = _this.isHorizontal();\r
+                       var isHorizontal = me.isHorizontal();\r
                        function IDMatches(meta) {\r
-                               return isHorizontal ? meta.xAxisID === _this.id : meta.yAxisID === _this.id;\r
+                               return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\r
                        }\r
 \r
                        // Calculate Range\r
-                       _this.min = null;\r
-                       _this.max = null;\r
+                       me.min = null;\r
+                       me.max = null;\r
 \r
                        if (opts.stacked) {\r
                                var valuesPerType = {};\r
@@ -12919,7 +13291,7 @@ module.exports = function(Chart) {
 \r
                                                helpers.each(dataset.data, function(rawValue, index) {\r
                                                        var values = valuesPerType[meta.type];\r
-                                                       var value = +_this.getRightValue(rawValue);\r
+                                                       var value = +me.getRightValue(rawValue);\r
                                                        if (isNaN(value) || meta.data[index].hidden) {\r
                                                                return;\r
                                                        }\r
@@ -12939,8 +13311,8 @@ module.exports = function(Chart) {
                                helpers.each(valuesPerType, function(valuesForType) {\r
                                        var minVal = helpers.min(valuesForType);\r
                                        var maxVal = helpers.max(valuesForType);\r
-                                       _this.min = _this.min === null ? minVal : Math.min(_this.min, minVal);\r
-                                       _this.max = _this.max === null ? maxVal : Math.max(_this.max, maxVal);\r
+                                       me.min = me.min === null ? minVal : Math.min(me.min, minVal);\r
+                                       me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\r
                                });\r
 \r
                        } else {\r
@@ -12948,58 +13320,58 @@ module.exports = function(Chart) {
                                        var meta = chart.getDatasetMeta(datasetIndex);\r
                                        if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\r
                                                helpers.each(dataset.data, function(rawValue, index) {\r
-                                                       var value = +_this.getRightValue(rawValue);\r
+                                                       var value = +me.getRightValue(rawValue);\r
                                                        if (isNaN(value) || meta.data[index].hidden) {\r
                                                                return;\r
                                                        }\r
 \r
-                                                       if (_this.min === null) {\r
-                                                               _this.min = value;\r
-                                                       } else if (value < _this.min) {\r
-                                                               _this.min = value;\r
+                                                       if (me.min === null) {\r
+                                                               me.min = value;\r
+                                                       } else if (value < me.min) {\r
+                                                               me.min = value;\r
                                                        }\r
 \r
-                                                       if (_this.max === null) {\r
-                                                               _this.max = value;\r
-                                                       } else if (value > _this.max) {\r
-                                                               _this.max = value;\r
+                                                       if (me.max === null) {\r
+                                                               me.max = value;\r
+                                                       } else if (value > me.max) {\r
+                                                               me.max = value;\r
                                                        }\r
                                                });\r
                                        }\r
                                });\r
                        }\r
 \r
-                       _this.min = getValueOrDefault(tickOpts.min, _this.min);\r
-                       _this.max = getValueOrDefault(tickOpts.max, _this.max);\r
+                       me.min = getValueOrDefault(tickOpts.min, me.min);\r
+                       me.max = getValueOrDefault(tickOpts.max, me.max);\r
 \r
-                       if (_this.min === _this.max) {\r
-                               if (_this.min !== 0 && _this.min !== null) {\r
-                                       _this.min = Math.pow(10, Math.floor(helpers.log10(_this.min)) - 1);\r
-                                       _this.max = Math.pow(10, Math.floor(helpers.log10(_this.max)) + 1);\r
+                       if (me.min === me.max) {\r
+                               if (me.min !== 0 && me.min !== null) {\r
+                                       me.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1);\r
+                                       me.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1);\r
                                } else {\r
-                                       _this.min = 1;\r
-                                       _this.max = 10;\r
+                                       me.min = 1;\r
+                                       me.max = 10;\r
                                }\r
                        }\r
                },\r
                buildTicks: function() {\r
-                       var _this = this;\r
-                       var opts = _this.options;\r
+                       var me = this;\r
+                       var opts = me.options;\r
                        var tickOpts = opts.ticks;\r
                        var getValueOrDefault = helpers.getValueOrDefault;\r
 \r
                        // Reset the ticks array. Later on, we will draw a grid line at these positions\r
                        // The array simply contains the numerical value of the spots where ticks will be\r
-                       var ticks = _this.ticks = [];\r
+                       var ticks = me.ticks = [];\r
 \r
                        // Figure out what the max number of ticks we can support it is based on the size of\r
                        // the axis area. For now, we say that the minimum tick spacing in pixels must be 50\r
                        // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\r
                        // the graph\r
 \r
-                       var tickVal = getValueOrDefault(tickOpts.min, Math.pow(10, Math.floor(helpers.log10(_this.min))));\r
+                       var tickVal = getValueOrDefault(tickOpts.min, Math.pow(10, Math.floor(helpers.log10(me.min))));\r
 \r
-                       while (tickVal < _this.max) {\r
+                       while (tickVal < me.max) {\r
                                ticks.push(tickVal);\r
 \r
                                var exp = Math.floor(helpers.log10(tickVal));\r
@@ -13016,24 +13388,24 @@ module.exports = function(Chart) {
                        var lastTick = getValueOrDefault(tickOpts.max, tickVal);\r
                        ticks.push(lastTick);\r
 \r
-                       if (!_this.isHorizontal()) {\r
+                       if (!me.isHorizontal()) {\r
                                // We are in a vertical orientation. The top value is the highest. So reverse the array\r
                                ticks.reverse();\r
                        }\r
 \r
                        // At this point, we need to update our max and min given the tick values since we have expanded the\r
                        // range of the scale\r
-                       _this.max = helpers.max(ticks);\r
-                       _this.min = helpers.min(ticks);\r
+                       me.max = helpers.max(ticks);\r
+                       me.min = helpers.min(ticks);\r
 \r
                        if (tickOpts.reverse) {\r
                                ticks.reverse();\r
 \r
-                               _this.start = _this.max;\r
-                               _this.end = _this.min;\r
+                               me.start = me.max;\r
+                               me.end = me.min;\r
                        } else {\r
-                               _this.start = _this.min;\r
-                               _this.end = _this.max;\r
+                               me.start = me.min;\r
+                               me.end = me.max;\r
                        }\r
                },\r
                convertTicksToLabels: function() {\r
@@ -13049,51 +13421,51 @@ module.exports = function(Chart) {
                        return this.getPixelForValue(this.tickValues[index], null, null, includeOffset);\r
                },\r
                getPixelForValue: function(value, index, datasetIndex, includeOffset) {\r
-                       var _this = this;\r
+                       var me = this;\r
                        var innerDimension;\r
                        var pixel;\r
 \r
-                       var start = _this.start;\r
-                       var newVal = +_this.getRightValue(value);\r
-                       var range = helpers.log10(_this.end) - helpers.log10(start);\r
-                       var paddingTop = _this.paddingTop;\r
-                       var paddingBottom = _this.paddingBottom;\r
-                       var paddingLeft = _this.paddingLeft;\r
+                       var start = me.start;\r
+                       var newVal = +me.getRightValue(value);\r
+                       var range = helpers.log10(me.end) - helpers.log10(start);\r
+                       var paddingTop = me.paddingTop;\r
+                       var paddingBottom = me.paddingBottom;\r
+                       var paddingLeft = me.paddingLeft;\r
 \r
-                       if (_this.isHorizontal()) {\r
+                       if (me.isHorizontal()) {\r
 \r
                                if (newVal === 0) {\r
-                                       pixel = _this.left + paddingLeft;\r
+                                       pixel = me.left + paddingLeft;\r
                                } else {\r
-                                       innerDimension = _this.width - (paddingLeft + _this.paddingRight);\r
-                                       pixel = _this.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\r
+                                       innerDimension = me.width - (paddingLeft + me.paddingRight);\r
+                                       pixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\r
                                        pixel += paddingLeft;\r
                                }\r
                        } else {\r
                                // Bottom - top since pixels increase downard on a screen\r
                                if (newVal === 0) {\r
-                                       pixel = _this.top + paddingTop;\r
+                                       pixel = me.top + paddingTop;\r
                                } else {\r
-                                       innerDimension = _this.height - (paddingTop + paddingBottom);\r
-                                       pixel = (_this.bottom - paddingBottom) - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\r
+                                       innerDimension = me.height - (paddingTop + paddingBottom);\r
+                                       pixel = (me.bottom - paddingBottom) - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\r
                                }\r
                        }\r
 \r
                        return pixel;\r
                },\r
                getValueForPixel: function(pixel) {\r
-                       var _this = this;\r
+                       var me = this;\r
                        var offset;\r
-                       var range = helpers.log10(_this.end) - helpers.log10(_this.start);\r
+                       var range = helpers.log10(me.end) - helpers.log10(me.start);\r
                        var value;\r
                        var innerDimension;\r
 \r
-                       if (_this.isHorizontal()) {\r
-                               innerDimension = _this.width - (_this.paddingLeft + _this.paddingRight);\r
-                               value = _this.start * Math.pow(10, (pixel - _this.left - _this.paddingLeft) * range / innerDimension);\r
+                       if (me.isHorizontal()) {\r
+                               innerDimension = me.width - (me.paddingLeft + me.paddingRight);\r
+                               value = me.start * Math.pow(10, (pixel - me.left - me.paddingLeft) * range / innerDimension);\r
                        } else {\r
-                               innerDimension = _this.height - (_this.paddingTop + _this.paddingBottom);\r
-                               value = Math.pow(10, (_this.bottom - _this.paddingBottom - pixel) * range / innerDimension) / _this.start;\r
+                               innerDimension = me.height - (me.paddingTop + me.paddingBottom);\r
+                               value = Math.pow(10, (me.bottom - me.paddingBottom - pixel) * range / innerDimension) / me.start;\r
                        }\r
 \r
                        return value;\r
@@ -13102,7 +13474,7 @@ module.exports = function(Chart) {
        Chart.scaleService.registerScaleType("logarithmic", LogarithmicScale, defaultConfig);\r
 \r
 };
-},{}],41:[function(require,module,exports){
+},{}],42:[function(require,module,exports){
 "use strict";\r
 \r
 module.exports = function(Chart) {\r
@@ -13150,136 +13522,70 @@ module.exports = function(Chart) {
                }\r
        };\r
 \r
-       var LinearRadialScale = Chart.Scale.extend({\r
+       var LinearRadialScale = Chart.LinearScaleBase.extend({\r
                getValueCount: function() {\r
                        return this.chart.data.labels.length;\r
                },\r
                setDimensions: function() {\r
-                       var options = this.options;\r
+                       var me = this;\r
+                       var opts = me.options;\r
+                       var tickOpts = opts.ticks;\r
                        // Set the unconstrained dimension before label rotation\r
-                       this.width = this.maxWidth;\r
-                       this.height = this.maxHeight;\r
-                       this.xCenter = Math.round(this.width / 2);\r
-                       this.yCenter = Math.round(this.height / 2);\r
+                       me.width = me.maxWidth;\r
+                       me.height = me.maxHeight;\r
+                       me.xCenter = Math.round(me.width / 2);\r
+                       me.yCenter = Math.round(me.height / 2);\r
 \r
-                       var minSize = helpers.min([this.height, this.width]);\r
-                       var tickFontSize = helpers.getValueOrDefault(options.ticks.fontSize, globalDefaults.defaultFontSize);\r
-                       this.drawingArea = (options.display) ? (minSize / 2) - (tickFontSize / 2 + options.ticks.backdropPaddingY) : (minSize / 2);\r
+                       var minSize = helpers.min([me.height, me.width]);\r
+                       var tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\r
+                       me.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2);\r
                },\r
                determineDataLimits: function() {\r
-                       this.min = null;\r
-                       this.max = null;\r
+                       var me = this;\r
+                       var chart = me.chart;\r
+                       me.min = null;\r
+                       me.max = null;\r
+\r
+\r
+                       helpers.each(chart.data.datasets, function(dataset, datasetIndex) {\r
+                               if (chart.isDatasetVisible(datasetIndex)) {\r
+                                       var meta = chart.getDatasetMeta(datasetIndex);\r
 \r
-                       helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) {\r
-                               if (this.chart.isDatasetVisible(datasetIndex)) {\r
-                                       var meta = this.chart.getDatasetMeta(datasetIndex);\r
                                        helpers.each(dataset.data, function(rawValue, index) {\r
-                                               var value = +this.getRightValue(rawValue);\r
+                                               var value = +me.getRightValue(rawValue);\r
                                                if (isNaN(value) || meta.data[index].hidden) {\r
                                                        return;\r
                                                }\r
 \r
-                                               if (this.min === null) {\r
-                                                       this.min = value;\r
-                                               } else if (value < this.min) {\r
-                                                       this.min = value;\r
+                                               if (me.min === null) {\r
+                                                       me.min = value;\r
+                                               } else if (value < me.min) {\r
+                                                       me.min = value;\r
                                                }\r
 \r
-                                               if (this.max === null) {\r
-                                                       this.max = value;\r
-                                               } else if (value > this.max) {\r
-                                                       this.max = value;\r
+                                               if (me.max === null) {\r
+                                                       me.max = value;\r
+                                               } else if (value > me.max) {\r
+                                                       me.max = value;\r
                                                }\r
-                                       }, this);\r
-                               }\r
-                       }, this);\r
-\r
-                       // If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\r
-                       // do nothing since that would make the chart weird. If the user really wants a weird chart\r
-                       // axis, they can manually override it\r
-                       if (this.options.ticks.beginAtZero) {\r
-                               var minSign = helpers.sign(this.min);\r
-                               var maxSign = helpers.sign(this.max);\r
-\r
-                               if (minSign < 0 && maxSign < 0) {\r
-                                       // move the top up to 0\r
-                                       this.max = 0;\r
-                               } else if (minSign > 0 && maxSign > 0) {\r
-                                       // move the botttom down to 0\r
-                                       this.min = 0;\r
+                                       });\r
                                }\r
-                       }\r
-\r
-                       if (this.options.ticks.min !== undefined) {\r
-                               this.min = this.options.ticks.min;\r
-                       } else if (this.options.ticks.suggestedMin !== undefined) {\r
-                               this.min = Math.min(this.min, this.options.ticks.suggestedMin);\r
-                       }\r
-\r
-                       if (this.options.ticks.max !== undefined) {\r
-                               this.max = this.options.ticks.max;\r
-                       } else if (this.options.ticks.suggestedMax !== undefined) {\r
-                               this.max = Math.max(this.max, this.options.ticks.suggestedMax);\r
-                       }\r
+                       });\r
 \r
-                       if (this.min === this.max) {\r
-                               this.min--;\r
-                               this.max++;\r
-                       }\r
+                       // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\r
+                       me.handleTickRangeOptions();\r
                },\r
-               buildTicks: function() {\r
-\r
-\r
-                       this.ticks = [];\r
-\r
-                       // Figure out what the max number of ticks we can support it is based on the size of\r
-                       // the axis area. For now, we say that the minimum tick spacing in pixels must be 50\r
-                       // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\r
-                       // the graph\r
-                       var tickFontSize = helpers.getValueOrDefault(this.options.ticks.fontSize, globalDefaults.defaultFontSize);\r
-                       var maxTicks = Math.min(this.options.ticks.maxTicksLimit ? this.options.ticks.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\r
-                       maxTicks = Math.max(2, maxTicks); // Make sure we always have at least 2 ticks\r
-\r
-                       // To get a "nice" value for the tick spacing, we will use the appropriately named\r
-                       // "nice number" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\r
-                       // for details.\r
-\r
-                       var niceRange = helpers.niceNum(this.max - this.min, false);\r
-                       var spacing = helpers.niceNum(niceRange / (maxTicks - 1), true);\r
-                       var niceMin = Math.floor(this.min / spacing) * spacing;\r
-                       var niceMax = Math.ceil(this.max / spacing) * spacing;\r
-\r
-                       var numSpaces = Math.ceil((niceMax - niceMin) / spacing);\r
-\r
-                       // Put the values into the ticks array\r
-                       this.ticks.push(this.options.ticks.min !== undefined ? this.options.ticks.min : niceMin);\r
-                       for (var j = 1; j < numSpaces; ++j) {\r
-                               this.ticks.push(niceMin + (j * spacing));\r
-                       }\r
-                       this.ticks.push(this.options.ticks.max !== undefined ? this.options.ticks.max : niceMax);\r
-\r
-                       // At this point, we need to update our max and min given the tick values since we have expanded the\r
-                       // range of the scale\r
-                       this.max = helpers.max(this.ticks);\r
-                       this.min = helpers.min(this.ticks);\r
-\r
-                       if (this.options.ticks.reverse) {\r
-                               this.ticks.reverse();\r
-\r
-                               this.start = this.max;\r
-                               this.end = this.min;\r
-                       } else {\r
-                               this.start = this.min;\r
-                               this.end = this.max;\r
-                       }\r
-\r
-                       this.zeroLineIndex = this.ticks.indexOf(0);\r
+               getTickLimit: function() {\r
+                       var tickOpts = this.options.ticks;\r
+                       var tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\r
+                       return Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\r
                },\r
                convertTicksToLabels: function() {\r
-                       Chart.Scale.prototype.convertTicksToLabels.call(this);\r
+                       var me = this;\r
+                       Chart.LinearScaleBase.prototype.convertTicksToLabels.call(me);\r
 \r
                        // Point labels\r
-                       this.pointLabels = this.chart.data.labels.map(this.options.pointLabels.callback, this);\r
+                       me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\r
                },\r
                getLabelForIndex: function(index, datasetIndex) {\r
                        return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\r
@@ -13388,13 +13694,13 @@ module.exports = function(Chart) {
                        this.setCenterPoint(radiusReductionLeft, radiusReductionRight);\r
                },\r
                setCenterPoint: function(leftMovement, rightMovement) {\r
+                       var me = this;\r
+                       var maxRight = me.width - rightMovement - me.drawingArea,\r
+                               maxLeft = leftMovement + me.drawingArea;\r
 \r
-                       var maxRight = this.width - rightMovement - this.drawingArea,\r
-                               maxLeft = leftMovement + this.drawingArea;\r
-\r
-                       this.xCenter = Math.round(((maxLeft + maxRight) / 2) + this.left);\r
+                       me.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left);\r
                        // Always vertically in the centre as the text height doesn't change\r
-                       this.yCenter = Math.round((this.height / 2) + this.top);\r
+                       me.yCenter = Math.round((me.height / 2) + me.top);\r
                },\r
 \r
                getIndexAngle: function(index) {\r
@@ -13404,23 +13710,26 @@ module.exports = function(Chart) {
                        return index * angleMultiplier - (Math.PI / 2);\r
                },\r
                getDistanceFromCenterForValue: function(value) {\r
+                       var me = this;\r
+\r
                        if (value === null) {\r
                                return 0; // null always in center\r
                        }\r
 \r
                        // Take into account half font size + the yPadding of the top value\r
-                       var scalingFactor = this.drawingArea / (this.max - this.min);\r
-                       if (this.options.reverse) {\r
-                               return (this.max - value) * scalingFactor;\r
+                       var scalingFactor = me.drawingArea / (me.max - me.min);\r
+                       if (me.options.reverse) {\r
+                               return (me.max - value) * scalingFactor;\r
                        } else {\r
-                               return (value - this.min) * scalingFactor;\r
+                               return (value - me.min) * scalingFactor;\r
                        }\r
                },\r
                getPointPosition: function(index, distanceFromCenter) {\r
-                       var thisAngle = this.getIndexAngle(index);\r
+                       var me = this;\r
+                       var thisAngle = me.getIndexAngle(index);\r
                        return {\r
-                               x: Math.round(Math.cos(thisAngle) * distanceFromCenter) + this.xCenter,\r
-                               y: Math.round(Math.sin(thisAngle) * distanceFromCenter) + this.yCenter\r
+                               x: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter,\r
+                               y: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter\r
                        };\r
                },\r
                getPointPositionForValue: function(index, value) {\r
@@ -13440,30 +13749,45 @@ module.exports = function(Chart) {
                },\r
 \r
                draw: function() {\r
-                       if (this.options.display) {\r
-                               var ctx = this.ctx;\r
-                               helpers.each(this.ticks, function(label, index) {\r
+                       var me = this;\r
+                       var opts = me.options;\r
+                       var gridLineOpts = opts.gridLines;\r
+                       var tickOpts = opts.ticks;\r
+                       var angleLineOpts = opts.angleLines;\r
+                       var pointLabelOpts = opts.pointLabels;\r
+                       var getValueOrDefault = helpers.getValueOrDefault;\r
+\r
+                       if (opts.display) {\r
+                               var ctx = me.ctx;\r
+\r
+                               // Tick Font\r
+                               var tickFontSize = getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\r
+                               var tickFontStyle = getValueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\r
+                               var tickFontFamily = getValueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily);\r
+                               var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\r
+\r
+                               helpers.each(me.ticks, function(label, index) {\r
                                        // Don't draw a centre value (if it is minimum)\r
-                                       if (index > 0 || this.options.reverse) {\r
-                                               var yCenterOffset = this.getDistanceFromCenterForValue(this.ticks[index]);\r
-                                               var yHeight = this.yCenter - yCenterOffset;\r
+                                       if (index > 0 || opts.reverse) {\r
+                                               var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\r
+                                               var yHeight = me.yCenter - yCenterOffset;\r
 \r
                                                // Draw circular lines around the scale\r
-                                               if (this.options.gridLines.display) {\r
-                                                       ctx.strokeStyle = this.options.gridLines.color;\r
-                                                       ctx.lineWidth = this.options.gridLines.lineWidth;\r
+                                               if (gridLineOpts.display && index !== 0) {\r
+                                                       ctx.strokeStyle = helpers.getValueAtIndexOrDefault(gridLineOpts.color, index - 1);\r
+                                                       ctx.lineWidth = helpers.getValueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1);\r
 \r
-                                                       if (this.options.lineArc) {\r
+                                                       if (opts.lineArc) {\r
                                                                // Draw circular arcs between the points\r
                                                                ctx.beginPath();\r
-                                                               ctx.arc(this.xCenter, this.yCenter, yCenterOffset, 0, Math.PI * 2);\r
+                                                               ctx.arc(me.xCenter, me.yCenter, yCenterOffset, 0, Math.PI * 2);\r
                                                                ctx.closePath();\r
                                                                ctx.stroke();\r
                                                        } else {\r
                                                                // Draw straight lines connecting each index\r
                                                                ctx.beginPath();\r
-                                                               for (var i = 0; i < this.getValueCount(); i++) {\r
-                                                                       var pointPosition = this.getPointPosition(i, this.getDistanceFromCenterForValue(this.ticks[index]));\r
+                                                               for (var i = 0; i < me.getValueCount(); i++) {\r
+                                                                       var pointPosition = me.getPointPosition(i, yCenterOffset);\r
                                                                        if (i === 0) {\r
                                                                                ctx.moveTo(pointPosition.x, pointPosition.y);\r
                                                                        } else {\r
@@ -13475,60 +13799,61 @@ module.exports = function(Chart) {
                                                        }\r
                                                }\r
 \r
-                                               if (this.options.ticks.display) {\r
-                                                       var tickFontColor = helpers.getValueOrDefault(this.options.ticks.fontColor, globalDefaults.defaultFontColor);\r
-                                                       var tickFontSize = helpers.getValueOrDefault(this.options.ticks.fontSize, globalDefaults.defaultFontSize);\r
-                                                       var tickFontStyle = helpers.getValueOrDefault(this.options.ticks.fontStyle, globalDefaults.defaultFontStyle);\r
-                                                       var tickFontFamily = helpers.getValueOrDefault(this.options.ticks.fontFamily, globalDefaults.defaultFontFamily);\r
-                                                       var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\r
+                                               if (tickOpts.display) {\r
+                                                       var tickFontColor = getValueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor);\r
                                                        ctx.font = tickLabelFont;\r
 \r
-                                                       if (this.options.ticks.showLabelBackdrop) {\r
+                                                       if (tickOpts.showLabelBackdrop) {\r
                                                                var labelWidth = ctx.measureText(label).width;\r
-                                                               ctx.fillStyle = this.options.ticks.backdropColor;\r
+                                                               ctx.fillStyle = tickOpts.backdropColor;\r
                                                                ctx.fillRect(\r
-                                                                       this.xCenter - labelWidth / 2 - this.options.ticks.backdropPaddingX,\r
-                                                                       yHeight - tickFontSize / 2 - this.options.ticks.backdropPaddingY,\r
-                                                                       labelWidth + this.options.ticks.backdropPaddingX * 2,\r
-                                                                       tickFontSize + this.options.ticks.backdropPaddingY * 2\r
+                                                                       me.xCenter - labelWidth / 2 - tickOpts.backdropPaddingX,\r
+                                                                       yHeight - tickFontSize / 2 - tickOpts.backdropPaddingY,\r
+                                                                       labelWidth + tickOpts.backdropPaddingX * 2,\r
+                                                                       tickFontSize + tickOpts.backdropPaddingY * 2\r
                                                                );\r
                                                        }\r
 \r
                                                        ctx.textAlign = 'center';\r
                                                        ctx.textBaseline = "middle";\r
                                                        ctx.fillStyle = tickFontColor;\r
-                                                       ctx.fillText(label, this.xCenter, yHeight);\r
+                                                       ctx.fillText(label, me.xCenter, yHeight);\r
                                                }\r
                                        }\r
-                               }, this);\r
+                               });\r
+\r
+                               if (!opts.lineArc) {\r
+                                       ctx.lineWidth = angleLineOpts.lineWidth;\r
+                                       ctx.strokeStyle = angleLineOpts.color;\r
 \r
-                               if (!this.options.lineArc) {\r
-                                       ctx.lineWidth = this.options.angleLines.lineWidth;\r
-                                       ctx.strokeStyle = this.options.angleLines.color;\r
+                                       var outerDistance = me.getDistanceFromCenterForValue(opts.reverse ? me.min : me.max);\r
 \r
-                                       for (var i = this.getValueCount() - 1; i >= 0; i--) {\r
-                                               if (this.options.angleLines.display) {\r
-                                                       var outerPosition = this.getPointPosition(i, this.getDistanceFromCenterForValue(this.options.reverse ? this.min : this.max));\r
+                                       // Point Label Font\r
+                                       var pointLabelFontSize = getValueOrDefault(pointLabelOpts.fontSize, globalDefaults.defaultFontSize);\r
+                                       var pointLabeFontStyle = getValueOrDefault(pointLabelOpts.fontStyle, globalDefaults.defaultFontStyle);\r
+                                       var pointLabeFontFamily = getValueOrDefault(pointLabelOpts.fontFamily, globalDefaults.defaultFontFamily);\r
+                                       var pointLabeFont = helpers.fontString(pointLabelFontSize, pointLabeFontStyle, pointLabeFontFamily);\r
+\r
+                                       for (var i = me.getValueCount() - 1; i >= 0; i--) {\r
+                                               if (angleLineOpts.display) {\r
+                                                       var outerPosition = me.getPointPosition(i, outerDistance);\r
                                                        ctx.beginPath();\r
-                                                       ctx.moveTo(this.xCenter, this.yCenter);\r
+                                                       ctx.moveTo(me.xCenter, me.yCenter);\r
                                                        ctx.lineTo(outerPosition.x, outerPosition.y);\r
                                                        ctx.stroke();\r
                                                        ctx.closePath();\r
                                                }\r
                                                // Extra 3px out for some label spacing\r
-                                               var pointLabelPosition = this.getPointPosition(i, this.getDistanceFromCenterForValue(this.options.reverse ? this.min : this.max) + 5);\r
-\r
-                                               var pointLabelFontColor = helpers.getValueOrDefault(this.options.pointLabels.fontColor, globalDefaults.defaultFontColor);\r
-                                               var pointLabelFontSize = helpers.getValueOrDefault(this.options.pointLabels.fontSize, globalDefaults.defaultFontSize);\r
-                                               var pointLabeFontStyle = helpers.getValueOrDefault(this.options.pointLabels.fontStyle, globalDefaults.defaultFontStyle);\r
-                                               var pointLabeFontFamily = helpers.getValueOrDefault(this.options.pointLabels.fontFamily, globalDefaults.defaultFontFamily);\r
-                                               var pointLabeFont = helpers.fontString(pointLabelFontSize, pointLabeFontStyle, pointLabeFontFamily);\r
+                                               var pointLabelPosition = me.getPointPosition(i, outerDistance + 5);\r
 \r
+                                               // Keep this in loop since we may support array properties here\r
+                                               var pointLabelFontColor = getValueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor);\r
                                                ctx.font = pointLabeFont;\r
                                                ctx.fillStyle = pointLabelFontColor;\r
 \r
-                                               var labelsCount = this.pointLabels.length,\r
-                                                       halfLabelsCount = this.pointLabels.length / 2,\r
+                                               var pointLabels = me.pointLabels,\r
+                                                       labelsCount = pointLabels.length,\r
+                                                       halfLabelsCount = pointLabels.length / 2,\r
                                                        quarterLabelsCount = halfLabelsCount / 2,\r
                                                        upperHalf = (i < quarterLabelsCount || i > labelsCount - quarterLabelsCount),\r
                                                        exactQuarter = (i === quarterLabelsCount || i === labelsCount - quarterLabelsCount);\r
@@ -13551,7 +13876,7 @@ module.exports = function(Chart) {
                                                        ctx.textBaseline = 'top';\r
                                                }\r
 \r
-                                               ctx.fillText(this.pointLabels[i] ? this.pointLabels[i] : '', pointLabelPosition.x, pointLabelPosition.y);\r
+                                               ctx.fillText(pointLabels[i] ? pointLabels[i] : '', pointLabelPosition.x, pointLabelPosition.y);\r
                                        }\r
                                }\r
                        }\r
@@ -13559,12 +13884,13 @@ module.exports = function(Chart) {
        });\r
        Chart.scaleService.registerScaleType("radialLinear", LinearRadialScale, defaultConfig);\r
 \r
-};
-},{}],42:[function(require,module,exports){
+};\r
+
+},{}],43:[function(require,module,exports){
 /*global window: false */\r
 "use strict";\r
 \r
-var moment = require('moment');\r
+var moment = require(6);\r
 moment = typeof(moment) === 'function' ? moment : window.moment;\r
 \r
 module.exports = function(Chart) {\r
@@ -13642,114 +13968,117 @@ module.exports = function(Chart) {
                        return this.labelMoments[datasetIndex][index];\r
                },\r
                getMomentStartOf: function(tick) {\r
-                       if (this.options.time.unit === 'week' && this.options.time.isoWeekday !== false) {\r
-                               return tick.clone().startOf('isoWeek').isoWeekday(this.options.time.isoWeekday);\r
+                       var me = this;\r
+                       if (me.options.time.unit === 'week' && me.options.time.isoWeekday !== false) {\r
+                               return tick.clone().startOf('isoWeek').isoWeekday(me.options.time.isoWeekday);\r
                        } else {\r
-                               return tick.clone().startOf(this.tickUnit);\r
+                               return tick.clone().startOf(me.tickUnit);\r
                        }\r
                },\r
                determineDataLimits: function() {\r
-                       this.labelMoments = [];\r
+                       var me = this;\r
+                       me.labelMoments = [];\r
 \r
                        // Only parse these once. If the dataset does not have data as x,y pairs, we will use\r
                        // these\r
                        var scaleLabelMoments = [];\r
-                       if (this.chart.data.labels && this.chart.data.labels.length > 0) {\r
-                               helpers.each(this.chart.data.labels, function(label, index) {\r
-                                       var labelMoment = this.parseTime(label);\r
+                       if (me.chart.data.labels && me.chart.data.labels.length > 0) {\r
+                               helpers.each(me.chart.data.labels, function(label, index) {\r
+                                       var labelMoment = me.parseTime(label);\r
 \r
                                        if (labelMoment.isValid()) {\r
-                                               if (this.options.time.round) {\r
-                                                       labelMoment.startOf(this.options.time.round);\r
+                                               if (me.options.time.round) {\r
+                                                       labelMoment.startOf(me.options.time.round);\r
                                                }\r
                                                scaleLabelMoments.push(labelMoment);\r
                                        }\r
-                               }, this);\r
+                               }, me);\r
 \r
-                               this.firstTick = moment.min.call(this, scaleLabelMoments);\r
-                               this.lastTick = moment.max.call(this, scaleLabelMoments);\r
+                               me.firstTick = moment.min.call(me, scaleLabelMoments);\r
+                               me.lastTick = moment.max.call(me, scaleLabelMoments);\r
                        } else {\r
-                               this.firstTick = null;\r
-                               this.lastTick = null;\r
+                               me.firstTick = null;\r
+                               me.lastTick = null;\r
                        }\r
 \r
-                       helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) {\r
+                       helpers.each(me.chart.data.datasets, function(dataset, datasetIndex) {\r
                                var momentsForDataset = [];\r
-                               var datasetVisible = this.chart.isDatasetVisible(datasetIndex);\r
+                               var datasetVisible = me.chart.isDatasetVisible(datasetIndex);\r
 \r
                                if (typeof dataset.data[0] === 'object' && dataset.data[0] !== null) {\r
                                        helpers.each(dataset.data, function(value, index) {\r
-                                               var labelMoment = this.parseTime(this.getRightValue(value));\r
+                                               var labelMoment = me.parseTime(me.getRightValue(value));\r
 \r
                                                if (labelMoment.isValid()) {\r
-                                                       if (this.options.time.round) {\r
-                                                               labelMoment.startOf(this.options.time.round);\r
+                                                       if (me.options.time.round) {\r
+                                                               labelMoment.startOf(me.options.time.round);\r
                                                        }\r
                                                        momentsForDataset.push(labelMoment);\r
 \r
                                                        if (datasetVisible) {\r
                                                                // May have gone outside the scale ranges, make sure we keep the first and last ticks updated\r
-                                                               this.firstTick = this.firstTick !== null ? moment.min(this.firstTick, labelMoment) : labelMoment;\r
-                                                               this.lastTick = this.lastTick !== null ? moment.max(this.lastTick, labelMoment) : labelMoment;\r
+                                                               me.firstTick = me.firstTick !== null ? moment.min(me.firstTick, labelMoment) : labelMoment;\r
+                                                               me.lastTick = me.lastTick !== null ? moment.max(me.lastTick, labelMoment) : labelMoment;\r
                                                        }\r
                                                }\r
-                                       }, this);\r
+                                       }, me);\r
                                } else {\r
                                        // We have no labels. Use the ones from the scale\r
                                        momentsForDataset = scaleLabelMoments;\r
                                }\r
 \r
-                               this.labelMoments.push(momentsForDataset);\r
-                       }, this);\r
+                               me.labelMoments.push(momentsForDataset);\r
+                       }, me);\r
 \r
                        // Set these after we've done all the data\r
-                       if (this.options.time.min) {\r
-                               this.firstTick = this.parseTime(this.options.time.min);\r
+                       if (me.options.time.min) {\r
+                               me.firstTick = me.parseTime(me.options.time.min);\r
                        }\r
 \r
-                       if (this.options.time.max) {\r
-                               this.lastTick = this.parseTime(this.options.time.max);\r
+                       if (me.options.time.max) {\r
+                               me.lastTick = me.parseTime(me.options.time.max);\r
                        }\r
 \r
                        // We will modify these, so clone for later\r
-                       this.firstTick = (this.firstTick || moment()).clone();\r
-                       this.lastTick = (this.lastTick || moment()).clone();\r
+                       me.firstTick = (me.firstTick || moment()).clone();\r
+                       me.lastTick = (me.lastTick || moment()).clone();\r
                },\r
                buildTicks: function(index) {\r
+                       var me = this;\r
 \r
-                       this.ctx.save();\r
-                       var tickFontSize = helpers.getValueOrDefault(this.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);\r
-                       var tickFontStyle = helpers.getValueOrDefault(this.options.ticks.fontStyle, Chart.defaults.global.defaultFontStyle);\r
-                       var tickFontFamily = helpers.getValueOrDefault(this.options.ticks.fontFamily, Chart.defaults.global.defaultFontFamily);\r
+                       me.ctx.save();\r
+                       var tickFontSize = helpers.getValueOrDefault(me.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);\r
+                       var tickFontStyle = helpers.getValueOrDefault(me.options.ticks.fontStyle, Chart.defaults.global.defaultFontStyle);\r
+                       var tickFontFamily = helpers.getValueOrDefault(me.options.ticks.fontFamily, Chart.defaults.global.defaultFontFamily);\r
                        var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\r
-                       this.ctx.font = tickLabelFont;\r
+                       me.ctx.font = tickLabelFont;\r
 \r
-                       this.ticks = [];\r
-                       this.unitScale = 1; // How much we scale the unit by, ie 2 means 2x unit per step\r
-                       this.scaleSizeInUnits = 0; // How large the scale is in the base unit (seconds, minutes, etc)\r
+                       me.ticks = [];\r
+                       me.unitScale = 1; // How much we scale the unit by, ie 2 means 2x unit per step\r
+                       me.scaleSizeInUnits = 0; // How large the scale is in the base unit (seconds, minutes, etc)\r
 \r
                        // Set unit override if applicable\r
-                       if (this.options.time.unit) {\r
-                               this.tickUnit = this.options.time.unit || 'day';\r
-                               this.displayFormat = this.options.time.displayFormats[this.tickUnit];\r
-                               this.scaleSizeInUnits = this.lastTick.diff(this.firstTick, this.tickUnit, true);\r
-                               this.unitScale = helpers.getValueOrDefault(this.options.time.unitStepSize, 1);\r
+                       if (me.options.time.unit) {\r
+                               me.tickUnit = me.options.time.unit || 'day';\r
+                               me.displayFormat = me.options.time.displayFormats[me.tickUnit];\r
+                               me.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);\r
+                               me.unitScale = helpers.getValueOrDefault(me.options.time.unitStepSize, 1);\r
                        } else {\r
                                // Determine the smallest needed unit of the time\r
-                               var innerWidth = this.isHorizontal() ? this.width - (this.paddingLeft + this.paddingRight) : this.height - (this.paddingTop + this.paddingBottom);\r
+                               var innerWidth = me.isHorizontal() ? me.width - (me.paddingLeft + me.paddingRight) : me.height - (me.paddingTop + me.paddingBottom);\r
 \r
                                // Crude approximation of what the label length might be\r
-                               var tempFirstLabel = this.tickFormatFunction(this.firstTick, 0, []);\r
-                               var tickLabelWidth = this.ctx.measureText(tempFirstLabel).width;\r
-                               var cosRotation = Math.cos(helpers.toRadians(this.options.ticks.maxRotation));\r
-                               var sinRotation = Math.sin(helpers.toRadians(this.options.ticks.maxRotation));\r
+                               var tempFirstLabel = me.tickFormatFunction(me.firstTick, 0, []);\r
+                               var tickLabelWidth = me.ctx.measureText(tempFirstLabel).width;\r
+                               var cosRotation = Math.cos(helpers.toRadians(me.options.ticks.maxRotation));\r
+                               var sinRotation = Math.sin(helpers.toRadians(me.options.ticks.maxRotation));\r
                                tickLabelWidth = (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);\r
                                var labelCapacity = innerWidth / (tickLabelWidth);\r
 \r
                                // Start as small as possible\r
-                               this.tickUnit = 'millisecond';\r
-                               this.scaleSizeInUnits = this.lastTick.diff(this.firstTick, this.tickUnit, true);\r
-                               this.displayFormat = this.options.time.displayFormats[this.tickUnit];\r
+                               me.tickUnit = 'millisecond';\r
+                               me.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);\r
+                               me.displayFormat = me.options.time.displayFormats[me.tickUnit];\r
 \r
                                var unitDefinitionIndex = 0;\r
                                var unitDefinition = time.units[unitDefinitionIndex];\r
@@ -13757,32 +14086,32 @@ module.exports = function(Chart) {
                                // While we aren't ideal and we don't have units left\r
                                while (unitDefinitionIndex < time.units.length) {\r
                                        // Can we scale this unit. If `false` we can scale infinitely\r
-                                       this.unitScale = 1;\r
+                                       me.unitScale = 1;\r
 \r
-                                       if (helpers.isArray(unitDefinition.steps) && Math.ceil(this.scaleSizeInUnits / labelCapacity) < helpers.max(unitDefinition.steps)) {\r
+                                       if (helpers.isArray(unitDefinition.steps) && Math.ceil(me.scaleSizeInUnits / labelCapacity) < helpers.max(unitDefinition.steps)) {\r
                                                // Use one of the prefedined steps\r
                                                for (var idx = 0; idx < unitDefinition.steps.length; ++idx) {\r
-                                                       if (unitDefinition.steps[idx] >= Math.ceil(this.scaleSizeInUnits / labelCapacity)) {\r
-                                                               this.unitScale = helpers.getValueOrDefault(this.options.time.unitStepSize, unitDefinition.steps[idx]);\r
+                                                       if (unitDefinition.steps[idx] >= Math.ceil(me.scaleSizeInUnits / labelCapacity)) {\r
+                                                               me.unitScale = helpers.getValueOrDefault(me.options.time.unitStepSize, unitDefinition.steps[idx]);\r
                                                                break;\r
                                                        }\r
                                                }\r
 \r
                                                break;\r
-                                       } else if ((unitDefinition.maxStep === false) || (Math.ceil(this.scaleSizeInUnits / labelCapacity) < unitDefinition.maxStep)) {\r
+                                       } else if ((unitDefinition.maxStep === false) || (Math.ceil(me.scaleSizeInUnits / labelCapacity) < unitDefinition.maxStep)) {\r
                                                // We have a max step. Scale this unit\r
-                                               this.unitScale = helpers.getValueOrDefault(this.options.time.unitStepSize, Math.ceil(this.scaleSizeInUnits / labelCapacity));\r
+                                               me.unitScale = helpers.getValueOrDefault(me.options.time.unitStepSize, Math.ceil(me.scaleSizeInUnits / labelCapacity));\r
                                                break;\r
                                        } else {\r
                                                // Move to the next unit up\r
                                                ++unitDefinitionIndex;\r
                                                unitDefinition = time.units[unitDefinitionIndex];\r
 \r
-                                               this.tickUnit = unitDefinition.name;\r
-                                               var leadingUnitBuffer = this.firstTick.diff(this.getMomentStartOf(this.firstTick), this.tickUnit, true);\r
-                                               var trailingUnitBuffer = this.getMomentStartOf(this.lastTick.clone().add(1, this.tickUnit)).diff(this.lastTick, this.tickUnit, true);\r
-                                               this.scaleSizeInUnits = this.lastTick.diff(this.firstTick, this.tickUnit, true) + leadingUnitBuffer + trailingUnitBuffer;\r
-                                               this.displayFormat = this.options.time.displayFormats[unitDefinition.name];\r
+                                               me.tickUnit = unitDefinition.name;\r
+                                               var leadingUnitBuffer = me.firstTick.diff(me.getMomentStartOf(me.firstTick), me.tickUnit, true);\r
+                                               var trailingUnitBuffer = me.getMomentStartOf(me.lastTick.clone().add(1, me.tickUnit)).diff(me.lastTick, me.tickUnit, true);\r
+                                               me.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true) + leadingUnitBuffer + trailingUnitBuffer;\r
+                                               me.displayFormat = me.options.time.displayFormats[unitDefinition.name];\r
                                        }\r
                                }\r
                        }\r
@@ -13790,79 +14119,80 @@ module.exports = function(Chart) {
                        var roundedStart;\r
 \r
                        // Only round the first tick if we have no hard minimum\r
-                       if (!this.options.time.min) {\r
-                               this.firstTick = this.getMomentStartOf(this.firstTick);\r
-                               roundedStart = this.firstTick;\r
+                       if (!me.options.time.min) {\r
+                               me.firstTick = me.getMomentStartOf(me.firstTick);\r
+                               roundedStart = me.firstTick;\r
                        } else {\r
-                               roundedStart = this.getMomentStartOf(this.firstTick);\r
+                               roundedStart = me.getMomentStartOf(me.firstTick);\r
                        }\r
 \r
                        // Only round the last tick if we have no hard maximum\r
-                       if (!this.options.time.max) {\r
-                               var roundedEnd = this.getMomentStartOf(this.lastTick);\r
-                               if (roundedEnd.diff(this.lastTick, this.tickUnit, true) !== 0) {\r
-                                       // Do not use end of because we need this to be in the next time unit\r
-                                       this.lastTick = this.getMomentStartOf(this.lastTick.add(1, this.tickUnit));\r
+                       if (!me.options.time.max) {\r
+                               var roundedEnd = me.getMomentStartOf(me.lastTick);\r
+                               if (roundedEnd.diff(me.lastTick, me.tickUnit, true) !== 0) {\r
+                                       // Do not use end of because we need me to be in the next time unit\r
+                                       me.lastTick = me.getMomentStartOf(me.lastTick.add(1, me.tickUnit));\r
                                }\r
                        }\r
 \r
-                       this.smallestLabelSeparation = this.width;\r
+                       me.smallestLabelSeparation = me.width;\r
 \r
-                       helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) {\r
-                               for (var i = 1; i < this.labelMoments[datasetIndex].length; i++) {\r
-                                       this.smallestLabelSeparation = Math.min(this.smallestLabelSeparation, this.labelMoments[datasetIndex][i].diff(this.labelMoments[datasetIndex][i - 1], this.tickUnit, true));\r
+                       helpers.each(me.chart.data.datasets, function(dataset, datasetIndex) {\r
+                               for (var i = 1; i < me.labelMoments[datasetIndex].length; i++) {\r
+                                       me.smallestLabelSeparation = Math.min(me.smallestLabelSeparation, me.labelMoments[datasetIndex][i].diff(me.labelMoments[datasetIndex][i - 1], me.tickUnit, true));\r
                                }\r
-                       }, this);\r
+                       }, me);\r
 \r
                        // Tick displayFormat override\r
-                       if (this.options.time.displayFormat) {\r
-                               this.displayFormat = this.options.time.displayFormat;\r
+                       if (me.options.time.displayFormat) {\r
+                               me.displayFormat = me.options.time.displayFormat;\r
                        }\r
 \r
                        // first tick. will have been rounded correctly if options.time.min is not specified\r
-                       this.ticks.push(this.firstTick.clone());\r
+                       me.ticks.push(me.firstTick.clone());\r
 \r
                        // For every unit in between the first and last moment, create a moment and add it to the ticks tick\r
-                       for (var i = 1; i <= this.scaleSizeInUnits; ++i) {\r
-                               var newTick = roundedStart.clone().add(i, this.tickUnit);\r
+                       for (var i = 1; i <= me.scaleSizeInUnits; ++i) {\r
+                               var newTick = roundedStart.clone().add(i, me.tickUnit);\r
 \r
                                // Are we greater than the max time\r
-                               if (this.options.time.max && newTick.diff(this.lastTick, this.tickUnit, true) >= 0) {\r
+                               if (me.options.time.max && newTick.diff(me.lastTick, me.tickUnit, true) >= 0) {\r
                                        break;\r
                                }\r
 \r
-                               if (i % this.unitScale === 0) {\r
-                                       this.ticks.push(newTick);\r
+                               if (i % me.unitScale === 0) {\r
+                                       me.ticks.push(newTick);\r
                                }\r
                        }\r
 \r
                        // Always show the right tick\r
-                       var diff = this.ticks[this.ticks.length - 1].diff(this.lastTick, this.tickUnit);\r
-                       if (diff !== 0 || this.scaleSizeInUnits === 0) {\r
+                       var diff = me.ticks[me.ticks.length - 1].diff(me.lastTick, me.tickUnit);\r
+                       if (diff !== 0 || me.scaleSizeInUnits === 0) {\r
                                // this is a weird case. If the <max> option is the same as the end option, we can't just diff the times because the tick was created from the roundedStart\r
                                // but the last tick was not rounded.\r
-                               if (this.options.time.max) {\r
-                                       this.ticks.push(this.lastTick.clone());\r
-                                       this.scaleSizeInUnits = this.lastTick.diff(this.ticks[0], this.tickUnit, true);\r
+                               if (me.options.time.max) {\r
+                                       me.ticks.push(me.lastTick.clone());\r
+                                       me.scaleSizeInUnits = me.lastTick.diff(me.ticks[0], me.tickUnit, true);\r
                                } else {\r
-                                       this.ticks.push(this.lastTick.clone());\r
-                                       this.scaleSizeInUnits = this.lastTick.diff(this.firstTick, this.tickUnit, true);\r
+                                       me.ticks.push(me.lastTick.clone());\r
+                                       me.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);\r
                                }\r
                        }\r
 \r
-                       this.ctx.restore();\r
+                       me.ctx.restore();\r
                },\r
                // Get tooltip label\r
                getLabelForIndex: function(index, datasetIndex) {\r
-                       var label = this.chart.data.labels && index < this.chart.data.labels.length ? this.chart.data.labels[index] : '';\r
+                       var me = this;\r
+                       var label = me.chart.data.labels && index < me.chart.data.labels.length ? me.chart.data.labels[index] : '';\r
 \r
-                       if (typeof this.chart.data.datasets[datasetIndex].data[0] === 'object') {\r
-                               label = this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\r
+                       if (typeof me.chart.data.datasets[datasetIndex].data[0] === 'object') {\r
+                               label = me.getRightValue(me.chart.data.datasets[datasetIndex].data[index]);\r
                        }\r
 \r
                        // Format nicely\r
-                       if (this.options.time.tooltipFormat) {\r
-                               label = this.parseTime(label).format(this.options.time.tooltipFormat);\r
+                       if (me.options.time.tooltipFormat) {\r
+                               label = me.parseTime(label).format(me.options.time.tooltipFormat);\r
                        }\r
 \r
                        return label;\r
@@ -13880,29 +14210,31 @@ module.exports = function(Chart) {
                        }\r
                },\r
                convertTicksToLabels: function() {\r
-                       this.tickMoments = this.ticks;\r
-                       this.ticks = this.ticks.map(this.tickFormatFunction, this);\r
+                       var me = this;\r
+                       me.tickMoments = me.ticks;\r
+                       me.ticks = me.ticks.map(me.tickFormatFunction, me);\r
                },\r
                getPixelForValue: function(value, index, datasetIndex, includeOffset) {\r
-                       var labelMoment = value && value.isValid && value.isValid() ? value : this.getLabelMoment(datasetIndex, index);\r
+                       var me = this;\r
+                       var labelMoment = value && value.isValid && value.isValid() ? value : me.getLabelMoment(datasetIndex, index);\r
 \r
                        if (labelMoment) {\r
-                               var offset = labelMoment.diff(this.firstTick, this.tickUnit, true);\r
+                               var offset = labelMoment.diff(me.firstTick, me.tickUnit, true);\r
 \r
-                               var decimal = offset / this.scaleSizeInUnits;\r
+                               var decimal = offset / me.scaleSizeInUnits;\r
 \r
-                               if (this.isHorizontal()) {\r
-                                       var innerWidth = this.width - (this.paddingLeft + this.paddingRight);\r
-                                       var valueWidth = innerWidth / Math.max(this.ticks.length - 1, 1);\r
-                                       var valueOffset = (innerWidth * decimal) + this.paddingLeft;\r
+                               if (me.isHorizontal()) {\r
+                                       var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\r
+                                       var valueWidth = innerWidth / Math.max(me.ticks.length - 1, 1);\r
+                                       var valueOffset = (innerWidth * decimal) + me.paddingLeft;\r
 \r
-                                       return this.left + Math.round(valueOffset);\r
+                                       return me.left + Math.round(valueOffset);\r
                                } else {\r
-                                       var innerHeight = this.height - (this.paddingTop + this.paddingBottom);\r
-                                       var valueHeight = innerHeight / Math.max(this.ticks.length - 1, 1);\r
-                                       var heightOffset = (innerHeight * decimal) + this.paddingTop;\r
+                                       var innerHeight = me.height - (me.paddingTop + me.paddingBottom);\r
+                                       var valueHeight = innerHeight / Math.max(me.ticks.length - 1, 1);\r
+                                       var heightOffset = (innerHeight * decimal) + me.paddingTop;\r
 \r
-                                       return this.top + Math.round(heightOffset);\r
+                                       return me.top + Math.round(heightOffset);\r
                                }\r
                        }\r
                },\r
@@ -13910,17 +14242,19 @@ module.exports = function(Chart) {
                        return this.getPixelForValue(this.tickMoments[index], null, null, includeOffset);\r
                },\r
                getValueForPixel: function(pixel) {\r
-                       var innerDimension = this.isHorizontal() ? this.width - (this.paddingLeft + this.paddingRight) : this.height - (this.paddingTop + this.paddingBottom);\r
-                       var offset = (pixel - (this.isHorizontal() ? this.left + this.paddingLeft : this.top + this.paddingTop)) / innerDimension;\r
-                       offset *= this.scaleSizeInUnits;\r
-                       return this.firstTick.clone().add(moment.duration(offset, this.tickUnit).asSeconds(), 'seconds');\r
+                       var me = this;\r
+                       var innerDimension = me.isHorizontal() ? me.width - (me.paddingLeft + me.paddingRight) : me.height - (me.paddingTop + me.paddingBottom);\r
+                       var offset = (pixel - (me.isHorizontal() ? me.left + me.paddingLeft : me.top + me.paddingTop)) / innerDimension;\r
+                       offset *= me.scaleSizeInUnits;\r
+                       return me.firstTick.clone().add(moment.duration(offset, me.tickUnit).asSeconds(), 'seconds');\r
                },\r
                parseTime: function(label) {\r
-                       if (typeof this.options.time.parser === 'string') {\r
-                               return moment(label, this.options.time.parser);\r
+                       var me = this;\r
+                       if (typeof me.options.time.parser === 'string') {\r
+                               return moment(label, me.options.time.parser);\r
                        }\r
-                       if (typeof this.options.time.parser === 'function') {\r
-                               return this.options.time.parser(label);\r
+                       if (typeof me.options.time.parser === 'function') {\r
+                               return me.options.time.parser(label);\r
                        }\r
                        // Date objects\r
                        if (typeof label.getMonth === 'function' || typeof label === 'number') {\r
@@ -13931,16 +14265,17 @@ module.exports = function(Chart) {
                                return label;\r
                        }\r
                        // Custom parsing (return an instance of moment)\r
-                       if (typeof this.options.time.format !== 'string' && this.options.time.format.call) {\r
+                       if (typeof me.options.time.format !== 'string' && me.options.time.format.call) {\r
                                console.warn("options.time.format is deprecated and replaced by options.time.parser. See http://nnnick.github.io/Chart.js/docs-v2/#scales-time-scale");\r
-                               return this.options.time.format(label);\r
+                               return me.options.time.format(label);\r
                        }\r
                        // Moment format parsing\r
-                       return moment(label, this.options.time.format);\r
+                       return moment(label, me.options.time.format);\r
                }\r
        });\r
        Chart.scaleService.registerScaleType("time", TimeScale, defaultConfig);\r
 \r
 };\r
 
-},{"moment":6}]},{},[7]);
+},{"6":6}]},{},[7])(7)
+});
\ No newline at end of file
index a94ef035550deca7e1c1287e329a643e639d1316..0292399d81f84963b27e8d2e119990d290b298ea 100644 (file)
@@ -1,16 +1,15 @@
 /*!
  * Chart.js
  * http://chartjs.org/
- * Version: 2.1.4
+ * Version: 2.1.5
  *
  * Copyright 2016 Nick Downie
  * Released under the MIT license
  * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md
  */
-!function t(e,i,n){function a(r,s){if(!i[r]){if(!e[r]){var l="function"==typeof require&&require;if(!s&&l)return l(r,!0);if(o)return o(r,!0);var h=new Error("Cannot find module '"+r+"'");throw h.code="MODULE_NOT_FOUND",h}var d=i[r]={exports:{}};e[r][0].call(d.exports,function(t){var i=e[r][1][t];return a(i?i:t)},d,d.exports,t,e,i,n)}return i[r].exports}for(var o="function"==typeof require&&require,r=0;r<n.length;r++)a(n[r]);return a}({1:[function(t,e,i){function n(t){if(t){var e=/^#([a-fA-F0-9]{3})$/,i=/^#([a-fA-F0-9]{6})$/,n=/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,a=/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,o=/(\w+)/,r=[0,0,0],s=1,l=t.match(e);if(l){l=l[1];for(var h=0;h<r.length;h++)r[h]=parseInt(l[h]+l[h],16)}else if(l=t.match(i)){l=l[1];for(var h=0;h<r.length;h++)r[h]=parseInt(l.slice(2*h,2*h+2),16)}else if(l=t.match(n)){for(var h=0;h<r.length;h++)r[h]=parseInt(l[h+1]);s=parseFloat(l[4])}else if(l=t.match(a)){for(var h=0;h<r.length;h++)r[h]=Math.round(2.55*parseFloat(l[h+1]));s=parseFloat(l[4])}else if(l=t.match(o)){if("transparent"==l[1])return[0,0,0,0];if(r=x[l[1]],!r)return}for(var h=0;h<r.length;h++)r[h]=v(r[h],0,255);return s=s||0==s?v(s,0,1):1,r[3]=s,r}}function a(t){if(t){var e=/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/,i=t.match(e);if(i){var n=parseFloat(i[4]),a=v(parseInt(i[1]),0,360),o=v(parseFloat(i[2]),0,100),r=v(parseFloat(i[3]),0,100),s=v(isNaN(n)?1:n,0,1);return[a,o,r,s]}}}function o(t){if(t){var e=/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/,i=t.match(e);if(i){var n=parseFloat(i[4]),a=v(parseInt(i[1]),0,360),o=v(parseFloat(i[2]),0,100),r=v(parseFloat(i[3]),0,100),s=v(isNaN(n)?1:n,0,1);return[a,o,r,s]}}}function r(t){var e=n(t);return e&&e.slice(0,3)}function s(t){var e=a(t);return e&&e.slice(0,3)}function l(t){var e=n(t);return e?e[3]:(e=a(t))?e[3]:(e=o(t))?e[3]:void 0}function h(t){return"#"+y(t[0])+y(t[1])+y(t[2])}function d(t,e){return 1>e||t[3]&&t[3]<1?u(t,e):"rgb("+t[0]+", "+t[1]+", "+t[2]+")"}function u(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function c(t,e){if(1>e||t[3]&&t[3]<1)return f(t,e);var i=Math.round(t[0]/255*100),n=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+i+"%, "+n+"%, "+a+"%)"}function f(t,e){var i=Math.round(t[0]/255*100),n=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgba("+i+"%, "+n+"%, "+a+"%, "+(e||t[3]||1)+")"}function g(t,e){return 1>e||t[3]&&t[3]<1?m(t,e):"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"}function m(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function p(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"}function b(t){return k[t.slice(0,3)]}function v(t,e,i){return Math.min(Math.max(e,t),i)}function y(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var x=t("color-name");e.exports={getRgba:n,getHsla:a,getRgb:r,getHsl:s,getHwb:o,getAlpha:l,hexString:h,rgbString:d,rgbaString:u,percentString:c,percentaString:f,hslString:g,hslaString:m,hwbString:p,keyword:b};var k={};for(var _ in x)k[x[_]]=_},{"color-name":5}],2:[function(t,e,i){var n=t("color-convert"),a=t("chartjs-color-string"),o=function(t){if(t instanceof o)return t;if(!(this instanceof o))return new o(t);this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1};var e;if("string"==typeof t)if(e=a.getRgba(t))this.setValues("rgb",e);else if(e=a.getHsla(t))this.setValues("hsl",e);else{if(!(e=a.getHwb(t)))throw new Error('Unable to parse color from string "'+t+'"');this.setValues("hwb",e)}else if("object"==typeof t)if(e=t,void 0!==e.r||void 0!==e.red)this.setValues("rgb",e);else if(void 0!==e.l||void 0!==e.lightness)this.setValues("hsl",e);else if(void 0!==e.v||void 0!==e.value)this.setValues("hsv",e);else if(void 0!==e.w||void 0!==e.whiteness)this.setValues("hwb",e);else{if(void 0===e.c&&void 0===e.cyan)throw new Error("Unable to parse color from object "+JSON.stringify(t));this.setValues("cmyk",e)}};o.prototype={rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t%=360,t=0>t?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return a.hexString(this.values.rgb)},rgbString:function(){return a.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return a.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return a.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return a.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return a.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return a.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return a.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],i=0;i<t.length;i++){var n=t[i]/255;e[i]=.03928>=n?n/12.92:Math.pow((n+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),i=t.luminosity();return e>i?(e+.05)/(i+.05):(i+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb,e=(299*t[0]+587*t[1]+114*t[2])/1e3;return 128>e},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;3>e;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,i=(e[0]+t)%360;return e[0]=0>i?360+i:i,this.setValues("hsl",e),this},mix:function(t,e){var i=this,n=t,a=void 0===e?.5:e,o=2*a-1,r=i.alpha()-n.alpha(),s=((o*r===-1?o:(o+r)/(1+o*r))+1)/2,l=1-s;return this.rgb(s*i.red()+l*n.red(),s*i.green()+l*n.green(),s*i.blue()+l*n.blue()).alpha(i.alpha()*a+n.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,i=new o,n=this.values,a=i.values;for(var r in n)n.hasOwnProperty(r)&&(t=n[r],e={}.toString.call(t),"[object Array]"===e?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return i}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,i={},n=0;n<t.length;n++)i[t.charAt(n)]=e[t][n];return 1!==e.alpha&&(i.a=e.alpha),i},o.prototype.setValues=function(t,e){var i,a=this.values,o=this.spaces,r=this.maxes,s=1;if("alpha"===t)s=e;else if(e.length)a[t]=e.slice(0,t.length),s=e[t.length];else if(void 0!==e[t.charAt(0)]){for(i=0;i<t.length;i++)a[t][i]=e[t.charAt(i)];s=e.a}else if(void 0!==e[o[t][0]]){var l=o[t];for(i=0;i<t.length;i++)a[t][i]=e[l[i]];s=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===s?a.alpha:s)),"alpha"===t)return!1;var h;for(i=0;i<t.length;i++)h=Math.max(0,Math.min(r[t][i],a[t][i])),a[t][i]=Math.round(h);for(var d in o)d!==t&&(a[d]=n[t][d](a[t]));return!0},o.prototype.setSpace=function(t,e){var i=e[0];return void 0===i?this.getValues(t):("number"==typeof i&&(i=Array.prototype.slice.call(e)),this.setValues(t,i),this)},o.prototype.setChannel=function(t,e,i){var n=this.values[t];return void 0===i?n[e]:i===n[e]?this:(n[e]=i,this.setValues(t,n),this)},"undefined"!=typeof window&&(window.Color=o),e.exports=o},{"chartjs-color-string":1,"color-convert":4}],3:[function(t,e,i){function n(t){var e,i,n,a=t[0]/255,o=t[1]/255,r=t[2]/255,s=Math.min(a,o,r),l=Math.max(a,o,r),h=l-s;return l==s?e=0:a==l?e=(o-r)/h:o==l?e=2+(r-a)/h:r==l&&(e=4+(a-o)/h),e=Math.min(60*e,360),0>e&&(e+=360),n=(s+l)/2,i=l==s?0:.5>=n?h/(l+s):h/(2-l-s),[e,100*i,100*n]}function a(t){var e,i,n,a=t[0],o=t[1],r=t[2],s=Math.min(a,o,r),l=Math.max(a,o,r),h=l-s;return i=0==l?0:h/l*1e3/10,l==s?e=0:a==l?e=(o-r)/h:o==l?e=2+(r-a)/h:r==l&&(e=4+(a-o)/h),e=Math.min(60*e,360),0>e&&(e+=360),n=l/255*1e3/10,[e,i,n]}function o(t){var e=t[0],i=t[1],a=t[2],o=n(t)[0],r=1/255*Math.min(e,Math.min(i,a)),a=1-1/255*Math.max(e,Math.max(i,a));return[o,100*r,100*a]}function s(t){var e,i,n,a,o=t[0]/255,r=t[1]/255,s=t[2]/255;return a=Math.min(1-o,1-r,1-s),e=(1-o-a)/(1-a)||0,i=(1-r-a)/(1-a)||0,n=(1-s-a)/(1-a)||0,[100*e,100*i,100*n,100*a]}function l(t){return Q[JSON.stringify(t)]}function h(t){var e=t[0]/255,i=t[1]/255,n=t[2]/255;e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92,i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92,n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92;var a=.4124*e+.3576*i+.1805*n,o=.2126*e+.7152*i+.0722*n,r=.0193*e+.1192*i+.9505*n;return[100*a,100*o,100*r]}function d(t){var e,i,n,a=h(t),o=a[0],r=a[1],s=a[2];return o/=95.047,r/=100,s/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,s=s>.008856?Math.pow(s,1/3):7.787*s+16/116,e=116*r-16,i=500*(o-r),n=200*(r-s),[e,i,n]}function u(t){return B(d(t))}function c(t){var e,i,n,a,o,r=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return o=255*l,[o,o,o];i=.5>l?l*(1+s):l+s-l*s,e=2*l-i,a=[0,0,0];for(var h=0;3>h;h++)n=r+1/3*-(h-1),0>n&&n++,n>1&&n--,o=1>6*n?e+6*(i-e)*n:1>2*n?i:2>3*n?e+(i-e)*(2/3-n)*6:e,a[h]=255*o;return a}function f(t){var e,i,n=t[0],a=t[1]/100,o=t[2]/100;return 0===o?[0,0,0]:(o*=2,a*=1>=o?o:2-o,i=(o+a)/2,e=2*a/(o+a),[n,100*e,100*i])}function m(t){return o(c(t))}function p(t){return s(c(t))}function v(t){return l(c(t))}function y(t){var e=t[0]/60,i=t[1]/100,n=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*n*(1-i),s=255*n*(1-i*o),l=255*n*(1-i*(1-o)),n=255*n;switch(a){case 0:return[n,l,r];case 1:return[s,n,r];case 2:return[r,n,l];case 3:return[r,s,n];case 4:return[l,r,n];case 5:return[n,r,s]}}function x(t){var e,i,n=t[0],a=t[1]/100,o=t[2]/100;return i=(2-a)*o,e=a*o,e/=1>=i?i:2-i,e=e||0,i/=2,[n,100*e,100*i]}function k(t){return o(y(t))}function _(t){return s(y(t))}function S(t){return l(y(t))}function w(t){var e,i,n,a,o=t[0]/360,s=t[1]/100,l=t[2]/100,h=s+l;switch(h>1&&(s/=h,l/=h),e=Math.floor(6*o),i=1-l,n=6*o-e,0!=(1&e)&&(n=1-n),a=s+n*(i-s),e){default:case 6:case 0:r=i,g=a,b=s;break;case 1:r=a,g=i,b=s;break;case 2:r=s,g=i,b=a;break;case 3:r=s,g=a,b=i;break;case 4:r=a,g=s,b=i;break;case 5:r=i,g=s,b=a}return[255*r,255*g,255*b]}function M(t){return n(w(t))}function C(t){return a(w(t))}function D(t){return s(w(t))}function T(t){return l(w(t))}function P(t){var e,i,n,a=t[0]/100,o=t[1]/100,r=t[2]/100,s=t[3]/100;return e=1-Math.min(1,a*(1-s)+s),i=1-Math.min(1,o*(1-s)+s),n=1-Math.min(1,r*(1-s)+s),[255*e,255*i,255*n]}function A(t){return n(P(t))}function F(t){return a(P(t))}function I(t){return o(P(t))}function O(t){return l(P(t))}function R(t){var e,i,n,a=t[0]/100,o=t[1]/100,r=t[2]/100;return e=3.2406*a+-1.5372*o+r*-.4986,i=a*-.9689+1.8758*o+.0415*r,n=.0557*a+o*-.204+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e=12.92*e,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i=12.92*i,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n=12.92*n,e=Math.min(Math.max(0,e),1),i=Math.min(Math.max(0,i),1),n=Math.min(Math.max(0,n),1),[255*e,255*i,255*n]}function W(t){var e,i,n,a=t[0],o=t[1],r=t[2];return a/=95.047,o/=100,r/=108.883,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*o-16,i=500*(a-o),n=200*(o-r),[e,i,n]}function V(t){return B(W(t))}function L(t){var e,i,n,a,o=t[0],r=t[1],s=t[2];return 8>=o?(i=100*o/903.3,a=7.787*(i/100)+16/116):(i=100*Math.pow((o+16)/116,3),a=Math.pow(i/100,1/3)),e=.008856>=e/95.047?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),n=.008859>=n/108.883?n=108.883*(a-s/200-16/116)/7.787:108.883*Math.pow(a-s/200,3),[e,i,n]}function B(t){var e,i,n,a=t[0],o=t[1],r=t[2];return e=Math.atan2(r,o),i=360*e/2/Math.PI,0>i&&(i+=360),n=Math.sqrt(o*o+r*r),[a,n,i]}function z(t){return R(L(t))}function Y(t){var e,i,n,a=t[0],o=t[1],r=t[2];return n=r/360*2*Math.PI,e=o*Math.cos(n),i=o*Math.sin(n),[a,e,i]}function H(t){return L(Y(t))}function N(t){return z(Y(t))}function E(t){return X[t]}function U(t){return n(E(t))}function j(t){return a(E(t))}function G(t){return o(E(t))}function q(t){return s(E(t))}function Z(t){return d(E(t))}function J(t){return h(E(t))}e.exports={rgb2hsl:n,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:s,rgb2keyword:l,rgb2xyz:h,rgb2lab:d,rgb2lch:u,hsl2rgb:c,hsl2hsv:f,hsl2hwb:m,hsl2cmyk:p,hsl2keyword:v,hsv2rgb:y,hsv2hsl:x,hsv2hwb:k,hsv2cmyk:_,hsv2keyword:S,hwb2rgb:w,hwb2hsl:M,hwb2hsv:C,hwb2cmyk:D,hwb2keyword:T,cmyk2rgb:P,cmyk2hsl:A,cmyk2hsv:F,cmyk2hwb:I,cmyk2keyword:O,keyword2rgb:E,keyword2hsl:U,keyword2hsv:j,keyword2hwb:G,keyword2cmyk:q,keyword2lab:Z,keyword2xyz:J,xyz2rgb:R,xyz2lab:W,xyz2lch:V,lab2xyz:L,lab2rgb:z,lab2lch:B,lch2lab:Y,lch2xyz:H,lch2rgb:N};var X={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Q={};for(var $ in X)Q[JSON.stringify(X[$])]=$},{}],4:[function(t,e,i){var n=t("./conversions"),a=function(){return new h};for(var o in n){a[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),n[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),s=r[1],l=r[2];a[s]=a[s]||{},a[s][l]=a[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var i=n[t](e);if("string"==typeof i||void 0===i)return i;for(var a=0;a<i.length;a++)i[a]=Math.round(i[a]);return i}}(o)}var h=function(){this.convs={}};h.prototype.routeSpace=function(t,e){var i=e[0];return void 0===i?this.getValues(t):("number"==typeof i&&(i=Array.prototype.slice.call(e)),this.setValues(t,i))},h.prototype.setValues=function(t,e){return this.space=t,this.convs={},this.convs[t]=e,this},h.prototype.getValues=function(t){var e=this.convs[t];if(!e){var i=this.space,n=this.convs[i];e=a[i][t](n),this.convs[t]=e}return e},["rgb","hsl","hsv","cmyk","keyword"].forEach(function(t){h.prototype[t]=function(e){return this.routeSpace(t,arguments)}}),e.exports=a},{"./conversions":3}],5:[function(t,e,i){e.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},{}],6:[function(t,e,i){!function(t,n){"object"==typeof i&&"undefined"!=typeof e?e.exports=n():"function"==typeof define&&define.amd?define(n):t.moment=n()}(this,function(){"use strict";function i(){return ln.apply(null,arguments)}function n(t){ln=t}function a(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function o(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function r(t,e){var i,n=[];for(i=0;i<t.length;++i)n.push(e(t[i],i));return n}function s(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function l(t,e){for(var i in e)s(e,i)&&(t[i]=e[i]);return s(e,"toString")&&(t.toString=e.toString),s(e,"valueOf")&&(t.valueOf=e.valueOf),t}function h(t,e,i,n){return Lt(t,e,i,n,!0).utc()}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null}}function u(t){return null==t._pf&&(t._pf=d()),t._pf}function c(t){if(null==t._isValid){var e=u(t),i=hn.call(e.parsedDateParts,function(t){return null!=t});t._isValid=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&i),t._strict&&(t._isValid=t._isValid&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour)}return t._isValid}function f(t){var e=h(NaN);return null!=t?l(u(e),t):u(e).userInvalidated=!0,e}function g(t){return void 0===t}function m(t,e){var i,n,a;if(g(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),g(e._i)||(t._i=e._i),g(e._f)||(t._f=e._f),g(e._l)||(t._l=e._l),g(e._strict)||(t._strict=e._strict),g(e._tzm)||(t._tzm=e._tzm),g(e._isUTC)||(t._isUTC=e._isUTC),g(e._offset)||(t._offset=e._offset),g(e._pf)||(t._pf=u(e)),g(e._locale)||(t._locale=e._locale),dn.length>0)for(i in dn)n=dn[i],a=e[n],g(a)||(t[n]=a);return t}function p(t){m(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),un===!1&&(un=!0,i.updateOffset(this),un=!1)}function b(t){return t instanceof p||null!=t&&null!=t._isAMomentObject}function v(t){return 0>t?Math.ceil(t):Math.floor(t)}function y(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=v(e)),i}function x(t,e,i){var n,a=Math.min(t.length,e.length),o=Math.abs(t.length-e.length),r=0;for(n=0;a>n;n++)(i&&t[n]!==e[n]||!i&&y(t[n])!==y(e[n]))&&r++;return r+o}function k(t){i.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function _(t,e){var n=!0;return l(function(){return null!=i.deprecationHandler&&i.deprecationHandler(null,t),n&&(k(t+"\nArguments: "+Array.prototype.slice.call(arguments).join(", ")+"\n"+(new Error).stack),n=!1),e.apply(this,arguments)},e)}function S(t,e){null!=i.deprecationHandler&&i.deprecationHandler(t,e),cn[t]||(k(e),cn[t]=!0)}function w(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function M(t){return"[object Object]"===Object.prototype.toString.call(t)}function C(t){var e,i;for(i in t)e=t[i],w(e)?this[i]=e:this["_"+i]=e;this._config=t,this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function D(t,e){var i,n=l({},t);for(i in e)s(e,i)&&(M(t[i])&&M(e[i])?(n[i]={},l(n[i],t[i]),l(n[i],e[i])):null!=e[i]?n[i]=e[i]:delete n[i]);return n}function T(t){null!=t&&this.set(t)}function P(t){return t?t.toLowerCase().replace("_","-"):t}function A(t){for(var e,i,n,a,o=0;o<t.length;){for(a=P(t[o]).split("-"),e=a.length,i=P(t[o+1]),i=i?i.split("-"):null;e>0;){if(n=F(a.slice(0,e).join("-")))return n;if(i&&i.length>=e&&x(a,i,!0)>=e-1)break;e--}o++}return null}function F(i){var n=null;if(!pn[i]&&"undefined"!=typeof e&&e&&e.exports)try{n=gn._abbr,t("./locale/"+i),I(n)}catch(a){}return pn[i]}function I(t,e){var i;return t&&(i=g(e)?W(t):O(t,e),i&&(gn=i)),gn._abbr}function O(t,e){return null!==e?(e.abbr=t,null!=pn[t]?(S("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale"),e=D(pn[t]._config,e)):null!=e.parentLocale&&(null!=pn[e.parentLocale]?e=D(pn[e.parentLocale]._config,e):S("parentLocaleUndefined","specified parentLocale is not defined yet")),pn[t]=new T(e),I(t),pn[t]):(delete pn[t],null)}function R(t,e){if(null!=e){var i;null!=pn[t]&&(e=D(pn[t]._config,e)),i=new T(e),i.parentLocale=pn[t],pn[t]=i,I(t)}else null!=pn[t]&&(null!=pn[t].parentLocale?pn[t]=pn[t].parentLocale:null!=pn[t]&&delete pn[t]);return pn[t]}function W(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return gn;if(!a(t)){if(e=F(t))return e;t=[t]}return A(t)}function V(){return fn(pn)}function L(t,e){var i=t.toLowerCase();bn[i]=bn[i+"s"]=bn[e]=t}function B(t){return"string"==typeof t?bn[t]||bn[t.toLowerCase()]:void 0}function z(t){var e,i,n={};for(i in t)s(t,i)&&(e=B(i),e&&(n[e]=t[i]));return n}function Y(t,e){return function(n){return null!=n?(N(this,t,n),i.updateOffset(this,e),this):H(this,t)}}function H(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function N(t,e,i){t.isValid()&&t._d["set"+(t._isUTC?"UTC":"")+e](i)}function E(t,e){var i;if("object"==typeof t)for(i in t)this.set(i,t[i]);else if(t=B(t),w(this[t]))return this[t](e);return this}function U(t,e,i){var n=""+Math.abs(t),a=e-n.length,o=t>=0;return(o?i?"+":"":"-")+Math.pow(10,Math.max(0,a)).toString().substr(1)+n}function j(t,e,i,n){var a=n;"string"==typeof n&&(a=function(){return this[n]()}),t&&(kn[t]=a),e&&(kn[e[0]]=function(){return U(a.apply(this,arguments),e[1],e[2])}),i&&(kn[i]=function(){return this.localeData().ordinal(a.apply(this,arguments),t)})}function G(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function q(t){var e,i,n=t.match(vn);for(e=0,i=n.length;i>e;e++)kn[n[e]]?n[e]=kn[n[e]]:n[e]=G(n[e]);return function(e){var a,o="";for(a=0;i>a;a++)o+=n[a]instanceof Function?n[a].call(e,t):n[a];return o}}function Z(t,e){return t.isValid()?(e=J(e,t.localeData()),xn[e]=xn[e]||q(e),xn[e](t)):t.localeData().invalidDate()}function J(t,e){function i(t){return e.longDateFormat(t)||t}var n=5;for(yn.lastIndex=0;n>=0&&yn.test(t);)t=t.replace(yn,i),yn.lastIndex=0,n-=1;return t}function X(t,e,i){zn[t]=w(e)?e:function(t,n){return t&&i?i:e}}function Q(t,e){return s(zn,t)?zn[t](e._strict,e._locale):new RegExp($(t))}function $(t){return K(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,n,a){return e||i||n||a}))}function K(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function tt(t,e){var i,n=e;for("string"==typeof t&&(t=[t]),"number"==typeof e&&(n=function(t,i){i[e]=y(t)}),i=0;i<t.length;i++)Yn[t[i]]=n}function et(t,e){tt(t,function(t,i,n,a){n._w=n._w||{},e(t,n._w,n,a)})}function it(t,e,i){null!=e&&s(Yn,t)&&Yn[t](e,i._a,i,t)}function nt(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function at(t,e){return a(this._months)?this._months[t.month()]:this._months[Xn.test(e)?"format":"standalone"][t.month()]}function ot(t,e){return a(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[Xn.test(e)?"format":"standalone"][t.month()]}function rt(t,e,i){var n,a,o,r=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],n=0;12>n;++n)o=h([2e3,n]),this._shortMonthsParse[n]=this.monthsShort(o,"").toLocaleLowerCase(),this._longMonthsParse[n]=this.months(o,"").toLocaleLowerCase();return i?"MMM"===e?(a=mn.call(this._shortMonthsParse,r),-1!==a?a:null):(a=mn.call(this._longMonthsParse,r),-1!==a?a:null):"MMM"===e?(a=mn.call(this._shortMonthsParse,r),-1!==a?a:(a=mn.call(this._longMonthsParse,r),-1!==a?a:null)):(a=mn.call(this._longMonthsParse,r),-1!==a?a:(a=mn.call(this._shortMonthsParse,r),-1!==a?a:null))}function st(t,e,i){var n,a,o;if(this._monthsParseExact)return rt.call(this,t,e,i);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),n=0;12>n;n++){if(a=h([2e3,n]),i&&!this._longMonthsParse[n]&&(this._longMonthsParse[n]=new RegExp("^"+this.months(a,"").replace(".","")+"$","i"),this._shortMonthsParse[n]=new RegExp("^"+this.monthsShort(a,"").replace(".","")+"$","i")),i||this._monthsParse[n]||(o="^"+this.months(a,"")+"|^"+this.monthsShort(a,""),this._monthsParse[n]=new RegExp(o.replace(".",""),"i")),i&&"MMMM"===e&&this._longMonthsParse[n].test(t))return n;if(i&&"MMM"===e&&this._shortMonthsParse[n].test(t))return n;if(!i&&this._monthsParse[n].test(t))return n}}function lt(t,e){var i;if(!t.isValid())return t;if("string"==typeof e)if(/^\d+$/.test(e))e=y(e);else if(e=t.localeData().monthsParse(e),"number"!=typeof e)return t;return i=Math.min(t.date(),nt(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,i),t}function ht(t){return null!=t?(lt(this,t),i.updateOffset(this,!0),this):H(this,"Month")}function dt(){
-return nt(this.year(),this.month())}function ut(t){return this._monthsParseExact?(s(this,"_monthsRegex")||ft.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex}function ct(t){return this._monthsParseExact?(s(this,"_monthsRegex")||ft.call(this),t?this._monthsStrictRegex:this._monthsRegex):this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex}function ft(){function t(t,e){return e.length-t.length}var e,i,n=[],a=[],o=[];for(e=0;12>e;e++)i=h([2e3,e]),n.push(this.monthsShort(i,"")),a.push(this.months(i,"")),o.push(this.months(i,"")),o.push(this.monthsShort(i,""));for(n.sort(t),a.sort(t),o.sort(t),e=0;12>e;e++)n[e]=K(n[e]),a[e]=K(a[e]),o[e]=K(o[e]);this._monthsRegex=new RegExp("^("+o.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+n.join("|")+")","i")}function gt(t){var e,i=t._a;return i&&-2===u(t).overflow&&(e=i[Nn]<0||i[Nn]>11?Nn:i[En]<1||i[En]>nt(i[Hn],i[Nn])?En:i[Un]<0||i[Un]>24||24===i[Un]&&(0!==i[jn]||0!==i[Gn]||0!==i[qn])?Un:i[jn]<0||i[jn]>59?jn:i[Gn]<0||i[Gn]>59?Gn:i[qn]<0||i[qn]>999?qn:-1,u(t)._overflowDayOfYear&&(Hn>e||e>En)&&(e=En),u(t)._overflowWeeks&&-1===e&&(e=Zn),u(t)._overflowWeekday&&-1===e&&(e=Jn),u(t).overflow=e),t}function mt(t){var e,i,n,a,o,r,s=t._i,l=ea.exec(s)||ia.exec(s);if(l){for(u(t).iso=!0,e=0,i=aa.length;i>e;e++)if(aa[e][1].exec(l[1])){a=aa[e][0],n=aa[e][2]!==!1;break}if(null==a)return void(t._isValid=!1);if(l[3]){for(e=0,i=oa.length;i>e;e++)if(oa[e][1].exec(l[3])){o=(l[2]||" ")+oa[e][0];break}if(null==o)return void(t._isValid=!1)}if(!n&&null!=o)return void(t._isValid=!1);if(l[4]){if(!na.exec(l[4]))return void(t._isValid=!1);r="Z"}t._f=a+(o||"")+(r||""),At(t)}else t._isValid=!1}function pt(t){var e=ra.exec(t._i);return null!==e?void(t._d=new Date(+e[1])):(mt(t),void(t._isValid===!1&&(delete t._isValid,i.createFromInputFallback(t))))}function bt(t,e,i,n,a,o,r){var s=new Date(t,e,i,n,a,o,r);return 100>t&&t>=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}function vt(t){var e=new Date(Date.UTC.apply(null,arguments));return 100>t&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function yt(t){return xt(t)?366:365}function xt(t){return t%4===0&&t%100!==0||t%400===0}function kt(){return xt(this.year())}function _t(t,e,i){var n=7+e-i,a=(7+vt(t,0,n).getUTCDay()-e)%7;return-a+n-1}function St(t,e,i,n,a){var o,r,s=(7+i-n)%7,l=_t(t,n,a),h=1+7*(e-1)+s+l;return 0>=h?(o=t-1,r=yt(o)+h):h>yt(t)?(o=t+1,r=h-yt(t)):(o=t,r=h),{year:o,dayOfYear:r}}function wt(t,e,i){var n,a,o=_t(t.year(),e,i),r=Math.floor((t.dayOfYear()-o-1)/7)+1;return 1>r?(a=t.year()-1,n=r+Mt(a,e,i)):r>Mt(t.year(),e,i)?(n=r-Mt(t.year(),e,i),a=t.year()+1):(a=t.year(),n=r),{week:n,year:a}}function Mt(t,e,i){var n=_t(t,e,i),a=_t(t+1,e,i);return(yt(t)-n+a)/7}function Ct(t,e,i){return null!=t?t:null!=e?e:i}function Dt(t){var e=new Date(i.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}function Tt(t){var e,i,n,a,o=[];if(!t._d){for(n=Dt(t),t._w&&null==t._a[En]&&null==t._a[Nn]&&Pt(t),t._dayOfYear&&(a=Ct(t._a[Hn],n[Hn]),t._dayOfYear>yt(a)&&(u(t)._overflowDayOfYear=!0),i=vt(a,0,t._dayOfYear),t._a[Nn]=i.getUTCMonth(),t._a[En]=i.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=o[e]=n[e];for(;7>e;e++)t._a[e]=o[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[Un]&&0===t._a[jn]&&0===t._a[Gn]&&0===t._a[qn]&&(t._nextDay=!0,t._a[Un]=0),t._d=(t._useUTC?vt:bt).apply(null,o),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[Un]=24)}}function Pt(t){var e,i,n,a,o,r,s,l;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(o=1,r=4,i=Ct(e.GG,t._a[Hn],wt(Bt(),1,4).year),n=Ct(e.W,1),a=Ct(e.E,1),(1>a||a>7)&&(l=!0)):(o=t._locale._week.dow,r=t._locale._week.doy,i=Ct(e.gg,t._a[Hn],wt(Bt(),o,r).year),n=Ct(e.w,1),null!=e.d?(a=e.d,(0>a||a>6)&&(l=!0)):null!=e.e?(a=e.e+o,(e.e<0||e.e>6)&&(l=!0)):a=o),1>n||n>Mt(i,o,r)?u(t)._overflowWeeks=!0:null!=l?u(t)._overflowWeekday=!0:(s=St(i,n,a,o,r),t._a[Hn]=s.year,t._dayOfYear=s.dayOfYear)}function At(t){if(t._f===i.ISO_8601)return void mt(t);t._a=[],u(t).empty=!0;var e,n,a,o,r,s=""+t._i,l=s.length,h=0;for(a=J(t._f,t._locale).match(vn)||[],e=0;e<a.length;e++)o=a[e],n=(s.match(Q(o,t))||[])[0],n&&(r=s.substr(0,s.indexOf(n)),r.length>0&&u(t).unusedInput.push(r),s=s.slice(s.indexOf(n)+n.length),h+=n.length),kn[o]?(n?u(t).empty=!1:u(t).unusedTokens.push(o),it(o,n,t)):t._strict&&!n&&u(t).unusedTokens.push(o);u(t).charsLeftOver=l-h,s.length>0&&u(t).unusedInput.push(s),u(t).bigHour===!0&&t._a[Un]<=12&&t._a[Un]>0&&(u(t).bigHour=void 0),u(t).parsedDateParts=t._a.slice(0),u(t).meridiem=t._meridiem,t._a[Un]=Ft(t._locale,t._a[Un],t._meridiem),Tt(t),gt(t)}function Ft(t,e,i){var n;return null==i?e:null!=t.meridiemHour?t.meridiemHour(e,i):null!=t.isPM?(n=t.isPM(i),n&&12>e&&(e+=12),n||12!==e||(e=0),e):e}function It(t){var e,i,n,a,o;if(0===t._f.length)return u(t).invalidFormat=!0,void(t._d=new Date(NaN));for(a=0;a<t._f.length;a++)o=0,e=m({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[a],At(e),c(e)&&(o+=u(e).charsLeftOver,o+=10*u(e).unusedTokens.length,u(e).score=o,(null==n||n>o)&&(n=o,i=e));l(t,i||e)}function Ot(t){if(!t._d){var e=z(t._i);t._a=r([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],function(t){return t&&parseInt(t,10)}),Tt(t)}}function Rt(t){var e=new p(gt(Wt(t)));return e._nextDay&&(e.add(1,"d"),e._nextDay=void 0),e}function Wt(t){var e=t._i,i=t._f;return t._locale=t._locale||W(t._l),null===e||void 0===i&&""===e?f({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),b(e)?new p(gt(e)):(a(i)?It(t):i?At(t):o(e)?t._d=e:Vt(t),c(t)||(t._d=null),t))}function Vt(t){var e=t._i;void 0===e?t._d=new Date(i.now()):o(e)?t._d=new Date(e.valueOf()):"string"==typeof e?pt(t):a(e)?(t._a=r(e.slice(0),function(t){return parseInt(t,10)}),Tt(t)):"object"==typeof e?Ot(t):"number"==typeof e?t._d=new Date(e):i.createFromInputFallback(t)}function Lt(t,e,i,n,a){var o={};return"boolean"==typeof i&&(n=i,i=void 0),o._isAMomentObject=!0,o._useUTC=o._isUTC=a,o._l=i,o._i=t,o._f=e,o._strict=n,Rt(o)}function Bt(t,e,i,n){return Lt(t,e,i,n,!1)}function zt(t,e){var i,n;if(1===e.length&&a(e[0])&&(e=e[0]),!e.length)return Bt();for(i=e[0],n=1;n<e.length;++n)(!e[n].isValid()||e[n][t](i))&&(i=e[n]);return i}function Yt(){var t=[].slice.call(arguments,0);return zt("isBefore",t)}function Ht(){var t=[].slice.call(arguments,0);return zt("isAfter",t)}function Nt(t){var e=z(t),i=e.year||0,n=e.quarter||0,a=e.month||0,o=e.week||0,r=e.day||0,s=e.hour||0,l=e.minute||0,h=e.second||0,d=e.millisecond||0;this._milliseconds=+d+1e3*h+6e4*l+1e3*s*60*60,this._days=+r+7*o,this._months=+a+3*n+12*i,this._data={},this._locale=W(),this._bubble()}function Et(t){return t instanceof Nt}function Ut(t,e){j(t,0,0,function(){var t=this.utcOffset(),i="+";return 0>t&&(t=-t,i="-"),i+U(~~(t/60),2)+e+U(~~t%60,2)})}function jt(t,e){var i=(e||"").match(t)||[],n=i[i.length-1]||[],a=(n+"").match(ua)||["-",0,0],o=+(60*a[1])+y(a[2]);return"+"===a[0]?o:-o}function Gt(t,e){var n,a;return e._isUTC?(n=e.clone(),a=(b(t)||o(t)?t.valueOf():Bt(t).valueOf())-n.valueOf(),n._d.setTime(n._d.valueOf()+a),i.updateOffset(n,!1),n):Bt(t).local()}function qt(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function Zt(t,e){var n,a=this._offset||0;return this.isValid()?null!=t?("string"==typeof t?t=jt(Vn,t):Math.abs(t)<16&&(t=60*t),!this._isUTC&&e&&(n=qt(this)),this._offset=t,this._isUTC=!0,null!=n&&this.add(n,"m"),a!==t&&(!e||this._changeInProgress?ue(this,oe(t-a,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,i.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?a:qt(this):null!=t?this:NaN}function Jt(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}function Xt(t){return this.utcOffset(0,t)}function Qt(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(qt(this),"m")),this}function $t(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(jt(Wn,this._i)),this}function Kt(t){return this.isValid()?(t=t?Bt(t).utcOffset():0,(this.utcOffset()-t)%60===0):!1}function te(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function ee(){if(!g(this._isDSTShifted))return this._isDSTShifted;var t={};if(m(t,this),t=Wt(t),t._a){var e=t._isUTC?h(t._a):Bt(t._a);this._isDSTShifted=this.isValid()&&x(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function ie(){return this.isValid()?!this._isUTC:!1}function ne(){return this.isValid()?this._isUTC:!1}function ae(){return this.isValid()?this._isUTC&&0===this._offset:!1}function oe(t,e){var i,n,a,o=t,r=null;return Et(t)?o={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(o={},e?o[e]=t:o.milliseconds=t):(r=ca.exec(t))?(i="-"===r[1]?-1:1,o={y:0,d:y(r[En])*i,h:y(r[Un])*i,m:y(r[jn])*i,s:y(r[Gn])*i,ms:y(r[qn])*i}):(r=fa.exec(t))?(i="-"===r[1]?-1:1,o={y:re(r[2],i),M:re(r[3],i),w:re(r[4],i),d:re(r[5],i),h:re(r[6],i),m:re(r[7],i),s:re(r[8],i)}):null==o?o={}:"object"==typeof o&&("from"in o||"to"in o)&&(a=le(Bt(o.from),Bt(o.to)),o={},o.ms=a.milliseconds,o.M=a.months),n=new Nt(o),Et(t)&&s(t,"_locale")&&(n._locale=t._locale),n}function re(t,e){var i=t&&parseFloat(t.replace(",","."));return(isNaN(i)?0:i)*e}function se(t,e){var i={milliseconds:0,months:0};return i.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(i.months,"M").isAfter(e)&&--i.months,i.milliseconds=+e-+t.clone().add(i.months,"M"),i}function le(t,e){var i;return t.isValid()&&e.isValid()?(e=Gt(e,t),t.isBefore(e)?i=se(t,e):(i=se(e,t),i.milliseconds=-i.milliseconds,i.months=-i.months),i):{milliseconds:0,months:0}}function he(t){return 0>t?-1*Math.round(-1*t):Math.round(t)}function de(t,e){return function(i,n){var a,o;return null===n||isNaN(+n)||(S(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period)."),o=i,i=n,n=o),i="string"==typeof i?+i:i,a=oe(i,n),ue(this,a,t),this}}function ue(t,e,n,a){var o=e._milliseconds,r=he(e._days),s=he(e._months);t.isValid()&&(a=null==a?!0:a,o&&t._d.setTime(t._d.valueOf()+o*n),r&&N(t,"Date",H(t,"Date")+r*n),s&&lt(t,H(t,"Month")+s*n),a&&i.updateOffset(t,r||s))}function ce(t,e){var i=t||Bt(),n=Gt(i,this).startOf("day"),a=this.diff(n,"days",!0),o=-6>a?"sameElse":-1>a?"lastWeek":0>a?"lastDay":1>a?"sameDay":2>a?"nextDay":7>a?"nextWeek":"sameElse",r=e&&(w(e[o])?e[o]():e[o]);return this.format(r||this.localeData().calendar(o,this,Bt(i)))}function fe(){return new p(this)}function ge(t,e){var i=b(t)?t:Bt(t);return this.isValid()&&i.isValid()?(e=B(g(e)?"millisecond":e),"millisecond"===e?this.valueOf()>i.valueOf():i.valueOf()<this.clone().startOf(e).valueOf()):!1}function me(t,e){var i=b(t)?t:Bt(t);return this.isValid()&&i.isValid()?(e=B(g(e)?"millisecond":e),"millisecond"===e?this.valueOf()<i.valueOf():this.clone().endOf(e).valueOf()<i.valueOf()):!1}function pe(t,e,i,n){return n=n||"()",("("===n[0]?this.isAfter(t,i):!this.isBefore(t,i))&&(")"===n[1]?this.isBefore(e,i):!this.isAfter(e,i))}function be(t,e){var i,n=b(t)?t:Bt(t);return this.isValid()&&n.isValid()?(e=B(e||"millisecond"),"millisecond"===e?this.valueOf()===n.valueOf():(i=n.valueOf(),this.clone().startOf(e).valueOf()<=i&&i<=this.clone().endOf(e).valueOf())):!1}function ve(t,e){return this.isSame(t,e)||this.isAfter(t,e)}function ye(t,e){return this.isSame(t,e)||this.isBefore(t,e)}function xe(t,e,i){var n,a,o,r;return this.isValid()?(n=Gt(t,this),n.isValid()?(a=6e4*(n.utcOffset()-this.utcOffset()),e=B(e),"year"===e||"month"===e||"quarter"===e?(r=ke(this,n),"quarter"===e?r/=3:"year"===e&&(r/=12)):(o=this-n,r="second"===e?o/1e3:"minute"===e?o/6e4:"hour"===e?o/36e5:"day"===e?(o-a)/864e5:"week"===e?(o-a)/6048e5:o),i?r:v(r)):NaN):NaN}function ke(t,e){var i,n,a=12*(e.year()-t.year())+(e.month()-t.month()),o=t.clone().add(a,"months");return 0>e-o?(i=t.clone().add(a-1,"months"),n=(e-o)/(o-i)):(i=t.clone().add(a+1,"months"),n=(e-o)/(i-o)),-(a+n)||0}function _e(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function Se(){var t=this.clone().utc();return 0<t.year()&&t.year()<=9999?w(Date.prototype.toISOString)?this.toDate().toISOString():Z(t,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):Z(t,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function we(t){t||(t=this.isUtc()?i.defaultFormatUtc:i.defaultFormat);var e=Z(this,t);return this.localeData().postformat(e)}function Me(t,e){return this.isValid()&&(b(t)&&t.isValid()||Bt(t).isValid())?oe({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function Ce(t){return this.from(Bt(),t)}function De(t,e){return this.isValid()&&(b(t)&&t.isValid()||Bt(t).isValid())?oe({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function Te(t){return this.to(Bt(),t)}function Pe(t){var e;return void 0===t?this._locale._abbr:(e=W(t),null!=e&&(this._locale=e),this)}function Ae(){return this._locale}function Fe(t){switch(t=B(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function Ie(t){return t=B(t),void 0===t||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function Oe(){return this._d.valueOf()-6e4*(this._offset||0)}function Re(){return Math.floor(this.valueOf()/1e3)}function We(){return this._offset?new Date(this.valueOf()):this._d}function Ve(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function Le(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function Be(){return this.isValid()?this.toISOString():null}function ze(){return c(this)}function Ye(){return l({},u(this))}function He(){return u(this).overflow}function Ne(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Ee(t,e){j(0,[t,t.length],0,e)}function Ue(t){return Ze.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function je(t){return Ze.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Ge(){return Mt(this.year(),1,4)}function qe(){var t=this.localeData()._week;return Mt(this.year(),t.dow,t.doy)}function Ze(t,e,i,n,a){var o;return null==t?wt(this,n,a).year:(o=Mt(t,n,a),e>o&&(e=o),Je.call(this,t,e,i,n,a))}function Je(t,e,i,n,a){var o=St(t,e,i,n,a),r=vt(o.year,0,o.dayOfYear);return this.year(r.getUTCFullYear()),this.month(r.getUTCMonth()),this.date(r.getUTCDate()),this}function Xe(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function Qe(t){return wt(t,this._week.dow,this._week.doy).week}function $e(){return this._week.dow}function Ke(){return this._week.doy}function ti(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function ei(t){var e=wt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function ii(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function ni(t,e){return a(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]}function ai(t){return this._weekdaysShort[t.day()]}function oi(t){return this._weekdaysMin[t.day()]}function ri(t,e,i){var n,a,o,r=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],n=0;7>n;++n)o=h([2e3,1]).day(n),this._minWeekdaysParse[n]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[n]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[n]=this.weekdays(o,"").toLocaleLowerCase();return i?"dddd"===e?(a=mn.call(this._weekdaysParse,r),-1!==a?a:null):"ddd"===e?(a=mn.call(this._shortWeekdaysParse,r),-1!==a?a:null):(a=mn.call(this._minWeekdaysParse,r),-1!==a?a:null):"dddd"===e?(a=mn.call(this._weekdaysParse,r),-1!==a?a:(a=mn.call(this._shortWeekdaysParse,r),-1!==a?a:(a=mn.call(this._minWeekdaysParse,r),-1!==a?a:null))):"ddd"===e?(a=mn.call(this._shortWeekdaysParse,r),-1!==a?a:(a=mn.call(this._weekdaysParse,r),-1!==a?a:(a=mn.call(this._minWeekdaysParse,r),-1!==a?a:null))):(a=mn.call(this._minWeekdaysParse,r),-1!==a?a:(a=mn.call(this._weekdaysParse,r),-1!==a?a:(a=mn.call(this._shortWeekdaysParse,r),-1!==a?a:null)))}function si(t,e,i){var n,a,o;if(this._weekdaysParseExact)return ri.call(this,t,e,i);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),n=0;7>n;n++){if(a=h([2e3,1]).day(n),i&&!this._fullWeekdaysParse[n]&&(this._fullWeekdaysParse[n]=new RegExp("^"+this.weekdays(a,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[n]=new RegExp("^"+this.weekdaysShort(a,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[n]=new RegExp("^"+this.weekdaysMin(a,"").replace(".",".?")+"$","i")),this._weekdaysParse[n]||(o="^"+this.weekdays(a,"")+"|^"+this.weekdaysShort(a,"")+"|^"+this.weekdaysMin(a,""),this._weekdaysParse[n]=new RegExp(o.replace(".",""),"i")),i&&"dddd"===e&&this._fullWeekdaysParse[n].test(t))return n;if(i&&"ddd"===e&&this._shortWeekdaysParse[n].test(t))return n;if(i&&"dd"===e&&this._minWeekdaysParse[n].test(t))return n;if(!i&&this._weekdaysParse[n].test(t))return n}}function li(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=ii(t,this.localeData()),this.add(t-e,"d")):e}function hi(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function di(t){return this.isValid()?null==t?this.day()||7:this.day(this.day()%7?t:t-7):null!=t?this:NaN}function ui(t){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||gi.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex}function ci(t){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||gi.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex}function fi(t){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||gi.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex}function gi(){function t(t,e){return e.length-t.length}var e,i,n,a,o,r=[],s=[],l=[],d=[];for(e=0;7>e;e++)i=h([2e3,1]).day(e),n=this.weekdaysMin(i,""),a=this.weekdaysShort(i,""),o=this.weekdays(i,""),r.push(n),s.push(a),l.push(o),d.push(n),d.push(a),d.push(o);for(r.sort(t),s.sort(t),l.sort(t),d.sort(t),e=0;7>e;e++)s[e]=K(s[e]),l[e]=K(l[e]),d[e]=K(d[e]);this._weekdaysRegex=new RegExp("^("+d.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+r.join("|")+")","i")}function mi(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function pi(){return this.hours()%12||12}function bi(){return this.hours()||24}function vi(t,e){j(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function yi(t,e){return e._meridiemParse}function xi(t){return"p"===(t+"").toLowerCase().charAt(0)}function ki(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"}function _i(t,e){e[qn]=y(1e3*("0."+t))}function Si(){return this._isUTC?"UTC":""}function wi(){return this._isUTC?"Coordinated Universal Time":""}function Mi(t){return Bt(1e3*t)}function Ci(){return Bt.apply(null,arguments).parseZone()}function Di(t,e,i){var n=this._calendar[t];return w(n)?n.call(e,i):n}function Ti(t){var e=this._longDateFormat[t],i=this._longDateFormat[t.toUpperCase()];return e||!i?e:(this._longDateFormat[t]=i.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])}function Pi(){return this._invalidDate}function Ai(t){return this._ordinal.replace("%d",t)}function Fi(t){return t}function Ii(t,e,i,n){var a=this._relativeTime[i];return w(a)?a(t,e,i,n):a.replace(/%d/i,t)}function Oi(t,e){var i=this._relativeTime[t>0?"future":"past"];return w(i)?i(e):i.replace(/%s/i,e)}function Ri(t,e,i,n){var a=W(),o=h().set(n,e);return a[i](o,t)}function Wi(t,e,i){if("number"==typeof t&&(e=t,t=void 0),t=t||"",null!=e)return Ri(t,e,i,"month");var n,a=[];for(n=0;12>n;n++)a[n]=Ri(t,n,i,"month");return a}function Vi(t,e,i,n){"boolean"==typeof t?("number"==typeof e&&(i=e,e=void 0),e=e||""):(e=t,i=e,t=!1,"number"==typeof e&&(i=e,e=void 0),e=e||"");var a=W(),o=t?a._week.dow:0;if(null!=i)return Ri(e,(i+o)%7,n,"day");var r,s=[];for(r=0;7>r;r++)s[r]=Ri(e,(r+o)%7,n,"day");return s}function Li(t,e){return Wi(t,e,"months")}function Bi(t,e){return Wi(t,e,"monthsShort")}function zi(t,e,i){return Vi(t,e,i,"weekdays")}function Yi(t,e,i){return Vi(t,e,i,"weekdaysShort")}function Hi(t,e,i){return Vi(t,e,i,"weekdaysMin")}function Ni(){var t=this._data;return this._milliseconds=Ya(this._milliseconds),this._days=Ya(this._days),this._months=Ya(this._months),t.milliseconds=Ya(t.milliseconds),t.seconds=Ya(t.seconds),t.minutes=Ya(t.minutes),t.hours=Ya(t.hours),t.months=Ya(t.months),t.years=Ya(t.years),this}function Ei(t,e,i,n){var a=oe(e,i);return t._milliseconds+=n*a._milliseconds,t._days+=n*a._days,t._months+=n*a._months,t._bubble()}function Ui(t,e){return Ei(this,t,e,1)}function ji(t,e){return Ei(this,t,e,-1)}function Gi(t){return 0>t?Math.floor(t):Math.ceil(t)}function qi(){var t,e,i,n,a,o=this._milliseconds,r=this._days,s=this._months,l=this._data;return o>=0&&r>=0&&s>=0||0>=o&&0>=r&&0>=s||(o+=864e5*Gi(Ji(s)+r),r=0,s=0),l.milliseconds=o%1e3,t=v(o/1e3),l.seconds=t%60,e=v(t/60),l.minutes=e%60,i=v(e/60),l.hours=i%24,r+=v(i/24),a=v(Zi(r)),s+=a,r-=Gi(Ji(a)),n=v(s/12),s%=12,l.days=r,l.months=s,l.years=n,this}function Zi(t){return 4800*t/146097}function Ji(t){return 146097*t/4800}function Xi(t){var e,i,n=this._milliseconds;if(t=B(t),"month"===t||"year"===t)return e=this._days+n/864e5,i=this._months+Zi(e),"month"===t?i:i/12;switch(e=this._days+Math.round(Ji(this._months)),t){case"week":return e/7+n/6048e5;case"day":return e+n/864e5;case"hour":return 24*e+n/36e5;case"minute":return 1440*e+n/6e4;case"second":return 86400*e+n/1e3;case"millisecond":return Math.floor(864e5*e)+n;default:throw new Error("Unknown unit "+t)}}function Qi(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*y(this._months/12)}function $i(t){return function(){return this.as(t)}}function Ki(t){return t=B(t),this[t+"s"]()}function tn(t){return function(){return this._data[t]}}function en(){return v(this.days()/7)}function nn(t,e,i,n,a){return a.relativeTime(e||1,!!i,t,n)}function an(t,e,i){var n=oe(t).abs(),a=io(n.as("s")),o=io(n.as("m")),r=io(n.as("h")),s=io(n.as("d")),l=io(n.as("M")),h=io(n.as("y")),d=a<no.s&&["s",a]||1>=o&&["m"]||o<no.m&&["mm",o]||1>=r&&["h"]||r<no.h&&["hh",r]||1>=s&&["d"]||s<no.d&&["dd",s]||1>=l&&["M"]||l<no.M&&["MM",l]||1>=h&&["y"]||["yy",h];return d[2]=e,d[3]=+t>0,d[4]=i,nn.apply(null,d)}function on(t,e){return void 0===no[t]?!1:void 0===e?no[t]:(no[t]=e,!0)}function rn(t){var e=this.localeData(),i=an(this,!t,e);return t&&(i=e.pastFuture(+this,i)),e.postformat(i)}function sn(){var t,e,i,n=ao(this._milliseconds)/1e3,a=ao(this._days),o=ao(this._months);t=v(n/60),e=v(t/60),n%=60,t%=60,i=v(o/12),o%=12;var r=i,s=o,l=a,h=e,d=t,u=n,c=this.asSeconds();return c?(0>c?"-":"")+"P"+(r?r+"Y":"")+(s?s+"M":"")+(l?l+"D":"")+(h||d||u?"T":"")+(h?h+"H":"")+(d?d+"M":"")+(u?u+"S":""):"P0D"}var ln,hn;hn=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),i=e.length>>>0,n=0;i>n;n++)if(n in e&&t.call(this,e[n],n,e))return!0;return!1};var dn=i.momentProperties=[],un=!1,cn={};i.suppressDeprecationWarnings=!1,i.deprecationHandler=null;var fn;fn=Object.keys?Object.keys:function(t){var e,i=[];for(e in t)s(t,e)&&i.push(e);return i};var gn,mn,pn={},bn={},vn=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,yn=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,xn={},kn={},_n=/\d/,Sn=/\d\d/,wn=/\d{3}/,Mn=/\d{4}/,Cn=/[+-]?\d{6}/,Dn=/\d\d?/,Tn=/\d\d\d\d?/,Pn=/\d\d\d\d\d\d?/,An=/\d{1,3}/,Fn=/\d{1,4}/,In=/[+-]?\d{1,6}/,On=/\d+/,Rn=/[+-]?\d+/,Wn=/Z|[+-]\d\d:?\d\d/gi,Vn=/Z|[+-]\d\d(?::?\d\d)?/gi,Ln=/[+-]?\d+(\.\d{1,3})?/,Bn=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,zn={},Yn={},Hn=0,Nn=1,En=2,Un=3,jn=4,Gn=5,qn=6,Zn=7,Jn=8;mn=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e<this.length;++e)if(this[e]===t)return e;return-1},j("M",["MM",2],"Mo",function(){return this.month()+1}),j("MMM",0,0,function(t){return this.localeData().monthsShort(this,t)}),j("MMMM",0,0,function(t){return this.localeData().months(this,t)}),L("month","M"),X("M",Dn),X("MM",Dn,Sn),X("MMM",function(t,e){return e.monthsShortRegex(t)}),X("MMMM",function(t,e){return e.monthsRegex(t)}),tt(["M","MM"],function(t,e){e[Nn]=y(t)-1}),tt(["MMM","MMMM"],function(t,e,i,n){var a=i._locale.monthsParse(t,n,i._strict);null!=a?e[Nn]=a:u(i).invalidMonth=t});var Xn=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/,Qn="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),$n="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),Kn=Bn,ta=Bn,ea=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,ia=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,na=/Z|[+-]\d\d(?::?\d\d)?/,aa=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],oa=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],ra=/^\/?Date\((\-?\d+)/i;i.createFromInputFallback=_("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),j("Y",0,0,function(){var t=this.year();return 9999>=t?""+t:"+"+t}),j(0,["YY",2],0,function(){return this.year()%100}),j(0,["YYYY",4],0,"year"),j(0,["YYYYY",5],0,"year"),j(0,["YYYYYY",6,!0],0,"year"),L("year","y"),X("Y",Rn),X("YY",Dn,Sn),X("YYYY",Fn,Mn),X("YYYYY",In,Cn),X("YYYYYY",In,Cn),tt(["YYYYY","YYYYYY"],Hn),tt("YYYY",function(t,e){e[Hn]=2===t.length?i.parseTwoDigitYear(t):y(t)}),tt("YY",function(t,e){e[Hn]=i.parseTwoDigitYear(t)}),tt("Y",function(t,e){e[Hn]=parseInt(t,10)}),i.parseTwoDigitYear=function(t){return y(t)+(y(t)>68?1900:2e3)};var sa=Y("FullYear",!0);i.ISO_8601=function(){};var la=_("moment().min is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(){var t=Bt.apply(null,arguments);return this.isValid()&&t.isValid()?this>t?this:t:f()}),ha=_("moment().max is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(){var t=Bt.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:f()}),da=function(){return Date.now?Date.now():+new Date};Ut("Z",":"),Ut("ZZ",""),X("Z",Vn),X("ZZ",Vn),tt(["Z","ZZ"],function(t,e,i){i._useUTC=!0,i._tzm=jt(Vn,t)});var ua=/([\+\-]|\d\d)/gi;i.updateOffset=function(){};var ca=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/,fa=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;oe.fn=Nt.prototype;var ga=de(1,"add"),ma=de(-1,"subtract");i.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",i.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var pa=_("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});j(0,["gg",2],0,function(){return this.weekYear()%100}),j(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ee("gggg","weekYear"),Ee("ggggg","weekYear"),Ee("GGGG","isoWeekYear"),Ee("GGGGG","isoWeekYear"),L("weekYear","gg"),L("isoWeekYear","GG"),X("G",Rn),X("g",Rn),X("GG",Dn,Sn),X("gg",Dn,Sn),X("GGGG",Fn,Mn),X("gggg",Fn,Mn),X("GGGGG",In,Cn),X("ggggg",In,Cn),et(["gggg","ggggg","GGGG","GGGGG"],function(t,e,i,n){e[n.substr(0,2)]=y(t)}),et(["gg","GG"],function(t,e,n,a){e[a]=i.parseTwoDigitYear(t)}),j("Q",0,"Qo","quarter"),L("quarter","Q"),X("Q",_n),tt("Q",function(t,e){e[Nn]=3*(y(t)-1)}),j("w",["ww",2],"wo","week"),j("W",["WW",2],"Wo","isoWeek"),L("week","w"),L("isoWeek","W"),X("w",Dn),X("ww",Dn,Sn),X("W",Dn),X("WW",Dn,Sn),et(["w","ww","W","WW"],function(t,e,i,n){e[n.substr(0,1)]=y(t)});var ba={dow:0,doy:6};j("D",["DD",2],"Do","date"),L("date","D"),X("D",Dn),X("DD",Dn,Sn),X("Do",function(t,e){return t?e._ordinalParse:e._ordinalParseLenient}),tt(["D","DD"],En),tt("Do",function(t,e){e[En]=y(t.match(Dn)[0],10)});var va=Y("Date",!0);j("d",0,"do","day"),j("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),j("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),j("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),j("e",0,0,"weekday"),j("E",0,0,"isoWeekday"),L("day","d"),L("weekday","e"),L("isoWeekday","E"),X("d",Dn),X("e",Dn),X("E",Dn),X("dd",function(t,e){return e.weekdaysMinRegex(t)}),X("ddd",function(t,e){return e.weekdaysShortRegex(t)}),X("dddd",function(t,e){return e.weekdaysRegex(t)}),et(["dd","ddd","dddd"],function(t,e,i,n){var a=i._locale.weekdaysParse(t,n,i._strict);null!=a?e.d=a:u(i).invalidWeekday=t}),et(["d","e","E"],function(t,e,i,n){e[n]=y(t)});var ya="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),xa="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),ka="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),_a=Bn,Sa=Bn,wa=Bn;j("DDD",["DDDD",3],"DDDo","dayOfYear"),L("dayOfYear","DDD"),X("DDD",An),X("DDDD",wn),tt(["DDD","DDDD"],function(t,e,i){i._dayOfYear=y(t)}),j("H",["HH",2],0,"hour"),j("h",["hh",2],0,pi),j("k",["kk",2],0,bi),j("hmm",0,0,function(){return""+pi.apply(this)+U(this.minutes(),2)}),j("hmmss",0,0,function(){return""+pi.apply(this)+U(this.minutes(),2)+U(this.seconds(),2)}),j("Hmm",0,0,function(){return""+this.hours()+U(this.minutes(),2)}),j("Hmmss",0,0,function(){return""+this.hours()+U(this.minutes(),2)+U(this.seconds(),2)}),vi("a",!0),vi("A",!1),L("hour","h"),X("a",yi),X("A",yi),X("H",Dn),X("h",Dn),X("HH",Dn,Sn),X("hh",Dn,Sn),X("hmm",Tn),X("hmmss",Pn),X("Hmm",Tn),X("Hmmss",Pn),tt(["H","HH"],Un),tt(["a","A"],function(t,e,i){i._isPm=i._locale.isPM(t),i._meridiem=t}),tt(["h","hh"],function(t,e,i){e[Un]=y(t),u(i).bigHour=!0}),tt("hmm",function(t,e,i){var n=t.length-2;e[Un]=y(t.substr(0,n)),e[jn]=y(t.substr(n)),u(i).bigHour=!0}),tt("hmmss",function(t,e,i){var n=t.length-4,a=t.length-2;e[Un]=y(t.substr(0,n)),e[jn]=y(t.substr(n,2)),e[Gn]=y(t.substr(a)),
-u(i).bigHour=!0}),tt("Hmm",function(t,e,i){var n=t.length-2;e[Un]=y(t.substr(0,n)),e[jn]=y(t.substr(n))}),tt("Hmmss",function(t,e,i){var n=t.length-4,a=t.length-2;e[Un]=y(t.substr(0,n)),e[jn]=y(t.substr(n,2)),e[Gn]=y(t.substr(a))});var Ma=/[ap]\.?m?\.?/i,Ca=Y("Hours",!0);j("m",["mm",2],0,"minute"),L("minute","m"),X("m",Dn),X("mm",Dn,Sn),tt(["m","mm"],jn);var Da=Y("Minutes",!1);j("s",["ss",2],0,"second"),L("second","s"),X("s",Dn),X("ss",Dn,Sn),tt(["s","ss"],Gn);var Ta=Y("Seconds",!1);j("S",0,0,function(){return~~(this.millisecond()/100)}),j(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),j(0,["SSS",3],0,"millisecond"),j(0,["SSSS",4],0,function(){return 10*this.millisecond()}),j(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),j(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),j(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),j(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),j(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),L("millisecond","ms"),X("S",An,_n),X("SS",An,Sn),X("SSS",An,wn);var Pa;for(Pa="SSSS";Pa.length<=9;Pa+="S")X(Pa,On);for(Pa="S";Pa.length<=9;Pa+="S")tt(Pa,_i);var Aa=Y("Milliseconds",!1);j("z",0,0,"zoneAbbr"),j("zz",0,0,"zoneName");var Fa=p.prototype;Fa.add=ga,Fa.calendar=ce,Fa.clone=fe,Fa.diff=xe,Fa.endOf=Ie,Fa.format=we,Fa.from=Me,Fa.fromNow=Ce,Fa.to=De,Fa.toNow=Te,Fa.get=E,Fa.invalidAt=He,Fa.isAfter=ge,Fa.isBefore=me,Fa.isBetween=pe,Fa.isSame=be,Fa.isSameOrAfter=ve,Fa.isSameOrBefore=ye,Fa.isValid=ze,Fa.lang=pa,Fa.locale=Pe,Fa.localeData=Ae,Fa.max=ha,Fa.min=la,Fa.parsingFlags=Ye,Fa.set=E,Fa.startOf=Fe,Fa.subtract=ma,Fa.toArray=Ve,Fa.toObject=Le,Fa.toDate=We,Fa.toISOString=Se,Fa.toJSON=Be,Fa.toString=_e,Fa.unix=Re,Fa.valueOf=Oe,Fa.creationData=Ne,Fa.year=sa,Fa.isLeapYear=kt,Fa.weekYear=Ue,Fa.isoWeekYear=je,Fa.quarter=Fa.quarters=Xe,Fa.month=ht,Fa.daysInMonth=dt,Fa.week=Fa.weeks=ti,Fa.isoWeek=Fa.isoWeeks=ei,Fa.weeksInYear=qe,Fa.isoWeeksInYear=Ge,Fa.date=va,Fa.day=Fa.days=li,Fa.weekday=hi,Fa.isoWeekday=di,Fa.dayOfYear=mi,Fa.hour=Fa.hours=Ca,Fa.minute=Fa.minutes=Da,Fa.second=Fa.seconds=Ta,Fa.millisecond=Fa.milliseconds=Aa,Fa.utcOffset=Zt,Fa.utc=Xt,Fa.local=Qt,Fa.parseZone=$t,Fa.hasAlignedHourOffset=Kt,Fa.isDST=te,Fa.isDSTShifted=ee,Fa.isLocal=ie,Fa.isUtcOffset=ne,Fa.isUtc=ae,Fa.isUTC=ae,Fa.zoneAbbr=Si,Fa.zoneName=wi,Fa.dates=_("dates accessor is deprecated. Use date instead.",va),Fa.months=_("months accessor is deprecated. Use month instead",ht),Fa.years=_("years accessor is deprecated. Use year instead",sa),Fa.zone=_("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",Jt);var Ia=Fa,Oa={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},Ra={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},Wa="Invalid date",Va="%d",La=/\d{1,2}/,Ba={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},za=T.prototype;za._calendar=Oa,za.calendar=Di,za._longDateFormat=Ra,za.longDateFormat=Ti,za._invalidDate=Wa,za.invalidDate=Pi,za._ordinal=Va,za.ordinal=Ai,za._ordinalParse=La,za.preparse=Fi,za.postformat=Fi,za._relativeTime=Ba,za.relativeTime=Ii,za.pastFuture=Oi,za.set=C,za.months=at,za._months=Qn,za.monthsShort=ot,za._monthsShort=$n,za.monthsParse=st,za._monthsRegex=ta,za.monthsRegex=ct,za._monthsShortRegex=Kn,za.monthsShortRegex=ut,za.week=Qe,za._week=ba,za.firstDayOfYear=Ke,za.firstDayOfWeek=$e,za.weekdays=ni,za._weekdays=ya,za.weekdaysMin=oi,za._weekdaysMin=ka,za.weekdaysShort=ai,za._weekdaysShort=xa,za.weekdaysParse=si,za._weekdaysRegex=_a,za.weekdaysRegex=ui,za._weekdaysShortRegex=Sa,za.weekdaysShortRegex=ci,za._weekdaysMinRegex=wa,za.weekdaysMinRegex=fi,za.isPM=xi,za._meridiemParse=Ma,za.meridiem=ki,I("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,i=1===y(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+i}}),i.lang=_("moment.lang is deprecated. Use moment.locale instead.",I),i.langData=_("moment.langData is deprecated. Use moment.localeData instead.",W);var Ya=Math.abs,Ha=$i("ms"),Na=$i("s"),Ea=$i("m"),Ua=$i("h"),ja=$i("d"),Ga=$i("w"),qa=$i("M"),Za=$i("y"),Ja=tn("milliseconds"),Xa=tn("seconds"),Qa=tn("minutes"),$a=tn("hours"),Ka=tn("days"),to=tn("months"),eo=tn("years"),io=Math.round,no={s:45,m:45,h:22,d:26,M:11},ao=Math.abs,oo=Nt.prototype;oo.abs=Ni,oo.add=Ui,oo.subtract=ji,oo.as=Xi,oo.asMilliseconds=Ha,oo.asSeconds=Na,oo.asMinutes=Ea,oo.asHours=Ua,oo.asDays=ja,oo.asWeeks=Ga,oo.asMonths=qa,oo.asYears=Za,oo.valueOf=Qi,oo._bubble=qi,oo.get=Ki,oo.milliseconds=Ja,oo.seconds=Xa,oo.minutes=Qa,oo.hours=$a,oo.days=Ka,oo.weeks=en,oo.months=to,oo.years=eo,oo.humanize=rn,oo.toISOString=sn,oo.toString=sn,oo.toJSON=sn,oo.locale=Pe,oo.localeData=Ae,oo.toIsoString=_("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",sn),oo.lang=pa,j("X",0,0,"unix"),j("x",0,0,"valueOf"),X("x",Rn),X("X",Ln),tt("X",function(t,e,i){i._d=new Date(1e3*parseFloat(t,10))}),tt("x",function(t,e,i){i._d=new Date(y(t))}),i.version="2.13.0",n(Bt),i.fn=Ia,i.min=Yt,i.max=Ht,i.now=da,i.utc=h,i.unix=Mi,i.months=Li,i.isDate=o,i.locale=I,i.invalid=f,i.duration=oe,i.isMoment=b,i.weekdays=zi,i.parseZone=Ci,i.localeData=W,i.isDuration=Et,i.monthsShort=Bi,i.weekdaysMin=Hi,i.defineLocale=O,i.updateLocale=R,i.locales=V,i.weekdaysShort=Yi,i.normalizeUnits=B,i.relativeTimeThreshold=on,i.prototype=Ia;var ro=i;return ro})},{}],7:[function(t,e,i){var n=t("./core/core.js")();t("./core/core.helpers")(n),t("./core/core.element")(n),t("./core/core.animation")(n),t("./core/core.controller")(n),t("./core/core.datasetController")(n),t("./core/core.layoutService")(n),t("./core/core.legend")(n),t("./core/core.plugin.js")(n),t("./core/core.scale")(n),t("./core/core.scaleService")(n),t("./core/core.title")(n),t("./core/core.tooltip")(n),t("./elements/element.arc")(n),t("./elements/element.line")(n),t("./elements/element.point")(n),t("./elements/element.rectangle")(n),t("./scales/scale.category")(n),t("./scales/scale.linear")(n),t("./scales/scale.logarithmic")(n),t("./scales/scale.radialLinear")(n),t("./scales/scale.time")(n),t("./controllers/controller.bar")(n),t("./controllers/controller.bubble")(n),t("./controllers/controller.doughnut")(n),t("./controllers/controller.line")(n),t("./controllers/controller.polarArea")(n),t("./controllers/controller.radar")(n),t("./charts/Chart.Bar")(n),t("./charts/Chart.Bubble")(n),t("./charts/Chart.Doughnut")(n),t("./charts/Chart.Line")(n),t("./charts/Chart.PolarArea")(n),t("./charts/Chart.Radar")(n),t("./charts/Chart.Scatter")(n),window.Chart=e.exports=n},{"./charts/Chart.Bar":8,"./charts/Chart.Bubble":9,"./charts/Chart.Doughnut":10,"./charts/Chart.Line":11,"./charts/Chart.PolarArea":12,"./charts/Chart.Radar":13,"./charts/Chart.Scatter":14,"./controllers/controller.bar":15,"./controllers/controller.bubble":16,"./controllers/controller.doughnut":17,"./controllers/controller.line":18,"./controllers/controller.polarArea":19,"./controllers/controller.radar":20,"./core/core.animation":21,"./core/core.controller":22,"./core/core.datasetController":23,"./core/core.element":24,"./core/core.helpers":25,"./core/core.js":26,"./core/core.layoutService":27,"./core/core.legend":28,"./core/core.plugin.js":29,"./core/core.scale":30,"./core/core.scaleService":31,"./core/core.title":32,"./core/core.tooltip":33,"./elements/element.arc":34,"./elements/element.line":35,"./elements/element.point":36,"./elements/element.rectangle":37,"./scales/scale.category":38,"./scales/scale.linear":39,"./scales/scale.logarithmic":40,"./scales/scale.radialLinear":41,"./scales/scale.time":42}],8:[function(t,e,i){"use strict";e.exports=function(t){t.Bar=function(e,i){return i.type="bar",new t(e,i)}}},{}],9:[function(t,e,i){"use strict";e.exports=function(t){t.Bubble=function(e,i){return i.type="bubble",new t(e,i)}}},{}],10:[function(t,e,i){"use strict";e.exports=function(t){t.Doughnut=function(e,i){return i.type="doughnut",new t(e,i)}}},{}],11:[function(t,e,i){"use strict";e.exports=function(t){t.Line=function(e,i){return i.type="line",new t(e,i)}}},{}],12:[function(t,e,i){"use strict";e.exports=function(t){t.PolarArea=function(e,i){return i.type="polarArea",new t(e,i)}}},{}],13:[function(t,e,i){"use strict";e.exports=function(t){t.Radar=function(e,i){return i.options=t.helpers.configMerge({aspectRatio:1},i.options),i.type="radar",new t(e,i)}}},{}],14:[function(t,e,i){"use strict";e.exports=function(t){var e={hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-1"}],yAxes:[{type:"linear",position:"left",id:"y-axis-1"}]},tooltips:{callbacks:{title:function(t,e){return""},label:function(t,e){return"("+t.xLabel+", "+t.yLabel+")"}}}};t.defaults.scatter=e,t.controllers.scatter=t.controllers.line,t.Scatter=function(e,i){return i.type="scatter",new t(e,i)}}},{}],15:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.bar={hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}},t.controllers.bar=t.DatasetController.extend({dataElementType:t.elements.Rectangle,initialize:function(e,i){t.DatasetController.prototype.initialize.call(this,e,i),this.getMeta().bar=!0},getBarCount:function(){var t=0;return e.each(this.chart.data.datasets,function(e,i){var n=this.chart.getDatasetMeta(i);n.bar&&this.chart.isDatasetVisible(i)&&++t},this),t},update:function(t){e.each(this.getMeta().data,function(e,i){this.updateElement(e,i,t)},this)},updateElement:function(t,i,n){var a=this.getMeta(),o=this.getScaleForId(a.xAxisID),r=this.getScaleForId(a.yAxisID),s=r.getBasePixel(),l=this.chart.options.elements.rectangle,h=t.custom||{},d=this.getDataset();e.extend(t,{_xScale:o,_yScale:r,_datasetIndex:this.index,_index:i,_model:{x:this.calculateBarX(i,this.index),y:n?s:this.calculateBarY(i,this.index),label:this.chart.data.labels[i],datasetLabel:d.label,base:n?s:this.calculateBarBase(this.index,i),width:this.calculateBarWidth(i),backgroundColor:h.backgroundColor?h.backgroundColor:e.getValueAtIndexOrDefault(d.backgroundColor,i,l.backgroundColor),borderSkipped:h.borderSkipped?h.borderSkipped:l.borderSkipped,borderColor:h.borderColor?h.borderColor:e.getValueAtIndexOrDefault(d.borderColor,i,l.borderColor),borderWidth:h.borderWidth?h.borderWidth:e.getValueAtIndexOrDefault(d.borderWidth,i,l.borderWidth)}}),t.pivot()},calculateBarBase:function(t,e){var i=this.getMeta(),n=this.getScaleForId(i.yAxisID),a=0;if(n.options.stacked){var o=this.chart,r=o.data.datasets,s=r[t].data[e];if(0>s)for(var l=0;t>l;l++){var h=r[l],d=o.getDatasetMeta(l);d.bar&&d.yAxisID===n.id&&o.isDatasetVisible(l)&&(a+=h.data[e]<0?h.data[e]:0)}else for(var u=0;t>u;u++){var c=r[u],f=o.getDatasetMeta(u);f.bar&&f.yAxisID===n.id&&o.isDatasetVisible(u)&&(a+=c.data[e]>0?c.data[e]:0)}return n.getPixelForValue(a)}return n.getBasePixel()},getRuler:function(t){var e,i=this.getMeta(),n=this.getScaleForId(i.xAxisID),a=this.getBarCount();e="category"===n.options.type?n.getPixelForTick(t+1)-n.getPixelForTick(t):n.width/n.ticks.length;var o=e*n.options.categoryPercentage,r=(e-e*n.options.categoryPercentage)/2,s=o/a;if(n.ticks.length!==this.chart.data.labels.length){var l=n.ticks.length/this.chart.data.labels.length;s*=l}var h=s*n.options.barPercentage,d=s-s*n.options.barPercentage;return{datasetCount:a,tickWidth:e,categoryWidth:o,categorySpacing:r,fullBarWidth:s,barWidth:h,barSpacing:d}},calculateBarWidth:function(t){var e=this.getScaleForId(this.getMeta().xAxisID),i=this.getRuler(t);return e.options.stacked?i.categoryWidth:i.barWidth},getBarIndex:function(t){var e,i,n=0;for(i=0;t>i;++i)e=this.chart.getDatasetMeta(i),e.bar&&this.chart.isDatasetVisible(i)&&++n;return n},calculateBarX:function(t,e){var i=this.getMeta(),n=this.getScaleForId(i.xAxisID),a=this.getBarIndex(e),o=this.getRuler(t),r=n.getPixelForValue(null,t,e,this.chart.isCombo);return r-=this.chart.isCombo?o.tickWidth/2:0,n.options.stacked?r+o.categoryWidth/2+o.categorySpacing:r+o.barWidth/2+o.categorySpacing+o.barWidth*a+o.barSpacing/2+o.barSpacing*a},calculateBarY:function(t,e){var i=this.getMeta(),n=this.getScaleForId(i.yAxisID),a=this.getDataset().data[t];if(n.options.stacked){for(var o=0,r=0,s=0;e>s;s++){var l=this.chart.data.datasets[s],h=this.chart.getDatasetMeta(s);h.bar&&h.yAxisID===n.id&&this.chart.isDatasetVisible(s)&&(l.data[t]<0?r+=l.data[t]||0:o+=l.data[t]||0)}return 0>a?n.getPixelForValue(r+a):n.getPixelForValue(o+a)}return n.getPixelForValue(a)},draw:function(t){var i=t||1;e.each(this.getMeta().data,function(t,e){var n=this.getDataset().data[e];null===n||void 0===n||isNaN(n)||t.transition(i).draw()},this)},setHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],n=t._index,a=t.custom||{},o=t._model;o.backgroundColor=a.hoverBackgroundColor?a.hoverBackgroundColor:e.getValueAtIndexOrDefault(i.hoverBackgroundColor,n,e.getHoverColor(o.backgroundColor)),o.borderColor=a.hoverBorderColor?a.hoverBorderColor:e.getValueAtIndexOrDefault(i.hoverBorderColor,n,e.getHoverColor(o.borderColor)),o.borderWidth=a.hoverBorderWidth?a.hoverBorderWidth:e.getValueAtIndexOrDefault(i.hoverBorderWidth,n,o.borderWidth)},removeHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],n=t._index,a=t.custom||{},o=t._model,r=this.chart.options.elements.rectangle;o.backgroundColor=a.backgroundColor?a.backgroundColor:e.getValueAtIndexOrDefault(i.backgroundColor,n,r.backgroundColor),o.borderColor=a.borderColor?a.borderColor:e.getValueAtIndexOrDefault(i.borderColor,n,r.borderColor),o.borderWidth=a.borderWidth?a.borderWidth:e.getValueAtIndexOrDefault(i.borderWidth,n,r.borderWidth)}}),t.defaults.horizontalBar={hover:{mode:"label"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{position:"left",type:"category",categoryPercentage:.8,barPercentage:.9,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{callbacks:{title:function(t,e){var i="";return t.length>0&&(t[0].yLabel?i=t[0].yLabel:e.labels.length>0&&t[0].index<e.labels.length&&(i=e.labels[t[0].index])),i},label:function(t,e){var i=e.datasets[t.datasetIndex].label||"";return i+": "+t.xLabel}}}},t.controllers.horizontalBar=t.controllers.bar.extend({updateElement:function(t,i,n,a){var o=this.getMeta(),r=this.getScaleForId(o.xAxisID),s=this.getScaleForId(o.yAxisID),l=r.getBasePixel(),h=t.custom||{},d=this.getDataset(),u=this.chart.options.elements.rectangle;e.extend(t,{_xScale:r,_yScale:s,_datasetIndex:this.index,_index:i,_model:{x:n?l:this.calculateBarX(i,this.index),y:this.calculateBarY(i,this.index),label:this.chart.data.labels[i],datasetLabel:d.label,base:n?l:this.calculateBarBase(this.index,i),height:this.calculateBarHeight(i),backgroundColor:h.backgroundColor?h.backgroundColor:e.getValueAtIndexOrDefault(d.backgroundColor,i,u.backgroundColor),borderSkipped:h.borderSkipped?h.borderSkipped:u.borderSkipped,borderColor:h.borderColor?h.borderColor:e.getValueAtIndexOrDefault(d.borderColor,i,u.borderColor),borderWidth:h.borderWidth?h.borderWidth:e.getValueAtIndexOrDefault(d.borderWidth,i,u.borderWidth)},draw:function(){function t(t){return l[(d+t)%4]}var e=this._chart.ctx,i=this._view,n=i.height/2,a=i.y-n,o=i.y+n,r=i.base-(i.base-i.x),s=i.borderWidth/2;i.borderWidth&&(a+=s,o-=s,r+=s),e.beginPath(),e.fillStyle=i.backgroundColor,e.strokeStyle=i.borderColor,e.lineWidth=i.borderWidth;var l=[[i.base,o],[i.base,a],[r,a],[r,o]],h=["bottom","left","top","right"],d=h.indexOf(i.borderSkipped,0);-1===d&&(d=0),e.moveTo.apply(e,t(0));for(var u=1;4>u;u++)e.lineTo.apply(e,t(u));e.fill(),i.borderWidth&&e.stroke()},inRange:function(t,e){var i=this._view,n=!1;return i&&(n=i.x<i.base?e>=i.y-i.height/2&&e<=i.y+i.height/2&&t>=i.x&&t<=i.base:e>=i.y-i.height/2&&e<=i.y+i.height/2&&t>=i.base&&t<=i.x),n}}),t.pivot()},calculateBarBase:function(t,e){var i=this.getMeta(),n=this.getScaleForId(i.xAxisID),a=0;if(n.options.stacked){var o=this.chart.data.datasets[t].data[e];if(0>o)for(var r=0;t>r;r++){var s=this.chart.data.datasets[r],l=this.chart.getDatasetMeta(r);l.bar&&l.xAxisID===n.id&&this.chart.isDatasetVisible(r)&&(a+=s.data[e]<0?s.data[e]:0)}else for(var h=0;t>h;h++){var d=this.chart.data.datasets[h],u=this.chart.getDatasetMeta(h);u.bar&&u.xAxisID===n.id&&this.chart.isDatasetVisible(h)&&(a+=d.data[e]>0?d.data[e]:0)}return n.getPixelForValue(a)}return n.getBasePixel()},getRuler:function(t){var e,i=this.getMeta(),n=this.getScaleForId(i.yAxisID),a=this.getBarCount();e="category"===n.options.type?n.getPixelForTick(t+1)-n.getPixelForTick(t):n.width/n.ticks.length;var o=e*n.options.categoryPercentage,r=(e-e*n.options.categoryPercentage)/2,s=o/a;if(n.ticks.length!==this.chart.data.labels.length){var l=n.ticks.length/this.chart.data.labels.length;s*=l}var h=s*n.options.barPercentage,d=s-s*n.options.barPercentage;return{datasetCount:a,tickHeight:e,categoryHeight:o,categorySpacing:r,fullBarHeight:s,barHeight:h,barSpacing:d}},calculateBarHeight:function(t){var e=this.getScaleForId(this.getMeta().yAxisID),i=this.getRuler(t);return e.options.stacked?i.categoryHeight:i.barHeight},calculateBarX:function(t,e){var i=this.getMeta(),n=this.getScaleForId(i.xAxisID),a=this.getDataset().data[t];if(n.options.stacked){for(var o=0,r=0,s=0;e>s;s++){var l=this.chart.data.datasets[s],h=this.chart.getDatasetMeta(s);h.bar&&h.xAxisID===n.id&&this.chart.isDatasetVisible(s)&&(l.data[t]<0?r+=l.data[t]||0:o+=l.data[t]||0)}return 0>a?n.getPixelForValue(r+a):n.getPixelForValue(o+a)}return n.getPixelForValue(a)},calculateBarY:function(t,e){var i=this.getMeta(),n=this.getScaleForId(i.yAxisID),a=this.getBarIndex(e),o=this.getRuler(t),r=n.getPixelForValue(null,t,e,this.chart.isCombo);return r-=this.chart.isCombo?o.tickHeight/2:0,n.options.stacked?r+o.categoryHeight/2+o.categorySpacing:r+o.barHeight/2+o.categorySpacing+o.barHeight*a+o.barSpacing/2+o.barSpacing*a}})}},{}],16:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.bubble={hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(t,e){return""},label:function(t,e){var i=e.datasets[t.datasetIndex].label||"",n=e.datasets[t.datasetIndex].data[t.index];return i+": ("+n.x+", "+n.y+", "+n.r+")"}}}},t.controllers.bubble=t.DatasetController.extend({dataElementType:t.elements.Point,update:function(t){var i=this.getMeta(),n=i.data;e.each(n,function(e,i){this.updateElement(e,i,t)},this)},updateElement:function(t,i,n){var a=this.getMeta(),o=this.getScaleForId(a.xAxisID),r=this.getScaleForId(a.yAxisID),s=t.custom||{},l=this.getDataset(),h=l.data[i],d=this.chart.options.elements.point;e.extend(t,{_xScale:o,_yScale:r,_datasetIndex:this.index,_index:i,_model:{x:n?o.getPixelForDecimal(.5):o.getPixelForValue(h,i,this.index,this.chart.isCombo),y:n?r.getBasePixel():r.getPixelForValue(h,i,this.index),radius:n?0:s.radius?s.radius:this.getRadius(h),backgroundColor:s.backgroundColor?s.backgroundColor:e.getValueAtIndexOrDefault(l.backgroundColor,i,d.backgroundColor),borderColor:s.borderColor?s.borderColor:e.getValueAtIndexOrDefault(l.borderColor,i,d.borderColor),borderWidth:s.borderWidth?s.borderWidth:e.getValueAtIndexOrDefault(l.borderWidth,i,d.borderWidth),hitRadius:s.hitRadius?s.hitRadius:e.getValueAtIndexOrDefault(l.hitRadius,i,d.hitRadius)}});var u=t._model;u.skip=s.skip?s.skip:isNaN(u.x)||isNaN(u.y),t.pivot()},getRadius:function(t){return t.r||this.chart.options.elements.point.radius},setHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],n=t._index,a=t.custom||{},o=t._model;o.radius=a.hoverRadius?a.hoverRadius:e.getValueAtIndexOrDefault(i.hoverRadius,n,this.chart.options.elements.point.hoverRadius)+this.getRadius(this.getDataset().data[t._index]),o.backgroundColor=a.hoverBackgroundColor?a.hoverBackgroundColor:e.getValueAtIndexOrDefault(i.hoverBackgroundColor,n,e.getHoverColor(o.backgroundColor)),o.borderColor=a.hoverBorderColor?a.hoverBorderColor:e.getValueAtIndexOrDefault(i.hoverBorderColor,n,e.getHoverColor(o.borderColor)),o.borderWidth=a.hoverBorderWidth?a.hoverBorderWidth:e.getValueAtIndexOrDefault(i.hoverBorderWidth,n,o.borderWidth)},removeHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],n=t._index,a=t.custom||{},o=t._model,r=this.chart.options.elements.point;o.radius=a.radius?a.radius:this.getRadius(i.data[t._index]),o.backgroundColor=a.backgroundColor?a.backgroundColor:e.getValueAtIndexOrDefault(i.backgroundColor,n,r.backgroundColor),o.borderColor=a.borderColor?a.borderColor:e.getValueAtIndexOrDefault(i.borderColor,n,r.borderColor),o.borderWidth=a.borderWidth?a.borderWidth:e.getValueAtIndexOrDefault(i.borderWidth,n,r.borderWidth)}})}},{}],17:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i=t.defaults;i.doughnut={animation:{animateRotate:!0,animateScale:!1},aspectRatio:1,hover:{mode:"single"},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var o=0;o<n[0].data.length;++o)e.push('<li><span style="background-color:'+n[0].backgroundColor[o]+'"></span>'),a[o]&&e.push(a[o]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var i=t.data;return i.labels.length&&i.datasets.length?i.labels.map(function(n,a){var o=t.getDatasetMeta(0),r=i.datasets[0],s=o.data[a],l=s.custom||{},h=e.getValueAtIndexOrDefault,d=t.options.elements.arc,u=l.backgroundColor?l.backgroundColor:h(r.backgroundColor,a,d.backgroundColor),c=l.borderColor?l.borderColor:h(r.borderColor,a,d.borderColor),f=l.borderWidth?l.borderWidth:h(r.borderWidth,a,d.borderWidth);return{text:n,fillStyle:u,strokeStyle:c,lineWidth:f,hidden:isNaN(r.data[a])||o.data[a].hidden,index:a}}):[]}},onClick:function(t,e){var i,n,a,o=e.index,r=this.chart;for(i=0,n=(r.data.datasets||[]).length;n>i;++i)a=r.getDatasetMeta(i),a.data[o].hidden=!a.data[o].hidden;r.update()}},cutoutPercentage:50,rotation:Math.PI*-.5,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+e.datasets[t.datasetIndex].data[t.index]}}}},i.pie=e.clone(i.doughnut),e.extend(i.pie,{cutoutPercentage:0}),t.controllers.doughnut=t.controllers.pie=t.DatasetController.extend({dataElementType:t.elements.Arc,linkScales:e.noop,getRingIndex:function(t){for(var e=0,i=0;t>i;++i)this.chart.isDatasetVisible(i)&&++e;return e},update:function(t){var i=this,n=i.chart,a=n.chartArea,o=n.options,r=o.elements.arc,s=a.right-a.left-r.borderWidth,l=a.bottom-a.top-r.borderWidth,h=Math.min(s,l),d={x:0,y:0},u=i.getMeta(),c=o.cutoutPercentage,f=o.circumference;if(f<2*Math.PI){var g=o.rotation%(2*Math.PI);g+=2*Math.PI*(g>=Math.PI?-1:g<-Math.PI?1:0);var m=g+f,p={x:Math.cos(g),y:Math.sin(g)},b={x:Math.cos(m),y:Math.sin(m)},v=0>=g&&m>=0||g<=2*Math.PI&&2*Math.PI<=m,y=g<=.5*Math.PI&&.5*Math.PI<=m||g<=2.5*Math.PI&&2.5*Math.PI<=m,x=g<=-Math.PI&&-Math.PI<=m||g<=Math.PI&&Math.PI<=m,k=g<=.5*-Math.PI&&.5*-Math.PI<=m||g<=1.5*Math.PI&&1.5*Math.PI<=m,_=c/100,S={x:x?-1:Math.min(p.x*(p.x<0?1:_),b.x*(b.x<0?1:_)),y:k?-1:Math.min(p.y*(p.y<0?1:_),b.y*(b.y<0?1:_))},w={x:v?1:Math.max(p.x*(p.x>0?1:_),b.x*(b.x>0?1:_)),y:y?1:Math.max(p.y*(p.y>0?1:_),b.y*(b.y>0?1:_))},M={width:.5*(w.x-S.x),height:.5*(w.y-S.y)};h=Math.min(s/M.width,l/M.height),d={x:(w.x+S.x)*-.5,y:(w.y+S.y)*-.5}}n.outerRadius=Math.max(h/2,0),n.innerRadius=Math.max(c?n.outerRadius/100*c:1,0),n.radiusLength=(n.outerRadius-n.innerRadius)/n.getVisibleDatasetCount(),n.offsetX=d.x*n.outerRadius,n.offsetY=d.y*n.outerRadius,u.total=i.calculateTotal(),i.outerRadius=n.outerRadius-n.radiusLength*i.getRingIndex(i.index),i.innerRadius=i.outerRadius-n.radiusLength,e.each(u.data,function(e,n){i.updateElement(e,n,t)})},updateElement:function(t,i,n){var a=this,o=a.chart,r=o.chartArea,s=o.options,l=s.animation,h=s.elements.arc,d=(r.left+r.right)/2,u=(r.top+r.bottom)/2,c=s.rotation,f=s.rotation,g=a.getDataset(),m=n&&l.animateRotate?0:t.hidden?0:a.calculateCircumference(g.data[i])*(s.circumference/(2*Math.PI)),p=n&&l.animateScale?0:a.innerRadius,b=n&&l.animateScale?0:a.outerRadius,v=t.custom||{},y=e.getValueAtIndexOrDefault;e.extend(t,{_datasetIndex:a.index,_index:i,_model:{x:d+o.offsetX,y:u+o.offsetY,startAngle:c,endAngle:f,circumference:m,outerRadius:b,innerRadius:p,label:y(g.label,i,o.data.labels[i])}});var x=t._model;x.backgroundColor=v.backgroundColor?v.backgroundColor:y(g.backgroundColor,i,h.backgroundColor),x.hoverBackgroundColor=v.hoverBackgroundColor?v.hoverBackgroundColor:y(g.hoverBackgroundColor,i,h.hoverBackgroundColor),x.borderWidth=v.borderWidth?v.borderWidth:y(g.borderWidth,i,h.borderWidth),x.borderColor=v.borderColor?v.borderColor:y(g.borderColor,i,h.borderColor),n&&l.animateRotate||(0===i?x.startAngle=s.rotation:x.startAngle=a.getMeta().data[i-1]._model.endAngle,x.endAngle=x.startAngle+x.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,i=this.getDataset(),n=this.getMeta(),a=0;return e.each(n.data,function(e,n){t=i.data[n],isNaN(t)||e.hidden||(a+=Math.abs(t))}),a},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0}})}},{}],18:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.line={showLines:!0,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}},t.controllers.line=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,addElementAndReset:function(e){var i=this,n=i.chart.options;t.DatasetController.prototype.addElementAndReset.call(i,e),n.showLines&&0!==n.elements.line.tension&&i.updateBezierControlPoints()},update:function(t){var i,n,a,o,r=this,s=r.getMeta(),l=s.dataset,h=s.data||[],d=r.chart.options,u=d.elements.line,c=r.getScaleForId(s.yAxisID);for(d.showLines&&(a=r.getDataset(),o=l.custom||{},void 0!==a.tension&&void 0===a.lineTension&&(a.lineTension=a.tension),l._scale=c,l._datasetIndex=r.index,l._children=h,l._model={tension:o.tension?o.tension:e.getValueOrDefault(a.lineTension,u.tension),backgroundColor:o.backgroundColor?o.backgroundColor:a.backgroundColor||u.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:a.borderWidth||u.borderWidth,borderColor:o.borderColor?o.borderColor:a.borderColor||u.borderColor,borderCapStyle:o.borderCapStyle?o.borderCapStyle:a.borderCapStyle||u.borderCapStyle,borderDash:o.borderDash?o.borderDash:a.borderDash||u.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:a.borderDashOffset||u.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:a.borderJoinStyle||u.borderJoinStyle,fill:o.fill?o.fill:void 0!==a.fill?a.fill:u.fill,scaleTop:c.top,scaleBottom:c.bottom,scaleZero:c.getBasePixel()},l.pivot()),i=0,n=h.length;n>i;++i)r.updateElement(h[i],i,t);d.showLines&&0!==u.tension&&r.updateBezierControlPoints()},getPointBackgroundColor:function(t,i){var n=this.chart.options.elements.point.backgroundColor,a=this.getDataset(),o=t.custom||{};return o.backgroundColor?n=o.backgroundColor:a.pointBackgroundColor?n=e.getValueAtIndexOrDefault(a.pointBackgroundColor,i,n):a.backgroundColor&&(n=a.backgroundColor),n},getPointBorderColor:function(t,i){var n=this.chart.options.elements.point.borderColor,a=this.getDataset(),o=t.custom||{};return o.borderColor?n=o.borderColor:a.pointBorderColor?n=e.getValueAtIndexOrDefault(a.pointBorderColor,i,n):a.borderColor&&(n=a.borderColor),n},getPointBorderWidth:function(t,i){var n=this.chart.options.elements.point.borderWidth,a=this.getDataset(),o=t.custom||{};return o.borderWidth?n=o.borderWidth:a.pointBorderWidth?n=e.getValueAtIndexOrDefault(a.pointBorderWidth,i,n):a.borderWidth&&(n=a.borderWidth),n},updateElement:function(t,i,n){var a,o,r=this,s=r.getMeta(),l=t.custom||{},h=r.getDataset(),d=r.index,u=h.data[i],c=r.getScaleForId(s.yAxisID),f=r.getScaleForId(s.xAxisID),g=r.chart.options.elements.point;void 0!==h.radius&&void 0===h.pointRadius&&(h.pointRadius=h.radius),void 0!==h.hitRadius&&void 0===h.pointHitRadius&&(h.pointHitRadius=h.hitRadius),a=f.getPixelForValue(u,i,d,r.chart.isCombo),o=n?c.getBasePixel():r.calculatePointY(u,i,d,r.chart.isCombo),t._xScale=f,t._yScale=c,t._datasetIndex=d,t._index=i,t._model={x:a,y:o,skip:l.skip||isNaN(a)||isNaN(o),radius:l.radius||e.getValueAtIndexOrDefault(h.pointRadius,i,g.radius),pointStyle:l.pointStyle||e.getValueAtIndexOrDefault(h.pointStyle,i,g.pointStyle),backgroundColor:r.getPointBackgroundColor(t,i),borderColor:r.getPointBorderColor(t,i),borderWidth:r.getPointBorderWidth(t,i),tension:s.dataset._model?s.dataset._model.tension:0,hitRadius:l.hitRadius||e.getValueAtIndexOrDefault(h.pointHitRadius,i,g.hitRadius)}},calculatePointY:function(t,e,i,n){var a,o,r,s=this,l=s.chart,h=s.getMeta(),d=s.getScaleForId(h.yAxisID),u=0,c=0;if(d.options.stacked){for(a=0;i>a;a++)o=l.data.datasets[a],r=l.getDatasetMeta(a),"line"===r.type&&l.isDatasetVisible(a)&&(o.data[e]<0?c+=o.data[e]||0:u+=o.data[e]||0);return 0>t?d.getPixelForValue(c+t):d.getPixelForValue(u+t)}return d.getPixelForValue(t)},updateBezierControlPoints:function(){var t,i,n,a,o,r=this.getMeta(),s=this.chart.chartArea,l=r.data||[];for(t=0,i=l.length;i>t;++t)n=l[t],a=n._model,o=e.splineCurve(e.previousItem(l,t)._model,a,e.nextItem(l,t)._model,r.dataset._model.tension),a.controlPointPreviousX=Math.max(Math.min(o.previous.x,s.right),s.left),a.controlPointPreviousY=Math.max(Math.min(o.previous.y,s.bottom),s.top),a.controlPointNextX=Math.max(Math.min(o.next.x,s.right),s.left),a.controlPointNextY=Math.max(Math.min(o.next.y,s.bottom),s.top),n.pivot()},draw:function(t){var e,i,n=this.getMeta(),a=n.data||[],o=t||1;for(e=0,i=a.length;i>e;++e)a[e].transition(o);for(this.chart.options.showLines&&n.dataset.transition(o).draw(),e=0,i=a.length;i>e;++e)a[e].draw()},setHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],n=t._index,a=t.custom||{},o=t._model;o.radius=a.hoverRadius||e.getValueAtIndexOrDefault(i.pointHoverRadius,n,this.chart.options.elements.point.hoverRadius),o.backgroundColor=a.hoverBackgroundColor||e.getValueAtIndexOrDefault(i.pointHoverBackgroundColor,n,e.getHoverColor(o.backgroundColor)),o.borderColor=a.hoverBorderColor||e.getValueAtIndexOrDefault(i.pointHoverBorderColor,n,e.getHoverColor(o.borderColor)),o.borderWidth=a.hoverBorderWidth||e.getValueAtIndexOrDefault(i.pointHoverBorderWidth,n,o.borderWidth)},removeHoverStyle:function(t){var i=this,n=i.chart.data.datasets[t._datasetIndex],a=t._index,o=t.custom||{},r=t._model;void 0!==n.radius&&void 0===n.pointRadius&&(n.pointRadius=n.radius),r.radius=o.radius||e.getValueAtIndexOrDefault(n.pointRadius,a,i.chart.options.elements.point.radius),r.backgroundColor=i.getPointBackgroundColor(t,a),r.borderColor=i.getPointBorderColor(t,a),r.borderWidth=i.getPointBorderWidth(t,a)}})}},{}],19:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.polarArea={scale:{type:"radialLinear",lineArc:!0},animation:{animateRotate:!0,animateScale:!0},aspectRatio:1,legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var o=0;o<n[0].data.length;++o)e.push('<li><span style="background-color:'+n[0].backgroundColor[o]+'">'),a[o]&&e.push(a[o]),e.push("</span></li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var i=t.data;return i.labels.length&&i.datasets.length?i.labels.map(function(n,a){var o=t.getDatasetMeta(0),r=i.datasets[0],s=o.data[a],l=s.custom||{},h=e.getValueAtIndexOrDefault,d=t.options.elements.arc,u=l.backgroundColor?l.backgroundColor:h(r.backgroundColor,a,d.backgroundColor),c=l.borderColor?l.borderColor:h(r.borderColor,a,d.borderColor),f=l.borderWidth?l.borderWidth:h(r.borderWidth,a,d.borderWidth);
-return{text:n,fillStyle:u,strokeStyle:c,lineWidth:f,hidden:isNaN(r.data[a])||o.data[a].hidden,index:a}}):[]}},onClick:function(t,e){var i,n,a,o=e.index,r=this.chart;for(i=0,n=(r.data.datasets||[]).length;n>i;++i)a=r.getDatasetMeta(i),a.data[o].hidden=!a.data[o].hidden;r.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}},t.controllers.polarArea=t.DatasetController.extend({dataElementType:t.elements.Arc,linkScales:e.noop,update:function(t){var i=this,n=i.chart,a=n.chartArea,o=this.getMeta(),r=n.options,s=r.elements.arc,l=Math.min(a.right-a.left,a.bottom-a.top);n.outerRadius=Math.max((l-s.borderWidth/2)/2,0),n.innerRadius=Math.max(r.cutoutPercentage?n.outerRadius/100*r.cutoutPercentage:1,0),n.radiusLength=(n.outerRadius-n.innerRadius)/n.getVisibleDatasetCount(),i.outerRadius=n.outerRadius-n.radiusLength*i.index,i.innerRadius=i.outerRadius-n.radiusLength,o.count=i.countVisibleElements(),e.each(o.data,function(e,n){i.updateElement(e,n,t)})},updateElement:function(t,i,n){for(var a=this,o=a.chart,r=o.chartArea,s=a.getDataset(),l=o.options,h=l.animation,d=l.elements.arc,u=t.custom||{},c=o.scale,f=e.getValueAtIndexOrDefault,g=o.data.labels,m=a.calculateCircumference(s.data[i]),p=(r.left+r.right)/2,b=(r.top+r.bottom)/2,v=0,y=a.getMeta(),x=0;i>x;++x)isNaN(s.data[x])||y.data[x].hidden||++v;var k=t.hidden?0:c.getDistanceFromCenterForValue(s.data[i]),_=-.5*Math.PI+m*v,S=_+(t.hidden?0:m),w={x:p,y:b,innerRadius:0,outerRadius:h.animateScale?0:c.getDistanceFromCenterForValue(s.data[i]),startAngle:h.animateRotate?Math.PI*-.5:_,endAngle:h.animateRotate?Math.PI*-.5:S,backgroundColor:u.backgroundColor?u.backgroundColor:f(s.backgroundColor,i,d.backgroundColor),borderWidth:u.borderWidth?u.borderWidth:f(s.borderWidth,i,d.borderWidth),borderColor:u.borderColor?u.borderColor:f(s.borderColor,i,d.borderColor),label:f(g,i,g[i])};e.extend(t,{_datasetIndex:a.index,_index:i,_scale:c,_model:n?w:{x:p,y:b,innerRadius:0,outerRadius:k,startAngle:_,endAngle:S,backgroundColor:u.backgroundColor?u.backgroundColor:f(s.backgroundColor,i,d.backgroundColor),borderWidth:u.borderWidth?u.borderWidth:f(s.borderWidth,i,d.borderWidth),borderColor:u.borderColor?u.borderColor:f(s.borderColor,i,d.borderColor),label:f(g,i,g[i])}}),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},countVisibleElements:function(){var t=this.getDataset(),i=this.getMeta(),n=0;return e.each(i.data,function(e,i){isNaN(t.data[i])||e.hidden||n++}),n},calculateCircumference:function(t){var e=this.getMeta().count;return e>0&&!isNaN(t)?2*Math.PI/e:0}})}},{}],20:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.radar={scale:{type:"radialLinear"},elements:{line:{tension:0}}},t.controllers.radar=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,linkScales:e.noop,addElementAndReset:function(e){t.DatasetController.prototype.addElementAndReset.call(this,e),this.updateBezierControlPoints()},update:function(t){var i=this.getMeta(),n=i.dataset,a=i.data,o=n.custom||{},r=this.getDataset(),s=this.chart.options.elements.line,l=this.chart.scale;void 0!==r.tension&&void 0===r.lineTension&&(r.lineTension=r.tension),e.extend(i.dataset,{_datasetIndex:this.index,_children:a,_loop:!0,_model:{tension:o.tension?o.tension:e.getValueOrDefault(r.lineTension,s.tension),backgroundColor:o.backgroundColor?o.backgroundColor:r.backgroundColor||s.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:r.borderWidth||s.borderWidth,borderColor:o.borderColor?o.borderColor:r.borderColor||s.borderColor,fill:o.fill?o.fill:void 0!==r.fill?r.fill:s.fill,borderCapStyle:o.borderCapStyle?o.borderCapStyle:r.borderCapStyle||s.borderCapStyle,borderDash:o.borderDash?o.borderDash:r.borderDash||s.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:r.borderDashOffset||s.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:r.borderJoinStyle||s.borderJoinStyle,scaleTop:l.top,scaleBottom:l.bottom,scaleZero:l.getBasePosition()}}),i.dataset.pivot(),e.each(a,function(e,i){this.updateElement(e,i,t)},this),this.updateBezierControlPoints()},updateElement:function(t,i,n){var a=t.custom||{},o=this.getDataset(),r=this.chart.scale,s=this.chart.options.elements.point,l=r.getPointPositionForValue(i,o.data[i]);e.extend(t,{_datasetIndex:this.index,_index:i,_scale:r,_model:{x:n?r.xCenter:l.x,y:n?r.yCenter:l.y,tension:a.tension?a.tension:e.getValueOrDefault(o.tension,this.chart.options.elements.line.tension),radius:a.radius?a.radius:e.getValueAtIndexOrDefault(o.pointRadius,i,s.radius),backgroundColor:a.backgroundColor?a.backgroundColor:e.getValueAtIndexOrDefault(o.pointBackgroundColor,i,s.backgroundColor),borderColor:a.borderColor?a.borderColor:e.getValueAtIndexOrDefault(o.pointBorderColor,i,s.borderColor),borderWidth:a.borderWidth?a.borderWidth:e.getValueAtIndexOrDefault(o.pointBorderWidth,i,s.borderWidth),pointStyle:a.pointStyle?a.pointStyle:e.getValueAtIndexOrDefault(o.pointStyle,i,s.pointStyle),hitRadius:a.hitRadius?a.hitRadius:e.getValueAtIndexOrDefault(o.hitRadius,i,s.hitRadius)}}),t._model.skip=a.skip?a.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,i=this.getMeta();e.each(i.data,function(n,a){var o=n._model,r=e.splineCurve(e.previousItem(i.data,a,!0)._model,o,e.nextItem(i.data,a,!0)._model,o.tension);o.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),o.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),o.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),o.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),n.pivot()},this)},draw:function(t){var i=this.getMeta(),n=t||1;e.each(i.data,function(t,e){t.transition(n)}),i.dataset.transition(n).draw(),e.each(i.data,function(t){t.draw()})},setHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},a=t._index,o=t._model;o.radius=n.hoverRadius?n.hoverRadius:e.getValueAtIndexOrDefault(i.pointHoverRadius,a,this.chart.options.elements.point.hoverRadius),o.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:e.getValueAtIndexOrDefault(i.pointHoverBackgroundColor,a,e.getHoverColor(o.backgroundColor)),o.borderColor=n.hoverBorderColor?n.hoverBorderColor:e.getValueAtIndexOrDefault(i.pointHoverBorderColor,a,e.getHoverColor(o.borderColor)),o.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:e.getValueAtIndexOrDefault(i.pointHoverBorderWidth,a,o.borderWidth)},removeHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],n=t.custom||{},a=t._index,o=t._model,r=this.chart.options.elements.point;o.radius=n.radius?n.radius:e.getValueAtIndexOrDefault(i.radius,a,r.radius),o.backgroundColor=n.backgroundColor?n.backgroundColor:e.getValueAtIndexOrDefault(i.pointBackgroundColor,a,r.backgroundColor),o.borderColor=n.borderColor?n.borderColor:e.getValueAtIndexOrDefault(i.pointBorderColor,a,r.borderColor),o.borderWidth=n.borderWidth?n.borderWidth:e.getValueAtIndexOrDefault(i.pointBorderWidth,a,r.borderWidth)}})}},{}],21:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.animation={duration:1e3,easing:"easeOutQuart",onProgress:e.noop,onComplete:e.noop},t.Animation=t.Element.extend({currentStep:null,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,i,n){n||(t.animating=!0);for(var a=0;a<this.animations.length;++a)if(this.animations[a].chartInstance===t)return void(this.animations[a].animationObject=e);this.animations.push({chartInstance:t,animationObject:e}),1===this.animations.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var i=e.findIndex(this.animations,function(e){return e.chartInstance===t});-1!==i&&(this.animations.splice(i,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=e.requestAnimFrame.call(window,function(){t.request=null,t.startDigest()}))},startDigest:function(){var t=Date.now(),e=0;this.dropFrames>1&&(e=Math.floor(this.dropFrames),this.dropFrames=this.dropFrames%1);for(var i=0;i<this.animations.length;)null===this.animations[i].animationObject.currentStep&&(this.animations[i].animationObject.currentStep=0),this.animations[i].animationObject.currentStep+=1+e,this.animations[i].animationObject.currentStep>this.animations[i].animationObject.numSteps&&(this.animations[i].animationObject.currentStep=this.animations[i].animationObject.numSteps),this.animations[i].animationObject.render(this.animations[i].chartInstance,this.animations[i].animationObject),this.animations[i].animationObject.onAnimationProgress&&this.animations[i].animationObject.onAnimationProgress.call&&this.animations[i].animationObject.onAnimationProgress.call(this.animations[i].chartInstance,this.animations[i]),this.animations[i].animationObject.currentStep===this.animations[i].animationObject.numSteps?(this.animations[i].animationObject.onAnimationComplete&&this.animations[i].animationObject.onAnimationComplete.call&&this.animations[i].animationObject.onAnimationComplete.call(this.animations[i].chartInstance,this.animations[i]),this.animations[i].chartInstance.animating=!1,this.animations.splice(i,1)):++i;var n=Date.now(),a=(n-t)/this.frameDuration;this.dropFrames+=a,this.animations.length>0&&this.requestAnimationFrame()}}}},{}],22:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.types={},t.instances={},t.controllers={},t.Controller=function(i){return this.chart=i,this.config=i.config,this.options=this.config.options=e.configMerge(t.defaults.global,t.defaults[this.config.type],this.config.options||{}),this.id=e.uid(),Object.defineProperty(this,"data",{get:function(){return this.config.data}}),t.instances[this.id]=this,this.options.responsive&&this.resize(!0),this.initialize(),this},e.extend(t.Controller.prototype,{initialize:function(){return t.pluginService.notifyPlugins("beforeInit",[this]),this.bindEvents(),this.ensureScalesHaveIDs(),this.buildOrUpdateControllers(),this.buildScales(),this.buildSurroundingItems(),this.updateLayout(),this.resetElements(),this.initToolTip(),this.update(),t.pluginService.notifyPlugins("afterInit",[this]),this},clear:function(){return e.clear(this.chart),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var i=this.chart.canvas,n=e.getMaximumWidth(this.chart.canvas),a=this.options.maintainAspectRatio&&isNaN(this.chart.aspectRatio)===!1&&isFinite(this.chart.aspectRatio)&&0!==this.chart.aspectRatio?n/this.chart.aspectRatio:e.getMaximumHeight(this.chart.canvas),o=this.chart.width!==n||this.chart.height!==a;return o?(i.width=this.chart.width=n,i.height=this.chart.height=a,e.retinaScale(this.chart),t||(this.stop(),this.update(this.options.responsiveAnimationDuration)),this):this},ensureScalesHaveIDs:function(){var t=this.options,i=t.scales||{},n=t.scale;e.each(i.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),e.each(i.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),n&&(n.id=n.id||"scale")},buildScales:function(){var i=this,n=i.options,a=i.scales={},o=[];n.scales&&(o=o.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear"}}))),n.scale&&o.push({options:n.scale,dtype:"radialLinear",isDefault:!0}),e.each(o,function(n,o){var r=n.options,s=e.getValueOrDefault(r.type,n.dtype),l=t.scaleService.getScaleConstructor(s);if(l){var h=new l({id:r.id,options:r,ctx:i.chart.ctx,chart:i});a[h.id]=h,n.isDefault&&(i.scale=h)}}),t.scaleService.addScalesToLayout(this)},buildSurroundingItems:function(){this.options.title&&(this.titleBlock=new t.Title({ctx:this.chart.ctx,options:this.options.title,chart:this}),t.layoutService.addBox(this,this.titleBlock)),this.options.legend&&(this.legend=new t.Legend({ctx:this.chart.ctx,options:this.options.legend,chart:this}),t.layoutService.addBox(this,this.legend))},updateLayout:function(){t.layoutService.update(this,this.chart.width,this.chart.height)},buildOrUpdateControllers:function(){var i=[],n=[];if(e.each(this.data.datasets,function(e,a){var o=this.getDatasetMeta(a);o.type||(o.type=e.type||this.config.type),i.push(o.type),o.controller?o.controller.updateIndex(a):(o.controller=new t.controllers[o.type](this,a),n.push(o.controller))},this),i.length>1)for(var a=1;a<i.length;a++)if(i[a]!==i[a-1]){this.isCombo=!0;break}return n},resetElements:function(){e.each(this.data.datasets,function(t,e){this.getDatasetMeta(e).controller.reset()},this)},update:function(i,n){t.pluginService.notifyPlugins("beforeUpdate",[this]),this.tooltip._data=this.data;var a=this.buildOrUpdateControllers();e.each(this.data.datasets,function(t,e){this.getDatasetMeta(e).controller.buildOrUpdateElements()},this),t.layoutService.update(this,this.chart.width,this.chart.height),t.pluginService.notifyPlugins("afterScaleUpdate",[this]),e.each(a,function(t){t.reset()}),e.each(this.data.datasets,function(t,e){this.getDatasetMeta(e).controller.update()},this),t.pluginService.notifyPlugins("afterUpdate",[this]),this.render(i,n)},render:function(i,n){t.pluginService.notifyPlugins("beforeRender",[this]);var a=this.options.animation;if(a&&("undefined"!=typeof i&&0!==i||"undefined"==typeof i&&0!==a.duration)){var o=new t.Animation;o.numSteps=(i||a.duration)/16.66,o.easing=a.easing,o.render=function(t,i){var n=e.easingEffects[i.easing],a=i.currentStep/i.numSteps,o=n(a);t.draw(o,a,i.currentStep)},o.onAnimationProgress=a.onProgress,o.onAnimationComplete=a.onComplete,t.animationService.addAnimation(this,o,i,n)}else this.draw(),a&&a.onComplete&&a.onComplete.call&&a.onComplete.call(this);return this},draw:function(i){var n=i||1;this.clear(),t.pluginService.notifyPlugins("beforeDraw",[this,n]),e.each(this.boxes,function(t){t.draw(this.chartArea)},this),this.scale&&this.scale.draw();var a=this.chart.ctx;a.save(),a.beginPath(),a.rect(this.chartArea.left,this.chartArea.top,this.chartArea.right-this.chartArea.left,this.chartArea.bottom-this.chartArea.top),a.clip(),e.each(this.data.datasets,function(t,e){this.isDatasetVisible(e)&&this.getDatasetMeta(e).controller.draw(i)},this,!0),a.restore(),this.tooltip.transition(n).draw(),t.pluginService.notifyPlugins("afterDraw",[this,n])},getElementAtEvent:function(t){var i=e.getRelativePosition(t,this.chart),n=[];return e.each(this.data.datasets,function(t,a){if(this.isDatasetVisible(a)){var o=this.getDatasetMeta(a);e.each(o.data,function(t,e){return t.inRange(i.x,i.y)?(n.push(t),n):void 0})}},this),n},getElementsAtEvent:function(t){var i=e.getRelativePosition(t,this.chart),n=[],a=function(){if(this.data.datasets)for(var t=0;t<this.data.datasets.length;t++){var e=this.getDatasetMeta(t);if(this.isDatasetVisible(t))for(var n=0;n<e.data.length;n++)if(e.data[n].inRange(i.x,i.y))return e.data[n]}}.call(this);return a?(e.each(this.data.datasets,function(t,e){if(this.isDatasetVisible(e)){var i=this.getDatasetMeta(e);n.push(i.data[a._index])}},this),n):n},getElementsAtEventForMode:function(t,e){var i=this;switch(e){case"single":return i.getElementAtEvent(t);case"label":return i.getElementsAtEvent(t);case"dataset":return i.getDatasetAtEvent(t);default:return t}},getDatasetAtEvent:function(t){var e=this.getElementAtEvent(t);return e.length>0&&(e=this.getDatasetMeta(e[0]._datasetIndex).data),e},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var i=e._meta[this.id];return i||(i=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,i=this.data.datasets.length;i>e;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroy:function(){this.clear(),e.unbindEvents(this,this.events),e.removeResizeListener(this.chart.canvas.parentNode);var i=this.chart.canvas;i.width=this.chart.width,i.height=this.chart.height,void 0!==this.chart.originalDevicePixelRatio&&this.chart.ctx.scale(1/this.chart.originalDevicePixelRatio,1/this.chart.originalDevicePixelRatio),i.style.width=this.chart.originalCanvasStyleWidth,i.style.height=this.chart.originalCanvasStyleHeight,t.pluginService.notifyPlugins("destroy",[this]),delete t.instances[this.id]},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)},initToolTip:function(){this.tooltip=new t.Tooltip({_chart:this.chart,_chartInstance:this,_data:this.data,_options:this.options},this)},bindEvents:function(){e.bindEvents(this,this.options.events,function(t){this.eventHandler(t)})},updateHoverStyle:function(t,e,i){var n,a,o,r=i?"setHoverStyle":"removeHoverStyle";switch(e){case"single":t=[t[0]];break;case"label":case"dataset":break;default:return}for(a=0,o=t.length;o>a;++a)n=t[a],n&&this.getDatasetMeta(n._datasetIndex).controller[r](n)},eventHandler:function(t){var i=this,n=i.tooltip,a=i.options||{},o=a.hover,r=a.tooltips;return i.lastActive=i.lastActive||[],i.lastTooltipActive=i.lastTooltipActive||[],"mouseout"===t.type?(i.active=[],i.tooltipActive=[]):(i.active=i.getElementsAtEventForMode(t,o.mode),i.tooltipActive=i.getElementsAtEventForMode(t,r.mode)),o.onHover&&o.onHover.call(i,i.active),("mouseup"===t.type||"click"===t.type)&&(a.onClick&&a.onClick.call(i,t,i.active),i.legend&&i.legend.handleEvent&&i.legend.handleEvent(t)),i.lastActive.length&&i.updateHoverStyle(i.lastActive,o.mode,!1),i.active.length&&o.mode&&i.updateHoverStyle(i.active,o.mode,!0),(r.enabled||r.custom)&&(n.initialize(),n._active=i.tooltipActive,n.update(!0)),n.pivot(),i.animating||e.arrayEquals(i.active,i.lastActive)&&e.arrayEquals(i.tooltipActive,i.lastTooltipActive)||(i.stop(),(r.enabled||r.custom)&&n.update(!0),i.render(o.animationDuration,!0)),i.lastActive=i.active,i.lastTooltipActive=i.tooltipActive,i}})}},{}],23:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i=e.noop;t.DatasetController=function(t,e){this.initialize.call(this,t,e)},e.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){this.chart=t,this.index=e,this.linkScales(),this.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this.getMeta(),e=this.getDataset();null===t.xAxisID&&(t.xAxisID=e.xAxisID||this.chart.options.scales.xAxes[0].id),null===t.yAxisID&&(t.yAxisID=e.yAxisID||this.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,i=e.dataElementType;return i&&new i({_chart:e.chart.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,i=this,n=i.getMeta(),a=i.getDataset().data||[],o=n.data;for(t=0,e=a.length;e>t;++t)o[t]=o[t]||i.createMetaData(n,t);n.dataset=n.dataset||i.createMetaDataset()},addElementAndReset:function(t){var e=this,i=e.createMetaData(t);e.getMeta().data.splice(t,0,i),e.updateElement(i,t,!0)},buildOrUpdateElements:function(){var t=this.getMeta(),e=t.data,i=this.getDataset().data.length,n=e.length;if(n>i)e.splice(i,n-i);else if(i>n)for(var a=n;i>a;++a)this.addElementAndReset(a)},update:i,draw:function(t){var i=t||1;e.each(this.getMeta().data,function(t,e){t.transition(i).draw()})},removeHoverStyle:function(t,i){var n=this.chart.data.datasets[t._datasetIndex],a=t._index,o=t.custom||{},r=e.getValueAtIndexOrDefault,s=(e.color,t._model);s.backgroundColor=o.backgroundColor?o.backgroundColor:r(n.backgroundColor,a,i.backgroundColor),s.borderColor=o.borderColor?o.borderColor:r(n.borderColor,a,i.borderColor),s.borderWidth=o.borderWidth?o.borderWidth:r(n.borderWidth,a,i.borderWidth)},setHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],n=t._index,a=t.custom||{},o=e.getValueAtIndexOrDefault,r=(e.color,e.getHoverColor),s=t._model;s.backgroundColor=a.hoverBackgroundColor?a.hoverBackgroundColor:o(i.hoverBackgroundColor,n,r(s.backgroundColor)),s.borderColor=a.hoverBorderColor?a.hoverBorderColor:o(i.hoverBorderColor,n,r(s.borderColor)),s.borderWidth=a.hoverBorderWidth?a.hoverBorderWidth:o(i.hoverBorderWidth,n,s.borderWidth)}}),t.DatasetController.extend=e.inherits}},{}],24:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.elements={},t.Element=function(t){e.extend(this,t),this.initialize.apply(this,arguments)},e.extend(t.Element.prototype,{initialize:function(){this.hidden=!1},pivot:function(){return this._view||(this._view=e.clone(this._model)),this._start=e.clone(this._view),this},transition:function(t){return this._view||(this._view=e.clone(this._model)),1===t?(this._view=this._model,this._start=null,this):(this._start||this.pivot(),e.each(this._model,function(i,n){if("_"===n[0]);else if(this._view.hasOwnProperty(n))if(i===this._view[n]);else if("string"==typeof i)try{var a=e.color(this._model[n]).mix(e.color(this._start[n]),t);this._view[n]=a.rgbString()}catch(o){this._view[n]=i}else if("number"==typeof i){var r=void 0!==this._start[n]&&isNaN(this._start[n])===!1?this._start[n]:0;this._view[n]=(this._model[n]-r)*t+r}else this._view[n]=i;else"number"!=typeof i||isNaN(this._view[n])?this._view[n]=i:this._view[n]=i*t},this),this)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return e.isNumber(this._model.x)&&e.isNumber(this._model.y)}}),t.Element.extend=e.inherits}},{}],25:[function(t,e,i){"use strict";var n=t("chartjs-color");e.exports=function(t){function e(t,e,i){var n;return"string"==typeof t?(n=parseInt(t,10),-1!=t.indexOf("%")&&(n=n/100*e.parentNode[i])):n=t,n}function i(t){return void 0!==t&&null!==t&&"none"!==t}function a(t,n,a){var o=document.defaultView,r=t.parentNode,s=o.getComputedStyle(t)[n],l=o.getComputedStyle(r)[n],h=i(s),d=i(l),u=Number.POSITIVE_INFINITY;return h||d?Math.min(h?e(s,t,a):u,d?e(l,r,a):u):"none"}var o=t.helpers={};o.each=function(t,e,i,n){var a,r;if(o.isArray(t))if(r=t.length,n)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;r>a;a++)e.call(i,t[a],a);else if("object"==typeof t){var s=Object.keys(t);for(r=s.length,a=0;r>a;a++)e.call(i,t[s[a]],s[a])}},o.clone=function(t){var e={};return o.each(t,function(t,i){o.isArray(t)?e[i]=t.slice(0):"object"==typeof t&&null!==t?e[i]=o.clone(t):e[i]=t}),e},o.extend=function(t){for(var e=arguments.length,i=[],n=1;e>n;n++)i.push(arguments[n]);return o.each(i,function(e){o.each(e,function(e,i){t[i]=e})}),t},o.configMerge=function(e){var i=o.clone(e);return o.each(Array.prototype.slice.call(arguments,1),function(e){o.each(e,function(e,n){if("scales"===n)i[n]=o.scaleMerge(i.hasOwnProperty(n)?i[n]:{},e);else if("scale"===n)i[n]=o.configMerge(i.hasOwnProperty(n)?i[n]:{},t.scaleService.getScaleDefaults(e.type),e);else if(i.hasOwnProperty(n)&&o.isArray(i[n])&&o.isArray(e)){var a=i[n];o.each(e,function(t,e){e<a.length?"object"==typeof a[e]&&null!==a[e]&&"object"==typeof t&&null!==t?a[e]=o.configMerge(a[e],t):a[e]=t:a.push(t)})}else i.hasOwnProperty(n)&&"object"==typeof i[n]&&null!==i[n]&&"object"==typeof e?i[n]=o.configMerge(i[n],e):i[n]=e})}),i},o.extendDeep=function(t){function e(t){return o.each(arguments,function(i){i!==t&&o.each(i,function(i,n){t[n]&&t[n].constructor&&t[n].constructor===Object?e(t[n],i):t[n]=i})}),t}return e.apply(this,arguments)},o.scaleMerge=function(e,i){var n=o.clone(e);return o.each(i,function(e,i){"xAxes"===i||"yAxes"===i?n.hasOwnProperty(i)?o.each(e,function(e,a){var r=o.getValueOrDefault(e.type,"xAxes"===i?"category":"linear"),s=t.scaleService.getScaleDefaults(r);a>=n[i].length||!n[i][a].type?n[i].push(o.configMerge(s,e)):e.type&&e.type!==n[i][a].type?n[i][a]=o.configMerge(n[i][a],s,e):n[i][a]=o.configMerge(n[i][a],e)}):(n[i]=[],o.each(e,function(e){var a=o.getValueOrDefault(e.type,"xAxes"===i?"category":"linear");n[i].push(o.configMerge(t.scaleService.getScaleDefaults(a),e))})):n.hasOwnProperty(i)&&"object"==typeof n[i]&&null!==n[i]&&"object"==typeof e?n[i]=o.configMerge(n[i],e):n[i]=e}),n},o.getValueAtIndexOrDefault=function(t,e,i){return void 0===t||null===t?i:o.isArray(t)?e<t.length?t[e]:i:t},o.getValueOrDefault=function(t,e){return void 0===t?e:t},o.indexOf=function(t,e){if(Array.prototype.indexOf)return t.indexOf(e);for(var i=0;i<t.length;i++)if(t[i]===e)return i;return-1},o.where=function(t,e){if(o.isArray(t)&&Array.prototype.filter)return t.filter(e);var i=[];return o.each(t,function(t){e(t)&&i.push(t)}),i},o.findIndex=function(t,e,i){var n=-1;if(Array.prototype.findIndex)n=t.findIndex(e,i);else for(var a=0;a<t.length;++a)if(i=void 0!==i?i:t,e.call(i,t[a],a,t)){n=a;break}return n},o.findNextWhere=function(t,e,i){(void 0===i||null===i)&&(i=-1);for(var n=i+1;n<t.length;n++){var a=t[n];if(e(a))return a}},o.findPreviousWhere=function(t,e,i){(void 0===i||null===i)&&(i=t.length);for(var n=i-1;n>=0;n--){var a=t[n];if(e(a))return a}},o.inherits=function(t){var e=this,i=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},n=function(){this.constructor=i};return n.prototype=e.prototype,i.prototype=new n,i.extend=o.inherits,t&&o.extend(i.prototype,t),i.__super__=e.prototype,i},o.noop=function(){},o.uid=function(){var t=0;return function(){return t++}}(),o.warn=function(t){console&&"function"==typeof console.warn&&console.warn(t)},o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,i){return Math.abs(t-e)<i},o.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},o.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},o.sign=function(t){return Math.sign?Math.sign(t):(t=+t,0===t||isNaN(t)?t:t>0?1:-1)},o.log10=function(t){return Math.log10?Math.log10(t):Math.log(t)/Math.LN10},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var i=e.x-t.x,n=e.y-t.y,a=Math.sqrt(i*i+n*n),o=Math.atan2(n,i);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},o.aliasPixel=function(t){return t%2===0?0:.5},o.splineCurve=function(t,e,i,n){var a=t.skip?e:t,o=e,r=i.skip?e:i,s=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),l=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),h=s/(s+l),d=l/(s+l);h=isNaN(h)?0:h,d=isNaN(d)?0:d;var u=n*h,c=n*d;return{previous:{x:o.x-u*(r.x-a.x),y:o.y-u*(r.y-a.y)},next:{x:o.x+c*(r.x-a.x),y:o.y+c*(r.y-a.y)}}},o.nextItem=function(t,e,i){return i?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,i){return i?0>=e?t[t.length-1]:t[e-1]:0>=e?t[0]:t[e-1]},o.niceNum=function(t,e){var i,n=Math.floor(o.log10(t)),a=t/Math.pow(10,n);return i=e?1.5>a?1:3>a?2:7>a?5:10:1>=a?1:2>=a?2:5>=a?5:10,i*Math.pow(10,n)};var r=o.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===(t/=1)?1:(i||(i=.3),n<Math.abs(1)?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),-(n*Math.pow(2,10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/i)))},easeOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===(t/=1)?1:(i||(i=.3),n<Math.abs(1)?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),n*Math.pow(2,-10*t)*Math.sin((1*t-e)*(2*Math.PI)/i)+1)},easeInOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:2===(t/=.5)?1:(i||(i=1*(.3*1.5)),n<Math.abs(1)?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),1>t?-.5*(n*Math.pow(2,10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/i)):n*Math.pow(2,-10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/i)*.5+1)},easeInBack:function(t){var e=1.70158;return 1*(t/=1)*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return 1*((t=t/1-1)*t*((e+1)*t+e)+1)},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?.5*(t*t*(((e*=1.525)+1)*t-e)):.5*((t-=2)*t*(((e*=1.525)+1)*t+e)+2)},easeInBounce:function(t){return 1-r.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?1*(7.5625*t*t):2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*r.easeInBounce(2*t):.5*r.easeOutBounce(2*t-1)+.5}};o.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),o.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),o.getRelativePosition=function(t,e){var i,n,a=t.originalEvent||t,r=t.currentTarget||t.srcElement,s=r.getBoundingClientRect(),l=a.touches;l&&l.length>0?(i=l[0].clientX,n=l[0].clientY):(i=a.clientX,n=a.clientY);var h=parseFloat(o.getStyle(r,"padding-left")),d=parseFloat(o.getStyle(r,"padding-top")),u=parseFloat(o.getStyle(r,"padding-right")),c=parseFloat(o.getStyle(r,"padding-bottom")),f=s.right-s.left-h-u,g=s.bottom-s.top-d-c;return i=Math.round((i-s.left-h)/f*r.width/e.currentDevicePixelRatio),n=Math.round((n-s.top-d)/g*r.height/e.currentDevicePixelRatio),{x:i,y:n}},o.addEvent=function(t,e,i){t.addEventListener?t.addEventListener(e,i):t.attachEvent?t.attachEvent("on"+e,i):t["on"+e]=i},o.removeEvent=function(t,e,i){t.removeEventListener?t.removeEventListener(e,i,!1):t.detachEvent?t.detachEvent("on"+e,i):t["on"+e]=o.noop},o.bindEvents=function(t,e,i){var n=t.events=t.events||{};o.each(e,function(e){n[e]=function(){i.apply(t,arguments)},o.addEvent(t.chart.canvas,e,n[e])})},o.unbindEvents=function(t,e){var i=t.chart.canvas;o.each(e,function(t,e){o.removeEvent(i,e,t)})},o.getConstraintWidth=function(t){return a(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return a(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode,i=parseInt(o.getStyle(e,"padding-left"))+parseInt(o.getStyle(e,"padding-right")),n=e.clientWidth-i,a=o.getConstraintWidth(t);return isNaN(a)?n:Math.min(n,a)},o.getMaximumHeight=function(t){var e=t.parentNode,i=parseInt(o.getStyle(e,"padding-top"))+parseInt(o.getStyle(e,"padding-bottom")),n=e.clientHeight-i,a=o.getConstraintHeight(t);return isNaN(a)?n:Math.min(n,a)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e);
-},o.retinaScale=function(t){var e=t.ctx,i=t.canvas,n=i.width,a=i.height,o=t.currentDevicePixelRatio=window.devicePixelRatio||1;1!==o&&(i.height=a*o,i.width=n*o,e.scale(o,o),t.originalDevicePixelRatio=t.originalDevicePixelRatio||o),i.style.width=n+"px",i.style.height=a+"px"},o.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},o.fontString=function(t,e,i){return e+" "+t+"px "+i},o.longestText=function(t,e,i,n){n=n||{};var a=n.data=n.data||{},r=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(a=n.data={},r=n.garbageCollect=[],n.font=e),t.font=e;var s=0;o.each(i,function(e){if(void 0!==e&&null!==e){var i=a[e];i||(i=a[e]=t.measureText(e).width,r.push(e)),i>s&&(s=i)}});var l=r.length/2;if(l>i.length){for(var h=0;l>h;h++)delete a[r[h]];r.splice(0,l)}return s},o.drawRoundedRectangle=function(t,e,i,n,a,o){t.beginPath(),t.moveTo(e+o,i),t.lineTo(e+n-o,i),t.quadraticCurveTo(e+n,i,e+n,i+o),t.lineTo(e+n,i+a-o),t.quadraticCurveTo(e+n,i+a,e+n-o,i+a),t.lineTo(e+o,i+a),t.quadraticCurveTo(e,i+a,e,i+a-o),t.lineTo(e,i+o),t.quadraticCurveTo(e,i,e+o,i),t.closePath()},o.color=function(e){return n?n(e instanceof CanvasGradient?t.defaults.global.defaultColor:e):(console.log("Color.js not found!"),e)},o.addResizeListener=function(t,e){var i=document.createElement("iframe"),n="chartjs-hidden-iframe";i.classlist?i.classlist.add(n):i.setAttribute("class",n);var a=i.style;a.width="100%",a.display="block",a.border=0,a.height=0,a.margin=0,a.position="absolute",a.left=0,a.right=0,a.top=0,a.bottom=0,t.insertBefore(i,t.firstChild),(i.contentWindow||i).onresize=function(){e&&e()}},o.removeResizeListener=function(t){var e=t.querySelector(".chartjs-hidden-iframe");e&&e.parentNode.removeChild(e)},o.isArray=function(t){return Array.isArray?Array.isArray(t):"[object Array]"===Object.prototype.toString.call(t)},o.arrayEquals=function(t,e){var i,n,a,r;if(!t||!e||t.length!=e.length)return!1;for(i=0,n=t.length;n>i;++i)if(a=t[i],r=e[i],a instanceof Array&&r instanceof Array){if(!o.arrayEquals(a,r))return!1}else if(a!=r)return!1;return!0},o.pushAllIfDefined=function(t,e){"undefined"!=typeof t&&(o.isArray(t)?e.push.apply(e,t):e.push(t))},o.callCallback=function(t,e,i){t&&"function"==typeof t.call&&t.apply(i,e)},o.getHoverColor=function(t){return t instanceof CanvasPattern?t:o.color(t).saturate(.5).darken(.1).rgbString()}}},{"chartjs-color":2}],26:[function(t,e,i){"use strict";e.exports=function(){var t=function(e,i){this.config=i,e.length&&e[0].getContext&&(e=e[0]),e.getContext&&(e=e.getContext("2d")),this.ctx=e,this.canvas=e.canvas,this.width=e.canvas.width||parseInt(t.helpers.getStyle(e.canvas,"width"))||t.helpers.getMaximumWidth(e.canvas),this.height=e.canvas.height||parseInt(t.helpers.getStyle(e.canvas,"height"))||t.helpers.getMaximumHeight(e.canvas),this.aspectRatio=this.width/this.height,(isNaN(this.aspectRatio)||isFinite(this.aspectRatio)===!1)&&(this.aspectRatio=void 0!==i.aspectRatio?i.aspectRatio:2),this.originalCanvasStyleWidth=e.canvas.style.width,this.originalCanvasStyleHeight=e.canvas.style.height,t.helpers.retinaScale(this),i&&(this.controller=new t.Controller(this));var n=this;return t.helpers.addResizeListener(e.canvas.parentNode,function(){n.controller&&n.controller.config.options.responsive&&n.controller.resize()}),this.controller?this.controller:this};return t.defaults={global:{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"single",animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');for(var i=0;i<t.data.datasets.length;i++)e.push('<li><span style="background-color:'+t.data.datasets[i].backgroundColor+'"></span>'),t.data.datasets[i].label&&e.push(t.data.datasets[i].label),e.push("</li>");return e.push("</ul>"),e.join("")}}},t}},{}],27:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),t.boxes.push(e)},removeBox:function(t,e){t.boxes&&t.boxes.splice(t.boxes.indexOf(e),1)},update:function(t,i,n){function a(t){var e,i=t.isHorizontal();i?(e=t.update(t.options.fullWidth?m:k,x),_-=e.height):(e=t.update(y,v),k-=e.width),S.push({horizontal:i,minSize:e,box:t})}function o(t){var i=e.findNextWhere(S,function(e){return e.box===t});if(i)if(t.isHorizontal()){var n={left:w,right:M,top:0,bottom:0};t.update(t.options.fullWidth?m:k,p/2,n)}else t.update(i.minSize.width,_)}function r(t){var i=e.findNextWhere(S,function(e){return e.box===t}),n={left:0,right:0,top:C,bottom:D};i&&t.update(i.minSize.width,_,n)}function s(t){t.isHorizontal()?(t.left=t.options.fullWidth?l:w,t.right=t.options.fullWidth?i-l:w+k,t.top=F,t.bottom=F+t.height,F=t.bottom):(t.left=A,t.right=A+t.width,t.top=C,t.bottom=C+_,A=t.right)}if(t){var l=0,h=0,d=e.where(t.boxes,function(t){return"left"===t.options.position}),u=e.where(t.boxes,function(t){return"right"===t.options.position}),c=e.where(t.boxes,function(t){return"top"===t.options.position}),f=e.where(t.boxes,function(t){return"bottom"===t.options.position}),g=e.where(t.boxes,function(t){return"chartArea"===t.options.position});c.sort(function(t,e){return(e.options.fullWidth?1:0)-(t.options.fullWidth?1:0)}),f.sort(function(t,e){return(t.options.fullWidth?1:0)-(e.options.fullWidth?1:0)});var m=i-2*l,p=n-2*h,b=m/2,v=p/2,y=(i-b)/(d.length+u.length),x=(n-v)/(c.length+f.length),k=m,_=p,S=[];e.each(d.concat(u,c,f),a);var w=l,M=l,C=h,D=h;e.each(d.concat(u),o),e.each(d,function(t){w+=t.width}),e.each(u,function(t){M+=t.width}),e.each(c.concat(f),o),e.each(c,function(t){C+=t.height}),e.each(f,function(t){D+=t.height}),e.each(d.concat(u),r),w=l,M=l,C=h,D=h,e.each(d,function(t){w+=t.width}),e.each(u,function(t){M+=t.width}),e.each(c,function(t){C+=t.height}),e.each(f,function(t){D+=t.height});var T=n-C-D,P=i-w-M;(P!==k||T!==_)&&(e.each(d,function(t){t.height=T}),e.each(u,function(t){t.height=T}),e.each(c,function(t){t.options.fullWidth||(t.width=P)}),e.each(f,function(t){t.options.fullWidth||(t.width=P)}),_=T,k=P);var A=l,F=h;e.each(d.concat(c),s),A+=k,F+=_,e.each(u,s),e.each(f,s),t.chartArea={left:w,top:C,right:w+k,bottom:C+_},e.each(g,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(k,_)})}}}}},{}],28:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i=e.noop;t.defaults.global.legend={display:!0,position:"top",fullWidth:!0,reverse:!1,onClick:function(t,e){var i=e.datasetIndex,n=this.chart,a=n.getDatasetMeta(i);a.hidden=null===a.hidden?!n.data.datasets[i].hidden:null,n.update()},labels:{boxWidth:40,padding:10,generateLabels:function(t){var i=t.data;return e.isArray(i.datasets)?i.datasets.map(function(e,i){return{text:e.label,fillStyle:e.backgroundColor,hidden:!t.isDatasetVisible(i),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,datasetIndex:i}},this):[]}}},t.Legend=t.Element.extend({initialize:function(t){e.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:i,update:function(t,e,i){return this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this.margins=i,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this.beforeBuildLabels(),this.buildLabels(),this.afterBuildLabels(),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate(),this.minSize},afterUpdate:i,beforeSetDimensions:i,setDimensions:function(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0,this.minSize={width:0,height:0}},afterSetDimensions:i,beforeBuildLabels:i,buildLabels:function(){this.legendItems=this.options.labels.generateLabels.call(this,this.chart),this.options.reverse&&this.legendItems.reverse()},afterBuildLabels:i,beforeFit:i,fit:function(){var i=this.options,n=i.labels,a=i.display,o=this.ctx,r=t.defaults.global,s=e.getValueOrDefault,l=s(n.fontSize,r.defaultFontSize),h=s(n.fontStyle,r.defaultFontStyle),d=s(n.fontFamily,r.defaultFontFamily),u=e.fontString(l,h,d),c=this.legendHitBoxes=[],f=this.minSize,g=this.isHorizontal();if(g?(f.width=this.maxWidth,f.height=a?10:0):(f.width=a?10:0,f.height=this.maxHeight),a&&g){var m=this.lineWidths=[0],p=this.legendItems.length?l+n.padding:0;o.textAlign="left",o.textBaseline="top",o.font=u,e.each(this.legendItems,function(t,e){var i=n.boxWidth+l/2+o.measureText(t.text).width;m[m.length-1]+i+n.padding>=this.width&&(p+=l+n.padding,m[m.length]=this.left),c[e]={left:0,top:0,width:i,height:l},m[m.length-1]+=i+n.padding},this),f.height+=p}this.width=f.width,this.height=f.height},afterFit:i,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var i=this.options,n=i.labels,a=t.defaults.global,o=a.elements.line,r=this.width,s=this.lineWidths;if(i.display){var l=this.ctx,h={x:this.left+(r-s[0])/2,y:this.top+n.padding,line:0},d=e.getValueOrDefault,u=d(n.fontColor,a.defaultFontColor),c=d(n.fontSize,a.defaultFontSize),f=d(n.fontStyle,a.defaultFontStyle),g=d(n.fontFamily,a.defaultFontFamily),m=e.fontString(c,f,g);if(this.isHorizontal()){l.textAlign="left",l.textBaseline="top",l.lineWidth=.5,l.strokeStyle=u,l.fillStyle=u,l.font=m;var p=n.boxWidth,b=this.legendHitBoxes;e.each(this.legendItems,function(t,e){var i=l.measureText(t.text).width,u=p+c/2+i,f=h.x,g=h.y;f+u>=r&&(g=h.y+=c+n.padding,h.line++,f=h.x=this.left+(r-s[h.line])/2),l.save(),l.fillStyle=d(t.fillStyle,a.defaultColor),l.lineCap=d(t.lineCap,o.borderCapStyle),l.lineDashOffset=d(t.lineDashOffset,o.borderDashOffset),l.lineJoin=d(t.lineJoin,o.borderJoinStyle),l.lineWidth=d(t.lineWidth,o.borderWidth),l.strokeStyle=d(t.strokeStyle,a.defaultColor),l.setLineDash&&l.setLineDash(d(t.lineDash,o.borderDash)),l.strokeRect(f,g,p,c),l.fillRect(f,g,p,c),l.restore(),b[e].left=f,b[e].top=g,l.fillText(t.text,p+c/2+f,g),t.hidden&&(l.beginPath(),l.lineWidth=2,l.moveTo(p+c/2+f,g+c/2),l.lineTo(p+c/2+f+i,g+c/2),l.stroke()),h.x+=u+n.padding},this)}}},handleEvent:function(t){var i=e.getRelativePosition(t,this.chart.chart),n=i.x,a=i.y,o=this.options;if(n>=this.left&&n<=this.right&&a>=this.top&&a<=this.bottom)for(var r=this.legendHitBoxes,s=0;s<r.length;++s){var l=r[s];if(n>=l.left&&n<=l.left+l.width&&a>=l.top&&a<=l.top+l.height){o.onClick&&o.onClick.call(this,t,this.legendItems[s]);break}}}})}},{}],29:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.plugins=[],t.pluginService={register:function(e){var i=t.plugins;-1===i.indexOf(e)&&i.push(e)},remove:function(e){var i=t.plugins,n=i.indexOf(e);-1!==n&&i.splice(n,1)},notifyPlugins:function(i,n,a){e.each(t.plugins,function(t){t[i]&&"function"==typeof t[i]&&t[i].apply(a,n)},a)}};var i=e.noop;t.PluginBase=t.Element.extend({beforeInit:i,afterInit:i,beforeUpdate:i,afterUpdate:i,beforeDraw:i,afterDraw:i,destroy:i})}},{}],30:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.scale={display:!0,position:"left",gridLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",offsetGridLines:!1},scaleLabel:{labelString:"",display:!1},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:10,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:function(t){return""+t}}},t.Scale=t.Element.extend({beforeUpdate:function(){e.callCallback(this.options.beforeUpdate,[this])},update:function(t,i,n){return this.beforeUpdate(),this.maxWidth=t,this.maxHeight=i,this.margins=e.extend({left:0,right:0,top:0,bottom:0},n),this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this.beforeBuildTicks(),this.buildTicks(),this.afterBuildTicks(),this.beforeTickToLabelConversion(),this.convertTicksToLabels(),this.afterTickToLabelConversion(),this.beforeCalculateTickRotation(),this.calculateTickRotation(),this.afterCalculateTickRotation(),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate(),this.minSize},afterUpdate:function(){e.callCallback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){e.callCallback(this.options.beforeSetDimensions,[this])},setDimensions:function(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0},afterSetDimensions:function(){e.callCallback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){e.callCallback(this.options.beforeDataLimits,[this])},determineDataLimits:e.noop,afterDataLimits:function(){e.callCallback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){e.callCallback(this.options.beforeBuildTicks,[this])},buildTicks:e.noop,afterBuildTicks:function(){e.callCallback(this.options.afterBuildTicks,[this])},beforeTickToLabelConversion:function(){e.callCallback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){this.ticks=this.ticks.map(function(t,e,i){return this.options.ticks.userCallback?this.options.ticks.userCallback(t,e,i):this.options.ticks.callback(t,e,i)},this)},afterTickToLabelConversion:function(){e.callCallback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){e.callCallback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var i=this.ctx,n=t.defaults.global,a=this.options.ticks,o=e.getValueOrDefault(a.fontSize,n.defaultFontSize),r=e.getValueOrDefault(a.fontStyle,n.defaultFontStyle),s=e.getValueOrDefault(a.fontFamily,n.defaultFontFamily),l=e.fontString(o,r,s);i.font=l;var h,d=i.measureText(this.ticks[0]).width,u=i.measureText(this.ticks[this.ticks.length-1]).width;if(this.labelRotation=a.minRotation||0,this.paddingRight=0,this.paddingLeft=0,this.options.display&&this.isHorizontal()){this.paddingRight=u/2+3,this.paddingLeft=d/2+3,this.longestTextCache||(this.longestTextCache={});for(var c,f,g=e.longestText(i,l,this.ticks,this.longestTextCache),m=g,p=this.getPixelForTick(1)-this.getPixelForTick(0)-6;m>p&&this.labelRotation<a.maxRotation;){if(c=Math.cos(e.toRadians(this.labelRotation)),f=Math.sin(e.toRadians(this.labelRotation)),h=c*d,h+o/2>this.yLabelWidth&&(this.paddingLeft=h+o/2),this.paddingRight=o/2,f*g>this.maxHeight){this.labelRotation--;break}this.labelRotation++,m=c*g}}this.margins&&(this.paddingLeft=Math.max(this.paddingLeft-this.margins.left,0),this.paddingRight=Math.max(this.paddingRight-this.margins.right,0))},afterCalculateTickRotation:function(){e.callCallback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){e.callCallback(this.options.beforeFit,[this])},fit:function(){var i=this.minSize={width:0,height:0},n=this.options,a=t.defaults.global,o=n.ticks,r=n.scaleLabel,s=n.display,l=this.isHorizontal(),h=e.getValueOrDefault(o.fontSize,a.defaultFontSize),d=e.getValueOrDefault(o.fontStyle,a.defaultFontStyle),u=e.getValueOrDefault(o.fontFamily,a.defaultFontFamily),c=e.fontString(h,d,u),f=e.getValueOrDefault(r.fontSize,a.defaultFontSize),g=e.getValueOrDefault(r.fontStyle,a.defaultFontStyle),m=e.getValueOrDefault(r.fontFamily,a.defaultFontFamily),p=(e.fontString(f,g,m),n.gridLines.tickMarkLength);if(l?i.width=this.isFullWidth()?this.maxWidth-this.margins.left-this.margins.right:this.maxWidth:i.width=s?p:0,l?i.height=s?p:0:i.height=this.maxHeight,r.display&&s&&(l?i.height+=1.5*f:i.width+=1.5*f),o.display&&s){this.longestTextCache||(this.longestTextCache={});var b=e.longestText(this.ctx,c,this.ticks,this.longestTextCache);if(l){this.longestLabelWidth=b;var v=Math.sin(e.toRadians(this.labelRotation))*this.longestLabelWidth+1.5*h;i.height=Math.min(this.maxHeight,i.height+v),this.ctx.font=c;var y=this.ctx.measureText(this.ticks[0]).width,x=this.ctx.measureText(this.ticks[this.ticks.length-1]).width,k=Math.cos(e.toRadians(this.labelRotation)),_=Math.sin(e.toRadians(this.labelRotation));this.paddingLeft=0!==this.labelRotation?k*y+3:y/2+3,this.paddingRight=0!==this.labelRotation?_*(h/2)+3:x/2+3}else{var S=this.maxWidth-i.width,w=o.mirror;w?b=0:b+=this.options.ticks.padding,S>b?i.width+=b:i.width=this.maxWidth,this.paddingTop=h/2,this.paddingBottom=h/2}}this.margins&&(this.paddingLeft=Math.max(this.paddingLeft-this.margins.left,0),this.paddingTop=Math.max(this.paddingTop-this.margins.top,0),this.paddingRight=Math.max(this.paddingRight-this.margins.right,0),this.paddingBottom=Math.max(this.paddingBottom-this.margins.bottom,0)),this.width=i.width,this.height=i.height},afterFit:function(){e.callCallback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function i(t){return null===t||"undefined"==typeof t?NaN:"number"==typeof t&&isNaN(t)?NaN:"object"==typeof t?t instanceof Date||t.isValid?t:i(this.isHorizontal()?t.x:t.y):t},getLabelForIndex:e.noop,getPixelForValue:e.noop,getValueForPixel:e.noop,getPixelForTick:function(t,e){if(this.isHorizontal()){var i=this.width-(this.paddingLeft+this.paddingRight),n=i/Math.max(this.ticks.length-(this.options.gridLines.offsetGridLines?0:1),1),a=n*t+this.paddingLeft;e&&(a+=n/2);var o=this.left+Math.round(a);return o+=this.isFullWidth()?this.margins.left:0}var r=this.height-(this.paddingTop+this.paddingBottom);return this.top+t*(r/(this.ticks.length-1))},getPixelForDecimal:function(t){if(this.isHorizontal()){var e=this.width-(this.paddingLeft+this.paddingRight),i=e*t+this.paddingLeft,n=this.left+Math.round(i);return n+=this.isFullWidth()?this.margins.left:0}return this.top+t*this.height},getBasePixel:function(){var t=this,e=t.min,i=t.max;return t.getPixelForValue(t.beginAtZero?0:0>e&&0>i?i:e>0&&i>0?e:0)},draw:function(i){var n=this.options;if(n.display){var a,o,r,s,l,h=this.ctx,d=t.defaults.global,u=n.ticks,c=n.gridLines,f=n.scaleLabel,g=0!==this.labelRotation,m=u.autoSkip;u.maxTicksLimit&&(l=u.maxTicksLimit);var p=e.getValueOrDefault(u.fontColor,d.defaultFontColor),b=e.getValueOrDefault(u.fontSize,d.defaultFontSize),v=e.getValueOrDefault(u.fontStyle,d.defaultFontStyle),y=e.getValueOrDefault(u.fontFamily,d.defaultFontFamily),x=e.fontString(b,v,y),k=c.tickMarkLength,_=e.getValueOrDefault(f.fontColor,d.defaultFontColor),S=e.getValueOrDefault(f.fontSize,d.defaultFontSize),w=e.getValueOrDefault(f.fontStyle,d.defaultFontStyle),M=e.getValueOrDefault(f.fontFamily,d.defaultFontFamily),C=e.fontString(S,w,M),D=e.toRadians(this.labelRotation),T=Math.cos(D),P=(Math.sin(D),this.longestLabelWidth*T);if(h.fillStyle=p,this.isHorizontal()){a=!0;var A="bottom"===n.position?this.top:this.bottom-k,F="bottom"===n.position?this.top+k:this.bottom;if(o=!1,g&&(P/=2),(P+u.autoSkipPadding)*this.ticks.length>this.width-(this.paddingLeft+this.paddingRight)&&(o=1+Math.floor((P+u.autoSkipPadding)*this.ticks.length/(this.width-(this.paddingLeft+this.paddingRight)))),l&&this.ticks.length>l)for(;!o||this.ticks.length/(o||1)>l;)o||(o=1),o+=1;m||(o=!1),e.each(this.ticks,function(t,r){var s=this.ticks.length===r+1,l=o>1&&r%o>0||r%o===0&&r+o>=this.ticks.length;if((!l||s)&&void 0!==t&&null!==t){var d=this.getPixelForTick(r),f=this.getPixelForTick(r,c.offsetGridLines);c.display&&(r===("undefined"!=typeof this.zeroLineIndex?this.zeroLineIndex:0)?(h.lineWidth=c.zeroLineWidth,h.strokeStyle=c.zeroLineColor,a=!0):a&&(h.lineWidth=c.lineWidth,h.strokeStyle=c.color,a=!1),d+=e.aliasPixel(h.lineWidth),h.beginPath(),c.drawTicks&&(h.moveTo(d,A),h.lineTo(d,F)),c.drawOnChartArea&&(h.moveTo(d,i.top),h.lineTo(d,i.bottom)),h.stroke()),u.display&&(h.save(),h.translate(f+u.labelOffset,g?this.top+12:"top"===n.position?this.bottom-k:this.top+k),h.rotate(-1*D),h.font=x,h.textAlign=g?"right":"center",h.textBaseline=g?"middle":"top"===n.position?"bottom":"top",h.fillText(t,0,0),h.restore())}},this),f.display&&(h.textAlign="center",h.textBaseline="middle",h.fillStyle=_,h.font=C,r=this.left+(this.right-this.left)/2,s="bottom"===n.position?this.bottom-S/2:this.top+S/2,h.fillText(f.labelString,r,s))}else{a=!0;var I="right"===n.position?this.left:this.right-5,O="right"===n.position?this.left+5:this.right;if(e.each(this.ticks,function(t,o){if(void 0!==t&&null!==t){var r=this.getPixelForTick(o);if(c.display&&(o===("undefined"!=typeof this.zeroLineIndex?this.zeroLineIndex:0)?(h.lineWidth=c.zeroLineWidth,h.strokeStyle=c.zeroLineColor,a=!0):a&&(h.lineWidth=c.lineWidth,h.strokeStyle=c.color,a=!1),r+=e.aliasPixel(h.lineWidth),h.beginPath(),c.drawTicks&&(h.moveTo(I,r),h.lineTo(O,r)),c.drawOnChartArea&&(h.moveTo(i.left,r),h.lineTo(i.right,r)),h.stroke()),u.display){var s,l=this.getPixelForTick(o,c.offsetGridLines);h.save(),"left"===n.position?u.mirror?(s=this.right+u.padding,h.textAlign="left"):(s=this.right-u.padding,h.textAlign="right"):u.mirror?(s=this.left-u.padding,h.textAlign="right"):(s=this.left+u.padding,h.textAlign="left"),h.translate(s,l+u.labelOffset),h.rotate(-1*D),h.font=x,h.textBaseline="middle",h.fillText(t,0,0),h.restore()}}},this),f.display){r="left"===n.position?this.left+S/2:this.right-S/2,s=this.top+(this.bottom-this.top)/2;var R="left"===n.position?-.5*Math.PI:.5*Math.PI;h.save(),h.translate(r,s),h.rotate(R),h.textAlign="center",h.fillStyle=_,h.font=C,h.textBaseline="middle",h.fillText(f.labelString,0,0),h.restore()}}if(c.drawBorder){h.lineWidth=c.lineWidth,h.strokeStyle=c.color;var W=this.left,V=this.right,L=this.top,B=this.bottom,z=e.aliasPixel(h.lineWidth);this.isHorizontal()?(L=B="top"===n.position?this.bottom:this.top,L+=z,B+=z):(W=V="left"===n.position?this.right:this.left,W+=z,V+=z),h.beginPath(),h.moveTo(W,L),h.lineTo(V,B),h.stroke()}}}})}},{}],31:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.scaleService={constructors:{},defaults:{},registerScaleType:function(t,i,n){this.constructors[t]=i,this.defaults[t]=e.clone(n)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(i){return this.defaults.hasOwnProperty(i)?e.scaleMerge(t.defaults.scale,this.defaults[i]):{}},updateScaleDefaults:function(t,i){var n=this.defaults;n.hasOwnProperty(t)&&(n[t]=e.extend(n[t],i))},addScalesToLayout:function(i){e.each(i.scales,function(e){t.layoutService.addBox(i,e)})}}}},{}],32:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.title={display:!1,position:"top",fullWidth:!0,fontStyle:"bold",padding:10,text:""};var i=e.noop;t.Title=t.Element.extend({initialize:function(i){e.extend(this,i),this.options=e.configMerge(t.defaults.global.title,i.options),this.legendHitBoxes=[]},beforeUpdate:i,update:function(t,e,i){return this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this.margins=i,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this.beforeBuildLabels(),this.buildLabels(),this.afterBuildLabels(),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate(),this.minSize},afterUpdate:i,beforeSetDimensions:i,setDimensions:function(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0,this.minSize={width:0,height:0}},afterSetDimensions:i,beforeBuildLabels:i,buildLabels:i,afterBuildLabels:i,beforeFit:i,fit:function(){var i=this,n=(i.ctx,e.getValueOrDefault),a=i.options,o=t.defaults.global,r=a.display,s=n(a.fontSize,o.defaultFontSize),l=i.minSize;i.isHorizontal()?(l.width=i.maxWidth,l.height=r?s+2*a.padding:0):(l.width=r?s+2*a.padding:0,l.height=i.maxHeight),i.width=l.width,i.height=l.height},afterFit:i,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var i=this,n=i.ctx,a=e.getValueOrDefault,o=i.options,r=t.defaults.global;if(o.display){var s,l,h=a(o.fontSize,r.defaultFontSize),d=a(o.fontStyle,r.defaultFontStyle),u=a(o.fontFamily,r.defaultFontFamily),c=e.fontString(h,d,u),f=0,g=i.top,m=i.left,p=i.bottom,b=i.right;n.fillStyle=a(o.fontColor,r.defaultFontColor),n.font=c,i.isHorizontal()?(s=m+(b-m)/2,l=g+(p-g)/2):(s="left"===o.position?m+h/2:b-h/2,l=g+(p-g)/2,f=Math.PI*("left"===o.position?-.5:.5)),n.save(),n.translate(s,l),n.rotate(f),n.textAlign="center",n.textBaseline="middle",n.fillText(o.text,0,0),n.restore()}}})}},{}],33:[function(t,e,i){"use strict";e.exports=function(t){function e(t,e){return e&&(i.isArray(e)?t=t.concat(e):t.push(e)),t}var i=t.helpers;t.defaults.global.tooltips={enabled:!0,custom:null,mode:"single",backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleColor:"#fff",titleAlign:"left",bodySpacing:2,bodyColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,yAlign:"center",xAlign:"center",caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",callbacks:{beforeTitle:i.noop,title:function(t,e){var i="";return t.length>0&&(t[0].xLabel?i=t[0].xLabel:e.labels.length>0&&t[0].index<e.labels.length&&(i=e.labels[t[0].index])),i},afterTitle:i.noop,beforeBody:i.noop,beforeLabel:i.noop,label:function(t,e){var i=e.datasets[t.datasetIndex].label||"";return i+": "+t.yLabel},afterLabel:i.noop,afterBody:i.noop,beforeFooter:i.noop,footer:i.noop,afterFooter:i.noop}},t.Tooltip=t.Element.extend({initialize:function(){var e=t.defaults.global,n=this._options,a=n.tooltips;i.extend(this,{_model:{xPadding:a.xPadding,yPadding:a.yPadding,xAlign:a.yAlign,yAlign:a.xAlign,bodyColor:a.bodyColor,_bodyFontFamily:i.getValueOrDefault(a.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:i.getValueOrDefault(a.bodyFontStyle,e.defaultFontStyle),_bodyAlign:a.bodyAlign,bodyFontSize:i.getValueOrDefault(a.bodyFontSize,e.defaultFontSize),bodySpacing:a.bodySpacing,titleColor:a.titleColor,_titleFontFamily:i.getValueOrDefault(a.titleFontFamily,e.defaultFontFamily),_titleFontStyle:i.getValueOrDefault(a.titleFontStyle,e.defaultFontStyle),titleFontSize:i.getValueOrDefault(a.titleFontSize,e.defaultFontSize),_titleAlign:a.titleAlign,titleSpacing:a.titleSpacing,titleMarginBottom:a.titleMarginBottom,footerColor:a.footerColor,_footerFontFamily:i.getValueOrDefault(a.footerFontFamily,e.defaultFontFamily),_footerFontStyle:i.getValueOrDefault(a.footerFontStyle,e.defaultFontStyle),footerFontSize:i.getValueOrDefault(a.footerFontSize,e.defaultFontSize),_footerAlign:a.footerAlign,footerSpacing:a.footerSpacing,footerMarginTop:a.footerMarginTop,caretSize:a.caretSize,cornerRadius:a.cornerRadius,backgroundColor:a.backgroundColor,opacity:0,legendColorBackground:a.multiKeyBackground}})},getTitle:function(){var t=this._options.tooltips.callbacks.beforeTitle.apply(this,arguments),i=this._options.tooltips.callbacks.title.apply(this,arguments),n=this._options.tooltips.callbacks.afterTitle.apply(this,arguments),a=[];return a=e(a,t),a=e(a,i),a=e(a,n)},getBeforeBody:function(){var t=this._options.tooltips.callbacks.beforeBody.apply(this,arguments);return i.isArray(t)?t:void 0!==t?[t]:[]},getBody:function(t,e){var n=[];return i.each(t,function(t){i.pushAllIfDefined(this._options.tooltips.callbacks.beforeLabel.call(this,t,e),n),i.pushAllIfDefined(this._options.tooltips.callbacks.label.call(this,t,e),n),i.pushAllIfDefined(this._options.tooltips.callbacks.afterLabel.call(this,t,e),n)},this),n},getAfterBody:function(){var t=this._options.tooltips.callbacks.afterBody.apply(this,arguments);return i.isArray(t)?t:void 0!==t?[t]:[]},getFooter:function(){var t=this._options.tooltips.callbacks.beforeFooter.apply(this,arguments),i=this._options.tooltips.callbacks.footer.apply(this,arguments),n=this._options.tooltips.callbacks.afterFooter.apply(this,arguments),a=[];return a=e(a,t),a=e(a,i),a=e(a,n)},getAveragePosition:function(t){if(!t.length)return!1;var e=[],n=[];i.each(t,function(t){if(t&&t.hasValue()){var i=t.tooltipPosition();e.push(i.x),n.push(i.y)}});for(var a=0,o=0,r=0;r<e.length;r++)a+=e[r],o+=n[r];return{x:Math.round(a/e.length),y:Math.round(o/e.length)}},update:function(t){if(this._active.length){this._model.opacity=1;var e,n=this._active[0],a=[],o=[];if("single"===this._options.tooltips.mode){var r=n._yScale||n._scale;o.push({xLabel:n._xScale?n._xScale.getLabelForIndex(n._index,n._datasetIndex):"",yLabel:r?r.getLabelForIndex(n._index,n._datasetIndex):"",index:n._index,datasetIndex:n._datasetIndex}),e=this.getAveragePosition(this._active)}else i.each(this._data.datasets,function(t,e){if(this._chartInstance.isDatasetVisible(e)){var i=this._chartInstance.getDatasetMeta(e),a=i.data[n._index];if(a){var r=n._yScale||n._scale;o.push({xLabel:a._xScale?a._xScale.getLabelForIndex(a._index,a._datasetIndex):"",yLabel:r?r.getLabelForIndex(a._index,a._datasetIndex):"",index:n._index,datasetIndex:e})}}},this),i.each(this._active,function(t){t&&a.push({borderColor:t._view.borderColor,backgroundColor:t._view.backgroundColor})},null),e=this.getAveragePosition(this._active);i.extend(this._model,{title:this.getTitle(o,this._data),beforeBody:this.getBeforeBody(o,this._data),body:this.getBody(o,this._data),afterBody:this.getAfterBody(o,this._data),footer:this.getFooter(o,this._data)}),i.extend(this._model,{x:Math.round(e.x),y:Math.round(e.y),caretPadding:i.getValueOrDefault(e.padding,2),labelColors:a});var s=this.getTooltipSize(this._model);this.determineAlignment(s),i.extend(this._model,this.getBackgroundPoint(this._model,s))}else this._model.opacity=0;return t&&this._options.tooltips.custom&&this._options.tooltips.custom.call(this,this._model),this},getTooltipSize:function(t){var e=this._chart.ctx,n={height:2*t.yPadding,width:0},a=t.body.length+t.beforeBody.length+t.afterBody.length;return n.height+=t.title.length*t.titleFontSize,n.height+=(t.title.length-1)*t.titleSpacing,n.height+=t.title.length?t.titleMarginBottom:0,n.height+=a*t.bodyFontSize,n.height+=a?(a-1)*t.bodySpacing:0,n.height+=t.footer.length?t.footerMarginTop:0,n.height+=t.footer.length*t.footerFontSize,n.height+=t.footer.length?(t.footer.length-1)*t.footerSpacing:0,e.font=i.fontString(t.titleFontSize,t._titleFontStyle,t._titleFontFamily),i.each(t.title,function(t){n.width=Math.max(n.width,e.measureText(t).width)}),e.font=i.fontString(t.bodyFontSize,t._bodyFontStyle,t._bodyFontFamily),i.each(t.beforeBody.concat(t.afterBody),function(t){n.width=Math.max(n.width,e.measureText(t).width)}),i.each(t.body,function(i){n.width=Math.max(n.width,e.measureText(i).width+("single"!==this._options.tooltips.mode?t.bodyFontSize+2:0))},this),e.font=i.fontString(t.footerFontSize,t._footerFontStyle,t._footerFontFamily),i.each(t.footer,function(t){n.width=Math.max(n.width,e.measureText(t).width)}),n.width+=2*t.xPadding,n},determineAlignment:function(t){this._model.y<t.height?this._model.yAlign="top":this._model.y>this._chart.height-t.height&&(this._model.yAlign="bottom");var e,i,n,a,o,r=this,s=(this._chartInstance.chartArea.left+this._chartInstance.chartArea.right)/2,l=(this._chartInstance.chartArea.top+this._chartInstance.chartArea.bottom)/2;"center"===this._model.yAlign?(e=function(t){return s>=t},i=function(t){return t>s}):(e=function(e){return e<=t.width/2},i=function(e){return e>=r._chart.width-t.width/2}),n=function(e){return e+t.width>r._chart.width},a=function(e){return e-t.width<0},o=function(t){return l>=t?"top":"bottom"},e(this._model.x)?(this._model.xAlign="left",n(this._model.x)&&(this._model.xAlign="center",this._model.yAlign=o(this._model.y))):i(this._model.x)&&(this._model.xAlign="right",a(this._model.x)&&(this._model.xAlign="center",this._model.yAlign=o(this._model.y)))},getBackgroundPoint:function(t,e){var i={
-x:t.x,y:t.y};return"right"===t.xAlign?i.x-=e.width:"center"===t.xAlign&&(i.x-=e.width/2),"top"===t.yAlign?i.y+=t.caretPadding+t.caretSize:"bottom"===t.yAlign?i.y-=e.height+t.caretPadding+t.caretSize:i.y-=e.height/2,"center"===t.yAlign?"left"===t.xAlign?i.x+=t.caretPadding+t.caretSize:"right"===t.xAlign&&(i.x-=t.caretPadding+t.caretSize):"left"===t.xAlign?i.x-=t.cornerRadius+t.caretPadding:"right"===t.xAlign&&(i.x+=t.cornerRadius+t.caretPadding),i},drawCaret:function(t,e,n,a){var o,r,s,l,h,d,u=this._view,c=this._chart.ctx;"center"===u.yAlign?("left"===u.xAlign?(o=t.x,r=o-u.caretSize,s=o):(o=t.x+e.width,r=o+u.caretSize,s=o),h=t.y+e.height/2,l=h-u.caretSize,d=h+u.caretSize):("left"===u.xAlign?(o=t.x+u.cornerRadius,r=o+u.caretSize,s=r+u.caretSize):"right"===u.xAlign?(o=t.x+e.width-u.cornerRadius,r=o-u.caretSize,s=r-u.caretSize):(r=t.x+e.width/2,o=r-u.caretSize,s=r+u.caretSize),"top"===u.yAlign?(l=t.y,h=l-u.caretSize,d=l):(l=t.y+e.height,h=l+u.caretSize,d=l));var f=i.color(u.backgroundColor);c.fillStyle=f.alpha(n*f.alpha()).rgbString(),c.beginPath(),c.moveTo(o,l),c.lineTo(r,h),c.lineTo(s,d),c.closePath(),c.fill()},drawTitle:function(t,e,n,a){if(e.title.length){n.textAlign=e._titleAlign,n.textBaseline="top";var o=i.color(e.titleColor);n.fillStyle=o.alpha(a*o.alpha()).rgbString(),n.font=i.fontString(e.titleFontSize,e._titleFontStyle,e._titleFontFamily),i.each(e.title,function(i,a){n.fillText(i,t.x,t.y),t.y+=e.titleFontSize+e.titleSpacing,a+1===e.title.length&&(t.y+=e.titleMarginBottom-e.titleSpacing)})}},drawBody:function(t,e,n,a){n.textAlign=e._bodyAlign,n.textBaseline="top";var o=i.color(e.bodyColor);n.fillStyle=o.alpha(a*o.alpha()).rgbString(),n.font=i.fontString(e.bodyFontSize,e._bodyFontStyle,e._bodyFontFamily),i.each(e.beforeBody,function(i){n.fillText(i,t.x,t.y),t.y+=e.bodyFontSize+e.bodySpacing}),i.each(e.body,function(o,r){"single"!==this._options.tooltips.mode&&(n.fillStyle=i.color(e.legendColorBackground).alpha(a).rgbaString(),n.fillRect(t.x,t.y,e.bodyFontSize,e.bodyFontSize),n.strokeStyle=i.color(e.labelColors[r].borderColor).alpha(a).rgbaString(),n.strokeRect(t.x,t.y,e.bodyFontSize,e.bodyFontSize),n.fillStyle=i.color(e.labelColors[r].backgroundColor).alpha(a).rgbaString(),n.fillRect(t.x+1,t.y+1,e.bodyFontSize-2,e.bodyFontSize-2),n.fillStyle=i.color(e.bodyColor).alpha(a).rgbaString()),n.fillText(o,t.x+("single"!==this._options.tooltips.mode?e.bodyFontSize+2:0),t.y),t.y+=e.bodyFontSize+e.bodySpacing},this),i.each(e.afterBody,function(i){n.fillText(i,t.x,t.y),t.y+=e.bodyFontSize}),t.y-=e.bodySpacing},drawFooter:function(t,e,n,a){if(e.footer.length){t.y+=e.footerMarginTop,n.textAlign=e._footerAlign,n.textBaseline="top";var o=i.color(e.footerColor);n.fillStyle=o.alpha(a*o.alpha()).rgbString(),n.font=i.fontString(e.footerFontSize,e._footerFontStyle,e._footerFontFamily),i.each(e.footer,function(i){n.fillText(i,t.x,t.y),t.y+=e.footerFontSize+e.footerSpacing})}},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n=e.caretPadding,a=this.getTooltipSize(e),o={x:e.x,y:e.y},r=Math.abs(e.opacity<.001)?0:e.opacity;if(this._options.tooltips.enabled){var s=i.color(e.backgroundColor);t.fillStyle=s.alpha(r*s.alpha()).rgbString(),i.drawRoundedRectangle(t,o.x,o.y,a.width,a.height,e.cornerRadius),t.fill(),this.drawCaret(o,a,r,n),o.x+=e.xPadding,o.y+=e.yPadding,this.drawTitle(o,e,t,r),this.drawBody(o,e,t,r),this.drawFooter(o,e,t,r)}}}})}},{}],34:[function(t,e,i){"use strict";e.exports=function(t,e){var i=t.helpers,n=t.defaults.global;n.elements.arc={backgroundColor:n.defaultColor,borderColor:"#fff",borderWidth:2},t.elements.Arc=t.Element.extend({inLabelRange:function(t){var e=this._view;return e?Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2):!1},inRange:function(t,e){var n=this._view;if(n){for(var a=i.getAngleFromPoint(n,{x:t,y:e}),o=a.angle,r=a.distance,s=n.startAngle,l=n.endAngle;s>l;)l+=2*Math.PI;for(;o>l;)o-=2*Math.PI;for(;s>o;)o+=2*Math.PI;var h=o>=s&&l>=o,d=r>=n.innerRadius&&r<=n.outerRadius;return h&&d}return!1},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,i=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},draw:function(){var t=this._chart.ctx,e=this._view,i=e.startAngle,n=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,i,n),t.arc(e.x,e.y,e.innerRadius,n,i,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})}},{}],35:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i=t.defaults.global;t.defaults.global.elements.line={tension:.4,backgroundColor:i.defaultColor,borderWidth:3,borderColor:i.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",fill:!0},t.elements.Line=t.Element.extend({lineToNextPoint:function(t,e,i,n,a){var o=this._chart.ctx;e._view.skip?n.call(this,t,e,i):t._view.skip?a.call(this,t,e,i):0===e._view.tension?o.lineTo(e._view.x,e._view.y):o.bezierCurveTo(t._view.controlPointNextX,t._view.controlPointNextY,e._view.controlPointPreviousX,e._view.controlPointPreviousY,e._view.x,e._view.y)},draw:function(){function t(t){r._view.skip||s._view.skip?t&&o.lineTo(n._view.scaleZero.x,n._view.scaleZero.y):o.bezierCurveTo(s._view.controlPointNextX,s._view.controlPointNextY,r._view.controlPointPreviousX,r._view.controlPointPreviousY,r._view.x,r._view.y)}var n=this,a=this._view,o=this._chart.ctx,r=this._children[0],s=this._children[this._children.length-1];o.save(),this._children.length>0&&a.fill&&(o.beginPath(),e.each(this._children,function(t,i){var n=e.previousItem(this._children,i),r=e.nextItem(this._children,i);0===i?(this._loop?o.moveTo(a.scaleZero.x,a.scaleZero.y):o.moveTo(t._view.x,a.scaleZero),t._view.skip?this._loop||o.moveTo(r._view.x,this._view.scaleZero):o.lineTo(t._view.x,t._view.y)):this.lineToNextPoint(n,t,r,function(t,e,i){this._loop?o.lineTo(this._view.scaleZero.x,this._view.scaleZero.y):(o.lineTo(t._view.x,this._view.scaleZero),o.moveTo(i._view.x,this._view.scaleZero))},function(t,e){o.lineTo(e._view.x,e._view.y)})},this),this._loop?t(!0):(o.lineTo(this._children[this._children.length-1]._view.x,a.scaleZero),o.lineTo(this._children[0]._view.x,a.scaleZero)),o.fillStyle=a.backgroundColor||i.defaultColor,o.closePath(),o.fill());var l=i.elements.line;o.lineCap=a.borderCapStyle||l.borderCapStyle,o.setLineDash&&o.setLineDash(a.borderDash||l.borderDash),o.lineDashOffset=a.borderDashOffset||l.borderDashOffset,o.lineJoin=a.borderJoinStyle||l.borderJoinStyle,o.lineWidth=a.borderWidth||l.borderWidth,o.strokeStyle=a.borderColor||i.defaultColor,o.beginPath(),e.each(this._children,function(t,i){var n=e.previousItem(this._children,i),a=e.nextItem(this._children,i);0===i?o.moveTo(t._view.x,t._view.y):this.lineToNextPoint(n,t,a,function(t,e,i){o.moveTo(i._view.x,i._view.y)},function(t,e){o.moveTo(e._view.x,e._view.y)})},this),this._loop&&this._children.length>0&&t(),o.stroke(),o.restore()}})}},{}],36:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i=t.defaults.global,n=i.defaultColor;i.elements.point={radius:3,pointStyle:"circle",backgroundColor:n,borderWidth:1,borderColor:n,hitRadius:1,hoverRadius:4,hoverBorderWidth:1},t.elements.Point=t.Element.extend({inRange:function(t,e){var i=this._view;return i?Math.pow(t-i.x,2)+Math.pow(e-i.y,2)<Math.pow(i.hitRadius+i.radius,2):!1},inLabelRange:function(t){var e=this._view;return e?Math.pow(t-e.x,2)<Math.pow(e.radius+e.hitRadius,2):!1},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(){var t,a,o,r,s,l,h=this._view,d=this._chart.ctx,u=h.pointStyle,c=h.radius,f=h.x,g=h.y;if(!h.skip){if("object"==typeof u&&(t=u.toString(),"[object HTMLImageElement]"===t||"[object HTMLCanvasElement]"===t))return void d.drawImage(u,f-u.width/2,g-u.height/2);if(!(isNaN(c)||0>=c)){switch(d.strokeStyle=h.borderColor||n,d.lineWidth=e.getValueOrDefault(h.borderWidth,i.elements.point.borderWidth),d.fillStyle=h.backgroundColor||n,u){default:d.beginPath(),d.arc(f,g,c,0,2*Math.PI),d.closePath(),d.fill();break;case"triangle":d.beginPath(),a=3*c/Math.sqrt(3),s=a*Math.sqrt(3)/2,d.moveTo(f-a/2,g+s/3),d.lineTo(f+a/2,g+s/3),d.lineTo(f,g-2*s/3),d.closePath(),d.fill();break;case"rect":l=1/Math.SQRT2*c,d.fillRect(f-l,g-l,2*l,2*l),d.strokeRect(f-l,g-l,2*l,2*l);break;case"rectRot":d.translate(f,g),d.rotate(Math.PI/4),l=1/Math.SQRT2*c,d.fillRect(-l,-l,2*l,2*l),d.strokeRect(-l,-l,2*l,2*l),d.setTransform(1,0,0,1,0,0);break;case"cross":d.beginPath(),d.moveTo(f,g+c),d.lineTo(f,g-c),d.moveTo(f-c,g),d.lineTo(f+c,g),d.closePath();break;case"crossRot":d.beginPath(),o=Math.cos(Math.PI/4)*c,r=Math.sin(Math.PI/4)*c,d.moveTo(f-o,g-r),d.lineTo(f+o,g+r),d.moveTo(f-o,g+r),d.lineTo(f+o,g-r),d.closePath();break;case"star":d.beginPath(),d.moveTo(f,g+c),d.lineTo(f,g-c),d.moveTo(f-c,g),d.lineTo(f+c,g),o=Math.cos(Math.PI/4)*c,r=Math.sin(Math.PI/4)*c,d.moveTo(f-o,g-r),d.lineTo(f+o,g+r),d.moveTo(f-o,g+r),d.lineTo(f+o,g-r),d.closePath();break;case"line":d.beginPath(),d.moveTo(f-c,g),d.lineTo(f+c,g),d.closePath();break;case"dash":d.beginPath(),d.moveTo(f,g),d.lineTo(f+c,g),d.closePath()}d.stroke()}}}})}},{}],37:[function(t,e,i){"use strict";e.exports=function(t){var e=(t.helpers,t.defaults.global);e.elements.rectangle={backgroundColor:e.defaultColor,borderWidth:0,borderColor:e.defaultColor,borderSkipped:"bottom"},t.elements.Rectangle=t.Element.extend({draw:function(){function t(t){return l[(d+t)%4]}var e=this._chart.ctx,i=this._view,n=i.width/2,a=i.x-n,o=i.x+n,r=i.base-(i.base-i.y),s=i.borderWidth/2;i.borderWidth&&(a+=s,o-=s,r+=s),e.beginPath(),e.fillStyle=i.backgroundColor,e.strokeStyle=i.borderColor,e.lineWidth=i.borderWidth;var l=[[a,i.base],[a,r],[o,r],[o,i.base]],h=["bottom","left","top","right"],d=h.indexOf(i.borderSkipped,0);-1===d&&(d=0),e.moveTo.apply(e,t(0));for(var u=1;4>u;u++)e.lineTo.apply(e,t(u));e.fill(),i.borderWidth&&e.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var i=this._view;return i?i.y<i.base?t>=i.x-i.width/2&&t<=i.x+i.width/2&&e>=i.y&&e<=i.base:t>=i.x-i.width/2&&t<=i.x+i.width/2&&e>=i.base&&e<=i.y:!1},inLabelRange:function(t){var e=this._view;return e?t>=e.x-e.width/2&&t<=e.x+e.width/2:!1},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})}},{}],38:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i={position:"bottom"},n=t.Scale.extend({determineDataLimits:function(){this.minIndex=0,this.maxIndex=this.chart.data.labels.length-1;var t;void 0!==this.options.ticks.min&&(t=e.indexOf(this.chart.data.labels,this.options.ticks.min),this.minIndex=-1!==t?t:this.minIndex),void 0!==this.options.ticks.max&&(t=e.indexOf(this.chart.data.labels,this.options.ticks.max),this.maxIndex=-1!==t?t:this.maxIndex),this.min=this.chart.data.labels[this.minIndex],this.max=this.chart.data.labels[this.maxIndex]},buildTicks:function(t){this.ticks=0===this.minIndex&&this.maxIndex===this.chart.data.labels.length-1?this.chart.data.labels:this.chart.data.labels.slice(this.minIndex,this.maxIndex+1)},getLabelForIndex:function(t,e){return this.ticks[t]},getPixelForValue:function(t,e,i,n){var a=Math.max(this.maxIndex+1-this.minIndex-(this.options.gridLines.offsetGridLines?0:1),1);if(this.isHorizontal()){var o=this.width-(this.paddingLeft+this.paddingRight),r=o/a,s=r*(e-this.minIndex)+this.paddingLeft;return this.options.gridLines.offsetGridLines&&n&&(s+=r/2),this.left+Math.round(s)}var l=this.height-(this.paddingTop+this.paddingBottom),h=l/a,d=h*(e-this.minIndex)+this.paddingTop;return this.options.gridLines.offsetGridLines&&n&&(d+=h/2),this.top+Math.round(d)},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null,e)},getValueForPixel:function(t){var e,i=Math.max(this.ticks.length-(this.options.gridLines.offsetGridLines?0:1),1),n=this.isHorizontal(),a=n?this.width-(this.paddingLeft+this.paddingRight):this.height-(this.paddingTop+this.paddingBottom),o=a/i;return this.options.gridLines.offsetGridLines&&(t-=o/2),t-=n?this.paddingLeft:this.paddingTop,e=0>=t?0:Math.round(t/o)}});t.scaleService.registerScaleType("category",n,i)}},{}],39:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i={position:"left",ticks:{callback:function(t,i,n){var a=n.length>3?n[2]-n[1]:n[1]-n[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var o=e.log10(Math.abs(a)),r="";if(0!==t){var s=-1*Math.floor(o);s=Math.max(Math.min(s,20),0),r=t.toFixed(s)}else r="0";return r}}},n=t.Scale.extend({determineDataLimits:function(){function t(t){return l?t.xAxisID===i.id:t.yAxisID===i.id}var i=this,n=i.options,a=n.ticks,o=i.chart,r=o.data,s=r.datasets,l=i.isHorizontal();if(i.min=null,i.max=null,n.stacked){var h={},d=!1,u=!1;e.each(s,function(a,r){var s=o.getDatasetMeta(r);void 0===h[s.type]&&(h[s.type]={positiveValues:[],negativeValues:[]});var l=h[s.type].positiveValues,c=h[s.type].negativeValues;o.isDatasetVisible(r)&&t(s)&&e.each(a.data,function(t,e){var a=+i.getRightValue(t);isNaN(a)||s.data[e].hidden||(l[e]=l[e]||0,c[e]=c[e]||0,n.relativePoints?l[e]=100:0>a?(u=!0,c[e]+=a):(d=!0,l[e]+=a))})}),e.each(h,function(t){var n=t.positiveValues.concat(t.negativeValues),a=e.min(n),o=e.max(n);i.min=null===i.min?a:Math.min(i.min,a),i.max=null===i.max?o:Math.max(i.max,o)})}else e.each(s,function(n,a){var r=o.getDatasetMeta(a);o.isDatasetVisible(a)&&t(r)&&e.each(n.data,function(t,e){var n=+i.getRightValue(t);isNaN(n)||r.data[e].hidden||(null===i.min?i.min=n:n<i.min&&(i.min=n),null===i.max?i.max=n:n>i.max&&(i.max=n))})});if(a.beginAtZero){var c=e.sign(i.min),f=e.sign(i.max);0>c&&0>f?i.max=0:c>0&&f>0&&(i.min=0)}void 0!==a.min?i.min=a.min:void 0!==a.suggestedMin&&(i.min=Math.min(i.min,a.suggestedMin)),void 0!==a.max?i.max=a.max:void 0!==a.suggestedMax&&(i.max=Math.max(i.max,a.suggestedMax)),i.min===i.max&&(i.max++,a.beginAtZero||i.min--)},buildTicks:function(){var i,n=this,a=n.options,o=a.ticks,r=e.getValueOrDefault,s=n.isHorizontal(),l=n.ticks=[];if(s)i=Math.min(o.maxTicksLimit?o.maxTicksLimit:11,Math.ceil(n.width/50));else{var h=r(o.fontSize,t.defaults.global.defaultFontSize);i=Math.min(o.maxTicksLimit?o.maxTicksLimit:11,Math.ceil(n.height/(2*h)))}i=Math.max(2,i);var d,u=o.fixedStepSize&&o.fixedStepSize>0||o.stepSize&&o.stepSize>0;if(u)d=r(o.fixedStepSize,o.stepSize);else{var c=e.niceNum(n.max-n.min,!1);d=e.niceNum(c/(i-1),!0)}var f=Math.floor(n.min/d)*d,g=Math.ceil(n.max/d)*d,m=(g-f)/d;m=e.almostEquals(m,Math.round(m),d/1e3)?Math.round(m):Math.ceil(m),l.push(void 0!==o.min?o.min:f);for(var p=1;m>p;++p)l.push(f+p*d);l.push(void 0!==o.max?o.max:g),s||l.reverse(),n.max=e.max(l),n.min=e.min(l),o.reverse?(l.reverse(),n.start=n.max,n.end=n.min):(n.start=n.min,n.end=n.max)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)},getPixelForValue:function(t,e,i,n){var a,o,r=this,s=r.paddingLeft,l=r.paddingBottom,h=r.start,d=+r.getRightValue(t),u=r.end-h;return r.isHorizontal()?(o=r.width-(s+r.paddingRight),a=r.left+o/u*(d-h),Math.round(a+s)):(o=r.height-(r.paddingTop+l),a=r.bottom-l-o/u*(d-h),Math.round(a))},getValueForPixel:function(t){var e=this,i=e.isHorizontal(),n=e.paddingLeft,a=e.paddingBottom,o=i?e.width-(n+e.paddingRight):e.height-(e.paddingTop+a),r=(i?t-e.left-n:e.bottom-a-t)/o;return e.start+(e.end-e.start)*r},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticksAsNumbers[t],null,null,e)}});t.scaleService.registerScaleType("linear",n,i)}},{}],40:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i={position:"left",ticks:{callback:function(t,i,n){var a=t/Math.pow(10,Math.floor(e.log10(t)));return 1===a||2===a||5===a||0===i||i===n.length-1?t.toExponential():""}}},n=t.Scale.extend({determineDataLimits:function(){function t(t){return h?t.xAxisID===i.id:t.yAxisID===i.id}var i=this,n=i.options,a=n.ticks,o=i.chart,r=o.data,s=r.datasets,l=e.getValueOrDefault,h=i.isHorizontal();if(i.min=null,i.max=null,n.stacked){var d={};e.each(s,function(a,r){var s=o.getDatasetMeta(r);o.isDatasetVisible(r)&&t(s)&&(void 0===d[s.type]&&(d[s.type]=[]),e.each(a.data,function(t,e){var a=d[s.type],o=+i.getRightValue(t);isNaN(o)||s.data[e].hidden||(a[e]=a[e]||0,n.relativePoints?a[e]=100:a[e]+=o)}))}),e.each(d,function(t){var n=e.min(t),a=e.max(t);i.min=null===i.min?n:Math.min(i.min,n),i.max=null===i.max?a:Math.max(i.max,a)})}else e.each(s,function(n,a){var r=o.getDatasetMeta(a);o.isDatasetVisible(a)&&t(r)&&e.each(n.data,function(t,e){var n=+i.getRightValue(t);isNaN(n)||r.data[e].hidden||(null===i.min?i.min=n:n<i.min&&(i.min=n),null===i.max?i.max=n:n>i.max&&(i.max=n))})});i.min=l(a.min,i.min),i.max=l(a.max,i.max),i.min===i.max&&(0!==i.min&&null!==i.min?(i.min=Math.pow(10,Math.floor(e.log10(i.min))-1),i.max=Math.pow(10,Math.floor(e.log10(i.max))+1)):(i.min=1,i.max=10))},buildTicks:function(){for(var t=this,i=t.options,n=i.ticks,a=e.getValueOrDefault,o=t.ticks=[],r=a(n.min,Math.pow(10,Math.floor(e.log10(t.min))));r<t.max;){o.push(r);var s=Math.floor(e.log10(r)),l=Math.floor(r/Math.pow(10,s))+1;10===l&&(l=1,++s),r=l*Math.pow(10,s)}var h=a(n.max,r);o.push(h),t.isHorizontal()||o.reverse(),t.max=e.max(o),t.min=e.min(o),n.reverse?(o.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),t.Scale.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t,e){return this.getPixelForValue(this.tickValues[t],null,null,e)},getPixelForValue:function(t,i,n,a){var o,r,s=this,l=s.start,h=+s.getRightValue(t),d=e.log10(s.end)-e.log10(l),u=s.paddingTop,c=s.paddingBottom,f=s.paddingLeft;return s.isHorizontal()?0===h?r=s.left+f:(o=s.width-(f+s.paddingRight),r=s.left+o/d*(e.log10(h)-e.log10(l)),r+=f):0===h?r=s.top+u:(o=s.height-(u+c),r=s.bottom-c-o/d*(e.log10(h)-e.log10(l))),r},getValueForPixel:function(t){var i,n,a=this,o=e.log10(a.end)-e.log10(a.start);return a.isHorizontal()?(n=a.width-(a.paddingLeft+a.paddingRight),i=a.start*Math.pow(10,(t-a.left-a.paddingLeft)*o/n)):(n=a.height-(a.paddingTop+a.paddingBottom),i=Math.pow(10,(a.bottom-a.paddingBottom-t)*o/n)/a.start),i}});t.scaleService.registerScaleType("logarithmic",n,i)}},{}],41:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i=t.defaults.global,n={display:!0,animate:!0,lineArc:!1,position:"chartArea",angleLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2},pointLabels:{fontSize:10,callback:function(t){return t}}},a=t.Scale.extend({getValueCount:function(){return this.chart.data.labels.length},setDimensions:function(){var t=this.options;this.width=this.maxWidth,this.height=this.maxHeight,this.xCenter=Math.round(this.width/2),this.yCenter=Math.round(this.height/2);var n=e.min([this.height,this.width]),a=e.getValueOrDefault(t.ticks.fontSize,i.defaultFontSize);this.drawingArea=t.display?n/2-(a/2+t.ticks.backdropPaddingY):n/2},determineDataLimits:function(){if(this.min=null,this.max=null,e.each(this.chart.data.datasets,function(t,i){if(this.chart.isDatasetVisible(i)){var n=this.chart.getDatasetMeta(i);e.each(t.data,function(t,e){var i=+this.getRightValue(t);isNaN(i)||n.data[e].hidden||(null===this.min?this.min=i:i<this.min&&(this.min=i),null===this.max?this.max=i:i>this.max&&(this.max=i))},this)}},this),this.options.ticks.beginAtZero){var t=e.sign(this.min),i=e.sign(this.max);0>t&&0>i?this.max=0:t>0&&i>0&&(this.min=0)}void 0!==this.options.ticks.min?this.min=this.options.ticks.min:void 0!==this.options.ticks.suggestedMin&&(this.min=Math.min(this.min,this.options.ticks.suggestedMin)),void 0!==this.options.ticks.max?this.max=this.options.ticks.max:void 0!==this.options.ticks.suggestedMax&&(this.max=Math.max(this.max,this.options.ticks.suggestedMax)),this.min===this.max&&(this.min--,this.max++)},buildTicks:function(){this.ticks=[];var t=e.getValueOrDefault(this.options.ticks.fontSize,i.defaultFontSize),n=Math.min(this.options.ticks.maxTicksLimit?this.options.ticks.maxTicksLimit:11,Math.ceil(this.drawingArea/(1.5*t)));n=Math.max(2,n);var a=e.niceNum(this.max-this.min,!1),o=e.niceNum(a/(n-1),!0),r=Math.floor(this.min/o)*o,s=Math.ceil(this.max/o)*o,l=Math.ceil((s-r)/o);this.ticks.push(void 0!==this.options.ticks.min?this.options.ticks.min:r);for(var h=1;l>h;++h)this.ticks.push(r+h*o);this.ticks.push(void 0!==this.options.ticks.max?this.options.ticks.max:s),this.max=e.max(this.ticks),this.min=e.min(this.ticks),this.options.ticks.reverse?(this.ticks.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),this.zeroLineIndex=this.ticks.indexOf(0)},convertTicksToLabels:function(){t.Scale.prototype.convertTicksToLabels.call(this),this.pointLabels=this.chart.data.labels.map(this.options.pointLabels.callback,this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t,n,a,o,r,s,l,h,d,u,c,f,g=this.options.pointLabels,m=e.getValueOrDefault(g.fontSize,i.defaultFontSize),p=e.getValueOrDefault(g.fontStyle,i.defaultFontStyle),b=e.getValueOrDefault(g.fontFamily,i.defaultFontFamily),v=e.fontString(m,p,b),y=e.min([this.height/2-m-5,this.width/2]),x=this.width,k=0;for(this.ctx.font=v,n=0;n<this.getValueCount();n++)t=this.getPointPosition(n,y),a=this.ctx.measureText(this.pointLabels[n]?this.pointLabels[n]:"").width+5,0===n||n===this.getValueCount()/2?(o=a/2,t.x+o>x&&(x=t.x+o,r=n),t.x-o<k&&(k=t.x-o,l=n)):n<this.getValueCount()/2?t.x+a>x&&(x=t.x+a,r=n):n>this.getValueCount()/2&&t.x-a<k&&(k=t.x-a,l=n);d=k,u=Math.ceil(x-this.width),s=this.getIndexAngle(r),h=this.getIndexAngle(l),c=u/Math.sin(s+Math.PI/2),f=d/Math.sin(h+Math.PI/2),c=e.isNumber(c)?c:0,f=e.isNumber(f)?f:0,this.drawingArea=Math.round(y-(f+c)/2),this.setCenterPoint(f,c)},setCenterPoint:function(t,e){var i=this.width-e-this.drawingArea,n=t+this.drawingArea;this.xCenter=Math.round((n+i)/2+this.left),this.yCenter=Math.round(this.height/2+this.top)},getIndexAngle:function(t){var e=2*Math.PI/this.getValueCount();return t*e-Math.PI/2},getDistanceFromCenterForValue:function(t){if(null===t)return 0;var e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e},getPointPosition:function(t,e){var i=this.getIndexAngle(t);return{x:Math.round(Math.cos(i)*e)+this.xCenter,y:Math.round(Math.sin(i)*e)+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this,e=t.min,i=t.max;return t.getPointPositionForValue(0,t.beginAtZero?0:0>e&&0>i?i:e>0&&i>0?e:0)},draw:function(){if(this.options.display){var t=this.ctx;if(e.each(this.ticks,function(n,a){if(a>0||this.options.reverse){var o=this.getDistanceFromCenterForValue(this.ticks[a]),r=this.yCenter-o;if(this.options.gridLines.display)if(t.strokeStyle=this.options.gridLines.color,t.lineWidth=this.options.gridLines.lineWidth,this.options.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,o,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var s=0;s<this.getValueCount();s++){var l=this.getPointPosition(s,this.getDistanceFromCenterForValue(this.ticks[a]));0===s?t.moveTo(l.x,l.y):t.lineTo(l.x,l.y)}t.closePath(),t.stroke()}if(this.options.ticks.display){var h=e.getValueOrDefault(this.options.ticks.fontColor,i.defaultFontColor),d=e.getValueOrDefault(this.options.ticks.fontSize,i.defaultFontSize),u=e.getValueOrDefault(this.options.ticks.fontStyle,i.defaultFontStyle),c=e.getValueOrDefault(this.options.ticks.fontFamily,i.defaultFontFamily),f=e.fontString(d,u,c);if(t.font=f,this.options.ticks.showLabelBackdrop){var g=t.measureText(n).width;t.fillStyle=this.options.ticks.backdropColor,t.fillRect(this.xCenter-g/2-this.options.ticks.backdropPaddingX,r-d/2-this.options.ticks.backdropPaddingY,g+2*this.options.ticks.backdropPaddingX,d+2*this.options.ticks.backdropPaddingY)}t.textAlign="center",t.textBaseline="middle",t.fillStyle=h,t.fillText(n,this.xCenter,r)}}},this),!this.options.lineArc){t.lineWidth=this.options.angleLines.lineWidth,t.strokeStyle=this.options.angleLines.color;for(var n=this.getValueCount()-1;n>=0;n--){if(this.options.angleLines.display){var a=this.getPointPosition(n,this.getDistanceFromCenterForValue(this.options.reverse?this.min:this.max));t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(a.x,a.y),t.stroke(),t.closePath()}var o=this.getPointPosition(n,this.getDistanceFromCenterForValue(this.options.reverse?this.min:this.max)+5),r=e.getValueOrDefault(this.options.pointLabels.fontColor,i.defaultFontColor),s=e.getValueOrDefault(this.options.pointLabels.fontSize,i.defaultFontSize),l=e.getValueOrDefault(this.options.pointLabels.fontStyle,i.defaultFontStyle),h=e.getValueOrDefault(this.options.pointLabels.fontFamily,i.defaultFontFamily),d=e.fontString(s,l,h);t.font=d,t.fillStyle=r;var u=this.pointLabels.length,c=this.pointLabels.length/2,f=c/2,g=f>n||n>u-f,m=n===f||n===u-f;0===n?t.textAlign="center":n===c?t.textAlign="center":c>n?t.textAlign="left":t.textAlign="right",m?t.textBaseline="middle":g?t.textBaseline="bottom":t.textBaseline="top",t.fillText(this.pointLabels[n]?this.pointLabels[n]:"",o.x,o.y)}}}}});t.scaleService.registerScaleType("radialLinear",a,n)}},{}],42:[function(t,e,i){"use strict";var n=t("moment");n="function"==typeof n?n:window.moment,e.exports=function(t){var e=t.helpers,i={units:[{name:"millisecond",steps:[1,2,5,10,20,50,100,250,500]},{name:"second",steps:[1,2,5,10,30]},{name:"minute",steps:[1,2,5,10,30]},{name:"hour",steps:[1,2,3,6,12]},{name:"day",steps:[1,2,5]},{name:"week",maxStep:4},{name:"month",maxStep:3},{name:"quarter",maxStep:4},{name:"year",maxStep:!1}]},a={position:"bottom",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,displayFormats:{millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm:ss a",hour:"MMM D, hA",day:"ll",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"}},ticks:{autoSkip:!1}},o=t.Scale.extend({initialize:function(){if(!n)throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com");t.Scale.prototype.initialize.call(this)},getLabelMoment:function(t,e){return this.labelMoments[t][e]},getMomentStartOf:function(t){return"week"===this.options.time.unit&&this.options.time.isoWeekday!==!1?t.clone().startOf("isoWeek").isoWeekday(this.options.time.isoWeekday):t.clone().startOf(this.tickUnit)},determineDataLimits:function(){this.labelMoments=[];var t=[];this.chart.data.labels&&this.chart.data.labels.length>0?(e.each(this.chart.data.labels,function(e,i){var n=this.parseTime(e);n.isValid()&&(this.options.time.round&&n.startOf(this.options.time.round),t.push(n))},this),this.firstTick=n.min.call(this,t),this.lastTick=n.max.call(this,t)):(this.firstTick=null,this.lastTick=null),e.each(this.chart.data.datasets,function(i,a){var o=[],r=this.chart.isDatasetVisible(a);"object"==typeof i.data[0]&&null!==i.data[0]?e.each(i.data,function(t,e){var i=this.parseTime(this.getRightValue(t));i.isValid()&&(this.options.time.round&&i.startOf(this.options.time.round),o.push(i),r&&(this.firstTick=null!==this.firstTick?n.min(this.firstTick,i):i,this.lastTick=null!==this.lastTick?n.max(this.lastTick,i):i))},this):o=t,this.labelMoments.push(o)},this),this.options.time.min&&(this.firstTick=this.parseTime(this.options.time.min)),this.options.time.max&&(this.lastTick=this.parseTime(this.options.time.max)),this.firstTick=(this.firstTick||n()).clone(),this.lastTick=(this.lastTick||n()).clone()},buildTicks:function(n){this.ctx.save();var a=e.getValueOrDefault(this.options.ticks.fontSize,t.defaults.global.defaultFontSize),o=e.getValueOrDefault(this.options.ticks.fontStyle,t.defaults.global.defaultFontStyle),r=e.getValueOrDefault(this.options.ticks.fontFamily,t.defaults.global.defaultFontFamily),s=e.fontString(a,o,r);if(this.ctx.font=s,this.ticks=[],this.unitScale=1,this.scaleSizeInUnits=0,this.options.time.unit)this.tickUnit=this.options.time.unit||"day",this.displayFormat=this.options.time.displayFormats[this.tickUnit],this.scaleSizeInUnits=this.lastTick.diff(this.firstTick,this.tickUnit,!0),this.unitScale=e.getValueOrDefault(this.options.time.unitStepSize,1);else{var l=this.isHorizontal()?this.width-(this.paddingLeft+this.paddingRight):this.height-(this.paddingTop+this.paddingBottom),h=this.tickFormatFunction(this.firstTick,0,[]),d=this.ctx.measureText(h).width,u=Math.cos(e.toRadians(this.options.ticks.maxRotation)),c=Math.sin(e.toRadians(this.options.ticks.maxRotation));d=d*u+a*c;var f=l/d;this.tickUnit="millisecond",this.scaleSizeInUnits=this.lastTick.diff(this.firstTick,this.tickUnit,!0),this.displayFormat=this.options.time.displayFormats[this.tickUnit];for(var g=0,m=i.units[g];g<i.units.length;){if(this.unitScale=1,e.isArray(m.steps)&&Math.ceil(this.scaleSizeInUnits/f)<e.max(m.steps)){for(var p=0;p<m.steps.length;++p)if(m.steps[p]>=Math.ceil(this.scaleSizeInUnits/f)){this.unitScale=e.getValueOrDefault(this.options.time.unitStepSize,m.steps[p]);break}break}if(m.maxStep===!1||Math.ceil(this.scaleSizeInUnits/f)<m.maxStep){this.unitScale=e.getValueOrDefault(this.options.time.unitStepSize,Math.ceil(this.scaleSizeInUnits/f));break}++g,m=i.units[g],this.tickUnit=m.name;var b=this.firstTick.diff(this.getMomentStartOf(this.firstTick),this.tickUnit,!0),v=this.getMomentStartOf(this.lastTick.clone().add(1,this.tickUnit)).diff(this.lastTick,this.tickUnit,!0);this.scaleSizeInUnits=this.lastTick.diff(this.firstTick,this.tickUnit,!0)+b+v,this.displayFormat=this.options.time.displayFormats[m.name]}}var y;if(this.options.time.min?y=this.getMomentStartOf(this.firstTick):(this.firstTick=this.getMomentStartOf(this.firstTick),y=this.firstTick),!this.options.time.max){var x=this.getMomentStartOf(this.lastTick);0!==x.diff(this.lastTick,this.tickUnit,!0)&&(this.lastTick=this.getMomentStartOf(this.lastTick.add(1,this.tickUnit)))}this.smallestLabelSeparation=this.width,e.each(this.chart.data.datasets,function(t,e){for(var i=1;i<this.labelMoments[e].length;i++)this.smallestLabelSeparation=Math.min(this.smallestLabelSeparation,this.labelMoments[e][i].diff(this.labelMoments[e][i-1],this.tickUnit,!0))},this),this.options.time.displayFormat&&(this.displayFormat=this.options.time.displayFormat),this.ticks.push(this.firstTick.clone());for(var k=1;k<=this.scaleSizeInUnits;++k){var _=y.clone().add(k,this.tickUnit);if(this.options.time.max&&_.diff(this.lastTick,this.tickUnit,!0)>=0)break;k%this.unitScale===0&&this.ticks.push(_)}var S=this.ticks[this.ticks.length-1].diff(this.lastTick,this.tickUnit);(0!==S||0===this.scaleSizeInUnits)&&(this.options.time.max?(this.ticks.push(this.lastTick.clone()),this.scaleSizeInUnits=this.lastTick.diff(this.ticks[0],this.tickUnit,!0)):(this.ticks.push(this.lastTick.clone()),this.scaleSizeInUnits=this.lastTick.diff(this.firstTick,this.tickUnit,!0))),this.ctx.restore()},getLabelForIndex:function(t,e){var i=this.chart.data.labels&&t<this.chart.data.labels.length?this.chart.data.labels[t]:"";return"object"==typeof this.chart.data.datasets[e].data[0]&&(i=this.getRightValue(this.chart.data.datasets[e].data[t])),this.options.time.tooltipFormat&&(i=this.parseTime(i).format(this.options.time.tooltipFormat)),i},tickFormatFunction:function(t,i,n){var a=t.format(this.displayFormat),o=this.options.ticks,r=e.getValueOrDefault(o.callback,o.userCallback);return r?r(a,i,n):a},convertTicksToLabels:function(){this.tickMoments=this.ticks,this.ticks=this.ticks.map(this.tickFormatFunction,this)},getPixelForValue:function(t,e,i,n){var a=t&&t.isValid&&t.isValid()?t:this.getLabelMoment(i,e);if(a){var o=a.diff(this.firstTick,this.tickUnit,!0),r=o/this.scaleSizeInUnits;if(this.isHorizontal()){var s=this.width-(this.paddingLeft+this.paddingRight),l=(s/Math.max(this.ticks.length-1,1),
-s*r+this.paddingLeft);return this.left+Math.round(l)}var h=this.height-(this.paddingTop+this.paddingBottom),d=(h/Math.max(this.ticks.length-1,1),h*r+this.paddingTop);return this.top+Math.round(d)}},getPixelForTick:function(t,e){return this.getPixelForValue(this.tickMoments[t],null,null,e)},getValueForPixel:function(t){var e=this.isHorizontal()?this.width-(this.paddingLeft+this.paddingRight):this.height-(this.paddingTop+this.paddingBottom),i=(t-(this.isHorizontal()?this.left+this.paddingLeft:this.top+this.paddingTop))/e;return i*=this.scaleSizeInUnits,this.firstTick.clone().add(n.duration(i,this.tickUnit).asSeconds(),"seconds")},parseTime:function(t){return"string"==typeof this.options.time.parser?n(t,this.options.time.parser):"function"==typeof this.options.time.parser?this.options.time.parser(t):"function"==typeof t.getMonth||"number"==typeof t?n(t):t.isValid&&t.isValid()?t:"string"!=typeof this.options.time.format&&this.options.time.format.call?(console.warn("options.time.format is deprecated and replaced by options.time.parser. See http://nnnick.github.io/Chart.js/docs-v2/#scales-time-scale"),this.options.time.format(t)):n(t,this.options.time.format)}});t.scaleService.registerScaleType("time",o,a)}},{moment:6}]},{},[7]);
\ No newline at end of file
+!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Chart=t()}}(function(){var t;return function e(t,n,i){function a(o,s){if(!n[o]){if(!t[o]){var l="function"==typeof require&&require;if(!s&&l)return l(o,!0);if(r)return r(o,!0);var d=new Error("Cannot find module '"+o+"'");throw d.code="MODULE_NOT_FOUND",d}var u=n[o]={exports:{}};t[o][0].call(u.exports,function(e){var n=t[o][1][e];return a(n?n:e)},u,u.exports,e,t,n,i)}return n[o].exports}for(var r="function"==typeof require&&require,o=0;o<i.length;o++)a(i[o]);return a}({1:[function(t,e,n){function i(t){if(t){var e=/^#([a-fA-F0-9]{3})$/,n=/^#([a-fA-F0-9]{6})$/,i=/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,a=/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,r=/(\w+)/,o=[0,0,0],s=1,l=t.match(e);if(l){l=l[1];for(var d=0;d<o.length;d++)o[d]=parseInt(l[d]+l[d],16)}else if(l=t.match(n)){l=l[1];for(var d=0;d<o.length;d++)o[d]=parseInt(l.slice(2*d,2*d+2),16)}else if(l=t.match(i)){for(var d=0;d<o.length;d++)o[d]=parseInt(l[d+1]);s=parseFloat(l[4])}else if(l=t.match(a)){for(var d=0;d<o.length;d++)o[d]=Math.round(2.55*parseFloat(l[d+1]));s=parseFloat(l[4])}else if(l=t.match(r)){if("transparent"==l[1])return[0,0,0,0];if(o=x[l[1]],!o)return}for(var d=0;d<o.length;d++)o[d]=b(o[d],0,255);return s=s||0==s?b(s,0,1):1,o[3]=s,o}}function a(t){if(t){var e=/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/,n=t.match(e);if(n){var i=parseFloat(n[4]),a=b(parseInt(n[1]),0,360),r=b(parseFloat(n[2]),0,100),o=b(parseFloat(n[3]),0,100),s=b(isNaN(i)?1:i,0,1);return[a,r,o,s]}}}function r(t){if(t){var e=/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/,n=t.match(e);if(n){var i=parseFloat(n[4]),a=b(parseInt(n[1]),0,360),r=b(parseFloat(n[2]),0,100),o=b(parseFloat(n[3]),0,100),s=b(isNaN(i)?1:i,0,1);return[a,r,o,s]}}}function o(t){var e=i(t);return e&&e.slice(0,3)}function s(t){var e=a(t);return e&&e.slice(0,3)}function l(t){var e=i(t);return e?e[3]:(e=a(t))?e[3]:(e=r(t))?e[3]:void 0}function d(t){return"#"+y(t[0])+y(t[1])+y(t[2])}function u(t,e){return 1>e||t[3]&&t[3]<1?c(t,e):"rgb("+t[0]+", "+t[1]+", "+t[2]+")"}function c(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function h(t,e){if(1>e||t[3]&&t[3]<1)return f(t,e);var n=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+n+"%, "+i+"%, "+a+"%)"}function f(t,e){var n=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgba("+n+"%, "+i+"%, "+a+"%, "+(e||t[3]||1)+")"}function g(t,e){return 1>e||t[3]&&t[3]<1?p(t,e):"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"}function p(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function m(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"}function v(t){return k[t.slice(0,3)]}function b(t,e,n){return Math.min(Math.max(e,t),n)}function y(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var x=t(5);e.exports={getRgba:i,getHsla:a,getRgb:o,getHsl:s,getHwb:r,getAlpha:l,hexString:d,rgbString:u,rgbaString:c,percentString:h,percentaString:f,hslString:g,hslaString:p,hwbString:m,keyword:v};var k={};for(var _ in x)k[x[_]]=_},{5:5}],2:[function(t,e,n){var i=t(4),a=t(1),r=function(t){if(t instanceof r)return t;if(!(this instanceof r))return new r(t);this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1};var e;if("string"==typeof t)if(e=a.getRgba(t))this.setValues("rgb",e);else if(e=a.getHsla(t))this.setValues("hsl",e);else{if(!(e=a.getHwb(t)))throw new Error('Unable to parse color from string "'+t+'"');this.setValues("hwb",e)}else if("object"==typeof t)if(e=t,void 0!==e.r||void 0!==e.red)this.setValues("rgb",e);else if(void 0!==e.l||void 0!==e.lightness)this.setValues("hsl",e);else if(void 0!==e.v||void 0!==e.value)this.setValues("hsv",e);else if(void 0!==e.w||void 0!==e.whiteness)this.setValues("hwb",e);else{if(void 0===e.c&&void 0===e.cyan)throw new Error("Unable to parse color from object "+JSON.stringify(t));this.setValues("cmyk",e)}};r.prototype={rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t%=360,t=0>t?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return a.hexString(this.values.rgb)},rgbString:function(){return a.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return a.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return a.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return a.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return a.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return a.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return a.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],n=0;n<t.length;n++){var i=t[n]/255;e[n]=.03928>=i?i/12.92:Math.pow((i+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),n=t.luminosity();return e>n?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb,e=(299*t[0]+587*t[1]+114*t[2])/1e3;return 128>e},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;3>e;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=0>n?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=this,i=t,a=void 0===e?.5:e,r=2*a-1,o=n.alpha()-i.alpha(),s=((r*o===-1?r:(r+o)/(1+r*o))+1)/2,l=1-s;return this.rgb(s*n.red()+l*i.red(),s*n.green()+l*i.green(),s*n.blue()+l*i.blue()).alpha(n.alpha()*a+i.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new r,i=this.values,a=n.values;for(var o in i)i.hasOwnProperty(o)&&(t=i[o],e={}.toString.call(t),"[object Array]"===e?a[o]=t.slice(0):"[object Number]"===e?a[o]=t:console.error("unexpected color value:",t));return n}},r.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},r.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},r.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i<t.length;i++)n[t.charAt(i)]=e[t][i];return 1!==e.alpha&&(n.a=e.alpha),n},r.prototype.setValues=function(t,e){var n,a=this.values,r=this.spaces,o=this.maxes,s=1;if("alpha"===t)s=e;else if(e.length)a[t]=e.slice(0,t.length),s=e[t.length];else if(void 0!==e[t.charAt(0)]){for(n=0;n<t.length;n++)a[t][n]=e[t.charAt(n)];s=e.a}else if(void 0!==e[r[t][0]]){var l=r[t];for(n=0;n<t.length;n++)a[t][n]=e[l[n]];s=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===s?a.alpha:s)),"alpha"===t)return!1;var d;for(n=0;n<t.length;n++)d=Math.max(0,Math.min(o[t][n],a[t][n])),a[t][n]=Math.round(d);for(var u in r)u!==t&&(a[u]=i[t][u](a[t]));return!0},r.prototype.setSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):("number"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n),this)},r.prototype.setChannel=function(t,e,n){var i=this.values[t];return void 0===n?i[e]:n===i[e]?this:(i[e]=n,this.setValues(t,i),this)},"undefined"!=typeof window&&(window.Color=r),e.exports=r},{1:1,4:4}],3:[function(t,e,n){function i(t){var e,n,i,a=t[0]/255,r=t[1]/255,o=t[2]/255,s=Math.min(a,r,o),l=Math.max(a,r,o),d=l-s;return l==s?e=0:a==l?e=(r-o)/d:r==l?e=2+(o-a)/d:o==l&&(e=4+(a-r)/d),e=Math.min(60*e,360),0>e&&(e+=360),i=(s+l)/2,n=l==s?0:.5>=i?d/(l+s):d/(2-l-s),[e,100*n,100*i]}function a(t){var e,n,i,a=t[0],r=t[1],o=t[2],s=Math.min(a,r,o),l=Math.max(a,r,o),d=l-s;return n=0==l?0:d/l*1e3/10,l==s?e=0:a==l?e=(r-o)/d:r==l?e=2+(o-a)/d:o==l&&(e=4+(a-r)/d),e=Math.min(60*e,360),0>e&&(e+=360),i=l/255*1e3/10,[e,n,i]}function o(t){var e=t[0],n=t[1],a=t[2],r=i(t)[0],o=1/255*Math.min(e,Math.min(n,a)),a=1-1/255*Math.max(e,Math.max(n,a));return[r,100*o,100*a]}function s(t){var e,n,i,a,r=t[0]/255,o=t[1]/255,s=t[2]/255;return a=Math.min(1-r,1-o,1-s),e=(1-r-a)/(1-a)||0,n=(1-o-a)/(1-a)||0,i=(1-s-a)/(1-a)||0,[100*e,100*n,100*i,100*a]}function l(t){return Q[JSON.stringify(t)]}function d(t){var e=t[0]/255,n=t[1]/255,i=t[2]/255;e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92,n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92,i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92;var a=.4124*e+.3576*n+.1805*i,r=.2126*e+.7152*n+.0722*i,o=.0193*e+.1192*n+.9505*i;return[100*a,100*r,100*o]}function u(t){var e,n,i,a=d(t),r=a[0],o=a[1],s=a[2];return r/=95.047,o/=100,s/=108.883,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,s=s>.008856?Math.pow(s,1/3):7.787*s+16/116,e=116*o-16,n=500*(r-o),i=200*(o-s),[e,n,i]}function c(t){return Y(u(t))}function h(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return r=255*l,[r,r,r];n=.5>l?l*(1+s):l+s-l*s,e=2*l-n,a=[0,0,0];for(var d=0;3>d;d++)i=o+1/3*-(d-1),0>i&&i++,i>1&&i--,r=1>6*i?e+6*(n-e)*i:1>2*i?n:2>3*i?e+(n-e)*(2/3-i)*6:e,a[d]=255*r;return a}function f(t){var e,n,i=t[0],a=t[1]/100,r=t[2]/100;return 0===r?[0,0,0]:(r*=2,a*=1>=r?r:2-r,n=(r+a)/2,e=2*a/(r+a),[i,100*e,100*n])}function p(t){return o(h(t))}function m(t){return s(h(t))}function v(t){return l(h(t))}function y(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r)),i=255*i;switch(a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}}function x(t){var e,n,i=t[0],a=t[1]/100,r=t[2]/100;return n=(2-a)*r,e=a*r,e/=1>=n?n:2-n,e=e||0,n/=2,[i,100*e,100*n]}function k(t){return o(y(t))}function _(t){return s(y(t))}function w(t){return l(y(t))}function S(t){var e,n,i,a,o=t[0]/360,s=t[1]/100,l=t[2]/100,d=s+l;switch(d>1&&(s/=d,l/=d),e=Math.floor(6*o),n=1-l,i=6*o-e,0!=(1&e)&&(i=1-i),a=s+i*(n-s),e){default:case 6:case 0:r=n,g=a,b=s;break;case 1:r=a,g=n,b=s;break;case 2:r=s,g=n,b=a;break;case 3:r=s,g=a,b=n;break;case 4:r=a,g=s,b=n;break;case 5:r=n,g=s,b=a}return[255*r,255*g,255*b]}function M(t){return i(S(t))}function D(t){return a(S(t))}function C(t){return s(S(t))}function T(t){return l(S(t))}function P(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100,s=t[3]/100;return e=1-Math.min(1,a*(1-s)+s),n=1-Math.min(1,r*(1-s)+s),i=1-Math.min(1,o*(1-s)+s),[255*e,255*n,255*i]}function F(t){return i(P(t))}function A(t){return a(P(t))}function I(t){return o(P(t))}function O(t){return l(P(t))}function R(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return e=3.2406*a+-1.5372*r+o*-.4986,n=a*-.9689+1.8758*r+.0415*o,i=.0557*a+r*-.204+1.057*o,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e=12.92*e,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n=12.92*n,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i=12.92*i,e=Math.min(Math.max(0,e),1),n=Math.min(Math.max(0,n),1),i=Math.min(Math.max(0,i),1),[255*e,255*n,255*i]}function W(t){var e,n,i,a=t[0],r=t[1],o=t[2];return a/=95.047,r/=100,o/=108.883,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,e=116*r-16,n=500*(a-r),i=200*(r-o),[e,n,i]}function V(t){return Y(W(t))}function L(t){var e,n,i,a,r=t[0],o=t[1],s=t[2];return 8>=r?(n=100*r/903.3,a=7.787*(n/100)+16/116):(n=100*Math.pow((r+16)/116,3),a=Math.pow(n/100,1/3)),e=.008856>=e/95.047?e=95.047*(o/500+a-16/116)/7.787:95.047*Math.pow(o/500+a,3),i=.008859>=i/108.883?i=108.883*(a-s/200-16/116)/7.787:108.883*Math.pow(a-s/200,3),[e,n,i]}function Y(t){var e,n,i,a=t[0],r=t[1],o=t[2];return e=Math.atan2(o,r),n=360*e/2/Math.PI,0>n&&(n+=360),i=Math.sqrt(r*r+o*o),[a,i,n]}function B(t){return R(L(t))}function z(t){var e,n,i,a=t[0],r=t[1],o=t[2];return i=o/360*2*Math.PI,e=r*Math.cos(i),n=r*Math.sin(i),[a,e,n]}function H(t){return L(z(t))}function N(t){return B(z(t))}function E(t){return X[t]}function U(t){return i(E(t))}function j(t){return a(E(t))}function G(t){return o(E(t))}function q(t){return s(E(t))}function Z(t){return u(E(t))}function J(t){return d(E(t))}e.exports={rgb2hsl:i,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:s,rgb2keyword:l,rgb2xyz:d,rgb2lab:u,rgb2lch:c,hsl2rgb:h,hsl2hsv:f,hsl2hwb:p,hsl2cmyk:m,hsl2keyword:v,hsv2rgb:y,hsv2hsl:x,hsv2hwb:k,hsv2cmyk:_,hsv2keyword:w,hwb2rgb:S,hwb2hsl:M,hwb2hsv:D,hwb2cmyk:C,hwb2keyword:T,cmyk2rgb:P,cmyk2hsl:F,cmyk2hsv:A,cmyk2hwb:I,cmyk2keyword:O,keyword2rgb:E,keyword2hsl:U,keyword2hsv:j,keyword2hwb:G,keyword2cmyk:q,keyword2lab:Z,keyword2xyz:J,xyz2rgb:R,xyz2lab:W,xyz2lch:V,lab2xyz:L,lab2rgb:B,lab2lch:Y,lch2lab:z,lch2xyz:H,lch2rgb:N};var X={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Q={};for(var $ in X)Q[JSON.stringify(X[$])]=$},{}],4:[function(t,e,n){var i=t(3),a=function(){return new d};for(var r in i){a[r+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(r);var o=/(\w+)2(\w+)/.exec(r),s=o[1],l=o[2];a[s]=a[s]||{},a[s][l]=a[r]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var n=i[t](e);if("string"==typeof n||void 0===n)return n;for(var a=0;a<n.length;a++)n[a]=Math.round(n[a]);return n}}(r)}var d=function(){this.convs={}};d.prototype.routeSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):("number"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n))},d.prototype.setValues=function(t,e){return this.space=t,this.convs={},this.convs[t]=e,this},d.prototype.getValues=function(t){var e=this.convs[t];if(!e){var n=this.space,i=this.convs[n];e=a[n][t](i),this.convs[t]=e}return e},["rgb","hsl","hsv","cmyk","keyword"].forEach(function(t){d.prototype[t]=function(e){return this.routeSpace(t,arguments)}}),e.exports=a},{3:3}],5:[function(t,e,n){e.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},{}],6:[function(e,n,i){!function(e,a){"object"==typeof i&&"undefined"!=typeof n?n.exports=a():"function"==typeof t&&t.amd?t(a):e.moment=a()}(this,function(){"use strict";function t(){return li.apply(null,arguments)}function i(t){li=t}function a(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function r(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function o(t,e){var n,i=[];for(n=0;n<t.length;++n)i.push(e(t[n],n));return i}function s(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function l(t,e){for(var n in e)s(e,n)&&(t[n]=e[n]);return s(e,"toString")&&(t.toString=e.toString),s(e,"valueOf")&&(t.valueOf=e.valueOf),t}function d(t,e,n,i){return Lt(t,e,n,i,!0).utc()}function u(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null}}function c(t){return null==t._pf&&(t._pf=u()),t._pf}function h(t){if(null==t._isValid){var e=c(t),n=di.call(e.parsedDateParts,function(t){return null!=t});t._isValid=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&n),t._strict&&(t._isValid=t._isValid&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour)}return t._isValid}function f(t){var e=d(NaN);return null!=t?l(c(e),t):c(e).userInvalidated=!0,e}function g(t){return void 0===t}function p(t,e){var n,i,a;if(g(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),g(e._i)||(t._i=e._i),g(e._f)||(t._f=e._f),g(e._l)||(t._l=e._l),g(e._strict)||(t._strict=e._strict),g(e._tzm)||(t._tzm=e._tzm),g(e._isUTC)||(t._isUTC=e._isUTC),g(e._offset)||(t._offset=e._offset),g(e._pf)||(t._pf=c(e)),g(e._locale)||(t._locale=e._locale),ui.length>0)for(n in ui)i=ui[n],a=e[i],g(a)||(t[i]=a);return t}function m(e){p(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),ci===!1&&(ci=!0,t.updateOffset(this),ci=!1)}function v(t){return t instanceof m||null!=t&&null!=t._isAMomentObject}function b(t){return 0>t?Math.ceil(t):Math.floor(t)}function y(t){var e=+t,n=0;return 0!==e&&isFinite(e)&&(n=b(e)),n}function x(t,e,n){var i,a=Math.min(t.length,e.length),r=Math.abs(t.length-e.length),o=0;for(i=0;a>i;i++)(n&&t[i]!==e[i]||!n&&y(t[i])!==y(e[i]))&&o++;return o+r}function k(e){t.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function _(e,n){var i=!0;return l(function(){return null!=t.deprecationHandler&&t.deprecationHandler(null,e),i&&(k(e+"\nArguments: "+Array.prototype.slice.call(arguments).join(", ")+"\n"+(new Error).stack),i=!1),n.apply(this,arguments)},n)}function w(e,n){null!=t.deprecationHandler&&t.deprecationHandler(e,n),hi[e]||(k(n),hi[e]=!0)}function S(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function M(t){return"[object Object]"===Object.prototype.toString.call(t)}function D(t){var e,n;for(n in t)e=t[n],S(e)?this[n]=e:this["_"+n]=e;this._config=t,this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function C(t,e){var n,i=l({},t);for(n in e)s(e,n)&&(M(t[n])&&M(e[n])?(i[n]={},l(i[n],t[n]),l(i[n],e[n])):null!=e[n]?i[n]=e[n]:delete i[n]);return i}function T(t){null!=t&&this.set(t)}function P(t){return t?t.toLowerCase().replace("_","-"):t}function F(t){for(var e,n,i,a,r=0;r<t.length;){for(a=P(t[r]).split("-"),e=a.length,n=P(t[r+1]),n=n?n.split("-"):null;e>0;){if(i=A(a.slice(0,e).join("-")))return i;if(n&&n.length>=e&&x(a,n,!0)>=e-1)break;e--}r++}return null}function A(t){var i=null;if(!mi[t]&&"undefined"!=typeof n&&n&&n.exports)try{i=gi._abbr,e("./locale/"+t),I(i)}catch(a){}return mi[t]}function I(t,e){var n;return t&&(n=g(e)?W(t):O(t,e),n&&(gi=n)),gi._abbr}function O(t,e){return null!==e?(e.abbr=t,null!=mi[t]?(w("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale"),e=C(mi[t]._config,e)):null!=e.parentLocale&&(null!=mi[e.parentLocale]?e=C(mi[e.parentLocale]._config,e):w("parentLocaleUndefined","specified parentLocale is not defined yet")),mi[t]=new T(e),I(t),mi[t]):(delete mi[t],null)}function R(t,e){if(null!=e){var n;null!=mi[t]&&(e=C(mi[t]._config,e)),n=new T(e),n.parentLocale=mi[t],mi[t]=n,I(t)}else null!=mi[t]&&(null!=mi[t].parentLocale?mi[t]=mi[t].parentLocale:null!=mi[t]&&delete mi[t]);return mi[t]}function W(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return gi;if(!a(t)){if(e=A(t))return e;t=[t]}return F(t)}function V(){return fi(mi)}function L(t,e){var n=t.toLowerCase();vi[n]=vi[n+"s"]=vi[e]=t}function Y(t){return"string"==typeof t?vi[t]||vi[t.toLowerCase()]:void 0}function B(t){var e,n,i={};for(n in t)s(t,n)&&(e=Y(n),e&&(i[e]=t[n]));return i}function z(e,n){return function(i){return null!=i?(N(this,e,i),t.updateOffset(this,n),this):H(this,e)}}function H(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function N(t,e,n){t.isValid()&&t._d["set"+(t._isUTC?"UTC":"")+e](n)}function E(t,e){var n;if("object"==typeof t)for(n in t)this.set(n,t[n]);else if(t=Y(t),S(this[t]))return this[t](e);return this}function U(t,e,n){var i=""+Math.abs(t),a=e-i.length,r=t>=0;return(r?n?"+":"":"-")+Math.pow(10,Math.max(0,a)).toString().substr(1)+i}function j(t,e,n,i){var a=i;"string"==typeof i&&(a=function(){return this[i]()}),t&&(ki[t]=a),e&&(ki[e[0]]=function(){return U(a.apply(this,arguments),e[1],e[2])}),n&&(ki[n]=function(){return this.localeData().ordinal(a.apply(this,arguments),t)})}function G(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function q(t){var e,n,i=t.match(bi);for(e=0,n=i.length;n>e;e++)ki[i[e]]?i[e]=ki[i[e]]:i[e]=G(i[e]);return function(e){var a,r="";for(a=0;n>a;a++)r+=i[a]instanceof Function?i[a].call(e,t):i[a];return r}}function Z(t,e){return t.isValid()?(e=J(e,t.localeData()),xi[e]=xi[e]||q(e),xi[e](t)):t.localeData().invalidDate()}function J(t,e){function n(t){return e.longDateFormat(t)||t}var i=5;for(yi.lastIndex=0;i>=0&&yi.test(t);)t=t.replace(yi,n),yi.lastIndex=0,i-=1;return t}function X(t,e,n){Bi[t]=S(e)?e:function(t,i){return t&&n?n:e}}function Q(t,e){return s(Bi,t)?Bi[t](e._strict,e._locale):new RegExp($(t))}function $(t){return K(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,i,a){return e||n||i||a}))}function K(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function tt(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),"number"==typeof e&&(i=function(t,n){n[e]=y(t)}),n=0;n<t.length;n++)zi[t[n]]=i}function et(t,e){tt(t,function(t,n,i,a){i._w=i._w||{},e(t,i._w,i,a)})}function nt(t,e,n){null!=e&&s(zi,t)&&zi[t](e,n._a,n,t)}function it(t,e){return new Date(Date.UTC(t,e+1,0)).getUTCDate()}function at(t,e){return a(this._months)?this._months[t.month()]:this._months[Xi.test(e)?"format":"standalone"][t.month()]}function rt(t,e){return a(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[Xi.test(e)?"format":"standalone"][t.month()]}function ot(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],i=0;12>i;++i)r=d([2e3,i]),this._shortMonthsParse[i]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[i]=this.months(r,"").toLocaleLowerCase();return n?"MMM"===e?(a=pi.call(this._shortMonthsParse,o),-1!==a?a:null):(a=pi.call(this._longMonthsParse,o),-1!==a?a:null):"MMM"===e?(a=pi.call(this._shortMonthsParse,o),-1!==a?a:(a=pi.call(this._longMonthsParse,o),-1!==a?a:null)):(a=pi.call(this._longMonthsParse,o),-1!==a?a:(a=pi.call(this._shortMonthsParse,o),-1!==a?a:null))}function st(t,e,n){var i,a,r;if(this._monthsParseExact)return ot.call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;12>i;i++){if(a=d([2e3,i]),n&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(a,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(a,"").replace(".","")+"$","i")),n||this._monthsParse[i]||(r="^"+this.months(a,"")+"|^"+this.monthsShort(a,""),this._monthsParse[i]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[i].test(t))return i;if(n&&"MMM"===e&&this._shortMonthsParse[i].test(t))return i;if(!n&&this._monthsParse[i].test(t))return i}}function lt(t,e){var n;if(!t.isValid())return t;if("string"==typeof e)if(/^\d+$/.test(e))e=y(e);else if(e=t.localeData().monthsParse(e),"number"!=typeof e)return t;return n=Math.min(t.date(),it(t.year(),e)),
+t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,n),t}function dt(e){return null!=e?(lt(this,e),t.updateOffset(this,!0),this):H(this,"Month")}function ut(){return it(this.year(),this.month())}function ct(t){return this._monthsParseExact?(s(this,"_monthsRegex")||ft.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex}function ht(t){return this._monthsParseExact?(s(this,"_monthsRegex")||ft.call(this),t?this._monthsStrictRegex:this._monthsRegex):this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex}function ft(){function t(t,e){return e.length-t.length}var e,n,i=[],a=[],r=[];for(e=0;12>e;e++)n=d([2e3,e]),i.push(this.monthsShort(n,"")),a.push(this.months(n,"")),r.push(this.months(n,"")),r.push(this.monthsShort(n,""));for(i.sort(t),a.sort(t),r.sort(t),e=0;12>e;e++)i[e]=K(i[e]),a[e]=K(a[e]),r[e]=K(r[e]);this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+i.join("|")+")","i")}function gt(t){var e,n=t._a;return n&&-2===c(t).overflow&&(e=n[Ni]<0||n[Ni]>11?Ni:n[Ei]<1||n[Ei]>it(n[Hi],n[Ni])?Ei:n[Ui]<0||n[Ui]>24||24===n[Ui]&&(0!==n[ji]||0!==n[Gi]||0!==n[qi])?Ui:n[ji]<0||n[ji]>59?ji:n[Gi]<0||n[Gi]>59?Gi:n[qi]<0||n[qi]>999?qi:-1,c(t)._overflowDayOfYear&&(Hi>e||e>Ei)&&(e=Ei),c(t)._overflowWeeks&&-1===e&&(e=Zi),c(t)._overflowWeekday&&-1===e&&(e=Ji),c(t).overflow=e),t}function pt(t){var e,n,i,a,r,o,s=t._i,l=ea.exec(s)||na.exec(s);if(l){for(c(t).iso=!0,e=0,n=aa.length;n>e;e++)if(aa[e][1].exec(l[1])){a=aa[e][0],i=aa[e][2]!==!1;break}if(null==a)return void(t._isValid=!1);if(l[3]){for(e=0,n=ra.length;n>e;e++)if(ra[e][1].exec(l[3])){r=(l[2]||" ")+ra[e][0];break}if(null==r)return void(t._isValid=!1)}if(!i&&null!=r)return void(t._isValid=!1);if(l[4]){if(!ia.exec(l[4]))return void(t._isValid=!1);o="Z"}t._f=a+(r||"")+(o||""),Ft(t)}else t._isValid=!1}function mt(e){var n=oa.exec(e._i);return null!==n?void(e._d=new Date(+n[1])):(pt(e),void(e._isValid===!1&&(delete e._isValid,t.createFromInputFallback(e))))}function vt(t,e,n,i,a,r,o){var s=new Date(t,e,n,i,a,r,o);return 100>t&&t>=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}function bt(t){var e=new Date(Date.UTC.apply(null,arguments));return 100>t&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function yt(t){return xt(t)?366:365}function xt(t){return t%4===0&&t%100!==0||t%400===0}function kt(){return xt(this.year())}function _t(t,e,n){var i=7+e-n,a=(7+bt(t,0,i).getUTCDay()-e)%7;return-a+i-1}function wt(t,e,n,i,a){var r,o,s=(7+n-i)%7,l=_t(t,i,a),d=1+7*(e-1)+s+l;return 0>=d?(r=t-1,o=yt(r)+d):d>yt(t)?(r=t+1,o=d-yt(t)):(r=t,o=d),{year:r,dayOfYear:o}}function St(t,e,n){var i,a,r=_t(t.year(),e,n),o=Math.floor((t.dayOfYear()-r-1)/7)+1;return 1>o?(a=t.year()-1,i=o+Mt(a,e,n)):o>Mt(t.year(),e,n)?(i=o-Mt(t.year(),e,n),a=t.year()+1):(a=t.year(),i=o),{week:i,year:a}}function Mt(t,e,n){var i=_t(t,e,n),a=_t(t+1,e,n);return(yt(t)-i+a)/7}function Dt(t,e,n){return null!=t?t:null!=e?e:n}function Ct(e){var n=new Date(t.now());return e._useUTC?[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate()]:[n.getFullYear(),n.getMonth(),n.getDate()]}function Tt(t){var e,n,i,a,r=[];if(!t._d){for(i=Ct(t),t._w&&null==t._a[Ei]&&null==t._a[Ni]&&Pt(t),t._dayOfYear&&(a=Dt(t._a[Hi],i[Hi]),t._dayOfYear>yt(a)&&(c(t)._overflowDayOfYear=!0),n=bt(a,0,t._dayOfYear),t._a[Ni]=n.getUTCMonth(),t._a[Ei]=n.getUTCDate()),e=0;3>e&&null==t._a[e];++e)t._a[e]=r[e]=i[e];for(;7>e;e++)t._a[e]=r[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[Ui]&&0===t._a[ji]&&0===t._a[Gi]&&0===t._a[qi]&&(t._nextDay=!0,t._a[Ui]=0),t._d=(t._useUTC?bt:vt).apply(null,r),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[Ui]=24)}}function Pt(t){var e,n,i,a,r,o,s,l;e=t._w,null!=e.GG||null!=e.W||null!=e.E?(r=1,o=4,n=Dt(e.GG,t._a[Hi],St(Yt(),1,4).year),i=Dt(e.W,1),a=Dt(e.E,1),(1>a||a>7)&&(l=!0)):(r=t._locale._week.dow,o=t._locale._week.doy,n=Dt(e.gg,t._a[Hi],St(Yt(),r,o).year),i=Dt(e.w,1),null!=e.d?(a=e.d,(0>a||a>6)&&(l=!0)):null!=e.e?(a=e.e+r,(e.e<0||e.e>6)&&(l=!0)):a=r),1>i||i>Mt(n,r,o)?c(t)._overflowWeeks=!0:null!=l?c(t)._overflowWeekday=!0:(s=wt(n,i,a,r,o),t._a[Hi]=s.year,t._dayOfYear=s.dayOfYear)}function Ft(e){if(e._f===t.ISO_8601)return void pt(e);e._a=[],c(e).empty=!0;var n,i,a,r,o,s=""+e._i,l=s.length,d=0;for(a=J(e._f,e._locale).match(bi)||[],n=0;n<a.length;n++)r=a[n],i=(s.match(Q(r,e))||[])[0],i&&(o=s.substr(0,s.indexOf(i)),o.length>0&&c(e).unusedInput.push(o),s=s.slice(s.indexOf(i)+i.length),d+=i.length),ki[r]?(i?c(e).empty=!1:c(e).unusedTokens.push(r),nt(r,i,e)):e._strict&&!i&&c(e).unusedTokens.push(r);c(e).charsLeftOver=l-d,s.length>0&&c(e).unusedInput.push(s),c(e).bigHour===!0&&e._a[Ui]<=12&&e._a[Ui]>0&&(c(e).bigHour=void 0),c(e).parsedDateParts=e._a.slice(0),c(e).meridiem=e._meridiem,e._a[Ui]=At(e._locale,e._a[Ui],e._meridiem),Tt(e),gt(e)}function At(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?(i=t.isPM(n),i&&12>e&&(e+=12),i||12!==e||(e=0),e):e}function It(t){var e,n,i,a,r;if(0===t._f.length)return c(t).invalidFormat=!0,void(t._d=new Date(NaN));for(a=0;a<t._f.length;a++)r=0,e=p({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[a],Ft(e),h(e)&&(r+=c(e).charsLeftOver,r+=10*c(e).unusedTokens.length,c(e).score=r,(null==i||i>r)&&(i=r,n=e));l(t,n||e)}function Ot(t){if(!t._d){var e=B(t._i);t._a=o([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],function(t){return t&&parseInt(t,10)}),Tt(t)}}function Rt(t){var e=new m(gt(Wt(t)));return e._nextDay&&(e.add(1,"d"),e._nextDay=void 0),e}function Wt(t){var e=t._i,n=t._f;return t._locale=t._locale||W(t._l),null===e||void 0===n&&""===e?f({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),v(e)?new m(gt(e)):(a(n)?It(t):n?Ft(t):r(e)?t._d=e:Vt(t),h(t)||(t._d=null),t))}function Vt(e){var n=e._i;void 0===n?e._d=new Date(t.now()):r(n)?e._d=new Date(n.valueOf()):"string"==typeof n?mt(e):a(n)?(e._a=o(n.slice(0),function(t){return parseInt(t,10)}),Tt(e)):"object"==typeof n?Ot(e):"number"==typeof n?e._d=new Date(n):t.createFromInputFallback(e)}function Lt(t,e,n,i,a){var r={};return"boolean"==typeof n&&(i=n,n=void 0),r._isAMomentObject=!0,r._useUTC=r._isUTC=a,r._l=n,r._i=t,r._f=e,r._strict=i,Rt(r)}function Yt(t,e,n,i){return Lt(t,e,n,i,!1)}function Bt(t,e){var n,i;if(1===e.length&&a(e[0])&&(e=e[0]),!e.length)return Yt();for(n=e[0],i=1;i<e.length;++i)(!e[i].isValid()||e[i][t](n))&&(n=e[i]);return n}function zt(){var t=[].slice.call(arguments,0);return Bt("isBefore",t)}function Ht(){var t=[].slice.call(arguments,0);return Bt("isAfter",t)}function Nt(t){var e=B(t),n=e.year||0,i=e.quarter||0,a=e.month||0,r=e.week||0,o=e.day||0,s=e.hour||0,l=e.minute||0,d=e.second||0,u=e.millisecond||0;this._milliseconds=+u+1e3*d+6e4*l+1e3*s*60*60,this._days=+o+7*r,this._months=+a+3*i+12*n,this._data={},this._locale=W(),this._bubble()}function Et(t){return t instanceof Nt}function Ut(t,e){j(t,0,0,function(){var t=this.utcOffset(),n="+";return 0>t&&(t=-t,n="-"),n+U(~~(t/60),2)+e+U(~~t%60,2)})}function jt(t,e){var n=(e||"").match(t)||[],i=n[n.length-1]||[],a=(i+"").match(ca)||["-",0,0],r=+(60*a[1])+y(a[2]);return"+"===a[0]?r:-r}function Gt(e,n){var i,a;return n._isUTC?(i=n.clone(),a=(v(e)||r(e)?e.valueOf():Yt(e).valueOf())-i.valueOf(),i._d.setTime(i._d.valueOf()+a),t.updateOffset(i,!1),i):Yt(e).local()}function qt(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function Zt(e,n){var i,a=this._offset||0;return this.isValid()?null!=e?("string"==typeof e?e=jt(Vi,e):Math.abs(e)<16&&(e=60*e),!this._isUTC&&n&&(i=qt(this)),this._offset=e,this._isUTC=!0,null!=i&&this.add(i,"m"),a!==e&&(!n||this._changeInProgress?ce(this,re(e-a,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,t.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?a:qt(this):null!=e?this:NaN}function Jt(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}function Xt(t){return this.utcOffset(0,t)}function Qt(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(qt(this),"m")),this}function $t(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(jt(Wi,this._i)),this}function Kt(t){return this.isValid()?(t=t?Yt(t).utcOffset():0,(this.utcOffset()-t)%60===0):!1}function te(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function ee(){if(!g(this._isDSTShifted))return this._isDSTShifted;var t={};if(p(t,this),t=Wt(t),t._a){var e=t._isUTC?d(t._a):Yt(t._a);this._isDSTShifted=this.isValid()&&x(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function ne(){return this.isValid()?!this._isUTC:!1}function ie(){return this.isValid()?this._isUTC:!1}function ae(){return this.isValid()?this._isUTC&&0===this._offset:!1}function re(t,e){var n,i,a,r=t,o=null;return Et(t)?r={ms:t._milliseconds,d:t._days,M:t._months}:"number"==typeof t?(r={},e?r[e]=t:r.milliseconds=t):(o=ha.exec(t))?(n="-"===o[1]?-1:1,r={y:0,d:y(o[Ei])*n,h:y(o[Ui])*n,m:y(o[ji])*n,s:y(o[Gi])*n,ms:y(o[qi])*n}):(o=fa.exec(t))?(n="-"===o[1]?-1:1,r={y:oe(o[2],n),M:oe(o[3],n),w:oe(o[4],n),d:oe(o[5],n),h:oe(o[6],n),m:oe(o[7],n),s:oe(o[8],n)}):null==r?r={}:"object"==typeof r&&("from"in r||"to"in r)&&(a=le(Yt(r.from),Yt(r.to)),r={},r.ms=a.milliseconds,r.M=a.months),i=new Nt(r),Et(t)&&s(t,"_locale")&&(i._locale=t._locale),i}function oe(t,e){var n=t&&parseFloat(t.replace(",","."));return(isNaN(n)?0:n)*e}function se(t,e){var n={milliseconds:0,months:0};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function le(t,e){var n;return t.isValid()&&e.isValid()?(e=Gt(e,t),t.isBefore(e)?n=se(t,e):(n=se(e,t),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function de(t){return 0>t?-1*Math.round(-1*t):Math.round(t)}function ue(t,e){return function(n,i){var a,r;return null===i||isNaN(+i)||(w(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period)."),r=n,n=i,i=r),n="string"==typeof n?+n:n,a=re(n,i),ce(this,a,t),this}}function ce(e,n,i,a){var r=n._milliseconds,o=de(n._days),s=de(n._months);e.isValid()&&(a=null==a?!0:a,r&&e._d.setTime(e._d.valueOf()+r*i),o&&N(e,"Date",H(e,"Date")+o*i),s&&lt(e,H(e,"Month")+s*i),a&&t.updateOffset(e,o||s))}function he(t,e){var n=t||Yt(),i=Gt(n,this).startOf("day"),a=this.diff(i,"days",!0),r=-6>a?"sameElse":-1>a?"lastWeek":0>a?"lastDay":1>a?"sameDay":2>a?"nextDay":7>a?"nextWeek":"sameElse",o=e&&(S(e[r])?e[r]():e[r]);return this.format(o||this.localeData().calendar(r,this,Yt(n)))}function fe(){return new m(this)}function ge(t,e){var n=v(t)?t:Yt(t);return this.isValid()&&n.isValid()?(e=Y(g(e)?"millisecond":e),"millisecond"===e?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(e).valueOf()):!1}function pe(t,e){var n=v(t)?t:Yt(t);return this.isValid()&&n.isValid()?(e=Y(g(e)?"millisecond":e),"millisecond"===e?this.valueOf()<n.valueOf():this.clone().endOf(e).valueOf()<n.valueOf()):!1}function me(t,e,n,i){return i=i||"()",("("===i[0]?this.isAfter(t,n):!this.isBefore(t,n))&&(")"===i[1]?this.isBefore(e,n):!this.isAfter(e,n))}function ve(t,e){var n,i=v(t)?t:Yt(t);return this.isValid()&&i.isValid()?(e=Y(e||"millisecond"),"millisecond"===e?this.valueOf()===i.valueOf():(n=i.valueOf(),this.clone().startOf(e).valueOf()<=n&&n<=this.clone().endOf(e).valueOf())):!1}function be(t,e){return this.isSame(t,e)||this.isAfter(t,e)}function ye(t,e){return this.isSame(t,e)||this.isBefore(t,e)}function xe(t,e,n){var i,a,r,o;return this.isValid()?(i=Gt(t,this),i.isValid()?(a=6e4*(i.utcOffset()-this.utcOffset()),e=Y(e),"year"===e||"month"===e||"quarter"===e?(o=ke(this,i),"quarter"===e?o/=3:"year"===e&&(o/=12)):(r=this-i,o="second"===e?r/1e3:"minute"===e?r/6e4:"hour"===e?r/36e5:"day"===e?(r-a)/864e5:"week"===e?(r-a)/6048e5:r),n?o:b(o)):NaN):NaN}function ke(t,e){var n,i,a=12*(e.year()-t.year())+(e.month()-t.month()),r=t.clone().add(a,"months");return 0>e-r?(n=t.clone().add(a-1,"months"),i=(e-r)/(r-n)):(n=t.clone().add(a+1,"months"),i=(e-r)/(n-r)),-(a+i)||0}function _e(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function we(){var t=this.clone().utc();return 0<t.year()&&t.year()<=9999?S(Date.prototype.toISOString)?this.toDate().toISOString():Z(t,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):Z(t,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function Se(e){e||(e=this.isUtc()?t.defaultFormatUtc:t.defaultFormat);var n=Z(this,e);return this.localeData().postformat(n)}function Me(t,e){return this.isValid()&&(v(t)&&t.isValid()||Yt(t).isValid())?re({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function De(t){return this.from(Yt(),t)}function Ce(t,e){return this.isValid()&&(v(t)&&t.isValid()||Yt(t).isValid())?re({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function Te(t){return this.to(Yt(),t)}function Pe(t){var e;return void 0===t?this._locale._abbr:(e=W(t),null!=e&&(this._locale=e),this)}function Fe(){return this._locale}function Ae(t){switch(t=Y(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function Ie(t){return t=Y(t),void 0===t||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function Oe(){return this._d.valueOf()-6e4*(this._offset||0)}function Re(){return Math.floor(this.valueOf()/1e3)}function We(){return this._offset?new Date(this.valueOf()):this._d}function Ve(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function Le(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function Ye(){return this.isValid()?this.toISOString():null}function Be(){return h(this)}function ze(){return l({},c(this))}function He(){return c(this).overflow}function Ne(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Ee(t,e){j(0,[t,t.length],0,e)}function Ue(t){return Ze.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function je(t){return Ze.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Ge(){return Mt(this.year(),1,4)}function qe(){var t=this.localeData()._week;return Mt(this.year(),t.dow,t.doy)}function Ze(t,e,n,i,a){var r;return null==t?St(this,i,a).year:(r=Mt(t,i,a),e>r&&(e=r),Je.call(this,t,e,n,i,a))}function Je(t,e,n,i,a){var r=wt(t,e,n,i,a),o=bt(r.year,0,r.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}function Xe(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function Qe(t){return St(t,this._week.dow,this._week.doy).week}function $e(){return this._week.dow}function Ke(){return this._week.doy}function tn(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function en(t){var e=St(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function nn(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function an(t,e){return a(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]}function rn(t){return this._weekdaysShort[t.day()]}function on(t){return this._weekdaysMin[t.day()]}function sn(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;7>i;++i)r=d([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===e?(a=pi.call(this._weekdaysParse,o),-1!==a?a:null):"ddd"===e?(a=pi.call(this._shortWeekdaysParse,o),-1!==a?a:null):(a=pi.call(this._minWeekdaysParse,o),-1!==a?a:null):"dddd"===e?(a=pi.call(this._weekdaysParse,o),-1!==a?a:(a=pi.call(this._shortWeekdaysParse,o),-1!==a?a:(a=pi.call(this._minWeekdaysParse,o),-1!==a?a:null))):"ddd"===e?(a=pi.call(this._shortWeekdaysParse,o),-1!==a?a:(a=pi.call(this._weekdaysParse,o),-1!==a?a:(a=pi.call(this._minWeekdaysParse,o),-1!==a?a:null))):(a=pi.call(this._minWeekdaysParse,o),-1!==a?a:(a=pi.call(this._weekdaysParse,o),-1!==a?a:(a=pi.call(this._shortWeekdaysParse,o),-1!==a?a:null)))}function ln(t,e,n){var i,a,r;if(this._weekdaysParseExact)return sn.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;7>i;i++){if(a=d([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(a,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(a,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(a,"").replace(".",".?")+"$","i")),this._weekdaysParse[i]||(r="^"+this.weekdays(a,"")+"|^"+this.weekdaysShort(a,"")+"|^"+this.weekdaysMin(a,""),this._weekdaysParse[i]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}}function dn(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=nn(t,this.localeData()),this.add(t-e,"d")):e}function un(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function cn(t){return this.isValid()?null==t?this.day()||7:this.day(this.day()%7?t:t-7):null!=t?this:NaN}function hn(t){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||pn.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex}function fn(t){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||pn.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex}function gn(t){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||pn.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex}function pn(){function t(t,e){return e.length-t.length}var e,n,i,a,r,o=[],s=[],l=[],u=[];for(e=0;7>e;e++)n=d([2e3,1]).day(e),i=this.weekdaysMin(n,""),a=this.weekdaysShort(n,""),r=this.weekdays(n,""),o.push(i),s.push(a),l.push(r),u.push(i),u.push(a),u.push(r);for(o.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;7>e;e++)s[e]=K(s[e]),l[e]=K(l[e]),u[e]=K(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function mn(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function vn(){return this.hours()%12||12}function bn(){return this.hours()||24}function yn(t,e){j(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function xn(t,e){return e._meridiemParse}function kn(t){return"p"===(t+"").toLowerCase().charAt(0)}function _n(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"}function wn(t,e){e[qi]=y(1e3*("0."+t))}function Sn(){return this._isUTC?"UTC":""}function Mn(){return this._isUTC?"Coordinated Universal Time":""}function Dn(t){return Yt(1e3*t)}function Cn(){return Yt.apply(null,arguments).parseZone()}function Tn(t,e,n){var i=this._calendar[t];return S(i)?i.call(e,n):i}function Pn(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])}function Fn(){return this._invalidDate}function An(t){return this._ordinal.replace("%d",t)}function In(t){return t}function On(t,e,n,i){var a=this._relativeTime[n];return S(a)?a(t,e,n,i):a.replace(/%d/i,t)}function Rn(t,e){var n=this._relativeTime[t>0?"future":"past"];return S(n)?n(e):n.replace(/%s/i,e)}function Wn(t,e,n,i){var a=W(),r=d().set(i,e);return a[n](r,t)}function Vn(t,e,n){if("number"==typeof t&&(e=t,t=void 0),t=t||"",null!=e)return Wn(t,e,n,"month");var i,a=[];for(i=0;12>i;i++)a[i]=Wn(t,i,n,"month");return a}function Ln(t,e,n,i){"boolean"==typeof t?("number"==typeof e&&(n=e,e=void 0),e=e||""):(e=t,n=e,t=!1,"number"==typeof e&&(n=e,e=void 0),e=e||"");var a=W(),r=t?a._week.dow:0;if(null!=n)return Wn(e,(n+r)%7,i,"day");var o,s=[];for(o=0;7>o;o++)s[o]=Wn(e,(o+r)%7,i,"day");return s}function Yn(t,e){return Vn(t,e,"months")}function Bn(t,e){return Vn(t,e,"monthsShort")}function zn(t,e,n){return Ln(t,e,n,"weekdays")}function Hn(t,e,n){return Ln(t,e,n,"weekdaysShort")}function Nn(t,e,n){return Ln(t,e,n,"weekdaysMin")}function En(){var t=this._data;return this._milliseconds=za(this._milliseconds),this._days=za(this._days),this._months=za(this._months),t.milliseconds=za(t.milliseconds),t.seconds=za(t.seconds),t.minutes=za(t.minutes),t.hours=za(t.hours),t.months=za(t.months),t.years=za(t.years),this}function Un(t,e,n,i){var a=re(e,n);return t._milliseconds+=i*a._milliseconds,t._days+=i*a._days,t._months+=i*a._months,t._bubble()}function jn(t,e){return Un(this,t,e,1)}function Gn(t,e){return Un(this,t,e,-1)}function qn(t){return 0>t?Math.floor(t):Math.ceil(t)}function Zn(){var t,e,n,i,a,r=this._milliseconds,o=this._days,s=this._months,l=this._data;return r>=0&&o>=0&&s>=0||0>=r&&0>=o&&0>=s||(r+=864e5*qn(Xn(s)+o),o=0,s=0),l.milliseconds=r%1e3,t=b(r/1e3),l.seconds=t%60,e=b(t/60),l.minutes=e%60,n=b(e/60),l.hours=n%24,o+=b(n/24),a=b(Jn(o)),s+=a,o-=qn(Xn(a)),i=b(s/12),s%=12,l.days=o,l.months=s,l.years=i,this}function Jn(t){return 4800*t/146097}function Xn(t){return 146097*t/4800}function Qn(t){var e,n,i=this._milliseconds;if(t=Y(t),"month"===t||"year"===t)return e=this._days+i/864e5,n=this._months+Jn(e),"month"===t?n:n/12;switch(e=this._days+Math.round(Xn(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}}function $n(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*y(this._months/12)}function Kn(t){return function(){return this.as(t)}}function ti(t){return t=Y(t),this[t+"s"]()}function ei(t){return function(){return this._data[t]}}function ni(){return b(this.days()/7)}function ii(t,e,n,i,a){return a.relativeTime(e||1,!!n,t,i)}function ai(t,e,n){var i=re(t).abs(),a=nr(i.as("s")),r=nr(i.as("m")),o=nr(i.as("h")),s=nr(i.as("d")),l=nr(i.as("M")),d=nr(i.as("y")),u=a<ir.s&&["s",a]||1>=r&&["m"]||r<ir.m&&["mm",r]||1>=o&&["h"]||o<ir.h&&["hh",o]||1>=s&&["d"]||s<ir.d&&["dd",s]||1>=l&&["M"]||l<ir.M&&["MM",l]||1>=d&&["y"]||["yy",d];return u[2]=e,u[3]=+t>0,u[4]=n,ii.apply(null,u)}function ri(t,e){return void 0===ir[t]?!1:void 0===e?ir[t]:(ir[t]=e,!0)}function oi(t){var e=this.localeData(),n=ai(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)}function si(){var t,e,n,i=ar(this._milliseconds)/1e3,a=ar(this._days),r=ar(this._months);t=b(i/60),e=b(t/60),i%=60,t%=60,n=b(r/12),r%=12;var o=n,s=r,l=a,d=e,u=t,c=i,h=this.asSeconds();return h?(0>h?"-":"")+"P"+(o?o+"Y":"")+(s?s+"M":"")+(l?l+"D":"")+(d||u||c?"T":"")+(d?d+"H":"")+(u?u+"M":"")+(c?c+"S":""):"P0D"}var li,di;di=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,i=0;n>i;i++)if(i in e&&t.call(this,e[i],i,e))return!0;return!1};var ui=t.momentProperties=[],ci=!1,hi={};t.suppressDeprecationWarnings=!1,t.deprecationHandler=null;var fi;fi=Object.keys?Object.keys:function(t){var e,n=[];for(e in t)s(t,e)&&n.push(e);return n};var gi,pi,mi={},vi={},bi=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,yi=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,xi={},ki={},_i=/\d/,wi=/\d\d/,Si=/\d{3}/,Mi=/\d{4}/,Di=/[+-]?\d{6}/,Ci=/\d\d?/,Ti=/\d\d\d\d?/,Pi=/\d\d\d\d\d\d?/,Fi=/\d{1,3}/,Ai=/\d{1,4}/,Ii=/[+-]?\d{1,6}/,Oi=/\d+/,Ri=/[+-]?\d+/,Wi=/Z|[+-]\d\d:?\d\d/gi,Vi=/Z|[+-]\d\d(?::?\d\d)?/gi,Li=/[+-]?\d+(\.\d{1,3})?/,Yi=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Bi={},zi={},Hi=0,Ni=1,Ei=2,Ui=3,ji=4,Gi=5,qi=6,Zi=7,Ji=8;pi=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e<this.length;++e)if(this[e]===t)return e;return-1},j("M",["MM",2],"Mo",function(){return this.month()+1}),j("MMM",0,0,function(t){return this.localeData().monthsShort(this,t)}),j("MMMM",0,0,function(t){return this.localeData().months(this,t)}),L("month","M"),X("M",Ci),X("MM",Ci,wi),X("MMM",function(t,e){return e.monthsShortRegex(t)}),X("MMMM",function(t,e){return e.monthsRegex(t)}),tt(["M","MM"],function(t,e){e[Ni]=y(t)-1}),tt(["MMM","MMMM"],function(t,e,n,i){var a=n._locale.monthsParse(t,i,n._strict);null!=a?e[Ni]=a:c(n).invalidMonth=t});var Xi=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/,Qi="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),$i="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),Ki=Yi,ta=Yi,ea=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,na=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/,ia=/Z|[+-]\d\d(?::?\d\d)?/,aa=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],ra=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],oa=/^\/?Date\((\-?\d+)/i;t.createFromInputFallback=_("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),j("Y",0,0,function(){var t=this.year();return 9999>=t?""+t:"+"+t}),j(0,["YY",2],0,function(){return this.year()%100}),j(0,["YYYY",4],0,"year"),j(0,["YYYYY",5],0,"year"),j(0,["YYYYYY",6,!0],0,"year"),L("year","y"),X("Y",Ri),X("YY",Ci,wi),X("YYYY",Ai,Mi),X("YYYYY",Ii,Di),X("YYYYYY",Ii,Di),tt(["YYYYY","YYYYYY"],Hi),tt("YYYY",function(e,n){n[Hi]=2===e.length?t.parseTwoDigitYear(e):y(e)}),tt("YY",function(e,n){n[Hi]=t.parseTwoDigitYear(e)}),tt("Y",function(t,e){e[Hi]=parseInt(t,10)}),t.parseTwoDigitYear=function(t){return y(t)+(y(t)>68?1900:2e3)};var sa=z("FullYear",!0);t.ISO_8601=function(){};var la=_("moment().min is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(){var t=Yt.apply(null,arguments);return this.isValid()&&t.isValid()?this>t?this:t:f()}),da=_("moment().max is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(){var t=Yt.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:f()}),ua=function(){return Date.now?Date.now():+new Date};Ut("Z",":"),Ut("ZZ",""),X("Z",Vi),X("ZZ",Vi),tt(["Z","ZZ"],function(t,e,n){n._useUTC=!0,n._tzm=jt(Vi,t)});var ca=/([\+\-]|\d\d)/gi;t.updateOffset=function(){};var ha=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?\d*)?$/,fa=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;re.fn=Nt.prototype;var ga=ue(1,"add"),pa=ue(-1,"subtract");t.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",t.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ma=_("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});j(0,["gg",2],0,function(){return this.weekYear()%100}),j(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ee("gggg","weekYear"),Ee("ggggg","weekYear"),Ee("GGGG","isoWeekYear"),Ee("GGGGG","isoWeekYear"),L("weekYear","gg"),L("isoWeekYear","GG"),X("G",Ri),X("g",Ri),X("GG",Ci,wi),X("gg",Ci,wi),X("GGGG",Ai,Mi),X("gggg",Ai,Mi),X("GGGGG",Ii,Di),X("ggggg",Ii,Di),et(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,i){e[i.substr(0,2)]=y(t)}),et(["gg","GG"],function(e,n,i,a){n[a]=t.parseTwoDigitYear(e)}),j("Q",0,"Qo","quarter"),L("quarter","Q"),X("Q",_i),tt("Q",function(t,e){e[Ni]=3*(y(t)-1)}),j("w",["ww",2],"wo","week"),j("W",["WW",2],"Wo","isoWeek"),L("week","w"),L("isoWeek","W"),X("w",Ci),X("ww",Ci,wi),X("W",Ci),X("WW",Ci,wi),et(["w","ww","W","WW"],function(t,e,n,i){e[i.substr(0,1)]=y(t)});var va={dow:0,doy:6};j("D",["DD",2],"Do","date"),L("date","D"),X("D",Ci),X("DD",Ci,wi),X("Do",function(t,e){return t?e._ordinalParse:e._ordinalParseLenient}),tt(["D","DD"],Ei),tt("Do",function(t,e){e[Ei]=y(t.match(Ci)[0],10)});var ba=z("Date",!0);j("d",0,"do","day"),j("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),j("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),j("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),j("e",0,0,"weekday"),j("E",0,0,"isoWeekday"),L("day","d"),L("weekday","e"),L("isoWeekday","E"),X("d",Ci),X("e",Ci),X("E",Ci),X("dd",function(t,e){return e.weekdaysMinRegex(t)}),X("ddd",function(t,e){return e.weekdaysShortRegex(t)}),X("dddd",function(t,e){return e.weekdaysRegex(t)}),et(["dd","ddd","dddd"],function(t,e,n,i){var a=n._locale.weekdaysParse(t,i,n._strict);null!=a?e.d=a:c(n).invalidWeekday=t}),et(["d","e","E"],function(t,e,n,i){e[i]=y(t)});var ya="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),xa="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),ka="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),_a=Yi,wa=Yi,Sa=Yi;j("DDD",["DDDD",3],"DDDo","dayOfYear"),L("dayOfYear","DDD"),X("DDD",Fi),X("DDDD",Si),tt(["DDD","DDDD"],function(t,e,n){n._dayOfYear=y(t)}),j("H",["HH",2],0,"hour"),j("h",["hh",2],0,vn),j("k",["kk",2],0,bn),j("hmm",0,0,function(){return""+vn.apply(this)+U(this.minutes(),2)}),j("hmmss",0,0,function(){return""+vn.apply(this)+U(this.minutes(),2)+U(this.seconds(),2)}),j("Hmm",0,0,function(){return""+this.hours()+U(this.minutes(),2)}),j("Hmmss",0,0,function(){return""+this.hours()+U(this.minutes(),2)+U(this.seconds(),2)}),yn("a",!0),yn("A",!1),L("hour","h"),X("a",xn),X("A",xn),X("H",Ci),X("h",Ci),X("HH",Ci,wi),X("hh",Ci,wi),X("hmm",Ti),X("hmmss",Pi),X("Hmm",Ti),X("Hmmss",Pi),tt(["H","HH"],Ui),tt(["a","A"],function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t}),tt(["h","hh"],function(t,e,n){e[Ui]=y(t),c(n).bigHour=!0}),tt("hmm",function(t,e,n){var i=t.length-2;e[Ui]=y(t.substr(0,i)),e[ji]=y(t.substr(i)),
+c(n).bigHour=!0}),tt("hmmss",function(t,e,n){var i=t.length-4,a=t.length-2;e[Ui]=y(t.substr(0,i)),e[ji]=y(t.substr(i,2)),e[Gi]=y(t.substr(a)),c(n).bigHour=!0}),tt("Hmm",function(t,e,n){var i=t.length-2;e[Ui]=y(t.substr(0,i)),e[ji]=y(t.substr(i))}),tt("Hmmss",function(t,e,n){var i=t.length-4,a=t.length-2;e[Ui]=y(t.substr(0,i)),e[ji]=y(t.substr(i,2)),e[Gi]=y(t.substr(a))});var Ma=/[ap]\.?m?\.?/i,Da=z("Hours",!0);j("m",["mm",2],0,"minute"),L("minute","m"),X("m",Ci),X("mm",Ci,wi),tt(["m","mm"],ji);var Ca=z("Minutes",!1);j("s",["ss",2],0,"second"),L("second","s"),X("s",Ci),X("ss",Ci,wi),tt(["s","ss"],Gi);var Ta=z("Seconds",!1);j("S",0,0,function(){return~~(this.millisecond()/100)}),j(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),j(0,["SSS",3],0,"millisecond"),j(0,["SSSS",4],0,function(){return 10*this.millisecond()}),j(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),j(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),j(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),j(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),j(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),L("millisecond","ms"),X("S",Fi,_i),X("SS",Fi,wi),X("SSS",Fi,Si);var Pa;for(Pa="SSSS";Pa.length<=9;Pa+="S")X(Pa,Oi);for(Pa="S";Pa.length<=9;Pa+="S")tt(Pa,wn);var Fa=z("Milliseconds",!1);j("z",0,0,"zoneAbbr"),j("zz",0,0,"zoneName");var Aa=m.prototype;Aa.add=ga,Aa.calendar=he,Aa.clone=fe,Aa.diff=xe,Aa.endOf=Ie,Aa.format=Se,Aa.from=Me,Aa.fromNow=De,Aa.to=Ce,Aa.toNow=Te,Aa.get=E,Aa.invalidAt=He,Aa.isAfter=ge,Aa.isBefore=pe,Aa.isBetween=me,Aa.isSame=ve,Aa.isSameOrAfter=be,Aa.isSameOrBefore=ye,Aa.isValid=Be,Aa.lang=ma,Aa.locale=Pe,Aa.localeData=Fe,Aa.max=da,Aa.min=la,Aa.parsingFlags=ze,Aa.set=E,Aa.startOf=Ae,Aa.subtract=pa,Aa.toArray=Ve,Aa.toObject=Le,Aa.toDate=We,Aa.toISOString=we,Aa.toJSON=Ye,Aa.toString=_e,Aa.unix=Re,Aa.valueOf=Oe,Aa.creationData=Ne,Aa.year=sa,Aa.isLeapYear=kt,Aa.weekYear=Ue,Aa.isoWeekYear=je,Aa.quarter=Aa.quarters=Xe,Aa.month=dt,Aa.daysInMonth=ut,Aa.week=Aa.weeks=tn,Aa.isoWeek=Aa.isoWeeks=en,Aa.weeksInYear=qe,Aa.isoWeeksInYear=Ge,Aa.date=ba,Aa.day=Aa.days=dn,Aa.weekday=un,Aa.isoWeekday=cn,Aa.dayOfYear=mn,Aa.hour=Aa.hours=Da,Aa.minute=Aa.minutes=Ca,Aa.second=Aa.seconds=Ta,Aa.millisecond=Aa.milliseconds=Fa,Aa.utcOffset=Zt,Aa.utc=Xt,Aa.local=Qt,Aa.parseZone=$t,Aa.hasAlignedHourOffset=Kt,Aa.isDST=te,Aa.isDSTShifted=ee,Aa.isLocal=ne,Aa.isUtcOffset=ie,Aa.isUtc=ae,Aa.isUTC=ae,Aa.zoneAbbr=Sn,Aa.zoneName=Mn,Aa.dates=_("dates accessor is deprecated. Use date instead.",ba),Aa.months=_("months accessor is deprecated. Use month instead",dt),Aa.years=_("years accessor is deprecated. Use year instead",sa),Aa.zone=_("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",Jt);var Ia=Aa,Oa={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},Ra={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},Wa="Invalid date",Va="%d",La=/\d{1,2}/,Ya={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Ba=T.prototype;Ba._calendar=Oa,Ba.calendar=Tn,Ba._longDateFormat=Ra,Ba.longDateFormat=Pn,Ba._invalidDate=Wa,Ba.invalidDate=Fn,Ba._ordinal=Va,Ba.ordinal=An,Ba._ordinalParse=La,Ba.preparse=In,Ba.postformat=In,Ba._relativeTime=Ya,Ba.relativeTime=On,Ba.pastFuture=Rn,Ba.set=D,Ba.months=at,Ba._months=Qi,Ba.monthsShort=rt,Ba._monthsShort=$i,Ba.monthsParse=st,Ba._monthsRegex=ta,Ba.monthsRegex=ht,Ba._monthsShortRegex=Ki,Ba.monthsShortRegex=ct,Ba.week=Qe,Ba._week=va,Ba.firstDayOfYear=Ke,Ba.firstDayOfWeek=$e,Ba.weekdays=an,Ba._weekdays=ya,Ba.weekdaysMin=on,Ba._weekdaysMin=ka,Ba.weekdaysShort=rn,Ba._weekdaysShort=xa,Ba.weekdaysParse=ln,Ba._weekdaysRegex=_a,Ba.weekdaysRegex=hn,Ba._weekdaysShortRegex=wa,Ba.weekdaysShortRegex=fn,Ba._weekdaysMinRegex=Sa,Ba.weekdaysMinRegex=gn,Ba.isPM=kn,Ba._meridiemParse=Ma,Ba.meridiem=_n,I("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,n=1===y(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}}),t.lang=_("moment.lang is deprecated. Use moment.locale instead.",I),t.langData=_("moment.langData is deprecated. Use moment.localeData instead.",W);var za=Math.abs,Ha=Kn("ms"),Na=Kn("s"),Ea=Kn("m"),Ua=Kn("h"),ja=Kn("d"),Ga=Kn("w"),qa=Kn("M"),Za=Kn("y"),Ja=ei("milliseconds"),Xa=ei("seconds"),Qa=ei("minutes"),$a=ei("hours"),Ka=ei("days"),tr=ei("months"),er=ei("years"),nr=Math.round,ir={s:45,m:45,h:22,d:26,M:11},ar=Math.abs,rr=Nt.prototype;rr.abs=En,rr.add=jn,rr.subtract=Gn,rr.as=Qn,rr.asMilliseconds=Ha,rr.asSeconds=Na,rr.asMinutes=Ea,rr.asHours=Ua,rr.asDays=ja,rr.asWeeks=Ga,rr.asMonths=qa,rr.asYears=Za,rr.valueOf=$n,rr._bubble=Zn,rr.get=ti,rr.milliseconds=Ja,rr.seconds=Xa,rr.minutes=Qa,rr.hours=$a,rr.days=Ka,rr.weeks=ni,rr.months=tr,rr.years=er,rr.humanize=oi,rr.toISOString=si,rr.toString=si,rr.toJSON=si,rr.locale=Pe,rr.localeData=Fe,rr.toIsoString=_("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",si),rr.lang=ma,j("X",0,0,"unix"),j("x",0,0,"valueOf"),X("x",Ri),X("X",Li),tt("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),tt("x",function(t,e,n){n._d=new Date(y(t))}),t.version="2.13.0",i(Yt),t.fn=Ia,t.min=zt,t.max=Ht,t.now=ua,t.utc=d,t.unix=Dn,t.months=Yn,t.isDate=r,t.locale=I,t.invalid=f,t.duration=re,t.isMoment=v,t.weekdays=zn,t.parseZone=Cn,t.localeData=W,t.isDuration=Et,t.monthsShort=Bn,t.weekdaysMin=Nn,t.defineLocale=O,t.updateLocale=R,t.locales=V,t.weekdaysShort=Hn,t.normalizeUnits=Y,t.relativeTimeThreshold=ri,t.prototype=Ia;var or=t;return or})},{}],7:[function(t,e,n){var i=t(26)();t(25)(i),t(24)(i),t(21)(i),t(22)(i),t(23)(i),t(27)(i),t(31)(i),t(29)(i),t(30)(i),t(32)(i),t(28)(i),t(33)(i),t(34)(i),t(35)(i),t(36)(i),t(37)(i),t(40)(i),t(38)(i),t(39)(i),t(41)(i),t(42)(i),t(43)(i),t(15)(i),t(16)(i),t(17)(i),t(18)(i),t(19)(i),t(20)(i),t(8)(i),t(9)(i),t(10)(i),t(11)(i),t(12)(i),t(13)(i),t(14)(i),window.Chart=e.exports=i},{10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,34:34,35:35,36:36,37:37,38:38,39:39,40:40,41:41,42:42,43:43,8:8,9:9}],8:[function(t,e,n){"use strict";e.exports=function(t){t.Bar=function(e,n){return n.type="bar",new t(e,n)}}},{}],9:[function(t,e,n){"use strict";e.exports=function(t){t.Bubble=function(e,n){return n.type="bubble",new t(e,n)}}},{}],10:[function(t,e,n){"use strict";e.exports=function(t){t.Doughnut=function(e,n){return n.type="doughnut",new t(e,n)}}},{}],11:[function(t,e,n){"use strict";e.exports=function(t){t.Line=function(e,n){return n.type="line",new t(e,n)}}},{}],12:[function(t,e,n){"use strict";e.exports=function(t){t.PolarArea=function(e,n){return n.type="polarArea",new t(e,n)}}},{}],13:[function(t,e,n){"use strict";e.exports=function(t){t.Radar=function(e,n){return n.options=t.helpers.configMerge({aspectRatio:1},n.options),n.type="radar",new t(e,n)}}},{}],14:[function(t,e,n){"use strict";e.exports=function(t){var e={hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-1"}],yAxes:[{type:"linear",position:"left",id:"y-axis-1"}]},tooltips:{callbacks:{title:function(t,e){return""},label:function(t,e){return"("+t.xLabel+", "+t.yLabel+")"}}}};t.defaults.scatter=e,t.controllers.scatter=t.controllers.line,t.Scatter=function(e,n){return n.type="scatter",new t(e,n)}}},{}],15:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.bar={hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}},t.controllers.bar=t.DatasetController.extend({dataElementType:t.elements.Rectangle,initialize:function(e,n){t.DatasetController.prototype.initialize.call(this,e,n),this.getMeta().bar=!0},getBarCount:function(){var t=this,n=0;return e.each(t.chart.data.datasets,function(e,i){var a=t.chart.getDatasetMeta(i);a.bar&&t.chart.isDatasetVisible(i)&&++n},t),n},update:function(t){var n=this;e.each(n.getMeta().data,function(e,i){n.updateElement(e,i,t)},n)},updateElement:function(t,n,i){var a=this,r=a.getMeta(),o=a.getScaleForId(r.xAxisID),s=a.getScaleForId(r.yAxisID),l=s.getBasePixel(),d=a.chart.options.elements.rectangle,u=t.custom||{},c=a.getDataset();e.extend(t,{_xScale:o,_yScale:s,_datasetIndex:a.index,_index:n,_model:{x:a.calculateBarX(n,a.index),y:i?l:a.calculateBarY(n,a.index),label:a.chart.data.labels[n],datasetLabel:c.label,base:i?l:a.calculateBarBase(a.index,n),width:a.calculateBarWidth(n),backgroundColor:u.backgroundColor?u.backgroundColor:e.getValueAtIndexOrDefault(c.backgroundColor,n,d.backgroundColor),borderSkipped:u.borderSkipped?u.borderSkipped:d.borderSkipped,borderColor:u.borderColor?u.borderColor:e.getValueAtIndexOrDefault(c.borderColor,n,d.borderColor),borderWidth:u.borderWidth?u.borderWidth:e.getValueAtIndexOrDefault(c.borderWidth,n,d.borderWidth)}}),t.pivot()},calculateBarBase:function(t,e){var n=this,i=n.getMeta(),a=n.getScaleForId(i.yAxisID),r=0;if(a.options.stacked){var o=n.chart,s=o.data.datasets,l=s[t].data[e];if(0>l)for(var d=0;t>d;d++){var u=s[d],c=o.getDatasetMeta(d);c.bar&&c.yAxisID===a.id&&o.isDatasetVisible(d)&&(r+=u.data[e]<0?u.data[e]:0)}else for(var h=0;t>h;h++){var f=s[h],g=o.getDatasetMeta(h);g.bar&&g.yAxisID===a.id&&o.isDatasetVisible(h)&&(r+=f.data[e]>0?f.data[e]:0)}return a.getPixelForValue(r)}return a.getBasePixel()},getRuler:function(t){var e,n=this,i=n.getMeta(),a=n.getScaleForId(i.xAxisID),r=n.getBarCount();e="category"===a.options.type?a.getPixelForTick(t+1)-a.getPixelForTick(t):a.width/a.ticks.length;var o=e*a.options.categoryPercentage,s=(e-e*a.options.categoryPercentage)/2,l=o/r;if(a.ticks.length!==n.chart.data.labels.length){var d=a.ticks.length/n.chart.data.labels.length;l*=d}var u=l*a.options.barPercentage,c=l-l*a.options.barPercentage;return{datasetCount:r,tickWidth:e,categoryWidth:o,categorySpacing:s,fullBarWidth:l,barWidth:u,barSpacing:c}},calculateBarWidth:function(t){var e=this.getScaleForId(this.getMeta().xAxisID),n=this.getRuler(t);return e.options.stacked?n.categoryWidth:n.barWidth},getBarIndex:function(t){var e,n,i=0;for(n=0;t>n;++n)e=this.chart.getDatasetMeta(n),e.bar&&this.chart.isDatasetVisible(n)&&++i;return i},calculateBarX:function(t,e){var n=this,i=n.getMeta(),a=n.getScaleForId(i.xAxisID),r=n.getBarIndex(e),o=n.getRuler(t),s=a.getPixelForValue(null,t,e,n.chart.isCombo);return s-=n.chart.isCombo?o.tickWidth/2:0,a.options.stacked?s+o.categoryWidth/2+o.categorySpacing:s+o.barWidth/2+o.categorySpacing+o.barWidth*r+o.barSpacing/2+o.barSpacing*r},calculateBarY:function(t,e){var n=this,i=n.getMeta(),a=n.getScaleForId(i.yAxisID),r=n.getDataset().data[t];if(a.options.stacked){for(var o=0,s=0,l=0;e>l;l++){var d=n.chart.data.datasets[l],u=n.chart.getDatasetMeta(l);u.bar&&u.yAxisID===a.id&&n.chart.isDatasetVisible(l)&&(d.data[t]<0?s+=d.data[t]||0:o+=d.data[t]||0)}return 0>r?a.getPixelForValue(s+r):a.getPixelForValue(o+r)}return a.getPixelForValue(r)},draw:function(t){var n=this,i=t||1;e.each(n.getMeta().data,function(t,e){var a=n.getDataset().data[e];null===a||void 0===a||isNaN(a)||t.transition(i).draw()},n)},setHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t._index,a=t.custom||{},r=t._model;r.backgroundColor=a.hoverBackgroundColor?a.hoverBackgroundColor:e.getValueAtIndexOrDefault(n.hoverBackgroundColor,i,e.getHoverColor(r.backgroundColor)),r.borderColor=a.hoverBorderColor?a.hoverBorderColor:e.getValueAtIndexOrDefault(n.hoverBorderColor,i,e.getHoverColor(r.borderColor)),r.borderWidth=a.hoverBorderWidth?a.hoverBorderWidth:e.getValueAtIndexOrDefault(n.hoverBorderWidth,i,r.borderWidth)},removeHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t._index,a=t.custom||{},r=t._model,o=this.chart.options.elements.rectangle;r.backgroundColor=a.backgroundColor?a.backgroundColor:e.getValueAtIndexOrDefault(n.backgroundColor,i,o.backgroundColor),r.borderColor=a.borderColor?a.borderColor:e.getValueAtIndexOrDefault(n.borderColor,i,o.borderColor),r.borderWidth=a.borderWidth?a.borderWidth:e.getValueAtIndexOrDefault(n.borderWidth,i,o.borderWidth)}}),t.defaults.horizontalBar={hover:{mode:"label"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{position:"left",type:"category",categoryPercentage:.8,barPercentage:.9,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{callbacks:{title:function(t,e){var n="";return t.length>0&&(t[0].yLabel?n=t[0].yLabel:e.labels.length>0&&t[0].index<e.labels.length&&(n=e.labels[t[0].index])),n},label:function(t,e){var n=e.datasets[t.datasetIndex].label||"";return n+": "+t.xLabel}}}},t.controllers.horizontalBar=t.controllers.bar.extend({updateElement:function(t,n,i,a){var r=this,o=r.getMeta(),s=r.getScaleForId(o.xAxisID),l=r.getScaleForId(o.yAxisID),d=s.getBasePixel(),u=t.custom||{},c=r.getDataset(),h=r.chart.options.elements.rectangle;e.extend(t,{_xScale:s,_yScale:l,_datasetIndex:r.index,_index:n,_model:{x:i?d:r.calculateBarX(n,r.index),y:r.calculateBarY(n,r.index),label:r.chart.data.labels[n],datasetLabel:c.label,base:i?d:r.calculateBarBase(r.index,n),height:r.calculateBarHeight(n),backgroundColor:u.backgroundColor?u.backgroundColor:e.getValueAtIndexOrDefault(c.backgroundColor,n,h.backgroundColor),borderSkipped:u.borderSkipped?u.borderSkipped:h.borderSkipped,borderColor:u.borderColor?u.borderColor:e.getValueAtIndexOrDefault(c.borderColor,n,h.borderColor),borderWidth:u.borderWidth?u.borderWidth:e.getValueAtIndexOrDefault(c.borderWidth,n,h.borderWidth)},draw:function(){function t(t){return l[(u+t)%4]}var e=this._chart.ctx,n=this._view,i=n.height/2,a=n.y-i,r=n.y+i,o=n.base-(n.base-n.x),s=n.borderWidth/2;n.borderWidth&&(a+=s,r-=s,o+=s),e.beginPath(),e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,e.lineWidth=n.borderWidth;var l=[[n.base,r],[n.base,a],[o,a],[o,r]],d=["bottom","left","top","right"],u=d.indexOf(n.borderSkipped,0);-1===u&&(u=0),e.moveTo.apply(e,t(0));for(var c=1;4>c;c++)e.lineTo.apply(e,t(c));e.fill(),n.borderWidth&&e.stroke()},inRange:function(t,e){var n=this._view,i=!1;return n&&(i=n.x<n.base?e>=n.y-n.height/2&&e<=n.y+n.height/2&&t>=n.x&&t<=n.base:e>=n.y-n.height/2&&e<=n.y+n.height/2&&t>=n.base&&t<=n.x),i}}),t.pivot()},calculateBarBase:function(t,e){var n=this,i=n.getMeta(),a=n.getScaleForId(i.xAxisID),r=0;if(a.options.stacked){var o=n.chart.data.datasets[t].data[e];if(0>o)for(var s=0;t>s;s++){var l=n.chart.data.datasets[s],d=n.chart.getDatasetMeta(s);d.bar&&d.xAxisID===a.id&&n.chart.isDatasetVisible(s)&&(r+=l.data[e]<0?l.data[e]:0)}else for(var u=0;t>u;u++){var c=n.chart.data.datasets[u],h=n.chart.getDatasetMeta(u);h.bar&&h.xAxisID===a.id&&n.chart.isDatasetVisible(u)&&(r+=c.data[e]>0?c.data[e]:0)}return a.getPixelForValue(r)}return a.getBasePixel()},getRuler:function(t){var e,n=this,i=n.getMeta(),a=n.getScaleForId(i.yAxisID),r=n.getBarCount();e="category"===a.options.type?a.getPixelForTick(t+1)-a.getPixelForTick(t):a.width/a.ticks.length;var o=e*a.options.categoryPercentage,s=(e-e*a.options.categoryPercentage)/2,l=o/r;if(a.ticks.length!==n.chart.data.labels.length){var d=a.ticks.length/n.chart.data.labels.length;l*=d}var u=l*a.options.barPercentage,c=l-l*a.options.barPercentage;return{datasetCount:r,tickHeight:e,categoryHeight:o,categorySpacing:s,fullBarHeight:l,barHeight:u,barSpacing:c}},calculateBarHeight:function(t){var e=this,n=e.getScaleForId(e.getMeta().yAxisID),i=e.getRuler(t);return n.options.stacked?i.categoryHeight:i.barHeight},calculateBarX:function(t,e){var n=this,i=n.getMeta(),a=n.getScaleForId(i.xAxisID),r=n.getDataset().data[t];if(a.options.stacked){for(var o=0,s=0,l=0;e>l;l++){var d=n.chart.data.datasets[l],u=n.chart.getDatasetMeta(l);u.bar&&u.xAxisID===a.id&&n.chart.isDatasetVisible(l)&&(d.data[t]<0?s+=d.data[t]||0:o+=d.data[t]||0)}return 0>r?a.getPixelForValue(s+r):a.getPixelForValue(o+r)}return a.getPixelForValue(r)},calculateBarY:function(t,e){var n=this,i=n.getMeta(),a=n.getScaleForId(i.yAxisID),r=n.getBarIndex(e),o=n.getRuler(t),s=a.getPixelForValue(null,t,e,n.chart.isCombo);return s-=n.chart.isCombo?o.tickHeight/2:0,a.options.stacked?s+o.categoryHeight/2+o.categorySpacing:s+o.barHeight/2+o.categorySpacing+o.barHeight*r+o.barSpacing/2+o.barSpacing*r}})}},{}],16:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.bubble={hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(t,e){return""},label:function(t,e){var n=e.datasets[t.datasetIndex].label||"",i=e.datasets[t.datasetIndex].data[t.index];return n+": ("+i.x+", "+i.y+", "+i.r+")"}}}},t.controllers.bubble=t.DatasetController.extend({dataElementType:t.elements.Point,update:function(t){var n=this,i=n.getMeta(),a=i.data;e.each(a,function(e,i){n.updateElement(e,i,t)})},updateElement:function(n,i,a){var r=this,o=r.getMeta(),s=r.getScaleForId(o.xAxisID),l=r.getScaleForId(o.yAxisID),d=n.custom||{},u=r.getDataset(),c=u.data[i],h=r.chart.options.elements.point,f=r.index;e.extend(n,{_xScale:s,_yScale:l,_datasetIndex:f,_index:i,_model:{x:a?s.getPixelForDecimal(.5):s.getPixelForValue(c,i,f,r.chart.isCombo),y:a?l.getBasePixel():l.getPixelForValue(c,i,f),radius:a?0:d.radius?d.radius:r.getRadius(c),hitRadius:d.hitRadius?d.hitRadius:e.getValueAtIndexOrDefault(u.hitRadius,i,h.hitRadius)}}),t.DatasetController.prototype.removeHoverStyle.call(r,n,h);var g=n._model;g.skip=d.skip?d.skip:isNaN(g.x)||isNaN(g.y),n.pivot()},getRadius:function(t){return t.r||this.chart.options.elements.point.radius},setHoverStyle:function(n){var i=this;t.DatasetController.prototype.setHoverStyle.call(i,n);var a=i.chart.data.datasets[n._datasetIndex],r=n._index,o=n.custom||{},s=n._model;s.radius=o.hoverRadius?o.hoverRadius:e.getValueAtIndexOrDefault(a.hoverRadius,r,i.chart.options.elements.point.hoverRadius)+i.getRadius(a.data[r])},removeHoverStyle:function(e){var n=this;t.DatasetController.prototype.removeHoverStyle.call(n,e,n.chart.options.elements.point);var i=n.chart.data.datasets[e._datasetIndex].data[e._index],a=e.custom||{},r=e._model;r.radius=a.radius?a.radius:n.getRadius(i)}})}},{}],17:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=t.defaults;n.doughnut={animation:{animateRotate:!0,animateScale:!1},aspectRatio:1,hover:{mode:"single"},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var r=0;r<i[0].data.length;++r)e.push('<li><span style="background-color:'+i[0].backgroundColor[r]+'"></span>'),a[r]&&e.push(a[r]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var n=t.data;return n.labels.length&&n.datasets.length?n.labels.map(function(i,a){var r=t.getDatasetMeta(0),o=n.datasets[0],s=r.data[a],l=s.custom||{},d=e.getValueAtIndexOrDefault,u=t.options.elements.arc,c=l.backgroundColor?l.backgroundColor:d(o.backgroundColor,a,u.backgroundColor),h=l.borderColor?l.borderColor:d(o.borderColor,a,u.borderColor),f=l.borderWidth?l.borderWidth:d(o.borderWidth,a,u.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(o.data[a])||r.data[a].hidden,index:a}}):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;i>n;++n)a=o.getDatasetMeta(n),a.data[r].hidden=!a.data[r].hidden;o.update()}},cutoutPercentage:50,rotation:Math.PI*-.5,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+e.datasets[t.datasetIndex].data[t.index]}}}},n.pie=e.clone(n.doughnut),e.extend(n.pie,{cutoutPercentage:0}),t.controllers.doughnut=t.controllers.pie=t.DatasetController.extend({dataElementType:t.elements.Arc,linkScales:e.noop,getRingIndex:function(t){for(var e=0,n=0;t>n;++n)this.chart.isDatasetVisible(n)&&++e;return e},update:function(t){var n=this,i=n.chart,a=i.chartArea,r=i.options,o=r.elements.arc,s=a.right-a.left-o.borderWidth,l=a.bottom-a.top-o.borderWidth,d=Math.min(s,l),u={x:0,y:0},c=n.getMeta(),h=r.cutoutPercentage,f=r.circumference;if(f<2*Math.PI){var g=r.rotation%(2*Math.PI);g+=2*Math.PI*(g>=Math.PI?-1:g<-Math.PI?1:0);var p=g+f,m={x:Math.cos(g),y:Math.sin(g)},v={x:Math.cos(p),y:Math.sin(p)},b=0>=g&&p>=0||g<=2*Math.PI&&2*Math.PI<=p,y=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,x=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,_=h/100,w={x:x?-1:Math.min(m.x*(m.x<0?1:_),v.x*(v.x<0?1:_)),y:k?-1:Math.min(m.y*(m.y<0?1:_),v.y*(v.y<0?1:_))},S={x:b?1:Math.max(m.x*(m.x>0?1:_),v.x*(v.x>0?1:_)),y:y?1:Math.max(m.y*(m.y>0?1:_),v.y*(v.y>0?1:_))},M={width:.5*(S.x-w.x),height:.5*(S.y-w.y)};d=Math.min(s/M.width,l/M.height),u={x:(S.x+w.x)*-.5,y:(S.y+w.y)*-.5}}i.outerRadius=Math.max(d/2,0),i.innerRadius=Math.max(h?i.outerRadius/100*h:1,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),i.offsetX=u.x*i.outerRadius,i.offsetY=u.y*i.outerRadius,c.total=n.calculateTotal(),n.outerRadius=i.outerRadius-i.radiusLength*n.getRingIndex(n.index),n.innerRadius=n.outerRadius-i.radiusLength,e.each(c.data,function(e,i){n.updateElement(e,i,t)})},updateElement:function(t,n,i){var a=this,r=a.chart,o=r.chartArea,s=r.options,l=s.animation,d=(s.elements.arc,(o.left+o.right)/2),u=(o.top+o.bottom)/2,c=s.rotation,h=s.rotation,f=a.getDataset(),g=i&&l.animateRotate?0:t.hidden?0:a.calculateCircumference(f.data[n])*(s.circumference/(2*Math.PI)),p=i&&l.animateScale?0:a.innerRadius,m=i&&l.animateScale?0:a.outerRadius,v=(t.custom||{},e.getValueAtIndexOrDefault);e.extend(t,{_datasetIndex:a.index,_index:n,_model:{x:d+r.offsetX,y:u+r.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:m,innerRadius:p,label:v(f.label,n,r.data.labels[n])}});var b=t._model;this.removeHoverStyle(t),i&&l.animateRotate||(0===n?b.startAngle=s.rotation:b.startAngle=a.getMeta().data[n-1]._model.endAngle,b.endAngle=b.startAngle+b.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,n=this.getDataset(),i=this.getMeta(),a=0;return e.each(i.data,function(e,i){t=n.data[i],isNaN(t)||e.hidden||(a+=Math.abs(t))}),a},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0}})}},{}],18:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){return n.getValueOrDefault(t.showLine,e.showLines)}var n=t.helpers;t.defaults.line={showLines:!0,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}},t.controllers.line=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,addElementAndReset:function(n){var i=this,a=i.chart.options,r=i.getMeta();t.DatasetController.prototype.addElementAndReset.call(i,n),e(i.getDataset(),a)&&0!==r.dataset._model.tension&&i.updateBezierControlPoints()},update:function(t){var i,a,r,o=this,s=o.getMeta(),l=s.dataset,d=s.data||[],u=o.chart.options,c=u.elements.line,h=o.getScaleForId(s.yAxisID),f=o.getDataset(),g=e(f,u);for(g&&(r=l.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),l._scale=h,l._datasetIndex=o.index,l._children=d,l._model={spanGaps:f.spanGaps?f.spanGaps:!1,tension:r.tension?r.tension:n.getValueOrDefault(f.lineTension,c.tension),backgroundColor:r.backgroundColor?r.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:f.borderWidth||c.borderWidth,borderColor:r.borderColor?r.borderColor:f.borderColor||c.borderColor,borderCapStyle:r.borderCapStyle?r.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:r.borderDash?r.borderDash:f.borderDash||c.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:r.fill?r.fill:void 0!==f.fill?f.fill:c.fill,scaleTop:h.top,scaleBottom:h.bottom,scaleZero:h.getBasePixel()},l.pivot()),i=0,a=d.length;a>i;++i)o.updateElement(d[i],i,t);for(g&&0!==l._model.tension&&o.updateBezierControlPoints(),i=0,a=d.length;a>i;++i)d[i].pivot()},getPointBackgroundColor:function(t,e){var i=this.chart.options.elements.point.backgroundColor,a=this.getDataset(),r=t.custom||{};return r.backgroundColor?i=r.backgroundColor:a.pointBackgroundColor?i=n.getValueAtIndexOrDefault(a.pointBackgroundColor,e,i):a.backgroundColor&&(i=a.backgroundColor),i},getPointBorderColor:function(t,e){var i=this.chart.options.elements.point.borderColor,a=this.getDataset(),r=t.custom||{};return r.borderColor?i=r.borderColor:a.pointBorderColor?i=n.getValueAtIndexOrDefault(a.pointBorderColor,e,i):a.borderColor&&(i=a.borderColor),i},getPointBorderWidth:function(t,e){var i=this.chart.options.elements.point.borderWidth,a=this.getDataset(),r=t.custom||{};return r.borderWidth?i=r.borderWidth:a.pointBorderWidth?i=n.getValueAtIndexOrDefault(a.pointBorderWidth,e,i):a.borderWidth&&(i=a.borderWidth),i},updateElement:function(t,e,i){var a,r,o=this,s=o.getMeta(),l=t.custom||{},d=o.getDataset(),u=o.index,c=d.data[e],h=o.getScaleForId(s.yAxisID),f=o.getScaleForId(s.xAxisID),g=o.chart.options.elements.point;void 0!==d.radius&&void 0===d.pointRadius&&(d.pointRadius=d.radius),void 0!==d.hitRadius&&void 0===d.pointHitRadius&&(d.pointHitRadius=d.hitRadius),a=f.getPixelForValue(c,e,u,o.chart.isCombo),r=i?h.getBasePixel():o.calculatePointY(c,e,u,o.chart.isCombo),t._xScale=f,t._yScale=h,t._datasetIndex=u,t._index=e,t._model={x:a,y:r,skip:l.skip||isNaN(a)||isNaN(r),radius:l.radius||n.getValueAtIndexOrDefault(d.pointRadius,e,g.radius),pointStyle:l.pointStyle||n.getValueAtIndexOrDefault(d.pointStyle,e,g.pointStyle),backgroundColor:o.getPointBackgroundColor(t,e),borderColor:o.getPointBorderColor(t,e),borderWidth:o.getPointBorderWidth(t,e),tension:s.dataset._model?s.dataset._model.tension:0,hitRadius:l.hitRadius||n.getValueAtIndexOrDefault(d.pointHitRadius,e,g.hitRadius)}},calculatePointY:function(t,e,n,i){var a,r,o,s=this,l=s.chart,d=s.getMeta(),u=s.getScaleForId(d.yAxisID),c=0,h=0;if(u.options.stacked){for(a=0;n>a;a++)r=l.data.datasets[a],o=l.getDatasetMeta(a),"line"===o.type&&l.isDatasetVisible(a)&&(r.data[e]<0?h+=r.data[e]||0:c+=r.data[e]||0);return 0>t?u.getPixelForValue(h+t):u.getPixelForValue(c+t)}return u.getPixelForValue(t)},updateBezierControlPoints:function(){var t,e,i,a,r,o=this.getMeta(),s=(this.chart.chartArea,o.data||[]);for(t=0,e=s.length;e>t;++t)i=s[t],a=i._model,r=n.splineCurve(n.previousItem(s,t)._model,a,n.nextItem(s,t)._model,o.dataset._model.tension),a.controlPointPreviousX=r.previous.x,a.controlPointPreviousY=r.previous.y,a.controlPointNextX=r.next.x,a.controlPointNextY=r.next.y},draw:function(t){var n,i,a=this,r=a.getMeta(),o=r.data||[],s=t||1;for(n=0,i=o.length;i>n;++n)o[n].transition(s);for(e(a.getDataset(),a.chart.options)&&r.dataset.transition(s).draw(),n=0,i=o.length;i>n;++n)o[n].draw()},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t._index,a=t.custom||{},r=t._model;r.radius=a.hoverRadius||n.getValueAtIndexOrDefault(e.pointHoverRadius,i,this.chart.options.elements.point.hoverRadius),r.backgroundColor=a.hoverBackgroundColor||n.getValueAtIndexOrDefault(e.pointHoverBackgroundColor,i,n.getHoverColor(r.backgroundColor)),r.borderColor=a.hoverBorderColor||n.getValueAtIndexOrDefault(e.pointHoverBorderColor,i,n.getHoverColor(r.borderColor)),r.borderWidth=a.hoverBorderWidth||n.getValueAtIndexOrDefault(e.pointHoverBorderWidth,i,r.borderWidth)},removeHoverStyle:function(t){var e=this,i=e.chart.data.datasets[t._datasetIndex],a=t._index,r=t.custom||{},o=t._model;void 0!==i.radius&&void 0===i.pointRadius&&(i.pointRadius=i.radius),o.radius=r.radius||n.getValueAtIndexOrDefault(i.pointRadius,a,e.chart.options.elements.point.radius),o.backgroundColor=e.getPointBackgroundColor(t,a),o.borderColor=e.getPointBorderColor(t,a),o.borderWidth=e.getPointBorderWidth(t,a)}})}},{}],19:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.polarArea={scale:{type:"radialLinear",lineArc:!0},animation:{animateRotate:!0,animateScale:!0},aspectRatio:1,legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var r=0;r<i[0].data.length;++r)e.push('<li><span style="background-color:'+i[0].backgroundColor[r]+'">'),a[r]&&e.push(a[r]),e.push("</span></li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var n=t.data;return n.labels.length&&n.datasets.length?n.labels.map(function(i,a){var r=t.getDatasetMeta(0),o=n.datasets[0],s=r.data[a],l=s.custom||{},d=e.getValueAtIndexOrDefault,u=t.options.elements.arc,c=l.backgroundColor?l.backgroundColor:d(o.backgroundColor,a,u.backgroundColor),h=l.borderColor?l.borderColor:d(o.borderColor,a,u.borderColor),f=l.borderWidth?l.borderWidth:d(o.borderWidth,a,u.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(o.data[a])||r.data[a].hidden,index:a}}):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;i>n;++n)a=o.getDatasetMeta(n),a.data[r].hidden=!a.data[r].hidden;o.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}},t.controllers.polarArea=t.DatasetController.extend({dataElementType:t.elements.Arc,linkScales:e.noop,update:function(t){var n=this,i=n.chart,a=i.chartArea,r=n.getMeta(),o=i.options,s=o.elements.arc,l=Math.min(a.right-a.left,a.bottom-a.top);i.outerRadius=Math.max((l-s.borderWidth/2)/2,0),i.innerRadius=Math.max(o.cutoutPercentage?i.outerRadius/100*o.cutoutPercentage:1,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),n.outerRadius=i.outerRadius-i.radiusLength*n.index,n.innerRadius=n.outerRadius-i.radiusLength,r.count=n.countVisibleElements(),e.each(r.data,function(e,i){n.updateElement(e,i,t)})},updateElement:function(t,n,i){for(var a=this,r=a.chart,o=r.chartArea,s=a.getDataset(),l=r.options,d=l.animation,u=(l.elements.arc,t.custom||{},r.scale),c=e.getValueAtIndexOrDefault,h=r.data.labels,f=a.calculateCircumference(s.data[n]),g=(o.left+o.right)/2,p=(o.top+o.bottom)/2,m=0,v=a.getMeta(),b=0;n>b;++b)isNaN(s.data[b])||v.data[b].hidden||++m;var y=-.5*Math.PI,x=t.hidden?0:u.getDistanceFromCenterForValue(s.data[n]),k=y+f*m,_=k+(t.hidden?0:f),w=d.animateScale?0:u.getDistanceFromCenterForValue(s.data[n]);e.extend(t,{_datasetIndex:a.index,_index:n,_scale:u,_model:{x:g,y:p,innerRadius:0,outerRadius:i?w:x,startAngle:i&&d.animateRotate?y:k,endAngle:i&&d.animateRotate?y:_,label:c(h,n,h[n])}}),a.removeHoverStyle(t),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},countVisibleElements:function(){var t=this.getDataset(),n=this.getMeta(),i=0;return e.each(n.data,function(e,n){isNaN(t.data[n])||e.hidden||i++}),i},calculateCircumference:function(t){var e=this.getMeta().count;return e>0&&!isNaN(t)?2*Math.PI/e:0}})}},{}],20:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.radar={scale:{type:"radialLinear"},elements:{line:{tension:0}}},t.controllers.radar=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,linkScales:e.noop,addElementAndReset:function(e){t.DatasetController.prototype.addElementAndReset.call(this,e),this.updateBezierControlPoints()},update:function(t){var n=this,i=n.getMeta(),a=i.dataset,r=i.data,o=a.custom||{},s=n.getDataset(),l=n.chart.options.elements.line,d=n.chart.scale;void 0!==s.tension&&void 0===s.lineTension&&(s.lineTension=s.tension),e.extend(i.dataset,{_datasetIndex:n.index,_children:r,_loop:!0,
+_model:{tension:o.tension?o.tension:e.getValueOrDefault(s.lineTension,l.tension),backgroundColor:o.backgroundColor?o.backgroundColor:s.backgroundColor||l.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:s.borderWidth||l.borderWidth,borderColor:o.borderColor?o.borderColor:s.borderColor||l.borderColor,fill:o.fill?o.fill:void 0!==s.fill?s.fill:l.fill,borderCapStyle:o.borderCapStyle?o.borderCapStyle:s.borderCapStyle||l.borderCapStyle,borderDash:o.borderDash?o.borderDash:s.borderDash||l.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:s.borderDashOffset||l.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:s.borderJoinStyle||l.borderJoinStyle,scaleTop:d.top,scaleBottom:d.bottom,scaleZero:d.getBasePosition()}}),i.dataset.pivot(),e.each(r,function(e,i){n.updateElement(e,i,t)},n),n.updateBezierControlPoints()},updateElement:function(t,n,i){var a=this,r=t.custom||{},o=a.getDataset(),s=a.chart.scale,l=a.chart.options.elements.point,d=s.getPointPositionForValue(n,o.data[n]);e.extend(t,{_datasetIndex:a.index,_index:n,_scale:s,_model:{x:i?s.xCenter:d.x,y:i?s.yCenter:d.y,tension:r.tension?r.tension:e.getValueOrDefault(o.tension,a.chart.options.elements.line.tension),radius:r.radius?r.radius:e.getValueAtIndexOrDefault(o.pointRadius,n,l.radius),backgroundColor:r.backgroundColor?r.backgroundColor:e.getValueAtIndexOrDefault(o.pointBackgroundColor,n,l.backgroundColor),borderColor:r.borderColor?r.borderColor:e.getValueAtIndexOrDefault(o.pointBorderColor,n,l.borderColor),borderWidth:r.borderWidth?r.borderWidth:e.getValueAtIndexOrDefault(o.pointBorderWidth,n,l.borderWidth),pointStyle:r.pointStyle?r.pointStyle:e.getValueAtIndexOrDefault(o.pointStyle,n,l.pointStyle),hitRadius:r.hitRadius?r.hitRadius:e.getValueAtIndexOrDefault(o.hitRadius,n,l.hitRadius)}}),t._model.skip=r.skip?r.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,n=this.getMeta();e.each(n.data,function(i,a){var r=i._model,o=e.splineCurve(e.previousItem(n.data,a,!0)._model,r,e.nextItem(n.data,a,!0)._model,r.tension);r.controlPointPreviousX=Math.max(Math.min(o.previous.x,t.right),t.left),r.controlPointPreviousY=Math.max(Math.min(o.previous.y,t.bottom),t.top),r.controlPointNextX=Math.max(Math.min(o.next.x,t.right),t.left),r.controlPointNextY=Math.max(Math.min(o.next.y,t.bottom),t.top),i.pivot()})},draw:function(t){var n=this.getMeta(),i=t||1;e.each(n.data,function(t,e){t.transition(i)}),n.dataset.transition(i).draw(),e.each(n.data,function(t){t.draw()})},setHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},a=t._index,r=t._model;r.radius=i.hoverRadius?i.hoverRadius:e.getValueAtIndexOrDefault(n.pointHoverRadius,a,this.chart.options.elements.point.hoverRadius),r.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:e.getValueAtIndexOrDefault(n.pointHoverBackgroundColor,a,e.getHoverColor(r.backgroundColor)),r.borderColor=i.hoverBorderColor?i.hoverBorderColor:e.getValueAtIndexOrDefault(n.pointHoverBorderColor,a,e.getHoverColor(r.borderColor)),r.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:e.getValueAtIndexOrDefault(n.pointHoverBorderWidth,a,r.borderWidth)},removeHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},a=t._index,r=t._model,o=this.chart.options.elements.point;r.radius=i.radius?i.radius:e.getValueAtIndexOrDefault(n.radius,a,o.radius),r.backgroundColor=i.backgroundColor?i.backgroundColor:e.getValueAtIndexOrDefault(n.pointBackgroundColor,a,o.backgroundColor),r.borderColor=i.borderColor?i.borderColor:e.getValueAtIndexOrDefault(n.pointBorderColor,a,o.borderColor),r.borderWidth=i.borderWidth?i.borderWidth:e.getValueAtIndexOrDefault(n.pointBorderWidth,a,o.borderWidth)}})}},{}],21:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.animation={duration:1e3,easing:"easeOutQuart",onProgress:e.noop,onComplete:e.noop},t.Animation=t.Element.extend({currentStep:null,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,n,i){var a=this;i||(t.animating=!0);for(var r=0;r<a.animations.length;++r)if(a.animations[r].chartInstance===t)return void(a.animations[r].animationObject=e);a.animations.push({chartInstance:t,animationObject:e}),1===a.animations.length&&a.requestAnimationFrame()},cancelAnimation:function(t){var n=e.findIndex(this.animations,function(e){return e.chartInstance===t});-1!==n&&(this.animations.splice(n,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=e.requestAnimFrame.call(window,function(){t.request=null,t.startDigest()}))},startDigest:function(){var t=this,e=Date.now(),n=0;t.dropFrames>1&&(n=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1);for(var i=0;i<t.animations.length;)null===t.animations[i].animationObject.currentStep&&(t.animations[i].animationObject.currentStep=0),t.animations[i].animationObject.currentStep+=1+n,t.animations[i].animationObject.currentStep>t.animations[i].animationObject.numSteps&&(t.animations[i].animationObject.currentStep=t.animations[i].animationObject.numSteps),t.animations[i].animationObject.render(t.animations[i].chartInstance,t.animations[i].animationObject),t.animations[i].animationObject.onAnimationProgress&&t.animations[i].animationObject.onAnimationProgress.call&&t.animations[i].animationObject.onAnimationProgress.call(t.animations[i].chartInstance,t.animations[i]),t.animations[i].animationObject.currentStep===t.animations[i].animationObject.numSteps?(t.animations[i].animationObject.onAnimationComplete&&t.animations[i].animationObject.onAnimationComplete.call&&t.animations[i].animationObject.onAnimationComplete.call(t.animations[i].chartInstance,t.animations[i]),t.animations[i].chartInstance.animating=!1,t.animations.splice(i,1)):++i;var a=Date.now(),r=(a-e)/t.frameDuration;t.dropFrames+=r,t.animations.length>0&&t.requestAnimationFrame()}}}},{}],22:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.types={},t.instances={},t.controllers={},t.Controller=function(n){return this.chart=n,this.config=n.config,this.options=this.config.options=e.configMerge(t.defaults.global,t.defaults[this.config.type],this.config.options||{}),this.id=e.uid(),Object.defineProperty(this,"data",{get:function(){return this.config.data}}),t.instances[this.id]=this,this.options.responsive&&this.resize(!0),this.initialize(),this},e.extend(t.Controller.prototype,{initialize:function(){var e=this;return t.plugins.notify("beforeInit",[e]),e.bindEvents(),e.ensureScalesHaveIDs(),e.buildOrUpdateControllers(),e.buildScales(),e.updateLayout(),e.resetElements(),e.initToolTip(),e.update(),t.plugins.notify("afterInit",[e]),e},clear:function(){return e.clear(this.chart),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(n){var i=this,a=i.chart,r=a.canvas,o=e.getMaximumWidth(r),s=a.aspectRatio,l=i.options.maintainAspectRatio&&isNaN(s)===!1&&isFinite(s)&&0!==s?o/s:e.getMaximumHeight(r),d=a.width!==o||a.height!==l;if(!d)return i;r.width=a.width=o,r.height=a.height=l,e.retinaScale(a);var u={width:o,height:l};return t.plugins.notify("resize",[i,u]),i.options.onResize&&i.options.onResize(i,u),n||(i.stop(),i.update(i.options.responsiveAnimationDuration)),i},ensureScalesHaveIDs:function(){var t=this.options,n=t.scales||{},i=t.scale;e.each(n.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),e.each(n.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),i&&(i.id=i.id||"scale")},buildScales:function(){var n=this,i=n.options,a=n.scales={},r=[];i.scales&&(r=r.concat((i.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category"}}),(i.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear"}}))),i.scale&&r.push({options:i.scale,dtype:"radialLinear",isDefault:!0}),e.each(r,function(i,r){var o=i.options,s=e.getValueOrDefault(o.type,i.dtype),l=t.scaleService.getScaleConstructor(s);if(l){var d=new l({id:o.id,options:o,ctx:n.chart.ctx,chart:n});a[d.id]=d,i.isDefault&&(n.scale=d)}}),t.scaleService.addScalesToLayout(this)},updateLayout:function(){t.layoutService.update(this,this.chart.width,this.chart.height)},buildOrUpdateControllers:function(){var n=this,i=[],a=[];if(e.each(n.data.datasets,function(e,r){var o=n.getDatasetMeta(r);o.type||(o.type=e.type||n.config.type),i.push(o.type),o.controller?o.controller.updateIndex(r):(o.controller=new t.controllers[o.type](n,r),a.push(o.controller))},n),i.length>1)for(var r=1;r<i.length;r++)if(i[r]!==i[r-1]){n.isCombo=!0;break}return a},resetElements:function(){var t=this;e.each(t.data.datasets,function(e,n){t.getDatasetMeta(n).controller.reset()},t)},update:function(n,i){var a=this;t.plugins.notify("beforeUpdate",[a]),a.tooltip._data=a.data;var r=a.buildOrUpdateControllers();e.each(a.data.datasets,function(t,e){a.getDatasetMeta(e).controller.buildOrUpdateElements()},a),t.layoutService.update(a,a.chart.width,a.chart.height),t.plugins.notify("afterScaleUpdate",[a]),e.each(r,function(t){t.reset()}),a.updateDatasets(),t.plugins.notify("afterUpdate",[a]),a.render(n,i)},updateDatasets:function(){var e,n,i=this;if(t.plugins.notify("beforeDatasetsUpdate",[i])){for(e=0,n=i.data.datasets.length;n>e;++e)i.getDatasetMeta(e).controller.update();t.plugins.notify("afterDatasetsUpdate",[i])}},render:function(n,i){var a=this;t.plugins.notify("beforeRender",[a]);var r=a.options.animation;if(r&&("undefined"!=typeof n&&0!==n||"undefined"==typeof n&&0!==r.duration)){var o=new t.Animation;o.numSteps=(n||r.duration)/16.66,o.easing=r.easing,o.render=function(t,n){var i=e.easingEffects[n.easing],a=n.currentStep/n.numSteps,r=i(a);t.draw(r,a,n.currentStep)},o.onAnimationProgress=r.onProgress,o.onAnimationComplete=r.onComplete,t.animationService.addAnimation(a,o,n,i)}else a.draw(),r&&r.onComplete&&r.onComplete.call&&r.onComplete.call(a);return a},draw:function(n){var i=this,a=n||1;i.clear(),t.plugins.notify("beforeDraw",[i,a]),e.each(i.boxes,function(t){t.draw(i.chartArea)},i),i.scale&&i.scale.draw(),t.plugins.notify("beforeDatasetsDraw",[i,a]),e.each(i.data.datasets,function(t,e){i.isDatasetVisible(e)&&i.getDatasetMeta(e).controller.draw(n)},i,!0),t.plugins.notify("afterDatasetsDraw",[i,a]),i.tooltip.transition(a).draw(),t.plugins.notify("afterDraw",[i,a])},getElementAtEvent:function(t){var n=this,i=e.getRelativePosition(t,n.chart),a=[];return e.each(n.data.datasets,function(t,r){if(n.isDatasetVisible(r)){var o=n.getDatasetMeta(r);e.each(o.data,function(t,e){return t.inRange(i.x,i.y)?(a.push(t),a):void 0})}}),a},getElementsAtEvent:function(t){var n=this,i=e.getRelativePosition(t,n.chart),a=[],r=function(){if(n.data.datasets)for(var t=0;t<n.data.datasets.length;t++){var e=n.getDatasetMeta(t);if(n.isDatasetVisible(t))for(var a=0;a<e.data.length;a++)if(e.data[a].inRange(i.x,i.y))return e.data[a]}}.call(n);return r?(e.each(n.data.datasets,function(t,e){if(n.isDatasetVisible(e)){var i=n.getDatasetMeta(e);a.push(i.data[r._index])}},n),a):a},getElementsAtEventForMode:function(t,e){var n=this;switch(e){case"single":return n.getElementAtEvent(t);case"label":return n.getElementsAtEvent(t);case"dataset":return n.getDatasetAtEvent(t);default:return t}},getDatasetAtEvent:function(t){var e=this.getElementAtEvent(t);return e.length>0&&(e=this.getDatasetMeta(e[0]._datasetIndex).data),e},getDatasetMeta:function(t){var e=this,n=e.data.datasets[t];n._meta||(n._meta={});var i=n._meta[e.id];return i||(i=n._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;n>e;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroy:function(){var n=this;n.stop(),n.clear(),e.unbindEvents(n,n.events),e.removeResizeListener(n.chart.canvas.parentNode);var i=n.chart.canvas;i.width=n.chart.width,i.height=n.chart.height,void 0!==n.chart.originalDevicePixelRatio&&n.chart.ctx.scale(1/n.chart.originalDevicePixelRatio,1/n.chart.originalDevicePixelRatio),i.style.width=n.chart.originalCanvasStyleWidth,i.style.height=n.chart.originalCanvasStyleHeight,t.plugins.notify("destroy",[n]),delete t.instances[n.id]},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)},initToolTip:function(){var e=this;e.tooltip=new t.Tooltip({_chart:e.chart,_chartInstance:e,_data:e.data,_options:e.options.tooltips},e)},bindEvents:function(){var t=this;e.bindEvents(t,t.options.events,function(e){t.eventHandler(e)})},updateHoverStyle:function(t,e,n){var i,a,r,o=n?"setHoverStyle":"removeHoverStyle";switch(e){case"single":t=[t[0]];break;case"label":case"dataset":break;default:return}for(a=0,r=t.length;r>a;++a)i=t[a],i&&this.getDatasetMeta(i._datasetIndex).controller[o](i)},eventHandler:function(t){var n=this,i=n.tooltip,a=n.options||{},r=a.hover,o=a.tooltips;return n.lastActive=n.lastActive||[],n.lastTooltipActive=n.lastTooltipActive||[],"mouseout"===t.type?(n.active=[],n.tooltipActive=[]):(n.active=n.getElementsAtEventForMode(t,r.mode),n.tooltipActive=n.getElementsAtEventForMode(t,o.mode)),r.onHover&&r.onHover.call(n,n.active),("mouseup"===t.type||"click"===t.type)&&(a.onClick&&a.onClick.call(n,t,n.active),n.legend&&n.legend.handleEvent&&n.legend.handleEvent(t)),n.lastActive.length&&n.updateHoverStyle(n.lastActive,r.mode,!1),n.active.length&&r.mode&&n.updateHoverStyle(n.active,r.mode,!0),(o.enabled||o.custom)&&(i.initialize(),i._active=n.tooltipActive,i.update(!0)),i.pivot(),n.animating||e.arrayEquals(n.active,n.lastActive)&&e.arrayEquals(n.tooltipActive,n.lastTooltipActive)||(n.stop(),(o.enabled||o.custom)&&i.update(!0),n.render(r.animationDuration,!0)),n.lastActive=n.active,n.lastTooltipActive=n.tooltipActive,n}})}},{}],23:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=e.noop;t.DatasetController=function(t,e){this.initialize.call(this,t,e)},e.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),n=t.getDataset();null===e.xAxisID&&(e.xAxisID=n.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=n.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,n=e.dataElementType;return n&&new n({_chart:e.chart.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,n=this,i=n.getMeta(),a=n.getDataset().data||[],r=i.data;for(t=0,e=a.length;e>t;++t)r[t]=r[t]||n.createMetaData(i,t);i.dataset=i.dataset||n.createMetaDataset()},addElementAndReset:function(t){var e=this,n=e.createMetaData(t);e.getMeta().data.splice(t,0,n),e.updateElement(n,t,!0)},buildOrUpdateElements:function(){var t=this.getMeta(),e=t.data,n=this.getDataset().data.length,i=e.length;if(i>n)e.splice(n,i-n);else if(n>i)for(var a=i;n>a;++a)this.addElementAndReset(a)},update:n,draw:function(t){var n=t||1;e.each(this.getMeta().data,function(t,e){t.transition(n).draw()})},removeHoverStyle:function(t,n){var i=this.chart.data.datasets[t._datasetIndex],a=t._index,r=t.custom||{},o=e.getValueAtIndexOrDefault,s=(e.color,t._model);s.backgroundColor=r.backgroundColor?r.backgroundColor:o(i.backgroundColor,a,n.backgroundColor),s.borderColor=r.borderColor?r.borderColor:o(i.borderColor,a,n.borderColor),s.borderWidth=r.borderWidth?r.borderWidth:o(i.borderWidth,a,n.borderWidth)},setHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t._index,a=t.custom||{},r=e.getValueAtIndexOrDefault,o=(e.color,e.getHoverColor),s=t._model;s.backgroundColor=a.hoverBackgroundColor?a.hoverBackgroundColor:r(n.hoverBackgroundColor,i,o(s.backgroundColor)),s.borderColor=a.hoverBorderColor?a.hoverBorderColor:r(n.hoverBorderColor,i,o(s.borderColor)),s.borderWidth=a.hoverBorderWidth?a.hoverBorderWidth:r(n.hoverBorderWidth,i,s.borderWidth)}}),t.DatasetController.extend=e.inherits}},{}],24:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.elements={},t.Element=function(t){e.extend(this,t),this.initialize.apply(this,arguments)},e.extend(t.Element.prototype,{initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=e.clone(t._model)),t._start=e.clone(t._view),t},transition:function(t){var n=this;return n._view||(n._view=e.clone(n._model)),1===t?(n._view=n._model,n._start=null,n):(n._start||n.pivot(),e.each(n._model,function(i,a){if("_"===a[0]);else if(n._view.hasOwnProperty(a))if(i===n._view[a]);else if("string"==typeof i)try{var r=e.color(n._model[a]).mix(e.color(n._start[a]),t);n._view[a]=r.rgbString()}catch(o){n._view[a]=i}else if("number"==typeof i){var s=void 0!==n._start[a]&&isNaN(n._start[a])===!1?n._start[a]:0;n._view[a]=(n._model[a]-s)*t+s}else n._view[a]=i;else"number"!=typeof i||isNaN(n._view[a])?n._view[a]=i:n._view[a]=i*t},n),n)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return e.isNumber(this._model.x)&&e.isNumber(this._model.y)}}),t.Element.extend=e.inherits}},{}],25:[function(t,e,n){"use strict";var i=t(2);e.exports=function(t){function e(t,e,n){var i;return"string"==typeof t?(i=parseInt(t,10),-1!=t.indexOf("%")&&(i=i/100*e.parentNode[n])):i=t,i}function n(t){return void 0!==t&&null!==t&&"none"!==t}function a(t,i,a){var r=document.defaultView,o=t.parentNode,s=r.getComputedStyle(t)[i],l=r.getComputedStyle(o)[i],d=n(s),u=n(l),c=Number.POSITIVE_INFINITY;return d||u?Math.min(d?e(s,t,a):c,u?e(l,o,a):c):"none"}var r=t.helpers={};r.each=function(t,e,n,i){var a,o;if(r.isArray(t))if(o=t.length,i)for(a=o-1;a>=0;a--)e.call(n,t[a],a);else for(a=0;o>a;a++)e.call(n,t[a],a);else if("object"==typeof t){var s=Object.keys(t);for(o=s.length,a=0;o>a;a++)e.call(n,t[s[a]],s[a])}},r.clone=function(t){var e={};return r.each(t,function(t,n){r.isArray(t)?e[n]=t.slice(0):"object"==typeof t&&null!==t?e[n]=r.clone(t):e[n]=t}),e},r.extend=function(t){for(var e=function(e,n){t[n]=e},n=1,i=arguments.length;i>n;n++)r.each(arguments[n],e);return t},r.configMerge=function(e){var n=r.clone(e);return r.each(Array.prototype.slice.call(arguments,1),function(e){r.each(e,function(e,i){if("scales"===i)n[i]=r.scaleMerge(n.hasOwnProperty(i)?n[i]:{},e);else if("scale"===i)n[i]=r.configMerge(n.hasOwnProperty(i)?n[i]:{},t.scaleService.getScaleDefaults(e.type),e);else if(n.hasOwnProperty(i)&&r.isArray(n[i])&&r.isArray(e)){var a=n[i];r.each(e,function(t,e){e<a.length?"object"==typeof a[e]&&null!==a[e]&&"object"==typeof t&&null!==t?a[e]=r.configMerge(a[e],t):a[e]=t:a.push(t)})}else n.hasOwnProperty(i)&&"object"==typeof n[i]&&null!==n[i]&&"object"==typeof e?n[i]=r.configMerge(n[i],e):n[i]=e})}),n},r.scaleMerge=function(e,n){var i=r.clone(e);return r.each(n,function(e,n){"xAxes"===n||"yAxes"===n?i.hasOwnProperty(n)?r.each(e,function(e,a){var o=r.getValueOrDefault(e.type,"xAxes"===n?"category":"linear"),s=t.scaleService.getScaleDefaults(o);a>=i[n].length||!i[n][a].type?i[n].push(r.configMerge(s,e)):e.type&&e.type!==i[n][a].type?i[n][a]=r.configMerge(i[n][a],s,e):i[n][a]=r.configMerge(i[n][a],e)}):(i[n]=[],r.each(e,function(e){var a=r.getValueOrDefault(e.type,"xAxes"===n?"category":"linear");i[n].push(r.configMerge(t.scaleService.getScaleDefaults(a),e))})):i.hasOwnProperty(n)&&"object"==typeof i[n]&&null!==i[n]&&"object"==typeof e?i[n]=r.configMerge(i[n],e):i[n]=e}),i},r.getValueAtIndexOrDefault=function(t,e,n){return void 0===t||null===t?n:r.isArray(t)?e<t.length?t[e]:n:t},r.getValueOrDefault=function(t,e){return void 0===t?e:t},r.indexOf=Array.prototype.indexOf?function(t,e){return t.indexOf(e)}:function(t,e){for(var n=0,i=t.length;i>n;++n)if(t[n]===e)return n;return-1},r.where=function(t,e){if(r.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return r.each(t,function(t){e(t)&&n.push(t)}),n},r.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;a>i;++i)if(e.call(n,t[i],i,t))return i;return-1},r.findNextWhere=function(t,e,n){(void 0===n||null===n)&&(n=-1);for(var i=n+1;i<t.length;i++){var a=t[i];if(e(a))return a}},r.findPreviousWhere=function(t,e,n){(void 0===n||null===n)&&(n=t.length);for(var i=n-1;i>=0;i--){var a=t[i];if(e(a))return a}},r.inherits=function(t){var e=this,n=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=n};return i.prototype=e.prototype,n.prototype=new i,n.extend=r.inherits,t&&r.extend(n.prototype,t),n.__super__=e.prototype,n},r.noop=function(){},r.uid=function(){var t=0;return function(){return t++}}(),r.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},r.almostEquals=function(t,e,n){return Math.abs(t-e)<n},r.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},r.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},r.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return t=+t,0===t||isNaN(t)?t:t>0?1:-1},r.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},r.toRadians=function(t){return t*(Math.PI/180)},r.toDegrees=function(t){return t*(180/Math.PI)},r.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),r=Math.atan2(i,n);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},r.aliasPixel=function(t){return t%2===0?0:.5},r.splineCurve=function(t,e,n,i){var a=t.skip?e:t,r=e,o=n.skip?e:n,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),d=s/(s+l),u=l/(s+l);d=isNaN(d)?0:d,u=isNaN(u)?0:u;var c=i*d,h=i*u;return{previous:{x:r.x-c*(o.x-a.x),y:r.y-c*(o.y-a.y)},next:{x:r.x+h*(o.x-a.x),y:r.y+h*(o.y-a.y)}}},r.nextItem=function(t,e,n){return n?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},r.previousItem=function(t,e,n){return n?0>=e?t[t.length-1]:t[e-1]:0>=e?t[0]:t[e-1]},r.niceNum=function(t,e){var n,i=Math.floor(r.log10(t)),a=t/Math.pow(10,i);return n=e?1.5>a?1:3>a?2:7>a?5:10:1>=a?1:2>=a?2:5>=a?5:10,n*Math.pow(10,i)};var o=r.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===(t/=1)?1:(n||(n=.3),i<Math.abs(1)?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-(i*Math.pow(2,10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/n)))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===(t/=1)?1:(n||(n=.3),i<Math.abs(1)?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((1*t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2===(t/=.5)?1:(n||(n=1*(.3*1.5)),i<Math.abs(1)?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),1>t?-.5*(i*Math.pow(2,10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/n)):i*Math.pow(2,-10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return 1*(t/=1)*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return 1*((t=t/1-1)*t*((e+1)*t+e)+1)},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?.5*(t*t*(((e*=1.525)+1)*t-e)):.5*((t-=2)*t*(((e*=1.525)+1)*t+e)+2)},easeInBounce:function(t){return 1-o.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?1*(7.5625*t*t):2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*o.easeInBounce(2*t):.5*o.easeOutBounce(2*t-1)+.5}};r.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),r.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),r.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,o=t.currentTarget||t.srcElement,s=o.getBoundingClientRect(),l=a.touches;l&&l.length>0?(n=l[0].clientX,i=l[0].clientY):(n=a.clientX,i=a.clientY);var d=parseFloat(r.getStyle(o,"padding-left")),u=parseFloat(r.getStyle(o,"padding-top")),c=parseFloat(r.getStyle(o,"padding-right")),h=parseFloat(r.getStyle(o,"padding-bottom")),f=s.right-s.left-d-c,g=s.bottom-s.top-u-h;return n=Math.round((n-s.left-d)/f*o.width/e.currentDevicePixelRatio),i=Math.round((i-s.top-u)/g*o.height/e.currentDevicePixelRatio),{x:n,y:i}},r.addEvent=function(t,e,n){t.addEventListener?t.addEventListener(e,n):t.attachEvent?t.attachEvent("on"+e,n):t["on"+e]=n},r.removeEvent=function(t,e,n){t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent?t.detachEvent("on"+e,n):t["on"+e]=r.noop},r.bindEvents=function(t,e,n){var i=t.events=t.events||{};r.each(e,function(e){i[e]=function(){n.apply(t,arguments)},r.addEvent(t.chart.canvas,e,i[e])})},r.unbindEvents=function(t,e){var n=t.chart.canvas;r.each(e,function(t,e){r.removeEvent(n,e,t)})},r.getConstraintWidth=function(t){return a(t,"max-width","clientWidth")},r.getConstraintHeight=function(t){return a(t,"max-height","clientHeight")},r.getMaximumWidth=function(t){var e=t.parentNode,n=parseInt(r.getStyle(e,"padding-left"))+parseInt(r.getStyle(e,"padding-right")),i=e.clientWidth-n,a=r.getConstraintWidth(t);return isNaN(a)?i:Math.min(i,a)},r.getMaximumHeight=function(t){var e=t.parentNode,n=parseInt(r.getStyle(e,"padding-top"))+parseInt(r.getStyle(e,"padding-bottom")),i=e.clientHeight-n,a=r.getConstraintHeight(t);return isNaN(a)?i:Math.min(i,a)},r.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},r.retinaScale=function(t){var e=t.ctx,n=t.canvas,i=n.width,a=n.height,r=t.currentDevicePixelRatio=window.devicePixelRatio||1;1!==r&&(n.height=a*r,n.width=i*r,e.scale(r,r),t.originalDevicePixelRatio=t.originalDevicePixelRatio||r),n.style.width=i+"px",n.style.height=a+"px"},r.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},r.fontString=function(t,e,n){return e+" "+t+"px "+n},r.longestText=function(t,e,n,i){i=i||{};var a=i.data=i.data||{},o=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},o=i.garbageCollect=[],i.font=e),t.font=e;var s=0;r.each(n,function(e){void 0!==e&&null!==e&&r.isArray(e)!==!0?s=r.measureText(t,a,o,s,e):r.isArray(e)&&r.each(e,function(e){void 0===e||null===e||r.isArray(e)||(s=r.measureText(t,a,o,s,e))})});var l=o.length/2;if(l>n.length){for(var d=0;l>d;d++)delete a[o[d]];o.splice(0,l)}return s},r.measureText=function(t,e,n,i,a){var r=e[a];return r||(r=e[a]=t.measureText(a).width,n.push(a)),r>i&&(i=r),i},r.numberOfLabelLines=function(t){var e=1;return r.each(t,function(t){r.isArray(t)&&t.length>e&&(e=t.length)}),e},r.drawRoundedRectangle=function(t,e,n,i,a,r){t.beginPath(),t.moveTo(e+r,n),t.lineTo(e+i-r,n),t.quadraticCurveTo(e+i,n,e+i,n+r),t.lineTo(e+i,n+a-r),t.quadraticCurveTo(e+i,n+a,e+i-r,n+a),t.lineTo(e+r,n+a),t.quadraticCurveTo(e,n+a,e,n+a-r),t.lineTo(e,n+r),t.quadraticCurveTo(e,n,e+r,n),t.closePath()},r.color=function(e){return i?i(e instanceof CanvasGradient?t.defaults.global.defaultColor:e):(console.log("Color.js not found!"),e)},r.addResizeListener=function(t,e){var n=document.createElement("iframe"),i="chartjs-hidden-iframe";n.classlist?n.classlist.add(i):n.setAttribute("class",i);var a=n.style;a.width="100%",a.display="block",a.border=0,a.height=0,a.margin=0,a.position="absolute",a.left=0,a.right=0,a.top=0,a.bottom=0,t.insertBefore(n,t.firstChild),(n.contentWindow||n).onresize=function(){e&&e()}},r.removeResizeListener=function(t){var e=t.querySelector(".chartjs-hidden-iframe");e&&e.parentNode.removeChild(e)},r.isArray=Array.isArray?function(t){return Array.isArray(t)}:function(t){return"[object Array]"===Object.prototype.toString.call(t)},r.arrayEquals=function(t,e){var n,i,a,o;if(!t||!e||t.length!=e.length)return!1;for(n=0,i=t.length;i>n;++n)if(a=t[n],o=e[n],a instanceof Array&&o instanceof Array){if(!r.arrayEquals(a,o))return!1}else if(a!=o)return!1;return!0},r.callCallback=function(t,e,n){t&&"function"==typeof t.call&&t.apply(n,e)},r.getHoverColor=function(t){return t instanceof CanvasPattern?t:r.color(t).saturate(.5).darken(.1).rgbString()}}},{2:2}],26:[function(t,e,n){"use strict";e.exports=function(){var t=function(e,n){var i=this,a=t.helpers;return i.config=n,e.length&&e[0].getContext&&(e=e[0]),e.getContext&&(e=e.getContext("2d")),i.ctx=e,i.canvas=e.canvas,e.canvas.style.display=e.canvas.style.display||"block",i.width=e.canvas.width||parseInt(a.getStyle(e.canvas,"width"),10)||a.getMaximumWidth(e.canvas),i.height=e.canvas.height||parseInt(a.getStyle(e.canvas,"height"),10)||a.getMaximumHeight(e.canvas),i.aspectRatio=i.width/i.height,(isNaN(i.aspectRatio)||isFinite(i.aspectRatio)===!1)&&(i.aspectRatio=void 0!==n.aspectRatio?n.aspectRatio:2),i.originalCanvasStyleWidth=e.canvas.style.width,i.originalCanvasStyleHeight=e.canvas.style.height,a.retinaScale(i),n&&(i.controller=new t.Controller(i)),a.addResizeListener(e.canvas.parentNode,function(){i.controller&&i.controller.config.options.responsive&&i.controller.resize()}),i.controller?i.controller:i};return t.defaults={global:{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"single",animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');for(var n=0;n<t.data.datasets.length;n++)e.push('<li><span style="background-color:'+t.data.datasets[n].backgroundColor+'"></span>'),t.data.datasets[n].label&&e.push(t.data.datasets[n].label),e.push("</li>");return e.push("</ul>"),e.join("")}}},t.Chart=t,t}},{}],27:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),t.boxes.push(e)},removeBox:function(t,e){
+t.boxes&&t.boxes.splice(t.boxes.indexOf(e),1)},update:function(t,n,i){function a(t){var e,n=t.isHorizontal();n?(e=t.update(t.options.fullWidth?p:k,x),_-=e.height):(e=t.update(y,b),k-=e.width),w.push({horizontal:n,minSize:e,box:t})}function r(t){var n=e.findNextWhere(w,function(e){return e.box===t});if(n)if(t.isHorizontal()){var i={left:S,right:M,top:0,bottom:0};t.update(t.options.fullWidth?p:k,m/2,i)}else t.update(n.minSize.width,_)}function o(t){var n=e.findNextWhere(w,function(e){return e.box===t}),i={left:0,right:0,top:D,bottom:C};n&&t.update(n.minSize.width,_,i)}function s(t){t.isHorizontal()?(t.left=t.options.fullWidth?l:S,t.right=t.options.fullWidth?n-l:S+k,t.top=A,t.bottom=A+t.height,A=t.bottom):(t.left=F,t.right=F+t.width,t.top=D,t.bottom=D+_,F=t.right)}if(t){var l=0,d=0,u=e.where(t.boxes,function(t){return"left"===t.options.position}),c=e.where(t.boxes,function(t){return"right"===t.options.position}),h=e.where(t.boxes,function(t){return"top"===t.options.position}),f=e.where(t.boxes,function(t){return"bottom"===t.options.position}),g=e.where(t.boxes,function(t){return"chartArea"===t.options.position});h.sort(function(t,e){return(e.options.fullWidth?1:0)-(t.options.fullWidth?1:0)}),f.sort(function(t,e){return(t.options.fullWidth?1:0)-(e.options.fullWidth?1:0)});var p=n-2*l,m=i-2*d,v=p/2,b=m/2,y=(n-v)/(u.length+c.length),x=(i-b)/(h.length+f.length),k=p,_=m,w=[];e.each(u.concat(c,h,f),a);var S=l,M=l,D=d,C=d;e.each(u.concat(c),r),e.each(u,function(t){S+=t.width}),e.each(c,function(t){M+=t.width}),e.each(h.concat(f),r),e.each(h,function(t){D+=t.height}),e.each(f,function(t){C+=t.height}),e.each(u.concat(c),o),S=l,M=l,D=d,C=d,e.each(u,function(t){S+=t.width}),e.each(c,function(t){M+=t.width}),e.each(h,function(t){D+=t.height}),e.each(f,function(t){C+=t.height});var T=i-D-C,P=n-S-M;(P!==k||T!==_)&&(e.each(u,function(t){t.height=T}),e.each(c,function(t){t.height=T}),e.each(h,function(t){t.options.fullWidth||(t.width=P)}),e.each(f,function(t){t.options.fullWidth||(t.width=P)}),_=T,k=P);var F=l,A=d;e.each(u.concat(h),s),F+=k,A+=_,e.each(c,s),e.each(f,s),t.chartArea={left:S,top:D,right:S+k,bottom:D+_},e.each(g,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(k,_)})}}}}},{}],28:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=e.noop;t.defaults.global.legend={display:!0,position:"top",fullWidth:!0,reverse:!1,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},labels:{boxWidth:40,padding:10,generateLabels:function(t){var n=t.data;return e.isArray(n.datasets)?n.datasets.map(function(n,i){return{text:n.label,fillStyle:e.isArray(n.backgroundColor)?n.backgroundColor[0]:n.backgroundColor,hidden:!t.isDatasetVisible(i),lineCap:n.borderCapStyle,lineDash:n.borderDash,lineDashOffset:n.borderDashOffset,lineJoin:n.borderJoinStyle,lineWidth:n.borderWidth,strokeStyle:n.borderColor,datasetIndex:i}},this):[]}}},t.Legend=t.Element.extend({initialize:function(t){e.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:n,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:n,beforeSetDimensions:n,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:n,beforeBuildLabels:n,buildLabels:function(){var t=this;t.legendItems=t.options.labels.generateLabels.call(t,t.chart),t.options.reverse&&t.legendItems.reverse()},afterBuildLabels:n,beforeFit:n,fit:function(){var n=this,i=n.options,a=i.labels,r=i.display,o=n.ctx,s=t.defaults.global,l=e.getValueOrDefault,d=l(a.fontSize,s.defaultFontSize),u=l(a.fontStyle,s.defaultFontStyle),c=l(a.fontFamily,s.defaultFontFamily),h=e.fontString(d,u,c),f=n.legendHitBoxes=[],g=n.minSize,p=n.isHorizontal();if(p?(g.width=n.maxWidth,g.height=r?10:0):(g.width=r?10:0,g.height=n.maxHeight),r)if(o.font=h,p){var m=n.lineWidths=[0],v=n.legendItems.length?d+a.padding:0;o.textAlign="left",o.textBaseline="top",e.each(n.legendItems,function(t,e){var i=a.boxWidth+d/2+o.measureText(t.text).width;m[m.length-1]+i+a.padding>=n.width&&(v+=d+a.padding,m[m.length]=n.left),f[e]={left:0,top:0,width:i,height:d},m[m.length-1]+=i+a.padding}),g.height+=v}else{var b=a.padding,y=n.columnWidths=[],x=a.padding,k=0,_=0,w=d+b;e.each(n.legendItems,function(t,e){var n=a.boxWidth+d/2+o.measureText(t.text).width;_+w>g.height&&(x+=k+a.padding,y.push(k),k=0,_=0),k=Math.max(k,n),_+=w,f[e]={left:0,top:0,width:n,height:d}}),x+=k,y.push(k),g.width+=x}n.width=g.width,n.height=g.height},afterFit:n,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var n=this,i=n.options,a=i.labels,r=t.defaults.global,o=r.elements.line,s=n.width,l=(n.height,n.lineWidths);if(i.display){var d,u=n.ctx,c=e.getValueOrDefault,h=c(a.fontColor,r.defaultFontColor),f=c(a.fontSize,r.defaultFontSize),g=c(a.fontStyle,r.defaultFontStyle),p=c(a.fontFamily,r.defaultFontFamily),m=e.fontString(f,g,p);u.textAlign="left",u.textBaseline="top",u.lineWidth=.5,u.strokeStyle=h,u.fillStyle=h,u.font=m;var v=a.boxWidth,b=n.legendHitBoxes,y=function(t,e,n){u.save(),u.fillStyle=c(n.fillStyle,r.defaultColor),u.lineCap=c(n.lineCap,o.borderCapStyle),u.lineDashOffset=c(n.lineDashOffset,o.borderDashOffset),u.lineJoin=c(n.lineJoin,o.borderJoinStyle),u.lineWidth=c(n.lineWidth,o.borderWidth),u.strokeStyle=c(n.strokeStyle,r.defaultColor),u.setLineDash&&u.setLineDash(c(n.lineDash,o.borderDash)),u.strokeRect(t,e,v,f),u.fillRect(t,e,v,f),u.restore()},x=function(t,e,n,i){u.fillText(n.text,v+f/2+t,e),n.hidden&&(u.beginPath(),u.lineWidth=2,u.moveTo(v+f/2+t,e+f/2),u.lineTo(v+f/2+t+i,e+f/2),u.stroke())},k=n.isHorizontal();d=k?{x:n.left+(s-l[0])/2,y:n.top+a.padding,line:0}:{x:n.left+a.padding,y:n.top,line:0};var _=f+a.padding;e.each(n.legendItems,function(t,e){var i=u.measureText(t.text).width,r=v+f/2+i,o=d.x,c=d.y;k?o+r>=s&&(c=d.y+=f+a.padding,d.line++,o=d.x=n.left+(s-l[d.line])/2):c+_>n.bottom&&(o=d.x=o+n.columnWidths[d.line]+a.padding,c=d.y=n.top,d.line++),y(o,c,t),b[e].left=o,b[e].top=c,x(o,c,t,i),k?d.x+=r+a.padding:d.y+=_})}},handleEvent:function(t){var n=this,i=e.getRelativePosition(t,n.chart.chart),a=i.x,r=i.y,o=n.options;if(a>=n.left&&a<=n.right&&r>=n.top&&r<=n.bottom)for(var s=n.legendHitBoxes,l=0;l<s.length;++l){var d=s[l];if(a>=d.left&&a<=d.left+d.width&&r>=d.top&&r<=d.top+d.height){o.onClick&&o.onClick.call(n,t,n.legendItems[l]);break}}}}),t.plugins.register({beforeInit:function(e){var n=e.options,i=n.legend;i&&(e.legend=new t.Legend({ctx:e.chart.ctx,options:i,chart:e}),t.layoutService.addBox(e,e.legend))}})}},{}],29:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers.noop;t.plugins={_plugins:[],register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){-1===e.indexOf(t)&&e.push(t)})},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var n=e.indexOf(t);-1!==n&&e.splice(n,1)})},clear:function(){this._plugins=[]},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e){var n,i,a=this._plugins,r=a.length;for(n=0;r>n;++n)if(i=a[n],"function"==typeof i[t]&&i[t].apply(i,e||[])===!1)return!1;return!0}},t.PluginBase=t.Element.extend({beforeInit:e,afterInit:e,beforeUpdate:e,afterUpdate:e,beforeDraw:e,afterDraw:e,destroy:e}),t.pluginService=t.plugins}},{}],30:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.scale={display:!0,position:"left",gridLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",offsetGridLines:!1},scaleLabel:{labelString:"",display:!1},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:10,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:function(t){return e.isArray(t)?t:""+t}}},t.Scale=t.Element.extend({beforeUpdate:function(){e.callCallback(this.options.beforeUpdate,[this])},update:function(t,n,i){var a=this;return a.beforeUpdate(),a.maxWidth=t,a.maxHeight=n,a.margins=e.extend({left:0,right:0,top:0,bottom:0},i),a.beforeSetDimensions(),a.setDimensions(),a.afterSetDimensions(),a.beforeDataLimits(),a.determineDataLimits(),a.afterDataLimits(),a.beforeBuildTicks(),a.buildTicks(),a.afterBuildTicks(),a.beforeTickToLabelConversion(),a.convertTicksToLabels(),a.afterTickToLabelConversion(),a.beforeCalculateTickRotation(),a.calculateTickRotation(),a.afterCalculateTickRotation(),a.beforeFit(),a.fit(),a.afterFit(),a.afterUpdate(),a.minSize},afterUpdate:function(){e.callCallback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){e.callCallback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){e.callCallback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){e.callCallback(this.options.beforeDataLimits,[this])},determineDataLimits:e.noop,afterDataLimits:function(){e.callCallback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){e.callCallback(this.options.beforeBuildTicks,[this])},buildTicks:e.noop,afterBuildTicks:function(){e.callCallback(this.options.afterBuildTicks,[this])},beforeTickToLabelConversion:function(){e.callCallback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this;t.ticks=t.ticks.map(function(e,n,i){return t.options.ticks.userCallback?t.options.ticks.userCallback(e,n,i):t.options.ticks.callback(e,n,i)},t)},afterTickToLabelConversion:function(){e.callCallback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){e.callCallback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var n=this,i=n.ctx,a=t.defaults.global,r=n.options.ticks,o=e.getValueOrDefault(r.fontSize,a.defaultFontSize),s=e.getValueOrDefault(r.fontStyle,a.defaultFontStyle),l=e.getValueOrDefault(r.fontFamily,a.defaultFontFamily),d=e.fontString(o,s,l);i.font=d;var u,c=i.measureText(n.ticks[0]).width,h=i.measureText(n.ticks[n.ticks.length-1]).width;if(n.labelRotation=r.minRotation||0,n.paddingRight=0,n.paddingLeft=0,n.options.display&&n.isHorizontal()){n.paddingRight=h/2+3,n.paddingLeft=c/2+3,n.longestTextCache||(n.longestTextCache={});for(var f,g,p=e.longestText(i,d,n.ticks,n.longestTextCache),m=p,v=n.getPixelForTick(1)-n.getPixelForTick(0)-6;m>v&&n.labelRotation<r.maxRotation;){if(f=Math.cos(e.toRadians(n.labelRotation)),g=Math.sin(e.toRadians(n.labelRotation)),u=f*c,u+o/2>n.yLabelWidth&&(n.paddingLeft=u+o/2),n.paddingRight=o/2,g*p>n.maxHeight){n.labelRotation--;break}n.labelRotation++,m=f*p}}n.margins&&(n.paddingLeft=Math.max(n.paddingLeft-n.margins.left,0),n.paddingRight=Math.max(n.paddingRight-n.margins.right,0))},afterCalculateTickRotation:function(){e.callCallback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){e.callCallback(this.options.beforeFit,[this])},fit:function(){var n=this,i=n.minSize={width:0,height:0},a=n.options,r=t.defaults.global,o=a.ticks,s=a.scaleLabel,l=a.display,d=n.isHorizontal(),u=e.getValueOrDefault(o.fontSize,r.defaultFontSize),c=e.getValueOrDefault(o.fontStyle,r.defaultFontStyle),h=e.getValueOrDefault(o.fontFamily,r.defaultFontFamily),f=e.fontString(u,c,h),g=e.getValueOrDefault(s.fontSize,r.defaultFontSize),p=e.getValueOrDefault(s.fontStyle,r.defaultFontStyle),m=e.getValueOrDefault(s.fontFamily,r.defaultFontFamily),v=(e.fontString(g,p,m),a.gridLines.tickMarkLength);if(d?i.width=n.isFullWidth()?n.maxWidth-n.margins.left-n.margins.right:n.maxWidth:i.width=l?v:0,d?i.height=l?v:0:i.height=n.maxHeight,s.display&&l&&(d?i.height+=1.5*g:i.width+=1.5*g),o.display&&l){n.longestTextCache||(n.longestTextCache={});var b=e.longestText(n.ctx,f,n.ticks,n.longestTextCache),y=e.numberOfLabelLines(n.ticks),x=.5*u;if(d){n.longestLabelWidth=b;var k=Math.sin(e.toRadians(n.labelRotation))*n.longestLabelWidth+u*y+x*y;i.height=Math.min(n.maxHeight,i.height+k),n.ctx.font=f;var _=n.ctx.measureText(n.ticks[0]).width,w=n.ctx.measureText(n.ticks[n.ticks.length-1]).width,S=Math.cos(e.toRadians(n.labelRotation)),M=Math.sin(e.toRadians(n.labelRotation));n.paddingLeft=0!==n.labelRotation?S*_+3:_/2+3,n.paddingRight=0!==n.labelRotation?M*(u/2)+3:w/2+3}else{var D=n.maxWidth-i.width,C=o.mirror;C?b=0:b+=n.options.ticks.padding,D>b?i.width+=b:i.width=n.maxWidth,n.paddingTop=u/2,n.paddingBottom=u/2}}n.margins&&(n.paddingLeft=Math.max(n.paddingLeft-n.margins.left,0),n.paddingTop=Math.max(n.paddingTop-n.margins.top,0),n.paddingRight=Math.max(n.paddingRight-n.margins.right,0),n.paddingBottom=Math.max(n.paddingBottom-n.margins.bottom,0)),n.width=i.width,n.height=i.height},afterFit:function(){e.callCallback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function n(t){return null===t||"undefined"==typeof t?NaN:"number"==typeof t&&isNaN(t)?NaN:"object"==typeof t?t instanceof Date||t.isValid?t:n(this.isHorizontal()?t.x:t.y):t},getLabelForIndex:e.noop,getPixelForValue:e.noop,getValueForPixel:e.noop,getPixelForTick:function(t,e){var n=this;if(n.isHorizontal()){var i=n.width-(n.paddingLeft+n.paddingRight),a=i/Math.max(n.ticks.length-(n.options.gridLines.offsetGridLines?0:1),1),r=a*t+n.paddingLeft;e&&(r+=a/2);var o=n.left+Math.round(r);return o+=n.isFullWidth()?n.margins.left:0}var s=n.height-(n.paddingTop+n.paddingBottom);return n.top+t*(s/(n.ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var n=e.width-(e.paddingLeft+e.paddingRight),i=n*t+e.paddingLeft,a=e.left+Math.round(i);return a+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){var t=this,e=t.min,n=t.max;return t.getPixelForValue(t.beginAtZero?0:0>e&&0>n?n:e>0&&n>0?e:0)},draw:function(n){var i=this,a=i.options;if(a.display){var r,o,s=i.ctx,l=t.defaults.global,d=a.ticks,u=a.gridLines,c=a.scaleLabel,h=0!==i.labelRotation,f=d.autoSkip,g=i.isHorizontal();d.maxTicksLimit&&(o=d.maxTicksLimit);var p=e.getValueOrDefault(d.fontColor,l.defaultFontColor),m=e.getValueOrDefault(d.fontSize,l.defaultFontSize),v=e.getValueOrDefault(d.fontStyle,l.defaultFontStyle),b=e.getValueOrDefault(d.fontFamily,l.defaultFontFamily),y=e.fontString(m,v,b),x=u.tickMarkLength,k=e.getValueOrDefault(c.fontColor,l.defaultFontColor),_=e.getValueOrDefault(c.fontSize,l.defaultFontSize),w=e.getValueOrDefault(c.fontStyle,l.defaultFontStyle),S=e.getValueOrDefault(c.fontFamily,l.defaultFontFamily),M=e.fontString(_,w,S),D=e.toRadians(i.labelRotation),C=Math.cos(D),T=(Math.sin(D),i.longestLabelWidth*C);s.fillStyle=p;var P=[];if(g){if(r=!1,h&&(T/=2),(T+d.autoSkipPadding)*i.ticks.length>i.width-(i.paddingLeft+i.paddingRight)&&(r=1+Math.floor((T+d.autoSkipPadding)*i.ticks.length/(i.width-(i.paddingLeft+i.paddingRight)))),o&&i.ticks.length>o)for(;!r||i.ticks.length/(r||1)>o;)r||(r=1),r+=1;f||(r=!1)}var F="right"===a.position?i.left:i.right-x,A="right"===a.position?i.left+x:i.right,I="bottom"===a.position?i.top:i.bottom-x,O="bottom"===a.position?i.top+x:i.bottom;if(e.each(i.ticks,function(t,o){if(void 0!==t&&null!==t){var s=i.ticks.length===o+1,l=r>1&&o%r>0||o%r===0&&o+r>=i.ticks.length;if((!l||s)&&void 0!==t&&null!==t){var c,f;o===("undefined"!=typeof i.zeroLineIndex?i.zeroLineIndex:0)?(c=u.zeroLineWidth,f=u.zeroLineColor):(c=e.getValueAtIndexOrDefault(u.lineWidth,o),f=e.getValueAtIndexOrDefault(u.color,o));var p,m,v,b,y,k,_,w,S,M,C,T="middle";if(g){h||(T="top"===a.position?"bottom":"top"),C=h?"right":"center";var R=i.getPixelForTick(o)+e.aliasPixel(c);S=i.getPixelForTick(o,u.offsetGridLines)+d.labelOffset,M=h?i.top+12:"top"===a.position?i.bottom-x:i.top+x,p=v=y=_=R,m=I,b=O,k=n.top,w=n.bottom}else{"left"===a.position?d.mirror?(S=i.right+d.padding,C="left"):(S=i.right-d.padding,C="right"):d.mirror?(S=i.left-d.padding,C="right"):(S=i.left+d.padding,C="left");var W=i.getPixelForTick(o);W+=e.aliasPixel(c),M=i.getPixelForTick(o,u.offsetGridLines),p=F,v=A,y=n.left,_=n.right,m=b=k=w=W}P.push({tx1:p,ty1:m,tx2:v,ty2:b,x1:y,y1:k,x2:_,y2:w,labelX:S,labelY:M,glWidth:c,glColor:f,rotation:-1*D,label:t,textBaseline:T,textAlign:C})}}}),e.each(P,function(t){if(u.display&&(s.lineWidth=t.glWidth,s.strokeStyle=t.glColor,s.beginPath(),u.drawTicks&&(s.moveTo(t.tx1,t.ty1),s.lineTo(t.tx2,t.ty2)),u.drawOnChartArea&&(s.moveTo(t.x1,t.y1),s.lineTo(t.x2,t.y2)),s.stroke()),d.display){s.save(),s.translate(t.labelX,t.labelY),s.rotate(t.rotation),s.font=y,s.textBaseline=t.textBaseline,s.textAlign=t.textAlign;var n=t.label;if(e.isArray(n))for(var i=0,a=0;i<n.length;++i)s.fillText(""+n[i],0,a),a+=1.5*m;else s.fillText(n,0,0);s.restore()}}),c.display){var R,W,V=0;if(g)R=i.left+(i.right-i.left)/2,W="bottom"===a.position?i.bottom-_/2:i.top+_/2;else{var L="left"===a.position;R=L?i.left+_/2:i.right-_/2,W=i.top+(i.bottom-i.top)/2,V=L?-.5*Math.PI:.5*Math.PI}s.save(),s.translate(R,W),s.rotate(V),s.textAlign="center",s.textBaseline="middle",s.fillStyle=k,s.font=M,s.fillText(c.labelString,0,0),s.restore()}if(u.drawBorder){s.lineWidth=e.getValueAtIndexOrDefault(u.lineWidth,0),s.strokeStyle=e.getValueAtIndexOrDefault(u.color,0);var Y=i.left,B=i.right,z=i.top,H=i.bottom,N=e.aliasPixel(s.lineWidth);g?(z=H="top"===a.position?i.bottom:i.top,z+=N,H+=N):(Y=B="left"===a.position?i.right:i.left,Y+=N,B+=N),s.beginPath(),s.moveTo(Y,z),s.lineTo(B,H),s.stroke()}}}})}},{}],31:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.scaleService={constructors:{},defaults:{},registerScaleType:function(t,n,i){this.constructors[t]=n,this.defaults[t]=e.clone(i)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(n){return this.defaults.hasOwnProperty(n)?e.scaleMerge(t.defaults.scale,this.defaults[n]):{}},updateScaleDefaults:function(t,n){var i=this.defaults;i.hasOwnProperty(t)&&(i[t]=e.extend(i[t],n))},addScalesToLayout:function(n){e.each(n.scales,function(e){t.layoutService.addBox(n,e)})}}}},{}],32:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.title={display:!1,position:"top",fullWidth:!0,fontStyle:"bold",padding:10,text:""};var n=e.noop;t.Title=t.Element.extend({initialize:function(n){var i=this;e.extend(i,n),i.options=e.configMerge(t.defaults.global.title,n.options),i.legendHitBoxes=[]},beforeUpdate:function(){var n=this.chart.options;n&&n.title&&(this.options=e.configMerge(t.defaults.global.title,n.title))},update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:n,beforeSetDimensions:n,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:n,beforeBuildLabels:n,buildLabels:n,afterBuildLabels:n,beforeFit:n,fit:function(){var n=this,i=(n.ctx,e.getValueOrDefault),a=n.options,r=t.defaults.global,o=a.display,s=i(a.fontSize,r.defaultFontSize),l=n.minSize;n.isHorizontal()?(l.width=n.maxWidth,l.height=o?s+2*a.padding:0):(l.width=o?s+2*a.padding:0,l.height=n.maxHeight),n.width=l.width,n.height=l.height},afterFit:n,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var n=this,i=n.ctx,a=e.getValueOrDefault,r=n.options,o=t.defaults.global;if(r.display){var s,l,d=a(r.fontSize,o.defaultFontSize),u=a(r.fontStyle,o.defaultFontStyle),c=a(r.fontFamily,o.defaultFontFamily),h=e.fontString(d,u,c),f=0,g=n.top,p=n.left,m=n.bottom,v=n.right;i.fillStyle=a(r.fontColor,o.defaultFontColor),i.font=h,n.isHorizontal()?(s=p+(v-p)/2,l=g+(m-g)/2):(s="left"===r.position?p+d/2:v-d/2,l=g+(m-g)/2,f=Math.PI*("left"===r.position?-.5:.5)),i.save(),i.translate(s,l),i.rotate(f),i.textAlign="center",i.textBaseline="middle",i.fillText(r.text,0,0),i.restore()}}}),t.plugins.register({beforeInit:function(e){var n=e.options,i=n.title;i&&(e.titleBlock=new t.Title({ctx:e.chart.ctx,options:i,chart:e}),t.layoutService.addBox(e,e.titleBlock))}})}},{}],33:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){return e&&(a.isArray(e)?t=t.concat(e):t.push(e)),t}function n(t){if(!t.length)return!1;var e,n,i=[],a=[];for(e=0,n=t.length;n>e;++e){var r=t[e];if(r&&r.hasValue()){var o=r.tooltipPosition();i.push(o.x),a.push(o.y)}}var s=0,l=0;for(e=0,n-i.length;n>e;++e)s+=i[e],l+=a[e];return{x:Math.round(s/i.length),y:Math.round(l/i.length)}}function i(t){var e=t._xScale,n=t._yScale||t._scale,i=t._index,a=t._datasetIndex;return{xLabel:e?e.getLabelForIndex(i,a):"",yLabel:n?n.getLabelForIndex(i,a):"",index:i,datasetIndex:a}}var a=t.helpers;t.defaults.global.tooltips={enabled:!0,custom:null,mode:"single",backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,yAlign:"center",xAlign:"center",caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",callbacks:{beforeTitle:a.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var r=t[0];r.xLabel?n=r.xLabel:a>0&&r.index<a&&(n=i[r.index])}return n},afterTitle:a.noop,beforeBody:a.noop,beforeLabel:a.noop,label:function(t,e){var n=e.datasets[t.datasetIndex].label||"";return n+": "+t.yLabel},labelColor:function(t,e){var n=e.getDatasetMeta(t.datasetIndex),i=n.data[t.index],a=i._view;return{borderColor:a.borderColor,backgroundColor:a.backgroundColor}},afterLabel:a.noop,afterBody:a.noop,beforeFooter:a.noop,footer:a.noop,afterFooter:a.noop}},t.Tooltip=t.Element.extend({initialize:function(){var e=this,n=t.defaults.global,i=e._options,r=a.getValueOrDefault;a.extend(e,{_model:{xPadding:i.xPadding,yPadding:i.yPadding,xAlign:i.yAlign,yAlign:i.xAlign,bodyFontColor:i.bodyFontColor,_bodyFontFamily:r(i.bodyFontFamily,n.defaultFontFamily),_bodyFontStyle:r(i.bodyFontStyle,n.defaultFontStyle),_bodyAlign:i.bodyAlign,bodyFontSize:r(i.bodyFontSize,n.defaultFontSize),bodySpacing:i.bodySpacing,titleFontColor:i.titleFontColor,_titleFontFamily:r(i.titleFontFamily,n.defaultFontFamily),_titleFontStyle:r(i.titleFontStyle,n.defaultFontStyle),titleFontSize:r(i.titleFontSize,n.defaultFontSize),_titleAlign:i.titleAlign,titleSpacing:i.titleSpacing,titleMarginBottom:i.titleMarginBottom,footerFontColor:i.footerFontColor,_footerFontFamily:r(i.footerFontFamily,n.defaultFontFamily),_footerFontStyle:r(i.footerFontStyle,n.defaultFontStyle),footerFontSize:r(i.footerFontSize,n.defaultFontSize),_footerAlign:i.footerAlign,footerSpacing:i.footerSpacing,footerMarginTop:i.footerMarginTop,caretSize:i.caretSize,cornerRadius:i.cornerRadius,backgroundColor:i.backgroundColor,opacity:0,legendColorBackground:i.multiKeyBackground}})},getTitle:function(){var t=this,n=t._options,i=n.callbacks,a=i.beforeTitle.apply(t,arguments),r=i.title.apply(t,arguments),o=i.afterTitle.apply(t,arguments),s=[];return s=e(s,a),s=e(s,r),s=e(s,o)},getBeforeBody:function(){var t=this._options.callbacks.beforeBody.apply(this,arguments);return a.isArray(t)?t:void 0!==t?[t]:[]},getBody:function(t,n){var i=this,r=i._options.callbacks,o=[];return a.each(t,function(t){var a={before:[],lines:[],after:[]};e(a.before,r.beforeLabel.call(i,t,n)),e(a.lines,r.label.call(i,t,n)),e(a.after,r.afterLabel.call(i,t,n)),o.push(a)}),o},getAfterBody:function(){var t=this._options.callbacks.afterBody.apply(this,arguments);return a.isArray(t)?t:void 0!==t?[t]:[]},getFooter:function(){var t=this,n=t._options.callbacks,i=n.beforeFooter.apply(t,arguments),a=n.footer.apply(t,arguments),r=n.afterFooter.apply(t,arguments),o=[];return o=e(o,i),o=e(o,a),o=e(o,r)},update:function(t){var e,r,o=this,s=o._options,l=o._model,d=o._active,u=o._data,c=o._chartInstance;if(d.length){l.opacity=1;var h=[],f=n(d),g=[];for(e=0,r=d.length;r>e;++e)g.push(i(d[e]));s.itemSort&&(g=g.sort(s.itemSort)),d.length>1&&a.each(g,function(t){h.push(s.callbacks.labelColor.call(o,t,c))}),a.extend(l,{title:o.getTitle(g,u),beforeBody:o.getBeforeBody(g,u),body:o.getBody(g,u),afterBody:o.getAfterBody(g,u),footer:o.getFooter(g,u),x:Math.round(f.x),y:Math.round(f.y),caretPadding:a.getValueOrDefault(f.padding,2),labelColors:h});var p=o.getTooltipSize(l);o.determineAlignment(p),a.extend(l,o.getBackgroundPoint(l,p))}else o._model.opacity=0;return t&&s.custom&&s.custom.call(o,l),o},getTooltipSize:function(t){var e=this._chart.ctx,n={height:2*t.yPadding,width:0},i=t.body,r=i.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);r+=t.beforeBody.length+t.afterBody.length;var o=t.title.length,s=t.footer.length,l=t.titleFontSize,d=t.bodyFontSize,u=t.footerFontSize;n.height+=o*l,n.height+=(o-1)*t.titleSpacing,n.height+=o?t.titleMarginBottom:0,n.height+=r*d,n.height+=r?(r-1)*t.bodySpacing:0,n.height+=s?t.footerMarginTop:0,n.height+=s*u,n.height+=s?(s-1)*t.footerSpacing:0;var c=0,h=function(t){n.width=Math.max(n.width,e.measureText(t).width+c)};return e.font=a.fontString(l,t._titleFontStyle,t._titleFontFamily),a.each(t.title,h),e.font=a.fontString(d,t._bodyFontStyle,t._bodyFontFamily),a.each(t.beforeBody.concat(t.afterBody),h),c=i.length>1?d+2:0,a.each(i,function(t){a.each(t.before,h),a.each(t.lines,h),a.each(t.after,h)}),c=0,e.font=a.fontString(u,t._footerFontStyle,t._footerFontFamily),a.each(t.footer,h),n.width+=2*t.xPadding,n},determineAlignment:function(t){var e=this,n=e._model,i=e._chart,a=e._chartInstance.chartArea;n.y<t.height?n.yAlign="top":n.y>i.height-t.height&&(n.yAlign="bottom");var r,o,s,l,d,u=(a.left+a.right)/2,c=(a.top+a.bottom)/2;"center"===n.yAlign?(r=function(t){return u>=t},o=function(t){return t>u}):(r=function(e){return e<=t.width/2},o=function(e){return e>=i.width-t.width/2}),s=function(e){return e+t.width>i.width},l=function(e){return e-t.width<0},d=function(t){return c>=t?"top":"bottom"},r(n.x)?(n.xAlign="left",s(n.x)&&(n.xAlign="center",n.yAlign=d(n.y))):o(n.x)&&(n.xAlign="right",l(n.x)&&(n.xAlign="center",n.yAlign=d(n.y)))},getBackgroundPoint:function(t,e){var n={x:t.x,y:t.y},i=t.caretSize,a=t.caretPadding,r=t.cornerRadius,o=t.xAlign,s=t.yAlign,l=i+a,d=r+a;return"right"===o?n.x-=e.width:"center"===o&&(n.x-=e.width/2),"top"===s?n.y+=l:"bottom"===s?n.y-=e.height+l:n.y-=e.height/2,"center"===s?"left"===o?n.x+=l:"right"===o&&(n.x-=l):"left"===o?n.x-=d:"right"===o&&(n.x+=d),n},drawCaret:function(t,e,n,i){var r,o,s,l,d,u,c=this._view,h=this._chart.ctx,f=c.caretSize,g=c.cornerRadius,p=c.xAlign,m=c.yAlign,v=t.x,b=t.y,y=e.width,x=e.height;"center"===m?("left"===p?(r=v,o=r-f,s=r):(r=v+y,o=r+f,s=r),d=b+x/2,l=d-f,u=d+f):("left"===p?(r=v+g,o=r+f,s=o+f):"right"===p?(r=v+y-g,o=r-f,s=o-f):(o=v+y/2,r=o-f,s=o+f),"top"===m?(l=b,d=l-f,u=l):(l=b+x,d=l+f,u=l));var k=a.color(c.backgroundColor);h.fillStyle=k.alpha(n*k.alpha()).rgbString(),h.beginPath(),h.moveTo(r,l),h.lineTo(o,d),h.lineTo(s,u),h.closePath(),h.fill()},drawTitle:function(t,e,n,i){var r=e.title;if(r.length){n.textAlign=e._titleAlign,n.textBaseline="top";var o=e.titleFontSize,s=e.titleSpacing,l=a.color(e.titleFontColor);n.fillStyle=l.alpha(i*l.alpha()).rgbString(),n.font=a.fontString(o,e._titleFontStyle,e._titleFontFamily);var d,u;for(d=0,u=r.length;u>d;++d)n.fillText(r[d],t.x,t.y),t.y+=o+s,d+1===r.length&&(t.y+=e.titleMarginBottom-s)}},drawBody:function(t,e,n,i){var r=e.bodyFontSize,o=e.bodySpacing,s=e.body;n.textAlign=e._bodyAlign,n.textBaseline="top";var l=a.color(e.bodyFontColor),d=l.alpha(i*l.alpha()).rgbString();n.fillStyle=d,n.font=a.fontString(r,e._bodyFontStyle,e._bodyFontFamily);var u=0,c=function(e){n.fillText(e,t.x+u,t.y),t.y+=r+o};a.each(e.beforeBody,c);var h=s.length>1;u=h?r+2:0,a.each(s,function(o,s){a.each(o.before,c),a.each(o.lines,function(o){h&&(n.fillStyle=a.color(e.legendColorBackground).alpha(i).rgbaString(),n.fillRect(t.x,t.y,r,r),n.strokeStyle=a.color(e.labelColors[s].borderColor).alpha(i).rgbaString(),n.strokeRect(t.x,t.y,r,r),n.fillStyle=a.color(e.labelColors[s].backgroundColor).alpha(i).rgbaString(),n.fillRect(t.x+1,t.y+1,r-2,r-2),n.fillStyle=d),c(o)}),a.each(o.after,c)}),u=0,a.each(e.afterBody,c),t.y-=o},drawFooter:function(t,e,n,i){var r=e.footer;if(r.length){t.y+=e.footerMarginTop,n.textAlign=e._footerAlign,n.textBaseline="top";var o=a.color(e.footerFontColor);n.fillStyle=o.alpha(i*o.alpha()).rgbString(),n.font=a.fontString(e.footerFontSize,e._footerFontStyle,e._footerFontFamily),a.each(r,function(i){n.fillText(i,t.x,t.y),t.y+=e.footerFontSize+e.footerSpacing})}},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n=this.getTooltipSize(e),i={x:e.x,y:e.y},r=Math.abs(e.opacity<.001)?0:e.opacity;if(this._options.enabled){var o=a.color(e.backgroundColor);t.fillStyle=o.alpha(r*o.alpha()).rgbString(),a.drawRoundedRectangle(t,i.x,i.y,n.width,n.height,e.cornerRadius),t.fill(),this.drawCaret(i,n,r,e.caretPadding),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,r),this.drawBody(i,e,t,r),this.drawFooter(i,e,t,r)}}}})}},{}],34:[function(t,e,n){"use strict";e.exports=function(t,e){var n=t.helpers,i=t.defaults.global;i.elements.arc={backgroundColor:i.defaultColor,borderColor:"#fff",borderWidth:2},t.elements.Arc=t.Element.extend({inLabelRange:function(t){var e=this._view;return e?Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2):!1},inRange:function(t,e){var i=this._view;if(i){for(var a=n.getAngleFromPoint(i,{x:t,y:e}),r=a.angle,o=a.distance,s=i.startAngle,l=i.endAngle;s>l;)l+=2*Math.PI;for(;r>l;)r-=2*Math.PI;for(;s>r;)r+=2*Math.PI;var d=r>=s&&l>=r,u=o>=i.innerRadius&&o<=i.outerRadius;return d&&u}return!1},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t=this._chart.ctx,e=this._view,n=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,n,i),t.arc(e.x,e.y,e.innerRadius,i,n,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})}},{}],35:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=t.defaults.global;t.defaults.global.elements.line={tension:.4,backgroundColor:n.defaultColor,borderWidth:3,borderColor:n.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",fill:!0},t.elements.Line=t.Element.extend({lineToNextPoint:function(t,e,n,i,a){var r=this,o=r._chart.ctx,s=r._view?r._view.spanGaps:!1;e._view.skip&&!s?i.call(r,t,e,n):t._view.skip&&!s?a.call(r,t,e,n):0===e._view.tension?o.lineTo(e._view.x,e._view.y):o.bezierCurveTo(t._view.controlPointNextX,t._view.controlPointNextY,e._view.controlPointPreviousX,e._view.controlPointPreviousY,e._view.x,e._view.y)},draw:function(){function t(t){o._view.skip||s._view.skip?t&&r.lineTo(i._view.scaleZero.x,i._view.scaleZero.y):r.bezierCurveTo(s._view.controlPointNextX,s._view.controlPointNextY,o._view.controlPointPreviousX,o._view.controlPointPreviousY,o._view.x,o._view.y)}var i=this,a=i._view,r=i._chart.ctx,o=i._children[0],s=i._children[i._children.length-1];r.save(),
+i._children.length>0&&a.fill&&(r.beginPath(),e.each(i._children,function(t,n){var o=e.previousItem(i._children,n),s=e.nextItem(i._children,n);0===n?(i._loop?r.moveTo(a.scaleZero.x,a.scaleZero.y):r.moveTo(t._view.x,a.scaleZero),t._view.skip?i._loop||r.moveTo(s._view.x,i._view.scaleZero):r.lineTo(t._view.x,t._view.y)):i.lineToNextPoint(o,t,s,function(t,e,n){i._loop?r.lineTo(i._view.scaleZero.x,i._view.scaleZero.y):(r.lineTo(t._view.x,i._view.scaleZero),r.moveTo(n._view.x,i._view.scaleZero))},function(t,e){r.lineTo(e._view.x,e._view.y)})},i),i._loop?t(!0):(r.lineTo(i._children[i._children.length-1]._view.x,a.scaleZero),r.lineTo(i._children[0]._view.x,a.scaleZero)),r.fillStyle=a.backgroundColor||n.defaultColor,r.closePath(),r.fill());var l=n.elements.line;r.lineCap=a.borderCapStyle||l.borderCapStyle,r.setLineDash&&r.setLineDash(a.borderDash||l.borderDash),r.lineDashOffset=a.borderDashOffset||l.borderDashOffset,r.lineJoin=a.borderJoinStyle||l.borderJoinStyle,r.lineWidth=a.borderWidth||l.borderWidth,r.strokeStyle=a.borderColor||n.defaultColor,r.beginPath(),e.each(i._children,function(t,n){var a=e.previousItem(i._children,n),o=e.nextItem(i._children,n);0===n?r.moveTo(t._view.x,t._view.y):i.lineToNextPoint(a,t,o,function(t,e,n){r.moveTo(n._view.x,n._view.y)},function(t,e){r.moveTo(e._view.x,e._view.y)})},i),i._loop&&i._children.length>0&&t(),r.stroke(),r.restore()}})}},{}],36:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=t.defaults.global,i=n.defaultColor;n.elements.point={radius:3,pointStyle:"circle",backgroundColor:i,borderWidth:1,borderColor:i,hitRadius:1,hoverRadius:4,hoverBorderWidth:1},t.elements.Point=t.Element.extend({inRange:function(t,e){var n=this._view;return n?Math.pow(t-n.x,2)+Math.pow(e-n.y,2)<Math.pow(n.hitRadius+n.radius,2):!1},inLabelRange:function(t){var e=this._view;return e?Math.pow(t-e.x,2)<Math.pow(e.radius+e.hitRadius,2):!1},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(){var t,a,r,o,s,l,d=this._view,u=this._chart.ctx,c=d.pointStyle,h=d.radius,f=d.x,g=d.y;if(!d.skip){if("object"==typeof c&&(t=c.toString(),"[object HTMLImageElement]"===t||"[object HTMLCanvasElement]"===t))return void u.drawImage(c,f-c.width/2,g-c.height/2);if(!(isNaN(h)||0>=h)){switch(u.strokeStyle=d.borderColor||i,u.lineWidth=e.getValueOrDefault(d.borderWidth,n.elements.point.borderWidth),u.fillStyle=d.backgroundColor||i,c){default:u.beginPath(),u.arc(f,g,h,0,2*Math.PI),u.closePath(),u.fill();break;case"triangle":u.beginPath(),a=3*h/Math.sqrt(3),s=a*Math.sqrt(3)/2,u.moveTo(f-a/2,g+s/3),u.lineTo(f+a/2,g+s/3),u.lineTo(f,g-2*s/3),u.closePath(),u.fill();break;case"rect":l=1/Math.SQRT2*h,u.fillRect(f-l,g-l,2*l,2*l),u.strokeRect(f-l,g-l,2*l,2*l);break;case"rectRot":l=1/Math.SQRT2*h,u.beginPath(),u.moveTo(f-l,g),u.lineTo(f,g+l),u.lineTo(f+l,g),u.lineTo(f,g-l),u.closePath(),u.fill();break;case"cross":u.beginPath(),u.moveTo(f,g+h),u.lineTo(f,g-h),u.moveTo(f-h,g),u.lineTo(f+h,g),u.closePath();break;case"crossRot":u.beginPath(),r=Math.cos(Math.PI/4)*h,o=Math.sin(Math.PI/4)*h,u.moveTo(f-r,g-o),u.lineTo(f+r,g+o),u.moveTo(f-r,g+o),u.lineTo(f+r,g-o),u.closePath();break;case"star":u.beginPath(),u.moveTo(f,g+h),u.lineTo(f,g-h),u.moveTo(f-h,g),u.lineTo(f+h,g),r=Math.cos(Math.PI/4)*h,o=Math.sin(Math.PI/4)*h,u.moveTo(f-r,g-o),u.lineTo(f+r,g+o),u.moveTo(f-r,g+o),u.lineTo(f+r,g-o),u.closePath();break;case"line":u.beginPath(),u.moveTo(f-h,g),u.lineTo(f+h,g),u.closePath();break;case"dash":u.beginPath(),u.moveTo(f,g),u.lineTo(f+h,g),u.closePath()}u.stroke()}}}})}},{}],37:[function(t,e,n){"use strict";e.exports=function(t){var e=(t.helpers,t.defaults.global);e.elements.rectangle={backgroundColor:e.defaultColor,borderWidth:0,borderColor:e.defaultColor,borderSkipped:"bottom"},t.elements.Rectangle=t.Element.extend({draw:function(){function t(t){return l[(u+t)%4]}var e=this._chart.ctx,n=this._view,i=n.width/2,a=n.x-i,r=n.x+i,o=n.base-(n.base-n.y),s=n.borderWidth/2;n.borderWidth&&(a+=s,r-=s,o+=s),e.beginPath(),e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,e.lineWidth=n.borderWidth;var l=[[a,n.base],[a,o],[r,o],[r,n.base]],d=["bottom","left","top","right"],u=d.indexOf(n.borderSkipped,0);-1===u&&(u=0),e.moveTo.apply(e,t(0));for(var c=1;4>c;c++)e.lineTo.apply(e,t(c));e.fill(),n.borderWidth&&e.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var n=this._view;return n?n.y<n.base?t>=n.x-n.width/2&&t<=n.x+n.width/2&&e>=n.y&&e<=n.base:t>=n.x-n.width/2&&t<=n.x+n.width/2&&e>=n.base&&e<=n.y:!1},inLabelRange:function(t){var e=this._view;return e?t>=e.x-e.width/2&&t<=e.x+e.width/2:!1},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})}},{}],38:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"bottom"},i=t.Scale.extend({determineDataLimits:function(){var t=this;t.minIndex=0,t.maxIndex=t.chart.data.labels.length-1;var n;void 0!==t.options.ticks.min&&(n=e.indexOf(t.chart.data.labels,t.options.ticks.min),t.minIndex=-1!==n?n:t.minIndex),void 0!==t.options.ticks.max&&(n=e.indexOf(t.chart.data.labels,t.options.ticks.max),t.maxIndex=-1!==n?n:t.maxIndex),t.min=t.chart.data.labels[t.minIndex],t.max=t.chart.data.labels[t.maxIndex]},buildTicks:function(t){var e=this;e.ticks=0===e.minIndex&&e.maxIndex===e.chart.data.labels.length-1?e.chart.data.labels:e.chart.data.labels.slice(e.minIndex,e.maxIndex+1)},getLabelForIndex:function(t,e){return this.ticks[t]},getPixelForValue:function(t,e,n,i){var a=this,r=Math.max(a.maxIndex+1-a.minIndex-(a.options.gridLines.offsetGridLines?0:1),1);if(a.isHorizontal()){var o=a.width-(a.paddingLeft+a.paddingRight),s=o/r,l=s*(e-a.minIndex)+a.paddingLeft;return a.options.gridLines.offsetGridLines&&i&&(l+=s/2),a.left+Math.round(l)}var d=a.height-(a.paddingTop+a.paddingBottom),u=d/r,c=u*(e-a.minIndex)+a.paddingTop;return a.options.gridLines.offsetGridLines&&i&&(c+=u/2),a.top+Math.round(c)},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null,e)},getValueForPixel:function(t){var e,n=this,i=Math.max(n.ticks.length-(n.options.gridLines.offsetGridLines?0:1),1),a=n.isHorizontal(),r=a?n.width-(n.paddingLeft+n.paddingRight):n.height-(n.paddingTop+n.paddingBottom),o=r/i;return n.options.gridLines.offsetGridLines&&(t-=o/2),t-=a?n.paddingLeft:n.paddingTop,e=0>=t?0:Math.round(t/o)}});t.scaleService.registerScaleType("category",i,n)}},{}],39:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"left",ticks:{callback:function(t,n,i){var a=i.length>3?i[2]-i[1]:i[1]-i[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var r=e.log10(Math.abs(a)),o="";if(0!==t){var s=-1*Math.floor(r);s=Math.max(Math.min(s,20),0),o=t.toFixed(s)}else o="0";return o}}},i=t.LinearScaleBase.extend({determineDataLimits:function(){function t(t){return s?t.xAxisID===n.id:t.yAxisID===n.id}var n=this,i=n.options,a=(i.ticks,n.chart),r=a.data,o=r.datasets,s=n.isHorizontal();if(n.min=null,n.max=null,i.stacked){var l={},d=!1,u=!1;e.each(o,function(r,o){var s=a.getDatasetMeta(o);void 0===l[s.type]&&(l[s.type]={positiveValues:[],negativeValues:[]});var c=l[s.type].positiveValues,h=l[s.type].negativeValues;a.isDatasetVisible(o)&&t(s)&&e.each(r.data,function(t,e){var a=+n.getRightValue(t);isNaN(a)||s.data[e].hidden||(c[e]=c[e]||0,h[e]=h[e]||0,i.relativePoints?c[e]=100:0>a?(u=!0,h[e]+=a):(d=!0,c[e]+=a))})}),e.each(l,function(t){var i=t.positiveValues.concat(t.negativeValues),a=e.min(i),r=e.max(i);n.min=null===n.min?a:Math.min(n.min,a),n.max=null===n.max?r:Math.max(n.max,r)})}else e.each(o,function(i,r){var o=a.getDatasetMeta(r);a.isDatasetVisible(r)&&t(o)&&e.each(i.data,function(t,e){var i=+n.getRightValue(t);isNaN(i)||o.data[e].hidden||(null===n.min?n.min=i:i<n.min&&(n.min=i),null===n.max?n.max=i:i>n.max&&(n.max=i))})});this.handleTickRangeOptions()},getTickLimit:function(){var n,i=this,a=i.options.ticks;if(i.isHorizontal())n=Math.min(a.maxTicksLimit?a.maxTicksLimit:11,Math.ceil(i.width/50));else{var r=e.getValueOrDefault(a.fontSize,t.defaults.global.defaultFontSize);n=Math.min(a.maxTicksLimit?a.maxTicksLimit:11,Math.ceil(i.height/(2*r)))}return n},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t,e,n,i){var a,r,o=this,s=o.paddingLeft,l=o.paddingBottom,d=o.start,u=+o.getRightValue(t),c=o.end-d;return o.isHorizontal()?(r=o.width-(s+o.paddingRight),a=o.left+r/c*(u-d),Math.round(a+s)):(r=o.height-(o.paddingTop+l),a=o.bottom-l-r/c*(u-d),Math.round(a))},getValueForPixel:function(t){var e=this,n=e.isHorizontal(),i=e.paddingLeft,a=e.paddingBottom,r=n?e.width-(i+e.paddingRight):e.height-(e.paddingTop+a),o=(n?t-e.left-i:e.bottom-a-t)/r;return e.start+(e.end-e.start)*o},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticksAsNumbers[t],null,null,e)}});t.scaleService.registerScaleType("linear",i,n)}},{}],40:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=e.noop;t.LinearScaleBase=t.Scale.extend({handleTickRangeOptions:function(){var t=this,n=t.options,i=n.ticks;if(i.beginAtZero){var a=e.sign(t.min),r=e.sign(t.max);0>a&&0>r?t.max=0:a>0&&r>0&&(t.min=0)}void 0!==i.min?t.min=i.min:void 0!==i.suggestedMin&&(t.min=Math.min(t.min,i.suggestedMin)),void 0!==i.max?t.max=i.max:void 0!==i.suggestedMax&&(t.max=Math.max(t.max,i.suggestedMax)),t.min===t.max&&(t.max++,i.beginAtZero||t.min--)},getTickLimit:n,handleDirectionalChanges:n,buildTicks:function(){var t=this,n=t.options,i=n.ticks,a=e.getValueOrDefault,r=(t.isHorizontal(),t.ticks=[]),o=t.getTickLimit();o=Math.max(2,o);var s,l=i.fixedStepSize&&i.fixedStepSize>0||i.stepSize&&i.stepSize>0;if(l)s=a(i.fixedStepSize,i.stepSize);else{var d=e.niceNum(t.max-t.min,!1);s=e.niceNum(d/(o-1),!0)}var u=Math.floor(t.min/s)*s,c=Math.ceil(t.max/s)*s,h=(c-u)/s;h=e.almostEquals(h,Math.round(h),s/1e3)?Math.round(h):Math.ceil(h),r.push(void 0!==i.min?i.min:u);for(var f=1;h>f;++f)r.push(u+f*s);r.push(void 0!==i.max?i.max:c),t.handleDirectionalChanges(),t.max=e.max(r),t.min=e.min(r),i.reverse?(r.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{}],41:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"left",ticks:{callback:function(t,n,i){var a=t/Math.pow(10,Math.floor(e.log10(t)));return 1===a||2===a||5===a||0===n||n===i.length-1?t.toExponential():""}}},i=t.Scale.extend({determineDataLimits:function(){function t(t){return d?t.xAxisID===n.id:t.yAxisID===n.id}var n=this,i=n.options,a=i.ticks,r=n.chart,o=r.data,s=o.datasets,l=e.getValueOrDefault,d=n.isHorizontal();if(n.min=null,n.max=null,i.stacked){var u={};e.each(s,function(a,o){var s=r.getDatasetMeta(o);r.isDatasetVisible(o)&&t(s)&&(void 0===u[s.type]&&(u[s.type]=[]),e.each(a.data,function(t,e){var a=u[s.type],r=+n.getRightValue(t);isNaN(r)||s.data[e].hidden||(a[e]=a[e]||0,i.relativePoints?a[e]=100:a[e]+=r)}))}),e.each(u,function(t){var i=e.min(t),a=e.max(t);n.min=null===n.min?i:Math.min(n.min,i),n.max=null===n.max?a:Math.max(n.max,a)})}else e.each(s,function(i,a){var o=r.getDatasetMeta(a);r.isDatasetVisible(a)&&t(o)&&e.each(i.data,function(t,e){var i=+n.getRightValue(t);isNaN(i)||o.data[e].hidden||(null===n.min?n.min=i:i<n.min&&(n.min=i),null===n.max?n.max=i:i>n.max&&(n.max=i))})});n.min=l(a.min,n.min),n.max=l(a.max,n.max),n.min===n.max&&(0!==n.min&&null!==n.min?(n.min=Math.pow(10,Math.floor(e.log10(n.min))-1),n.max=Math.pow(10,Math.floor(e.log10(n.max))+1)):(n.min=1,n.max=10))},buildTicks:function(){for(var t=this,n=t.options,i=n.ticks,a=e.getValueOrDefault,r=t.ticks=[],o=a(i.min,Math.pow(10,Math.floor(e.log10(t.min))));o<t.max;){r.push(o);var s=Math.floor(e.log10(o)),l=Math.floor(o/Math.pow(10,s))+1;10===l&&(l=1,++s),o=l*Math.pow(10,s)}var d=a(i.max,o);r.push(d),t.isHorizontal()||r.reverse(),t.max=e.max(r),t.min=e.min(r),i.reverse?(r.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),t.Scale.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t,e){return this.getPixelForValue(this.tickValues[t],null,null,e)},getPixelForValue:function(t,n,i,a){var r,o,s=this,l=s.start,d=+s.getRightValue(t),u=e.log10(s.end)-e.log10(l),c=s.paddingTop,h=s.paddingBottom,f=s.paddingLeft;return s.isHorizontal()?0===d?o=s.left+f:(r=s.width-(f+s.paddingRight),o=s.left+r/u*(e.log10(d)-e.log10(l)),o+=f):0===d?o=s.top+c:(r=s.height-(c+h),o=s.bottom-h-r/u*(e.log10(d)-e.log10(l))),o},getValueForPixel:function(t){var n,i,a=this,r=e.log10(a.end)-e.log10(a.start);return a.isHorizontal()?(i=a.width-(a.paddingLeft+a.paddingRight),n=a.start*Math.pow(10,(t-a.left-a.paddingLeft)*r/i)):(i=a.height-(a.paddingTop+a.paddingBottom),n=Math.pow(10,(a.bottom-a.paddingBottom-t)*r/i)/a.start),n}});t.scaleService.registerScaleType("logarithmic",i,n)}},{}],42:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=t.defaults.global,i={display:!0,animate:!0,lineArc:!1,position:"chartArea",angleLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2},pointLabels:{fontSize:10,callback:function(t){return t}}},a=t.LinearScaleBase.extend({getValueCount:function(){return this.chart.data.labels.length},setDimensions:function(){var t=this,i=t.options,a=i.ticks;t.width=t.maxWidth,t.height=t.maxHeight,t.xCenter=Math.round(t.width/2),t.yCenter=Math.round(t.height/2);var r=e.min([t.height,t.width]),o=e.getValueOrDefault(a.fontSize,n.defaultFontSize);t.drawingArea=i.display?r/2-(o/2+a.backdropPaddingY):r/2},determineDataLimits:function(){var t=this,n=t.chart;t.min=null,t.max=null,e.each(n.data.datasets,function(i,a){if(n.isDatasetVisible(a)){var r=n.getDatasetMeta(a);e.each(i.data,function(e,n){var i=+t.getRightValue(e);isNaN(i)||r.data[n].hidden||(null===t.min?t.min=i:i<t.min&&(t.min=i),null===t.max?t.max=i:i>t.max&&(t.max=i))})}}),t.handleTickRangeOptions()},getTickLimit:function(){var t=this.options.ticks,i=e.getValueOrDefault(t.fontSize,n.defaultFontSize);return Math.min(t.maxTicksLimit?t.maxTicksLimit:11,Math.ceil(this.drawingArea/(1.5*i)))},convertTicksToLabels:function(){var e=this;t.LinearScaleBase.prototype.convertTicksToLabels.call(e),e.pointLabels=e.chart.data.labels.map(e.options.pointLabels.callback,e)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t,i,a,r,o,s,l,d,u,c,h,f,g=this.options.pointLabels,p=e.getValueOrDefault(g.fontSize,n.defaultFontSize),m=e.getValueOrDefault(g.fontStyle,n.defaultFontStyle),v=e.getValueOrDefault(g.fontFamily,n.defaultFontFamily),b=e.fontString(p,m,v),y=e.min([this.height/2-p-5,this.width/2]),x=this.width,k=0;for(this.ctx.font=b,i=0;i<this.getValueCount();i++)t=this.getPointPosition(i,y),a=this.ctx.measureText(this.pointLabels[i]?this.pointLabels[i]:"").width+5,0===i||i===this.getValueCount()/2?(r=a/2,t.x+r>x&&(x=t.x+r,o=i),t.x-r<k&&(k=t.x-r,l=i)):i<this.getValueCount()/2?t.x+a>x&&(x=t.x+a,o=i):i>this.getValueCount()/2&&t.x-a<k&&(k=t.x-a,l=i);u=k,c=Math.ceil(x-this.width),s=this.getIndexAngle(o),d=this.getIndexAngle(l),h=c/Math.sin(s+Math.PI/2),f=u/Math.sin(d+Math.PI/2),h=e.isNumber(h)?h:0,f=e.isNumber(f)?f:0,this.drawingArea=Math.round(y-(f+h)/2),this.setCenterPoint(f,h)},setCenterPoint:function(t,e){var n=this,i=n.width-e-n.drawingArea,a=t+n.drawingArea;n.xCenter=Math.round((a+i)/2+n.left),n.yCenter=Math.round(n.height/2+n.top)},getIndexAngle:function(t){var e=2*Math.PI/this.getValueCount();return t*e-Math.PI/2},getDistanceFromCenterForValue:function(t){var e=this;if(null===t)return 0;var n=e.drawingArea/(e.max-e.min);return e.options.reverse?(e.max-t)*n:(t-e.min)*n},getPointPosition:function(t,e){var n=this,i=n.getIndexAngle(t);return{x:Math.round(Math.cos(i)*e)+n.xCenter,y:Math.round(Math.sin(i)*e)+n.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this,e=t.min,n=t.max;return t.getPointPositionForValue(0,t.beginAtZero?0:0>e&&0>n?n:e>0&&n>0?e:0)},draw:function(){var t=this,i=t.options,a=i.gridLines,r=i.ticks,o=i.angleLines,s=i.pointLabels,l=e.getValueOrDefault;if(i.display){var d=t.ctx,u=l(r.fontSize,n.defaultFontSize),c=l(r.fontStyle,n.defaultFontStyle),h=l(r.fontFamily,n.defaultFontFamily),f=e.fontString(u,c,h);if(e.each(t.ticks,function(o,s){if(s>0||i.reverse){var c=t.getDistanceFromCenterForValue(t.ticksAsNumbers[s]),h=t.yCenter-c;if(a.display&&0!==s)if(d.strokeStyle=e.getValueAtIndexOrDefault(a.color,s-1),d.lineWidth=e.getValueAtIndexOrDefault(a.lineWidth,s-1),i.lineArc)d.beginPath(),d.arc(t.xCenter,t.yCenter,c,0,2*Math.PI),d.closePath(),d.stroke();else{d.beginPath();for(var g=0;g<t.getValueCount();g++){var p=t.getPointPosition(g,c);0===g?d.moveTo(p.x,p.y):d.lineTo(p.x,p.y)}d.closePath(),d.stroke()}if(r.display){var m=l(r.fontColor,n.defaultFontColor);if(d.font=f,r.showLabelBackdrop){var v=d.measureText(o).width;d.fillStyle=r.backdropColor,d.fillRect(t.xCenter-v/2-r.backdropPaddingX,h-u/2-r.backdropPaddingY,v+2*r.backdropPaddingX,u+2*r.backdropPaddingY)}d.textAlign="center",d.textBaseline="middle",d.fillStyle=m,d.fillText(o,t.xCenter,h)}}}),!i.lineArc){d.lineWidth=o.lineWidth,d.strokeStyle=o.color;for(var g=t.getDistanceFromCenterForValue(i.reverse?t.min:t.max),p=l(s.fontSize,n.defaultFontSize),m=l(s.fontStyle,n.defaultFontStyle),v=l(s.fontFamily,n.defaultFontFamily),b=e.fontString(p,m,v),y=t.getValueCount()-1;y>=0;y--){if(o.display){var x=t.getPointPosition(y,g);d.beginPath(),d.moveTo(t.xCenter,t.yCenter),d.lineTo(x.x,x.y),d.stroke(),d.closePath()}var k=t.getPointPosition(y,g+5),_=l(s.fontColor,n.defaultFontColor);d.font=b,d.fillStyle=_;var w=t.pointLabels,S=w.length,M=w.length/2,D=M/2,C=D>y||y>S-D,T=y===D||y===S-D;0===y?d.textAlign="center":y===M?d.textAlign="center":M>y?d.textAlign="left":d.textAlign="right",T?d.textBaseline="middle":C?d.textBaseline="bottom":d.textBaseline="top",d.fillText(w[y]?w[y]:"",k.x,k.y)}}}}});t.scaleService.registerScaleType("radialLinear",a,i)}},{}],43:[function(t,e,n){"use strict";var i=t(6);i="function"==typeof i?i:window.moment,e.exports=function(t){var e=t.helpers,n={units:[{name:"millisecond",steps:[1,2,5,10,20,50,100,250,500]},{name:"second",steps:[1,2,5,10,30]},{name:"minute",steps:[1,2,5,10,30]},{name:"hour",steps:[1,2,3,6,12]},{name:"day",steps:[1,2,5]},{name:"week",maxStep:4},{name:"month",maxStep:3},{name:"quarter",maxStep:4},{name:"year",maxStep:!1}]},a={position:"bottom",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,displayFormats:{millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm:ss a",hour:"MMM D, hA",day:"ll",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"}},ticks:{autoSkip:!1}},r=t.Scale.extend({initialize:function(){if(!i)throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com");t.Scale.prototype.initialize.call(this)},getLabelMoment:function(t,e){return this.labelMoments[t][e]},getMomentStartOf:function(t){var e=this;return"week"===e.options.time.unit&&e.options.time.isoWeekday!==!1?t.clone().startOf("isoWeek").isoWeekday(e.options.time.isoWeekday):t.clone().startOf(e.tickUnit)},determineDataLimits:function(){var t=this;t.labelMoments=[];var n=[];t.chart.data.labels&&t.chart.data.labels.length>0?(e.each(t.chart.data.labels,function(e,i){var a=t.parseTime(e);a.isValid()&&(t.options.time.round&&a.startOf(t.options.time.round),n.push(a))},t),t.firstTick=i.min.call(t,n),t.lastTick=i.max.call(t,n)):(t.firstTick=null,t.lastTick=null),e.each(t.chart.data.datasets,function(a,r){var o=[],s=t.chart.isDatasetVisible(r);"object"==typeof a.data[0]&&null!==a.data[0]?e.each(a.data,function(e,n){var a=t.parseTime(t.getRightValue(e));a.isValid()&&(t.options.time.round&&a.startOf(t.options.time.round),o.push(a),s&&(t.firstTick=null!==t.firstTick?i.min(t.firstTick,a):a,t.lastTick=null!==t.lastTick?i.max(t.lastTick,a):a))},t):o=n,t.labelMoments.push(o)},t),t.options.time.min&&(t.firstTick=t.parseTime(t.options.time.min)),t.options.time.max&&(t.lastTick=t.parseTime(t.options.time.max)),t.firstTick=(t.firstTick||i()).clone(),t.lastTick=(t.lastTick||i()).clone()},buildTicks:function(i){var a=this;a.ctx.save();var r=e.getValueOrDefault(a.options.ticks.fontSize,t.defaults.global.defaultFontSize),o=e.getValueOrDefault(a.options.ticks.fontStyle,t.defaults.global.defaultFontStyle),s=e.getValueOrDefault(a.options.ticks.fontFamily,t.defaults.global.defaultFontFamily),l=e.fontString(r,o,s);if(a.ctx.font=l,a.ticks=[],a.unitScale=1,a.scaleSizeInUnits=0,a.options.time.unit)a.tickUnit=a.options.time.unit||"day",a.displayFormat=a.options.time.displayFormats[a.tickUnit],a.scaleSizeInUnits=a.lastTick.diff(a.firstTick,a.tickUnit,!0),a.unitScale=e.getValueOrDefault(a.options.time.unitStepSize,1);else{var d=a.isHorizontal()?a.width-(a.paddingLeft+a.paddingRight):a.height-(a.paddingTop+a.paddingBottom),u=a.tickFormatFunction(a.firstTick,0,[]),c=a.ctx.measureText(u).width,h=Math.cos(e.toRadians(a.options.ticks.maxRotation)),f=Math.sin(e.toRadians(a.options.ticks.maxRotation));c=c*h+r*f;var g=d/c;a.tickUnit="millisecond",a.scaleSizeInUnits=a.lastTick.diff(a.firstTick,a.tickUnit,!0),a.displayFormat=a.options.time.displayFormats[a.tickUnit];for(var p=0,m=n.units[p];p<n.units.length;){if(a.unitScale=1,e.isArray(m.steps)&&Math.ceil(a.scaleSizeInUnits/g)<e.max(m.steps)){for(var v=0;v<m.steps.length;++v)if(m.steps[v]>=Math.ceil(a.scaleSizeInUnits/g)){a.unitScale=e.getValueOrDefault(a.options.time.unitStepSize,m.steps[v]);break}break}if(m.maxStep===!1||Math.ceil(a.scaleSizeInUnits/g)<m.maxStep){a.unitScale=e.getValueOrDefault(a.options.time.unitStepSize,Math.ceil(a.scaleSizeInUnits/g));break}++p,m=n.units[p],a.tickUnit=m.name;var b=a.firstTick.diff(a.getMomentStartOf(a.firstTick),a.tickUnit,!0),y=a.getMomentStartOf(a.lastTick.clone().add(1,a.tickUnit)).diff(a.lastTick,a.tickUnit,!0);a.scaleSizeInUnits=a.lastTick.diff(a.firstTick,a.tickUnit,!0)+b+y,a.displayFormat=a.options.time.displayFormats[m.name]}}var x;if(a.options.time.min?x=a.getMomentStartOf(a.firstTick):(a.firstTick=a.getMomentStartOf(a.firstTick),x=a.firstTick),!a.options.time.max){var k=a.getMomentStartOf(a.lastTick);0!==k.diff(a.lastTick,a.tickUnit,!0)&&(a.lastTick=a.getMomentStartOf(a.lastTick.add(1,a.tickUnit)))}a.smallestLabelSeparation=a.width,e.each(a.chart.data.datasets,function(t,e){for(var n=1;n<a.labelMoments[e].length;n++)a.smallestLabelSeparation=Math.min(a.smallestLabelSeparation,a.labelMoments[e][n].diff(a.labelMoments[e][n-1],a.tickUnit,!0))},a),a.options.time.displayFormat&&(a.displayFormat=a.options.time.displayFormat),a.ticks.push(a.firstTick.clone());for(var _=1;_<=a.scaleSizeInUnits;++_){var w=x.clone().add(_,a.tickUnit);if(a.options.time.max&&w.diff(a.lastTick,a.tickUnit,!0)>=0)break;_%a.unitScale===0&&a.ticks.push(w)}var S=a.ticks[a.ticks.length-1].diff(a.lastTick,a.tickUnit);(0!==S||0===a.scaleSizeInUnits)&&(a.options.time.max?(a.ticks.push(a.lastTick.clone()),a.scaleSizeInUnits=a.lastTick.diff(a.ticks[0],a.tickUnit,!0)):(a.ticks.push(a.lastTick.clone()),a.scaleSizeInUnits=a.lastTick.diff(a.firstTick,a.tickUnit,!0))),a.ctx.restore()},getLabelForIndex:function(t,e){var n=this,i=n.chart.data.labels&&t<n.chart.data.labels.length?n.chart.data.labels[t]:"";return"object"==typeof n.chart.data.datasets[e].data[0]&&(i=n.getRightValue(n.chart.data.datasets[e].data[t])),n.options.time.tooltipFormat&&(i=n.parseTime(i).format(n.options.time.tooltipFormat)),i},tickFormatFunction:function(t,n,i){var a=t.format(this.displayFormat),r=this.options.ticks,o=e.getValueOrDefault(r.callback,r.userCallback);return o?o(a,n,i):a},convertTicksToLabels:function(){var t=this;t.tickMoments=t.ticks,t.ticks=t.ticks.map(t.tickFormatFunction,t)},getPixelForValue:function(t,e,n,i){var a=this,r=t&&t.isValid&&t.isValid()?t:a.getLabelMoment(n,e);if(r){var o=r.diff(a.firstTick,a.tickUnit,!0),s=o/a.scaleSizeInUnits;if(a.isHorizontal()){var l=a.width-(a.paddingLeft+a.paddingRight),d=(l/Math.max(a.ticks.length-1,1),l*s+a.paddingLeft);return a.left+Math.round(d)}var u=a.height-(a.paddingTop+a.paddingBottom),c=(u/Math.max(a.ticks.length-1,1),u*s+a.paddingTop);return a.top+Math.round(c)}},getPixelForTick:function(t,e){return this.getPixelForValue(this.tickMoments[t],null,null,e)},getValueForPixel:function(t){var e=this,n=e.isHorizontal()?e.width-(e.paddingLeft+e.paddingRight):e.height-(e.paddingTop+e.paddingBottom),a=(t-(e.isHorizontal()?e.left+e.paddingLeft:e.top+e.paddingTop))/n;return a*=e.scaleSizeInUnits,e.firstTick.clone().add(i.duration(a,e.tickUnit).asSeconds(),"seconds")},parseTime:function(t){var e=this;return"string"==typeof e.options.time.parser?i(t,e.options.time.parser):"function"==typeof e.options.time.parser?e.options.time.parser(t):"function"==typeof t.getMonth||"number"==typeof t?i(t):t.isValid&&t.isValid()?t:"string"!=typeof e.options.time.format&&e.options.time.format.call?(console.warn("options.time.format is deprecated and replaced by options.time.parser. See http://nnnick.github.io/Chart.js/docs-v2/#scales-time-scale"),e.options.time.format(t)):i(t,e.options.time.format)}});t.scaleService.registerScaleType("time",r,a)}},{6:6}]},{},[7])(7)});
\ No newline at end of file
index d260ac6d9dda433ce26debb7e0b0852d20d96b0e..e464fb75b93b4b1648c8d7c99d128df9c387b074 100644 (file)
@@ -1,17 +1,17 @@
 /*!
  * Chart.js
  * http://chartjs.org/
- * Version: 2.1.4
+ * Version: 2.1.5
  *
  * Copyright 2016 Nick Downie
  * Released under the MIT license
  * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md
  */
-(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Chart = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
 
 },{}],2:[function(require,module,exports){
 /* MIT license */\r
-var colorNames = require('color-name');\r
+var colorNames = require(6);\r
 \r
 module.exports = {\r
    getRgba: getRgba,\r
@@ -232,10 +232,10 @@ for (var name in colorNames) {
    reverseNames[colorNames[name]] = name;\r
 }\r
 
-},{"color-name":6}],3:[function(require,module,exports){
+},{"6":6}],3:[function(require,module,exports){
 /* MIT license */\r
-var convert = require('color-convert');\r
-var string = require('chartjs-color-string');\r
+var convert = require(5);\r
+var string = require(2);\r
 \r
 var Color = function (obj) {\r
        if (obj instanceof Color) {\r
@@ -717,7 +717,7 @@ if (typeof window !== 'undefined') {
 \r
 module.exports = Color;\r
 
-},{"chartjs-color-string":2,"color-convert":5}],4:[function(require,module,exports){
+},{"2":2,"5":5}],4:[function(require,module,exports){
 /* MIT license */
 
 module.exports = {
@@ -1418,7 +1418,7 @@ for (var key in cssKeywords) {
 }
 
 },{}],5:[function(require,module,exports){
-var conversions = require("./conversions");
+var conversions = require(4);
 
 var convert = function() {
    return new Converter();
@@ -1510,7 +1510,7 @@ Converter.prototype.getValues = function(space) {
 });
 
 module.exports = convert;
-},{"./conversions":4}],6:[function(require,module,exports){
+},{"4":4}],6:[function(require,module,exports){
 module.exports = {\r
        "aliceblue": [240, 248, 255],\r
        "antiquewhite": [250, 235, 215],\r
@@ -1662,52 +1662,56 @@ module.exports = {
        "yellowgreen": [154, 205, 50]\r
 };
 },{}],7:[function(require,module,exports){
-var Chart = require('./core/core.js')();\r
-\r
-require('./core/core.helpers')(Chart);\r
-require('./core/core.element')(Chart);\r
-require('./core/core.animation')(Chart);\r
-require('./core/core.controller')(Chart);\r
-require('./core/core.datasetController')(Chart);\r
-require('./core/core.layoutService')(Chart);\r
-require('./core/core.legend')(Chart);\r
-require('./core/core.plugin.js')(Chart);\r
-require('./core/core.scale')(Chart);\r
-require('./core/core.scaleService')(Chart);\r
-require('./core/core.title')(Chart);\r
-require('./core/core.tooltip')(Chart);\r
-\r
-require('./elements/element.arc')(Chart);\r
-require('./elements/element.line')(Chart);\r
-require('./elements/element.point')(Chart);\r
-require('./elements/element.rectangle')(Chart);\r
-\r
-require('./scales/scale.category')(Chart);\r
-require('./scales/scale.linear')(Chart);\r
-require('./scales/scale.logarithmic')(Chart);\r
-require('./scales/scale.radialLinear')(Chart);\r
-require('./scales/scale.time')(Chart);\r
+/**\r
+ * @namespace Chart\r
+ */\r
+var Chart = require(26)();\r
+\r
+require(25)(Chart);\r
+require(24)(Chart);\r
+require(21)(Chart);\r
+require(22)(Chart);\r
+require(23)(Chart);\r
+require(27)(Chart);\r
+require(31)(Chart);\r
+require(29)(Chart);\r
+require(30)(Chart);\r
+require(32)(Chart);\r
+require(28)(Chart);\r
+require(33)(Chart);\r
+\r
+require(34)(Chart);\r
+require(35)(Chart);\r
+require(36)(Chart);\r
+require(37)(Chart);\r
+\r
+require(40)(Chart);\r
+require(38)(Chart);\r
+require(39)(Chart);\r
+require(41)(Chart);\r
+require(42)(Chart);\r
+require(43)(Chart);\r
 \r
 // Controllers must be loaded after elements\r
 // See Chart.core.datasetController.dataElementType\r
-require('./controllers/controller.bar')(Chart);\r
-require('./controllers/controller.bubble')(Chart);\r
-require('./controllers/controller.doughnut')(Chart);\r
-require('./controllers/controller.line')(Chart);\r
-require('./controllers/controller.polarArea')(Chart);\r
-require('./controllers/controller.radar')(Chart);\r
-\r
-require('./charts/Chart.Bar')(Chart);\r
-require('./charts/Chart.Bubble')(Chart);\r
-require('./charts/Chart.Doughnut')(Chart);\r
-require('./charts/Chart.Line')(Chart);\r
-require('./charts/Chart.PolarArea')(Chart);\r
-require('./charts/Chart.Radar')(Chart);\r
-require('./charts/Chart.Scatter')(Chart);\r
+require(15)(Chart);\r
+require(16)(Chart);\r
+require(17)(Chart);\r
+require(18)(Chart);\r
+require(19)(Chart);\r
+require(20)(Chart);\r
+\r
+require(8)(Chart);\r
+require(9)(Chart);\r
+require(10)(Chart);\r
+require(11)(Chart);\r
+require(12)(Chart);\r
+require(13)(Chart);\r
+require(14)(Chart);\r
 \r
 window.Chart = module.exports = Chart;\r
 
-},{"./charts/Chart.Bar":8,"./charts/Chart.Bubble":9,"./charts/Chart.Doughnut":10,"./charts/Chart.Line":11,"./charts/Chart.PolarArea":12,"./charts/Chart.Radar":13,"./charts/Chart.Scatter":14,"./controllers/controller.bar":15,"./controllers/controller.bubble":16,"./controllers/controller.doughnut":17,"./controllers/controller.line":18,"./controllers/controller.polarArea":19,"./controllers/controller.radar":20,"./core/core.animation":21,"./core/core.controller":22,"./core/core.datasetController":23,"./core/core.element":24,"./core/core.helpers":25,"./core/core.js":26,"./core/core.layoutService":27,"./core/core.legend":28,"./core/core.plugin.js":29,"./core/core.scale":30,"./core/core.scaleService":31,"./core/core.title":32,"./core/core.tooltip":33,"./elements/element.arc":34,"./elements/element.line":35,"./elements/element.point":36,"./elements/element.rectangle":37,"./scales/scale.category":38,"./scales/scale.linear":39,"./scales/scale.logarithmic":40,"./scales/scale.radialLinear":41,"./scales/scale.time":42}],8:[function(require,module,exports){
+},{"10":10,"11":11,"12":12,"13":13,"14":14,"15":15,"16":16,"17":17,"18":18,"19":19,"20":20,"21":21,"22":22,"23":23,"24":24,"25":25,"26":26,"27":27,"28":28,"29":29,"30":30,"31":31,"32":32,"33":33,"34":34,"35":35,"36":36,"37":37,"38":38,"39":39,"40":40,"41":41,"42":42,"43":43,"8":8,"9":9}],8:[function(require,module,exports){
 "use strict";\r
 \r
 module.exports = function(Chart) {\r
@@ -1872,50 +1876,53 @@ module.exports = function(Chart) {
 \r
                // Get the number of datasets that display bars. We use this to correctly calculate the bar width\r
                getBarCount: function getBarCount() {\r
+                       var me = this;\r
                        var barCount = 0;\r
-                       helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) {\r
-                               var meta = this.chart.getDatasetMeta(datasetIndex);\r
-                               if (meta.bar && this.chart.isDatasetVisible(datasetIndex)) {\r
+                       helpers.each(me.chart.data.datasets, function(dataset, datasetIndex) {\r
+                               var meta = me.chart.getDatasetMeta(datasetIndex);\r
+                               if (meta.bar && me.chart.isDatasetVisible(datasetIndex)) {\r
                                        ++barCount;\r
                                }\r
-                       }, this);\r
+                       }, me);\r
                        return barCount;\r
                },\r
 \r
                update: function update(reset) {\r
-                       helpers.each(this.getMeta().data, function(rectangle, index) {\r
-                               this.updateElement(rectangle, index, reset);\r
-                       }, this);\r
+                       var me = this;\r
+                       helpers.each(me.getMeta().data, function(rectangle, index) {\r
+                               me.updateElement(rectangle, index, reset);\r
+                       }, me);\r
                },\r
 \r
                updateElement: function updateElement(rectangle, index, reset) {\r
-                       var meta = this.getMeta();\r
-                       var xScale = this.getScaleForId(meta.xAxisID);\r
-                       var yScale = this.getScaleForId(meta.yAxisID);\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var xScale = me.getScaleForId(meta.xAxisID);\r
+                       var yScale = me.getScaleForId(meta.yAxisID);\r
                        var scaleBase = yScale.getBasePixel();\r
-                       var rectangleElementOptions = this.chart.options.elements.rectangle;\r
+                       var rectangleElementOptions = me.chart.options.elements.rectangle;\r
                        var custom = rectangle.custom || {};\r
-                       var dataset = this.getDataset();\r
+                       var dataset = me.getDataset();\r
 \r
                        helpers.extend(rectangle, {\r
                                // Utility\r
                                _xScale: xScale,\r
                                _yScale: yScale,\r
-                               _datasetIndex: this.index,\r
+                               _datasetIndex: me.index,\r
                                _index: index,\r
 \r
                                // Desired view properties\r
                                _model: {\r
-                                       x: this.calculateBarX(index, this.index),\r
-                                       y: reset ? scaleBase : this.calculateBarY(index, this.index),\r
+                                       x: me.calculateBarX(index, me.index),\r
+                                       y: reset ? scaleBase : me.calculateBarY(index, me.index),\r
 \r
                                        // Tooltip\r
-                                       label: this.chart.data.labels[index],\r
+                                       label: me.chart.data.labels[index],\r
                                        datasetLabel: dataset.label,\r
 \r
                                        // Appearance\r
-                                       base: reset ? scaleBase : this.calculateBarBase(this.index, index),\r
-                                       width: this.calculateBarWidth(index),\r
+                                       base: reset ? scaleBase : me.calculateBarBase(me.index, index),\r
+                                       width: me.calculateBarWidth(index),\r
                                        backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor),\r
                                        borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleElementOptions.borderSkipped,\r
                                        borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor),\r
@@ -1926,12 +1933,13 @@ module.exports = function(Chart) {
                },\r
 \r
                calculateBarBase: function(datasetIndex, index) {\r
-                       var meta = this.getMeta();\r
-                       var yScale = this.getScaleForId(meta.yAxisID);\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var yScale = me.getScaleForId(meta.yAxisID);\r
                        var base = 0;\r
 \r
                        if (yScale.options.stacked) {\r
-                               var chart = this.chart;\r
+                               var chart = me.chart;\r
                                var datasets = chart.data.datasets;\r
                                var value = datasets[datasetIndex].data[index];\r
 \r
@@ -1960,9 +1968,10 @@ module.exports = function(Chart) {
                },\r
 \r
                getRuler: function(index) {\r
-                       var meta = this.getMeta();\r
-                       var xScale = this.getScaleForId(meta.xAxisID);\r
-                       var datasetCount = this.getBarCount();\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var xScale = me.getScaleForId(meta.xAxisID);\r
+                       var datasetCount = me.getBarCount();\r
 \r
                        var tickWidth;\r
 \r
@@ -1976,8 +1985,8 @@ module.exports = function(Chart) {
                        var categorySpacing = (tickWidth - (tickWidth * xScale.options.categoryPercentage)) / 2;\r
                        var fullBarWidth = categoryWidth / datasetCount;\r
 \r
-                       if (xScale.ticks.length !== this.chart.data.labels.length) {\r
-                           var perc = xScale.ticks.length / this.chart.data.labels.length;\r
+                       if (xScale.ticks.length !== me.chart.data.labels.length) {\r
+                           var perc = xScale.ticks.length / me.chart.data.labels.length;\r
                            fullBarWidth = fullBarWidth * perc;\r
                        }\r
 \r
@@ -2017,13 +2026,14 @@ module.exports = function(Chart) {
                },\r
 \r
                calculateBarX: function(index, datasetIndex) {\r
-                       var meta = this.getMeta();\r
-                       var xScale = this.getScaleForId(meta.xAxisID);\r
-                       var barIndex = this.getBarIndex(datasetIndex);\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var xScale = me.getScaleForId(meta.xAxisID);\r
+                       var barIndex = me.getBarIndex(datasetIndex);\r
 \r
-                       var ruler = this.getRuler(index);\r
-                       var leftTick = xScale.getPixelForValue(null, index, datasetIndex, this.chart.isCombo);\r
-                       leftTick -= this.chart.isCombo ? (ruler.tickWidth / 2) : 0;\r
+                       var ruler = me.getRuler(index);\r
+                       var leftTick = xScale.getPixelForValue(null, index, datasetIndex, me.chart.isCombo);\r
+                       leftTick -= me.chart.isCombo ? (ruler.tickWidth / 2) : 0;\r
 \r
                        if (xScale.options.stacked) {\r
                                return leftTick + (ruler.categoryWidth / 2) + ruler.categorySpacing;\r
@@ -2038,9 +2048,10 @@ module.exports = function(Chart) {
                },\r
 \r
                calculateBarY: function(index, datasetIndex) {\r
-                       var meta = this.getMeta();\r
-                       var yScale = this.getScaleForId(meta.yAxisID);\r
-                       var value = this.getDataset().data[index];\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var yScale = me.getScaleForId(meta.yAxisID);\r
+                       var value = me.getDataset().data[index];\r
 \r
                        if (yScale.options.stacked) {\r
 \r
@@ -2048,9 +2059,9 @@ module.exports = function(Chart) {
                                        sumNeg = 0;\r
 \r
                                for (var i = 0; i < datasetIndex; i++) {\r
-                                       var ds = this.chart.data.datasets[i];\r
-                                       var dsMeta = this.chart.getDatasetMeta(i);\r
-                                       if (dsMeta.bar && dsMeta.yAxisID === yScale.id && this.chart.isDatasetVisible(i)) {\r
+                                       var ds = me.chart.data.datasets[i];\r
+                                       var dsMeta = me.chart.getDatasetMeta(i);\r
+                                       if (dsMeta.bar && dsMeta.yAxisID === yScale.id && me.chart.isDatasetVisible(i)) {\r
                                                if (ds.data[index] < 0) {\r
                                                        sumNeg += ds.data[index] || 0;\r
                                                } else {\r
@@ -2070,13 +2081,14 @@ module.exports = function(Chart) {
                },\r
 \r
                draw: function(ease) {\r
+                       var me = this;\r
                        var easingDecimal = ease || 1;\r
-                       helpers.each(this.getMeta().data, function(rectangle, index) {\r
-                               var d = this.getDataset().data[index];\r
+                       helpers.each(me.getMeta().data, function(rectangle, index) {\r
+                               var d = me.getDataset().data[index];\r
                                if (d !== null && d !== undefined && !isNaN(d)) {\r
                                        rectangle.transition(easingDecimal).draw();\r
                                }\r
-                       }, this);\r
+                       }, me);\r
                },\r
 \r
                setHoverStyle: function(rectangle) {\r
@@ -2162,33 +2174,34 @@ module.exports = function(Chart) {
 \r
        Chart.controllers.horizontalBar = Chart.controllers.bar.extend({\r
                updateElement: function updateElement(rectangle, index, reset, numBars) {\r
-                       var meta = this.getMeta();\r
-                       var xScale = this.getScaleForId(meta.xAxisID);\r
-                       var yScale = this.getScaleForId(meta.yAxisID);\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var xScale = me.getScaleForId(meta.xAxisID);\r
+                       var yScale = me.getScaleForId(meta.yAxisID);\r
                        var scaleBase = xScale.getBasePixel();\r
                        var custom = rectangle.custom || {};\r
-                       var dataset = this.getDataset();\r
-                       var rectangleElementOptions = this.chart.options.elements.rectangle;\r
+                       var dataset = me.getDataset();\r
+                       var rectangleElementOptions = me.chart.options.elements.rectangle;\r
 \r
                        helpers.extend(rectangle, {\r
                                // Utility\r
                                _xScale: xScale,\r
                                _yScale: yScale,\r
-                               _datasetIndex: this.index,\r
+                               _datasetIndex: me.index,\r
                                _index: index,\r
 \r
                                // Desired view properties\r
                                _model: {\r
-                                       x: reset ? scaleBase : this.calculateBarX(index, this.index),\r
-                                       y: this.calculateBarY(index, this.index),\r
+                                       x: reset ? scaleBase : me.calculateBarX(index, me.index),\r
+                                       y: me.calculateBarY(index, me.index),\r
 \r
                                        // Tooltip\r
-                                       label: this.chart.data.labels[index],\r
+                                       label: me.chart.data.labels[index],\r
                                        datasetLabel: dataset.label,\r
 \r
                                        // Appearance\r
-                                       base: reset ? scaleBase : this.calculateBarBase(this.index, index),\r
-                                       height: this.calculateBarHeight(index),\r
+                                       base: reset ? scaleBase : me.calculateBarBase(me.index, index),\r
+                                       height: me.calculateBarHeight(index),\r
                                        backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor),\r
                                        borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleElementOptions.borderSkipped,\r
                                        borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor),\r
@@ -2196,7 +2209,6 @@ module.exports = function(Chart) {
                                },\r
 \r
                                draw: function () {\r
-\r
                                        var ctx = this._chart.ctx;\r
                                        var vm = this._view;\r
 \r
@@ -2271,27 +2283,28 @@ module.exports = function(Chart) {
                },\r
 \r
                calculateBarBase: function (datasetIndex, index) {\r
-                       var meta = this.getMeta();\r
-                       var xScale = this.getScaleForId(meta.xAxisID);\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var xScale = me.getScaleForId(meta.xAxisID);\r
                        var base = 0;\r
 \r
                        if (xScale.options.stacked) {\r
 \r
-                               var value = this.chart.data.datasets[datasetIndex].data[index];\r
+                               var value = me.chart.data.datasets[datasetIndex].data[index];\r
 \r
                                if (value < 0) {\r
                                        for (var i = 0; i < datasetIndex; i++) {\r
-                                               var negDS = this.chart.data.datasets[i];\r
-                                               var negDSMeta = this.chart.getDatasetMeta(i);\r
-                                               if (negDSMeta.bar && negDSMeta.xAxisID === xScale.id && this.chart.isDatasetVisible(i)) {\r
+                                               var negDS = me.chart.data.datasets[i];\r
+                                               var negDSMeta = me.chart.getDatasetMeta(i);\r
+                                               if (negDSMeta.bar && negDSMeta.xAxisID === xScale.id && me.chart.isDatasetVisible(i)) {\r
                                                        base += negDS.data[index] < 0 ? negDS.data[index] : 0;\r
                                                }\r
                                        }\r
                                } else {\r
                                        for (var j = 0; j < datasetIndex; j++) {\r
-                                               var posDS = this.chart.data.datasets[j];\r
-                                               var posDSMeta = this.chart.getDatasetMeta(j);\r
-                                               if (posDSMeta.bar && posDSMeta.xAxisID === xScale.id && this.chart.isDatasetVisible(j)) {\r
+                                               var posDS = me.chart.data.datasets[j];\r
+                                               var posDSMeta = me.chart.getDatasetMeta(j);\r
+                                               if (posDSMeta.bar && posDSMeta.xAxisID === xScale.id && me.chart.isDatasetVisible(j)) {\r
                                                        base += posDS.data[index] > 0 ? posDS.data[index] : 0;\r
                                                }\r
                                        }\r
@@ -2304,9 +2317,10 @@ module.exports = function(Chart) {
                },\r
 \r
                getRuler: function (index) {\r
-                       var meta = this.getMeta();\r
-                       var yScale = this.getScaleForId(meta.yAxisID);\r
-                       var datasetCount = this.getBarCount();\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var yScale = me.getScaleForId(meta.yAxisID);\r
+                       var datasetCount = me.getBarCount();\r
 \r
                        var tickHeight;\r
                        if (yScale.options.type === 'category') {\r
@@ -2319,8 +2333,8 @@ module.exports = function(Chart) {
                        var categorySpacing = (tickHeight - (tickHeight * yScale.options.categoryPercentage)) / 2;\r
                        var fullBarHeight = categoryHeight / datasetCount;\r
 \r
-                       if (yScale.ticks.length !== this.chart.data.labels.length) {\r
-                               var perc = yScale.ticks.length / this.chart.data.labels.length;\r
+                       if (yScale.ticks.length !== me.chart.data.labels.length) {\r
+                               var perc = yScale.ticks.length / me.chart.data.labels.length;\r
                                fullBarHeight = fullBarHeight * perc;\r
                        }\r
 \r
@@ -2339,15 +2353,17 @@ module.exports = function(Chart) {
                },\r
 \r
                calculateBarHeight: function (index) {\r
-                       var yScale = this.getScaleForId(this.getMeta().yAxisID);\r
-                       var ruler = this.getRuler(index);\r
+                       var me = this;\r
+                       var yScale = me.getScaleForId(me.getMeta().yAxisID);\r
+                       var ruler = me.getRuler(index);\r
                        return yScale.options.stacked ? ruler.categoryHeight : ruler.barHeight;\r
                },\r
 \r
                calculateBarX: function (index, datasetIndex) {\r
-                       var meta = this.getMeta();\r
-                       var xScale = this.getScaleForId(meta.xAxisID);\r
-                       var value = this.getDataset().data[index];\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var xScale = me.getScaleForId(meta.xAxisID);\r
+                       var value = me.getDataset().data[index];\r
 \r
                        if (xScale.options.stacked) {\r
 \r
@@ -2355,9 +2371,9 @@ module.exports = function(Chart) {
                                        sumNeg = 0;\r
 \r
                                for (var i = 0; i < datasetIndex; i++) {\r
-                                       var ds = this.chart.data.datasets[i];\r
-                                       var dsMeta = this.chart.getDatasetMeta(i);\r
-                                       if (dsMeta.bar && dsMeta.xAxisID === xScale.id && this.chart.isDatasetVisible(i)) {\r
+                                       var ds = me.chart.data.datasets[i];\r
+                                       var dsMeta = me.chart.getDatasetMeta(i);\r
+                                       if (dsMeta.bar && dsMeta.xAxisID === xScale.id && me.chart.isDatasetVisible(i)) {\r
                                                if (ds.data[index] < 0) {\r
                                                        sumNeg += ds.data[index] || 0;\r
                                                } else {\r
@@ -2377,13 +2393,14 @@ module.exports = function(Chart) {
                },\r
 \r
                calculateBarY: function (index, datasetIndex) {\r
-                       var meta = this.getMeta();\r
-                       var yScale = this.getScaleForId(meta.yAxisID);\r
-                       var barIndex = this.getBarIndex(datasetIndex);\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var yScale = me.getScaleForId(meta.yAxisID);\r
+                       var barIndex = me.getBarIndex(datasetIndex);\r
 \r
-                       var ruler = this.getRuler(index);\r
-                       var topTick = yScale.getPixelForValue(null, index, datasetIndex, this.chart.isCombo);\r
-                       topTick -= this.chart.isCombo ? (ruler.tickHeight / 2) : 0;\r
+                       var ruler = me.getRuler(index);\r
+                       var topTick = yScale.getPixelForValue(null, index, datasetIndex, me.chart.isCombo);\r
+                       topTick -= me.chart.isCombo ? (ruler.tickHeight / 2) : 0;\r
 \r
                        if (yScale.options.stacked) {\r
                                return topTick + (ruler.categoryHeight / 2) + ruler.categorySpacing;\r
@@ -2444,47 +2461,50 @@ module.exports = function(Chart) {
                dataElementType: Chart.elements.Point,\r
 \r
                update: function update(reset) {\r
-                       var meta = this.getMeta();\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
                        var points = meta.data;\r
 \r
                        // Update Points\r
                        helpers.each(points, function(point, index) {\r
-                               this.updateElement(point, index, reset);\r
-                       }, this);\r
+                               me.updateElement(point, index, reset);\r
+                       });\r
                },\r
 \r
                updateElement: function(point, index, reset) {\r
-                       var meta = this.getMeta();\r
-                       var xScale = this.getScaleForId(meta.xAxisID);\r
-                       var yScale = this.getScaleForId(meta.yAxisID);\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var xScale = me.getScaleForId(meta.xAxisID);\r
+                       var yScale = me.getScaleForId(meta.yAxisID);\r
 \r
                        var custom = point.custom || {};\r
-                       var dataset = this.getDataset();\r
+                       var dataset = me.getDataset();\r
                        var data = dataset.data[index];\r
-                       var pointElementOptions = this.chart.options.elements.point;\r
+                       var pointElementOptions = me.chart.options.elements.point;\r
+                       var dsIndex = me.index;\r
 \r
                        helpers.extend(point, {\r
                                // Utility\r
                                _xScale: xScale,\r
                                _yScale: yScale,\r
-                               _datasetIndex: this.index,\r
+                               _datasetIndex: dsIndex,\r
                                _index: index,\r
 \r
                                // Desired view properties\r
                                _model: {\r
-                                       x: reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(data, index, this.index, this.chart.isCombo),\r
-                                       y: reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, this.index),\r
+                                       x: reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(data, index, dsIndex, me.chart.isCombo),\r
+                                       y: reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex),\r
                                        // Appearance\r
-                                       radius: reset ? 0 : custom.radius ? custom.radius : this.getRadius(data),\r
-                                       backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, pointElementOptions.backgroundColor),\r
-                                       borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, pointElementOptions.borderColor),\r
-                                       borderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, pointElementOptions.borderWidth),\r
+                                       radius: reset ? 0 : custom.radius ? custom.radius : me.getRadius(data),\r
 \r
                                        // Tooltip\r
                                        hitRadius: custom.hitRadius ? custom.hitRadius : helpers.getValueAtIndexOrDefault(dataset.hitRadius, index, pointElementOptions.hitRadius)\r
                                }\r
                        });\r
 \r
+                       // Trick to reset the styles of the point\r
+                       Chart.DatasetController.prototype.removeHoverStyle.call(me, point, pointElementOptions);\r
+\r
                        var model = point._model;\r
                        model.skip = custom.skip ? custom.skip : (isNaN(model.x) || isNaN(model.y));\r
 \r
@@ -2496,29 +2516,26 @@ module.exports = function(Chart) {
                },\r
 \r
                setHoverStyle: function(point) {\r
-                       // Point\r
-                       var dataset = this.chart.data.datasets[point._datasetIndex];\r
+                       var me = this;\r
+                       Chart.DatasetController.prototype.setHoverStyle.call(me, point);\r
+\r
+                       // Radius\r
+                       var dataset = me.chart.data.datasets[point._datasetIndex];\r
                        var index = point._index;\r
                        var custom = point.custom || {};\r
                        var model = point._model;\r
-\r
-                       model.radius = custom.hoverRadius ? custom.hoverRadius : (helpers.getValueAtIndexOrDefault(dataset.hoverRadius, index, this.chart.options.elements.point.hoverRadius)) + this.getRadius(this.getDataset().data[point._index]);\r
-                       model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\r
-                       model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor));\r
-                       model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\r
+                       model.radius = custom.hoverRadius ? custom.hoverRadius : (helpers.getValueAtIndexOrDefault(dataset.hoverRadius, index, me.chart.options.elements.point.hoverRadius)) + me.getRadius(dataset.data[index]);\r
                },\r
 \r
                removeHoverStyle: function(point) {\r
-                       var dataset = this.chart.data.datasets[point._datasetIndex];\r
-                       var index = point._index;\r
+                       var me = this;\r
+                       Chart.DatasetController.prototype.removeHoverStyle.call(me, point, me.chart.options.elements.point);\r
+\r
+                       var dataVal = me.chart.data.datasets[point._datasetIndex].data[point._index];\r
                        var custom = point.custom || {};\r
                        var model = point._model;\r
-                       var pointElementOptions = this.chart.options.elements.point;\r
 \r
-                       model.radius = custom.radius ? custom.radius : this.getRadius(dataset.data[point._index]);\r
-                       model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, pointElementOptions.backgroundColor);\r
-                       model.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, pointElementOptions.borderColor);\r
-                       model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, pointElementOptions.borderWidth);\r
+                       model.radius = custom.radius ? custom.radius : me.getRadius(dataVal);\r
                }\r
        });\r
 };\r
@@ -2658,8 +2675,8 @@ module.exports = function(Chart) {
                },\r
 \r
                update: function update(reset) {\r
-                       var _this = this;\r
-                       var chart = _this.chart,\r
+                       var me = this;\r
+                       var chart = me.chart,\r
                                chartArea = chart.chartArea,\r
                                opts = chart.options,\r
                                arcOpts = opts.elements.arc,\r
@@ -2670,7 +2687,7 @@ module.exports = function(Chart) {
                                        x: 0,\r
                                        y: 0\r
                                },\r
-                               meta = _this.getMeta(),\r
+                               meta = me.getMeta(),\r
                                cutoutPercentage = opts.cutoutPercentage,\r
                                circumference = opts.circumference;\r
 \r
@@ -2699,19 +2716,19 @@ module.exports = function(Chart) {
                        chart.offsetX = offset.x * chart.outerRadius;\r
                        chart.offsetY = offset.y * chart.outerRadius;\r
 \r
-                       meta.total = _this.calculateTotal();\r
+                       meta.total = me.calculateTotal();\r
 \r
-                       _this.outerRadius = chart.outerRadius - (chart.radiusLength * _this.getRingIndex(_this.index));\r
-                       _this.innerRadius = _this.outerRadius - chart.radiusLength;\r
+                       me.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index));\r
+                       me.innerRadius = me.outerRadius - chart.radiusLength;\r
 \r
                        helpers.each(meta.data, function(arc, index) {\r
-                               _this.updateElement(arc, index, reset);\r
+                               me.updateElement(arc, index, reset);\r
                        });\r
                },\r
 \r
                updateElement: function(arc, index, reset) {\r
-                       var _this = this;\r
-                       var chart = _this.chart,\r
+                       var me = this;\r
+                       var chart = me.chart,\r
                                chartArea = chart.chartArea,\r
                                opts = chart.options,\r
                                animationOpts = opts.animation,\r
@@ -2720,16 +2737,16 @@ module.exports = function(Chart) {
                                centerY = (chartArea.top + chartArea.bottom) / 2,\r
                                startAngle = opts.rotation, // non reset case handled later\r
                                endAngle = opts.rotation, // non reset case handled later\r
-                               dataset = _this.getDataset(),\r
-                               circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : _this.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)),\r
-                               innerRadius = reset && animationOpts.animateScale ? 0 : _this.innerRadius,\r
-                               outerRadius = reset && animationOpts.animateScale ? 0 : _this.outerRadius,\r
+                               dataset = me.getDataset(),\r
+                               circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)),\r
+                               innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius,\r
+                               outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius,\r
                                custom = arc.custom || {},\r
                                valueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\r
 \r
                        helpers.extend(arc, {\r
                                // Utility\r
-                               _datasetIndex: _this.index,\r
+                               _datasetIndex: me.index,\r
                                _index: index,\r
 \r
                                // Desired view properties\r
@@ -2746,17 +2763,15 @@ module.exports = function(Chart) {
                        });\r
 \r
                        var model = arc._model;\r
-                       model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(dataset.backgroundColor, index, arcOpts.backgroundColor);\r
-                       model.hoverBackgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, arcOpts.hoverBackgroundColor);\r
-                       model.borderWidth = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(dataset.borderWidth, index, arcOpts.borderWidth);\r
-                       model.borderColor = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(dataset.borderColor, index, arcOpts.borderColor);\r
+                       // Resets the visual styles\r
+                       this.removeHoverStyle(arc);\r
 \r
                        // Set correct angles if not resetting\r
                        if (!reset || !animationOpts.animateRotate) {\r
                                if (index === 0) {\r
                                        model.startAngle = opts.rotation;\r
                                } else {\r
-                                       model.startAngle = _this.getMeta().data[index - 1]._model.endAngle;\r
+                                       model.startAngle = me.getMeta().data[index - 1]._model.endAngle;\r
                                }\r
 \r
                                model.endAngle = model.startAngle + model.circumference;\r
@@ -2822,6 +2837,10 @@ module.exports = function(Chart) {
                }\r
        };\r
 \r
+       function lineEnabled(dataset, options) {\r
+               return helpers.getValueOrDefault(dataset.showLine, options.showLines);\r
+       }\r
+\r
        Chart.controllers.line = Chart.DatasetController.extend({\r
 \r
                datasetElementType: Chart.elements.Line,\r
@@ -2831,11 +2850,12 @@ module.exports = function(Chart) {
                addElementAndReset: function(index) {\r
                        var me = this;\r
                        var options = me.chart.options;\r
+                       var meta = me.getMeta();\r
 \r
                        Chart.DatasetController.prototype.addElementAndReset.call(me, index);\r
 \r
                        // Make sure bezier control points are updated\r
-                       if (options.showLines && options.elements.line.tension !== 0) {\r
+                       if (lineEnabled(me.getDataset(), options) && meta.dataset._model.tension !== 0) {\r
                                me.updateBezierControlPoints();\r
                        }\r
                },\r
@@ -2848,11 +2868,12 @@ module.exports = function(Chart) {
                        var options = me.chart.options;\r
                        var lineElementOptions = options.elements.line;\r
                        var scale = me.getScaleForId(meta.yAxisID);\r
-                       var i, ilen, dataset, custom;\r
+                       var i, ilen, custom;\r
+                       var dataset = me.getDataset();\r
+                       var showLine = lineEnabled(dataset, options);\r
 \r
                        // Update Line\r
-                       if (options.showLines) {\r
-                               dataset = me.getDataset();\r
+                       if (showLine) {\r
                                custom = line.custom || {};\r
 \r
                                // Compatibility: If the properties are defined with only the old name, use those values\r
@@ -2868,6 +2889,10 @@ module.exports = function(Chart) {
                                // Model\r
                                line._model = {\r
                                        // Appearance\r
+                                       // The default behavior of lines is to break at null values, according\r
+                                       // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\r
+                                       // This option gives linse the ability to span gaps\r
+                                       spanGaps: dataset.spanGaps ? dataset.spanGaps : false,\r
                                        tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension),\r
                                        backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\r
                                        borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\r
@@ -2891,9 +2916,14 @@ module.exports = function(Chart) {
                                me.updateElement(points[i], i, reset);\r
                        }\r
 \r
-                       if (options.showLines && lineElementOptions.tension !== 0) {\r
+                       if (showLine && line._model.tension !== 0) {\r
                                me.updateBezierControlPoints();\r
                        }\r
+\r
+                       // Now pivot the point for animation\r
+                       for (i=0, ilen=points.length; i<ilen; ++i) {\r
+                               points[i].pivot();\r
+                       }\r
                },\r
 \r
                getPointBackgroundColor: function(point, index) {\r
@@ -3038,19 +3068,16 @@ module.exports = function(Chart) {
                                        meta.dataset._model.tension\r
                                );\r
 \r
-                               // Prevent the bezier going outside of the bounds of the graph\r
-                               model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, area.right), area.left);\r
-                               model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, area.bottom), area.top);\r
-                               model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, area.right), area.left);\r
-                               model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, area.bottom), area.top);\r
-\r
-                               // Now pivot the point for animation\r
-                               point.pivot();\r
+                               model.controlPointPreviousX = controlPoints.previous.x;\r
+                               model.controlPointPreviousY = controlPoints.previous.y;\r
+                               model.controlPointNextX = controlPoints.next.x;\r
+                               model.controlPointNextY = controlPoints.next.y;\r
                        }\r
                },\r
 \r
                draw: function(ease) {\r
-                       var meta = this.getMeta();\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
                        var points = meta.data || [];\r
                        var easingDecimal = ease || 1;\r
                        var i, ilen;\r
@@ -3061,7 +3088,7 @@ module.exports = function(Chart) {
                        }\r
 \r
                        // Transition and Draw the line\r
-                       if (this.chart.options.showLines) {\r
+                       if (lineEnabled(me.getDataset(), me.chart.options)) {\r
                                meta.dataset.transition(easingDecimal).draw();\r
                        }\r
 \r
@@ -3213,10 +3240,10 @@ module.exports = function(Chart) {
                linkScales: helpers.noop,\r
 \r
                update: function update(reset) {\r
-                       var _this = this;\r
-                       var chart = _this.chart;\r
+                       var me = this;\r
+                       var chart = me.chart;\r
                        var chartArea = chart.chartArea;\r
-                       var meta = this.getMeta();\r
+                       var meta = me.getMeta();\r
                        var opts = chart.options;\r
                        var arcOpts = opts.elements.arc;\r
                        var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\r
@@ -3224,21 +3251,21 @@ module.exports = function(Chart) {
                        chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\r
                        chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\r
 \r
-                       _this.outerRadius = chart.outerRadius - (chart.radiusLength * _this.index);\r
-                       _this.innerRadius = _this.outerRadius - chart.radiusLength;\r
+                       me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\r
+                       me.innerRadius = me.outerRadius - chart.radiusLength;\r
 \r
-                       meta.count = _this.countVisibleElements();\r
+                       meta.count = me.countVisibleElements();\r
 \r
                        helpers.each(meta.data, function(arc, index) {\r
-                               _this.updateElement(arc, index, reset);\r
+                               me.updateElement(arc, index, reset);\r
                        });\r
                },\r
 \r
                updateElement: function(arc, index, reset) {\r
-                       var _this = this;\r
-                       var chart = _this.chart;\r
+                       var me = this;\r
+                       var chart = me.chart;\r
                        var chartArea = chart.chartArea;\r
-                       var dataset = _this.getDataset();\r
+                       var dataset = me.getDataset();\r
                        var opts = chart.options;\r
                        var animationOpts = opts.animation;\r
                        var arcOpts = opts.elements.arc;\r
@@ -3247,62 +3274,48 @@ module.exports = function(Chart) {
                        var getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\r
                        var labels = chart.data.labels;\r
 \r
-                       var circumference = _this.calculateCircumference(dataset.data[index]);\r
+                       var circumference = me.calculateCircumference(dataset.data[index]);\r
                        var centerX = (chartArea.left + chartArea.right) / 2;\r
                        var centerY = (chartArea.top + chartArea.bottom) / 2;\r
 \r
                        // If there is NaN data before us, we need to calculate the starting angle correctly.\r
                        // We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data\r
                        var visibleCount = 0;\r
-                       var meta = _this.getMeta();\r
+                       var meta = me.getMeta();\r
                        for (var i = 0; i < index; ++i) {\r
                                if (!isNaN(dataset.data[i]) && !meta.data[i].hidden) {\r
                                        ++visibleCount;\r
                                }\r
                        }\r
 \r
-                       var distance = arc.hidden? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\r
-                       var startAngle = (-0.5 * Math.PI) + (circumference * visibleCount);\r
-                       var endAngle = startAngle + (arc.hidden? 0 : circumference);\r
-\r
-                       var resetModel = {\r
-                               x: centerX,\r
-                               y: centerY,\r
-                               innerRadius: 0,\r
-                               outerRadius: animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]),\r
-                               startAngle: animationOpts.animateRotate ? Math.PI * -0.5 : startAngle,\r
-                               endAngle: animationOpts.animateRotate ? Math.PI * -0.5 : endAngle,\r
+                       var negHalfPI = -0.5 * Math.PI;\r
+                       var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\r
+                       var startAngle = (negHalfPI) + (circumference * visibleCount);\r
+                       var endAngle = startAngle + (arc.hidden ? 0 : circumference);\r
 \r
-                               backgroundColor: custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(dataset.backgroundColor, index, arcOpts.backgroundColor),\r
-                               borderWidth: custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(dataset.borderWidth, index, arcOpts.borderWidth),\r
-                               borderColor: custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(dataset.borderColor, index, arcOpts.borderColor),\r
-\r
-                               label: getValueAtIndexOrDefault(labels, index, labels[index])\r
-                       };\r
+                       var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\r
 \r
                        helpers.extend(arc, {\r
                                // Utility\r
-                               _datasetIndex: _this.index,\r
+                               _datasetIndex: me.index,\r
                                _index: index,\r
                                _scale: scale,\r
 \r
                                // Desired view properties\r
-                               _model: reset ? resetModel : {\r
+                               _model: {\r
                                        x: centerX,\r
                                        y: centerY,\r
                                        innerRadius: 0,\r
-                                       outerRadius: distance,\r
-                                       startAngle: startAngle,\r
-                                       endAngle: endAngle,\r
-\r
-                                       backgroundColor: custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(dataset.backgroundColor, index, arcOpts.backgroundColor),\r
-                                       borderWidth: custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(dataset.borderWidth, index, arcOpts.borderWidth),\r
-                                       borderColor: custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(dataset.borderColor, index, arcOpts.borderColor),\r
-\r
+                                       outerRadius: reset ? resetRadius : distance,\r
+                                       startAngle: reset && animationOpts.animateRotate ? negHalfPI : startAngle,\r
+                                       endAngle: reset && animationOpts.animateRotate ? negHalfPI : endAngle,\r
                                        label: getValueAtIndexOrDefault(labels, index, labels[index])\r
                                }\r
                        });\r
 \r
+                       // Apply border and fill style\r
+                       me.removeHoverStyle(arc);\r
+\r
                        arc.pivot();\r
                },\r
 \r
@@ -3369,13 +3382,14 @@ module.exports = function(Chart) {
                },\r
 \r
                update: function update(reset) {\r
-                       var meta = this.getMeta();\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
                        var line = meta.dataset;\r
                        var points = meta.data;\r
                        var custom = line.custom || {};\r
-                       var dataset = this.getDataset();\r
-                       var lineElementOptions = this.chart.options.elements.line;\r
-                       var scale = this.chart.scale;\r
+                       var dataset = me.getDataset();\r
+                       var lineElementOptions = me.chart.options.elements.line;\r
+                       var scale = me.chart.scale;\r
 \r
                        // Compatibility: If the properties are defined with only the old name, use those values\r
                        if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\r
@@ -3384,7 +3398,7 @@ module.exports = function(Chart) {
 \r
                        helpers.extend(meta.dataset, {\r
                                // Utility\r
-                               _datasetIndex: this.index,\r
+                               _datasetIndex: me.index,\r
                                // Data\r
                                _children: points,\r
                                _loop: true,\r
@@ -3412,23 +3426,24 @@ module.exports = function(Chart) {
 \r
                        // Update Points\r
                        helpers.each(points, function(point, index) {\r
-                               this.updateElement(point, index, reset);\r
-                       }, this);\r
+                               me.updateElement(point, index, reset);\r
+                       }, me);\r
 \r
 \r
                        // Update bezier control points\r
-                       this.updateBezierControlPoints();\r
+                       me.updateBezierControlPoints();\r
                },\r
                updateElement: function(point, index, reset) {\r
+                       var me = this;\r
                        var custom = point.custom || {};\r
-                       var dataset = this.getDataset();\r
-                       var scale = this.chart.scale;\r
-                       var pointElementOptions = this.chart.options.elements.point;\r
+                       var dataset = me.getDataset();\r
+                       var scale = me.chart.scale;\r
+                       var pointElementOptions = me.chart.options.elements.point;\r
                        var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\r
 \r
                        helpers.extend(point, {\r
                                // Utility\r
-                               _datasetIndex: this.index,\r
+                               _datasetIndex: me.index,\r
                                _index: index,\r
                                _scale: scale,\r
 \r
@@ -3438,7 +3453,7 @@ module.exports = function(Chart) {
                                        y: reset ? scale.yCenter : pointPosition.y,\r
 \r
                                        // Appearance\r
-                                       tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.tension, this.chart.options.elements.line.tension),\r
+                                       tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.tension, me.chart.options.elements.line.tension),\r
                                        radius: custom.radius ? custom.radius : helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),\r
                                        backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),\r
                                        borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),\r
@@ -3474,7 +3489,7 @@ module.exports = function(Chart) {
 \r
                                // Now pivot the point for animation\r
                                point.pivot();\r
-                       }, this);\r
+                       });\r
                },\r
 \r
                draw: function(ease) {\r
@@ -3554,27 +3569,28 @@ module.exports = function(Chart) {
                dropFrames: 0,\r
                request: null,\r
                addAnimation: function(chartInstance, animationObject, duration, lazy) {\r
+                       var me = this;\r
 \r
                        if (!lazy) {\r
                                chartInstance.animating = true;\r
                        }\r
 \r
-                       for (var index = 0; index < this.animations.length; ++index) {\r
-                               if (this.animations[index].chartInstance === chartInstance) {\r
+                       for (var index = 0; index < me.animations.length; ++index) {\r
+                               if (me.animations[index].chartInstance === chartInstance) {\r
                                        // replacing an in progress animation\r
-                                       this.animations[index].animationObject = animationObject;\r
+                                       me.animations[index].animationObject = animationObject;\r
                                        return;\r
                                }\r
                        }\r
 \r
-                       this.animations.push({\r
+                       me.animations.push({\r
                                chartInstance: chartInstance,\r
                                animationObject: animationObject\r
                        });\r
 \r
                        // If there are no animations queued, manually kickstart a digest, for lack of a better word\r
-                       if (this.animations.length === 1) {\r
-                               this.requestAnimationFrame();\r
+                       if (me.animations.length === 1) {\r
+                               me.requestAnimationFrame();\r
                        }\r
                },\r
                // Cancel the animation for a given chart instance\r
@@ -3601,54 +3617,55 @@ module.exports = function(Chart) {
                        }\r
                },\r
                startDigest: function() {\r
+                       var me = this;\r
 \r
                        var startTime = Date.now();\r
                        var framesToDrop = 0;\r
 \r
-                       if (this.dropFrames > 1) {\r
-                               framesToDrop = Math.floor(this.dropFrames);\r
-                               this.dropFrames = this.dropFrames % 1;\r
+                       if (me.dropFrames > 1) {\r
+                               framesToDrop = Math.floor(me.dropFrames);\r
+                               me.dropFrames = me.dropFrames % 1;\r
                        }\r
 \r
                        var i = 0;\r
-                       while (i < this.animations.length) {\r
-                               if (this.animations[i].animationObject.currentStep === null) {\r
-                                       this.animations[i].animationObject.currentStep = 0;\r
+                       while (i < me.animations.length) {\r
+                               if (me.animations[i].animationObject.currentStep === null) {\r
+                                       me.animations[i].animationObject.currentStep = 0;\r
                                }\r
 \r
-                               this.animations[i].animationObject.currentStep += 1 + framesToDrop;\r
+                               me.animations[i].animationObject.currentStep += 1 + framesToDrop;\r
 \r
-                               if (this.animations[i].animationObject.currentStep > this.animations[i].animationObject.numSteps) {\r
-                                       this.animations[i].animationObject.currentStep = this.animations[i].animationObject.numSteps;\r
+                               if (me.animations[i].animationObject.currentStep > me.animations[i].animationObject.numSteps) {\r
+                                       me.animations[i].animationObject.currentStep = me.animations[i].animationObject.numSteps;\r
                                }\r
 \r
-                               this.animations[i].animationObject.render(this.animations[i].chartInstance, this.animations[i].animationObject);\r
-                               if (this.animations[i].animationObject.onAnimationProgress && this.animations[i].animationObject.onAnimationProgress.call) {\r
-                                       this.animations[i].animationObject.onAnimationProgress.call(this.animations[i].chartInstance, this.animations[i]);\r
+                               me.animations[i].animationObject.render(me.animations[i].chartInstance, me.animations[i].animationObject);\r
+                               if (me.animations[i].animationObject.onAnimationProgress && me.animations[i].animationObject.onAnimationProgress.call) {\r
+                                       me.animations[i].animationObject.onAnimationProgress.call(me.animations[i].chartInstance, me.animations[i]);\r
                                }\r
 \r
-                               if (this.animations[i].animationObject.currentStep === this.animations[i].animationObject.numSteps) {\r
-                                       if (this.animations[i].animationObject.onAnimationComplete && this.animations[i].animationObject.onAnimationComplete.call) {\r
-                                               this.animations[i].animationObject.onAnimationComplete.call(this.animations[i].chartInstance, this.animations[i]);\r
+                               if (me.animations[i].animationObject.currentStep === me.animations[i].animationObject.numSteps) {\r
+                                       if (me.animations[i].animationObject.onAnimationComplete && me.animations[i].animationObject.onAnimationComplete.call) {\r
+                                               me.animations[i].animationObject.onAnimationComplete.call(me.animations[i].chartInstance, me.animations[i]);\r
                                        }\r
 \r
                                        // executed the last frame. Remove the animation.\r
-                                       this.animations[i].chartInstance.animating = false;\r
+                                       me.animations[i].chartInstance.animating = false;\r
 \r
-                                       this.animations.splice(i, 1);\r
+                                       me.animations.splice(i, 1);\r
                                } else {\r
                                        ++i;\r
                                }\r
                        }\r
 \r
                        var endTime = Date.now();\r
-                       var dropFrames = (endTime - startTime) / this.frameDuration;\r
+                       var dropFrames = (endTime - startTime) / me.frameDuration;\r
 \r
-                       this.dropFrames += dropFrames;\r
+                       me.dropFrames += dropFrames;\r
 \r
                        // Do we have more stuff to animate?\r
-                       if (this.animations.length > 0) {\r
-                               this.requestAnimationFrame();\r
+                       if (me.animations.length > 0) {\r
+                               me.requestAnimationFrame();\r
                        }\r
                }\r
        };\r
@@ -3669,7 +3686,10 @@ module.exports = function(Chart) {
        // Controllers available for dataset visualization eg. bar, line, slice, etc.\r
        Chart.controllers = {};\r
 \r
-       // The main controller of a chart\r
+       /**\r
+        * @class Chart.Controller\r
+        * The main controller of a chart.\r
+        */\r
        Chart.Controller = function(instance) {\r
 \r
                this.chart = instance;\r
@@ -3696,29 +3716,29 @@ module.exports = function(Chart) {
                return this;\r
        };\r
 \r
-       helpers.extend(Chart.Controller.prototype, {\r
+       helpers.extend(Chart.Controller.prototype, /** @lends Chart.Controller */ {\r
 \r
                initialize: function initialize() {\r
+                       var me = this;\r
                        // Before init plugin notification\r
-                       Chart.pluginService.notifyPlugins('beforeInit', [this]);\r
+                       Chart.plugins.notify('beforeInit', [me]);\r
 \r
-                       this.bindEvents();\r
+                       me.bindEvents();\r
 \r
                        // Make sure controllers are built first so that each dataset is bound to an axis before the scales\r
                        // are built\r
-                       this.ensureScalesHaveIDs();\r
-                       this.buildOrUpdateControllers();\r
-                       this.buildScales();\r
-                       this.buildSurroundingItems();\r
-                       this.updateLayout();\r
-                       this.resetElements();\r
-                       this.initToolTip();\r
-                       this.update();\r
+                       me.ensureScalesHaveIDs();\r
+                       me.buildOrUpdateControllers();\r
+                       me.buildScales();\r
+                       me.updateLayout();\r
+                       me.resetElements();\r
+                       me.initToolTip();\r
+                       me.update();\r
 \r
                        // After init plugin notification\r
-                       Chart.pluginService.notifyPlugins('afterInit', [this]);\r
+                       Chart.plugins.notify('afterInit', [me]);\r
 \r
-                       return this;\r
+                       return me;\r
                },\r
 \r
                clear: function clear() {\r
@@ -3733,26 +3753,39 @@ module.exports = function(Chart) {
                },\r
 \r
                resize: function resize(silent) {\r
-                       var canvas = this.chart.canvas;\r
-                       var newWidth = helpers.getMaximumWidth(this.chart.canvas);\r
-                       var newHeight = (this.options.maintainAspectRatio && isNaN(this.chart.aspectRatio) === false && isFinite(this.chart.aspectRatio) && this.chart.aspectRatio !== 0) ? newWidth / this.chart.aspectRatio : helpers.getMaximumHeight(this.chart.canvas);\r
+                       var me = this;\r
+                       var chart = me.chart;\r
+                       var canvas = chart.canvas;\r
+                       var newWidth = helpers.getMaximumWidth(canvas);\r
+                       var aspectRatio = chart.aspectRatio;\r
+                       var newHeight = (me.options.maintainAspectRatio && isNaN(aspectRatio) === false && isFinite(aspectRatio) && aspectRatio !== 0) ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas);\r
+\r
+                       var sizeChanged = chart.width !== newWidth || chart.height !== newHeight;\r
 \r
-                       var sizeChanged = this.chart.width !== newWidth || this.chart.height !== newHeight;\r
+                       if (!sizeChanged) {\r
+                               return me;\r
+                       }\r
+\r
+                       canvas.width = chart.width = newWidth;\r
+                       canvas.height = chart.height = newHeight;\r
 \r
-                       if (!sizeChanged)\r
-                               return this;\r
+                       helpers.retinaScale(chart);\r
 \r
-                       canvas.width = this.chart.width = newWidth;\r
-                       canvas.height = this.chart.height = newHeight;\r
+                       // Notify any plugins about the resize\r
+                       var newSize = { width: newWidth, height: newHeight };\r
+                       Chart.plugins.notify('resize', [me, newSize]);\r
 \r
-                       helpers.retinaScale(this.chart);\r
+                       // Notify of resize\r
+                       if (me.options.onResize) {\r
+                               me.options.onResize(me, newSize);\r
+                       }\r
 \r
                        if (!silent) {\r
-                               this.stop();\r
-                               this.update(this.options.responsiveAnimationDuration);\r
+                               me.stop();\r
+                               me.update(me.options.responsiveAnimationDuration);\r
                        }\r
 \r
-                       return this;\r
+                       return me;\r
                },\r
 \r
                ensureScalesHaveIDs: function ensureScalesHaveIDs() {\r
@@ -3822,40 +3855,19 @@ module.exports = function(Chart) {
                        Chart.scaleService.addScalesToLayout(this);\r
                },\r
 \r
-               buildSurroundingItems: function() {\r
-                       if (this.options.title) {\r
-                               this.titleBlock = new Chart.Title({\r
-                                       ctx: this.chart.ctx,\r
-                                       options: this.options.title,\r
-                                       chart: this\r
-                               });\r
-\r
-                               Chart.layoutService.addBox(this, this.titleBlock);\r
-                       }\r
-\r
-                       if (this.options.legend) {\r
-                               this.legend = new Chart.Legend({\r
-                                       ctx: this.chart.ctx,\r
-                                       options: this.options.legend,\r
-                                       chart: this\r
-                               });\r
-\r
-                               Chart.layoutService.addBox(this, this.legend);\r
-                       }\r
-               },\r
-\r
                updateLayout: function() {\r
                        Chart.layoutService.update(this, this.chart.width, this.chart.height);\r
                },\r
 \r
                buildOrUpdateControllers: function buildOrUpdateControllers() {\r
+                       var me = this;\r
                        var types = [];\r
                        var newControllers = [];\r
 \r
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {\r
-                               var meta = this.getDatasetMeta(datasetIndex);\r
+                       helpers.each(me.data.datasets, function(dataset, datasetIndex) {\r
+                               var meta = me.getDatasetMeta(datasetIndex);\r
                                if (!meta.type) {\r
-                                       meta.type = dataset.type || this.config.type;\r
+                                       meta.type = dataset.type || me.config.type;\r
                                }\r
 \r
                                types.push(meta.type);\r
@@ -3863,15 +3875,15 @@ module.exports = function(Chart) {
                                if (meta.controller) {\r
                                        meta.controller.updateIndex(datasetIndex);\r
                                } else {\r
-                                       meta.controller = new Chart.controllers[meta.type](this, datasetIndex);\r
+                                       meta.controller = new Chart.controllers[meta.type](me, datasetIndex);\r
                                        newControllers.push(meta.controller);\r
                                }\r
-                       }, this);\r
+                       }, me);\r
 \r
                        if (types.length > 1) {\r
                                for (var i = 1; i < types.length; i++) {\r
                                        if (types[i] !== types[i - 1]) {\r
-                                               this.isCombo = true;\r
+                                               me.isCombo = true;\r
                                                break;\r
                                        }\r
                                }\r
@@ -3881,50 +3893,91 @@ module.exports = function(Chart) {
                },\r
 \r
                resetElements: function resetElements() {\r
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {\r
-                               this.getDatasetMeta(datasetIndex).controller.reset();\r
-                       }, this);\r
+                       var me = this;\r
+                       helpers.each(me.data.datasets, function(dataset, datasetIndex) {\r
+                               me.getDatasetMeta(datasetIndex).controller.reset();\r
+                       }, me);\r
                },\r
 \r
                update: function update(animationDuration, lazy) {\r
-                       Chart.pluginService.notifyPlugins('beforeUpdate', [this]);\r
+                       var me = this;\r
+                       Chart.plugins.notify('beforeUpdate', [me]);\r
 \r
                        // In case the entire data object changed\r
-                       this.tooltip._data = this.data;\r
+                       me.tooltip._data = me.data;\r
 \r
                        // Make sure dataset controllers are updated and new controllers are reset\r
-                       var newControllers = this.buildOrUpdateControllers();\r
+                       var newControllers = me.buildOrUpdateControllers();\r
 \r
                        // Make sure all dataset controllers have correct meta data counts\r
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {\r
-                               this.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\r
-                       }, this);\r
+                       helpers.each(me.data.datasets, function(dataset, datasetIndex) {\r
+                               me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\r
+                       }, me);\r
 \r
-                       Chart.layoutService.update(this, this.chart.width, this.chart.height);\r
+                       Chart.layoutService.update(me, me.chart.width, me.chart.height);\r
 \r
                        // Apply changes to the dataets that require the scales to have been calculated i.e BorderColor chages\r
-                       Chart.pluginService.notifyPlugins('afterScaleUpdate', [this]);\r
+                       Chart.plugins.notify('afterScaleUpdate', [me]);\r
 \r
                        // Can only reset the new controllers after the scales have been updated\r
                        helpers.each(newControllers, function(controller) {\r
                                controller.reset();\r
                        });\r
 \r
-                       // This will loop through any data and do the appropriate element update for the type\r
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {\r
-                               this.getDatasetMeta(datasetIndex).controller.update();\r
-                       }, this);\r
+                       me.updateDatasets();\r
 \r
                        // Do this before render so that any plugins that need final scale updates can use it\r
-                       Chart.pluginService.notifyPlugins('afterUpdate', [this]);\r
+                       Chart.plugins.notify('afterUpdate', [me]);\r
+\r
+                       me.render(animationDuration, lazy);\r
+               },\r
+\r
+               /**\r
+                * @method beforeDatasetsUpdate\r
+                * @description Called before all datasets are updated. If a plugin returns false,\r
+                * the datasets update will be cancelled until another chart update is triggered.\r
+                * @param {Object} instance the chart instance being updated.\r
+                * @returns {Boolean} false to cancel the datasets update.\r
+                * @memberof Chart.PluginBase\r
+                * @since version 2.1.5\r
+                * @instance\r
+                */\r
+\r
+               /**\r
+                * @method afterDatasetsUpdate\r
+                * @description Called after all datasets have been updated. Note that this\r
+                * extension will not be called if the datasets update has been cancelled.\r
+                * @param {Object} instance the chart instance being updated.\r
+                * @memberof Chart.PluginBase\r
+                * @since version 2.1.5\r
+                * @instance\r
+                */\r
+\r
+               /**\r
+                * Updates all datasets unless a plugin returns false to the beforeDatasetsUpdate\r
+                * extension, in which case no datasets will be updated and the afterDatasetsUpdate\r
+                * notification will be skipped.\r
+                * @protected\r
+                * @instance\r
+                */\r
+               updateDatasets: function() {\r
+                       var me = this;\r
+                       var i, ilen;\r
+\r
+                       if (Chart.plugins.notify('beforeDatasetsUpdate', [ me ])) {\r
+                               for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\r
+                                       me.getDatasetMeta(i).controller.update();\r
+                               }\r
 \r
-                       this.render(animationDuration, lazy);\r
+                               Chart.plugins.notify('afterDatasetsUpdate', [ me ]);\r
+                       }\r
                },\r
 \r
                render: function render(duration, lazy) {\r
-                       Chart.pluginService.notifyPlugins('beforeRender', [this]);\r
+                       var me = this;\r
+                       Chart.plugins.notify('beforeRender', [me]);\r
 \r
-                       var animationOptions = this.options.animation;\r
+                       var animationOptions = me.options.animation;\r
                        if (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) {\r
                                var animation = new Chart.Animation();\r
                                animation.numSteps = (duration || animationOptions.duration) / 16.66; //60 fps\r
@@ -3943,62 +3996,58 @@ module.exports = function(Chart) {
                                animation.onAnimationProgress = animationOptions.onProgress;\r
                                animation.onAnimationComplete = animationOptions.onComplete;\r
 \r
-                               Chart.animationService.addAnimation(this, animation, duration, lazy);\r
+                               Chart.animationService.addAnimation(me, animation, duration, lazy);\r
                        } else {\r
-                               this.draw();\r
+                               me.draw();\r
                                if (animationOptions && animationOptions.onComplete && animationOptions.onComplete.call) {\r
-                                       animationOptions.onComplete.call(this);\r
+                                       animationOptions.onComplete.call(me);\r
                                }\r
                        }\r
-                       return this;\r
+                       return me;\r
                },\r
 \r
                draw: function(ease) {\r
+                       var me = this;\r
                        var easingDecimal = ease || 1;\r
-                       this.clear();\r
+                       me.clear();\r
 \r
-                       Chart.pluginService.notifyPlugins('beforeDraw', [this, easingDecimal]);\r
+                       Chart.plugins.notify('beforeDraw', [me, easingDecimal]);\r
 \r
                        // Draw all the scales\r
-                       helpers.each(this.boxes, function(box) {\r
-                               box.draw(this.chartArea);\r
-                       }, this);\r
-                       if (this.scale) {\r
-                               this.scale.draw();\r
+                       helpers.each(me.boxes, function(box) {\r
+                               box.draw(me.chartArea);\r
+                       }, me);\r
+                       if (me.scale) {\r
+                               me.scale.draw();\r
                        }\r
 \r
-                       // Clip out the chart area so that anything outside does not draw. This is necessary for zoom and pan to function\r
-                       var context = this.chart.ctx;\r
-                       context.save();\r
-                       context.beginPath();\r
-                       context.rect(this.chartArea.left, this.chartArea.top, this.chartArea.right - this.chartArea.left, this.chartArea.bottom - this.chartArea.top);\r
-                       context.clip();\r
+                       Chart.plugins.notify('beforeDatasetsDraw', [me, easingDecimal]);\r
 \r
                        // Draw each dataset via its respective controller (reversed to support proper line stacking)\r
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {\r
-                               if (this.isDatasetVisible(datasetIndex)) {\r
-                                       this.getDatasetMeta(datasetIndex).controller.draw(ease);\r
+                       helpers.each(me.data.datasets, function(dataset, datasetIndex) {\r
+                               if (me.isDatasetVisible(datasetIndex)) {\r
+                                       me.getDatasetMeta(datasetIndex).controller.draw(ease);\r
                                }\r
-                       }, this, true);\r
+                       }, me, true);\r
 \r
-                       // Restore from the clipping operation\r
-                       context.restore();\r
+                       Chart.plugins.notify('afterDatasetsDraw', [me, easingDecimal]);\r
 \r
                        // Finally draw the tooltip\r
-                       this.tooltip.transition(easingDecimal).draw();\r
+                       me.tooltip.transition(easingDecimal).draw();\r
 \r
-                       Chart.pluginService.notifyPlugins('afterDraw', [this, easingDecimal]);\r
+                       Chart.plugins.notify('afterDraw', [me, easingDecimal]);\r
                },\r
 \r
                // Get the single element that was clicked on\r
                // @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\r
                getElementAtEvent: function(e) {\r
-                       var eventPosition = helpers.getRelativePosition(e, this.chart);\r
+                       var me = this;\r
+                       var eventPosition = helpers.getRelativePosition(e, me.chart);\r
                        var elementsArray = [];\r
 \r
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {\r
-                               if (this.isDatasetVisible(datasetIndex)) {\r
-                                       var meta = this.getDatasetMeta(datasetIndex);\r
+                       helpers.each(me.data.datasets, function(dataset, datasetIndex) {\r
+                               if (me.isDatasetVisible(datasetIndex)) {\r
+                                       var meta = me.getDatasetMeta(datasetIndex);\r
                                        helpers.each(meta.data, function(element, index) {\r
                                                if (element.inRange(eventPosition.x, eventPosition.y)) {\r
                                                        elementsArray.push(element);\r
@@ -4006,20 +4055,21 @@ module.exports = function(Chart) {
                                                }\r
                                        });\r
                                }\r
-                       }, this);\r
+                       });\r
 \r
                        return elementsArray;\r
                },\r
 \r
                getElementsAtEvent: function(e) {\r
-                       var eventPosition = helpers.getRelativePosition(e, this.chart);\r
+                       var me = this;\r
+                       var eventPosition = helpers.getRelativePosition(e, me.chart);\r
                        var elementsArray = [];\r
 \r
                        var found = (function() {\r
-                               if (this.data.datasets) {\r
-                                       for (var i = 0; i < this.data.datasets.length; i++) {\r
-                                               var meta = this.getDatasetMeta(i);\r
-                                               if (this.isDatasetVisible(i)) {\r
+                               if (me.data.datasets) {\r
+                                       for (var i = 0; i < me.data.datasets.length; i++) {\r
+                                               var meta = me.getDatasetMeta(i);\r
+                                               if (me.isDatasetVisible(i)) {\r
                                                        for (var j = 0; j < meta.data.length; j++) {\r
                                                                if (meta.data[j].inRange(eventPosition.x, eventPosition.y)) {\r
                                                                        return meta.data[j];\r
@@ -4028,18 +4078,18 @@ module.exports = function(Chart) {
                                                }\r
                                        }\r
                                }\r
-                       }).call(this);\r
+                       }).call(me);\r
 \r
                        if (!found) {\r
                                return elementsArray;\r
                        }\r
 \r
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {\r
-                               if (this.isDatasetVisible(datasetIndex)) {\r
-                                       var meta = this.getDatasetMeta(datasetIndex);\r
+                       helpers.each(me.data.datasets, function(dataset, datasetIndex) {\r
+                               if (me.isDatasetVisible(datasetIndex)) {\r
+                                       var meta = me.getDatasetMeta(datasetIndex);\r
                                        elementsArray.push(meta.data[found._index]);\r
                                }\r
-                       }, this);\r
+                       }, me);\r
 \r
                        return elementsArray;\r
                },\r
@@ -4069,14 +4119,15 @@ module.exports = function(Chart) {
                },\r
 \r
                getDatasetMeta: function(datasetIndex) {\r
-                       var dataset = this.data.datasets[datasetIndex];\r
+                       var me = this;\r
+                       var dataset = me.data.datasets[datasetIndex];\r
                        if (!dataset._meta) {\r
                                dataset._meta = {};\r
                        }\r
 \r
-                       var meta = dataset._meta[this.id];\r
+                       var meta = dataset._meta[me.id];\r
                        if (!meta) {\r
-                               meta = dataset._meta[this.id] = {\r
+                               meta = dataset._meta[me.id] = {\r
                                type: null,\r
                                data: [],\r
                                dataset: null,\r
@@ -4113,27 +4164,29 @@ module.exports = function(Chart) {
                },\r
 \r
                destroy: function destroy() {\r
-                       this.clear();\r
-                       helpers.unbindEvents(this, this.events);\r
-                       helpers.removeResizeListener(this.chart.canvas.parentNode);\r
+                       var me = this;\r
+                       me.stop();\r
+                       me.clear();\r
+                       helpers.unbindEvents(me, me.events);\r
+                       helpers.removeResizeListener(me.chart.canvas.parentNode);\r
 \r
                        // Reset canvas height/width attributes\r
-                       var canvas = this.chart.canvas;\r
-                       canvas.width = this.chart.width;\r
-                       canvas.height = this.chart.height;\r
+                       var canvas = me.chart.canvas;\r
+                       canvas.width = me.chart.width;\r
+                       canvas.height = me.chart.height;\r
 \r
                        // if we scaled the canvas in response to a devicePixelRatio !== 1, we need to undo that transform here\r
-                       if (this.chart.originalDevicePixelRatio !== undefined) {\r
-                               this.chart.ctx.scale(1 / this.chart.originalDevicePixelRatio, 1 / this.chart.originalDevicePixelRatio);\r
+                       if (me.chart.originalDevicePixelRatio !== undefined) {\r
+                               me.chart.ctx.scale(1 / me.chart.originalDevicePixelRatio, 1 / me.chart.originalDevicePixelRatio);\r
                        }\r
 \r
                        // Reset to the old style since it may have been changed by the device pixel ratio changes\r
-                       canvas.style.width = this.chart.originalCanvasStyleWidth;\r
-                       canvas.style.height = this.chart.originalCanvasStyleHeight;\r
+                       canvas.style.width = me.chart.originalCanvasStyleWidth;\r
+                       canvas.style.height = me.chart.originalCanvasStyleHeight;\r
 \r
-                       Chart.pluginService.notifyPlugins('destroy', [this]);\r
+                       Chart.plugins.notify('destroy', [me]);\r
 \r
-                       delete Chart.instances[this.id];\r
+                       delete Chart.instances[me.id];\r
                },\r
 \r
                toBase64Image: function toBase64Image() {\r
@@ -4141,17 +4194,19 @@ module.exports = function(Chart) {
                },\r
 \r
                initToolTip: function initToolTip() {\r
-                       this.tooltip = new Chart.Tooltip({\r
-                               _chart: this.chart,\r
-                               _chartInstance: this,\r
-                               _data: this.data,\r
-                               _options: this.options\r
-                       }, this);\r
+                       var me = this;\r
+                       me.tooltip = new Chart.Tooltip({\r
+                               _chart: me.chart,\r
+                               _chartInstance: me,\r
+                               _data: me.data,\r
+                               _options: me.options.tooltips\r
+                       }, me);\r
                },\r
 \r
                bindEvents: function bindEvents() {\r
-                       helpers.bindEvents(this, this.options.events, function(evt) {\r
-                               this.eventHandler(evt);\r
+                       var me = this;\r
+                       helpers.bindEvents(me, me.options.events, function(evt) {\r
+                               me.eventHandler(evt);\r
                        });\r
                },\r
 \r
@@ -4286,10 +4341,11 @@ module.exports = function(Chart) {
                dataElementType: null,\r
 \r
                initialize: function(chart, datasetIndex) {\r
-                       this.chart = chart;\r
-                       this.index = datasetIndex;\r
-                       this.linkScales();\r
-                       this.addElements();\r
+                       var me = this;\r
+                       me.chart = chart;\r
+                       me.index = datasetIndex;\r
+                       me.linkScales();\r
+                       me.addElements();\r
                },\r
 \r
                updateIndex: function(datasetIndex) {\r
@@ -4297,14 +4353,15 @@ module.exports = function(Chart) {
                },\r
 \r
                linkScales: function() {\r
-                       var meta = this.getMeta();\r
-                       var dataset = this.getDataset();\r
+                       var me = this;\r
+                       var meta = me.getMeta();\r
+                       var dataset = me.getDataset();\r
 \r
                        if (meta.xAxisID === null) {\r
-                               meta.xAxisID = dataset.xAxisID || this.chart.options.scales.xAxes[0].id;\r
+                               meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\r
                        }\r
                        if (meta.yAxisID === null) {\r
-                               meta.yAxisID = dataset.yAxisID || this.chart.options.scales.yAxes[0].id;\r
+                               meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\r
                        }\r
                },\r
 \r
@@ -4435,81 +4492,90 @@ module.exports = function(Chart) {
     helpers.extend(this, configuration);\r
     this.initialize.apply(this, arguments);\r
   };\r
+\r
   helpers.extend(Chart.Element.prototype, {\r
+\r
     initialize: function() {\r
       this.hidden = false;\r
     },\r
+\r
     pivot: function() {\r
-      if (!this._view) {\r
-        this._view = helpers.clone(this._model);\r
+      var me = this;\r
+      if (!me._view) {\r
+        me._view = helpers.clone(me._model);\r
       }\r
-      this._start = helpers.clone(this._view);\r
-      return this;\r
+      me._start = helpers.clone(me._view);\r
+      return me;\r
     },\r
+\r
     transition: function(ease) {\r
-      if (!this._view) {\r
-        this._view = helpers.clone(this._model);\r
+      var me = this;\r
+      \r
+      if (!me._view) {\r
+        me._view = helpers.clone(me._model);\r
       }\r
 \r
       // No animation -> No Transition\r
       if (ease === 1) {\r
-        this._view = this._model;\r
-        this._start = null;\r
-        return this;\r
+        me._view = me._model;\r
+        me._start = null;\r
+        return me;\r
       }\r
 \r
-      if (!this._start) {\r
-        this.pivot();\r
+      if (!me._start) {\r
+        me.pivot();\r
       }\r
 \r
-      helpers.each(this._model, function(value, key) {\r
+      helpers.each(me._model, function(value, key) {\r
 \r
         if (key[0] === '_') {\r
           // Only non-underscored properties\r
         }\r
 \r
         // Init if doesn't exist\r
-        else if (!this._view.hasOwnProperty(key)) {\r
-          if (typeof value === 'number' && !isNaN(this._view[key])) {\r
-            this._view[key] = value * ease;\r
+        else if (!me._view.hasOwnProperty(key)) {\r
+          if (typeof value === 'number' && !isNaN(me._view[key])) {\r
+            me._view[key] = value * ease;\r
           } else {\r
-            this._view[key] = value;\r
+            me._view[key] = value;\r
           }\r
         }\r
 \r
         // No unnecessary computations\r
-        else if (value === this._view[key]) {\r
+        else if (value === me._view[key]) {\r
           // It's the same! Woohoo!\r
         }\r
 \r
         // Color transitions if possible\r
         else if (typeof value === 'string') {\r
           try {\r
-            var color = helpers.color(this._model[key]).mix(helpers.color(this._start[key]), ease);\r
-            this._view[key] = color.rgbString();\r
+            var color = helpers.color(me._model[key]).mix(helpers.color(me._start[key]), ease);\r
+            me._view[key] = color.rgbString();\r
           } catch (err) {\r
-            this._view[key] = value;\r
+            me._view[key] = value;\r
           }\r
         }\r
         // Number transitions\r
         else if (typeof value === 'number') {\r
-          var startVal = this._start[key] !== undefined && isNaN(this._start[key]) === false ? this._start[key] : 0;\r
-          this._view[key] = ((this._model[key] - startVal) * ease) + startVal;\r
+          var startVal = me._start[key] !== undefined && isNaN(me._start[key]) === false ? me._start[key] : 0;\r
+          me._view[key] = ((me._model[key] - startVal) * ease) + startVal;\r
         }\r
         // Everything else\r
         else {\r
-          this._view[key] = value;\r
+          me._view[key] = value;\r
         }\r
-      }, this);\r
+      }, me);\r
 \r
-      return this;\r
+      return me;\r
     },\r
+\r
     tooltipPosition: function() {\r
       return {\r
         x: this._model.x,\r
         y: this._model.y\r
       };\r
     },\r
+\r
     hasValue: function() {\r
       return helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);\r
     }\r
@@ -4524,7 +4590,7 @@ module.exports = function(Chart) {
 /*global document: false */\r
 "use strict";\r
 \r
-var color = require('chartjs-color');\r
+var color = require(3);\r
 \r
 module.exports = function(Chart) {\r
        //Global Chart helpers object for utility methods and classes\r
@@ -4567,16 +4633,10 @@ module.exports = function(Chart) {
                return objClone;\r
        };\r
        helpers.extend = function(base) {\r
-               var len = arguments.length;\r
-               var additionalArgs = [];\r
-               for (var i = 1; i < len; i++) {\r
-                       additionalArgs.push(arguments[i]);\r
+               var setFn = function(value, key) { base[key] = value; };\r
+               for (var i = 1, ilen = arguments.length; i < ilen; i++) {\r
+                       helpers.each(arguments[i], setFn);\r
                }\r
-               helpers.each(additionalArgs, function(extensionObject) {\r
-                       helpers.each(extensionObject, function(value, key) {\r
-                               base[key] = value;\r
-                       });\r
-               });\r
                return base;\r
        };\r
        // Need a special merge function to chart configs since they are now grouped\r
@@ -4624,24 +4684,6 @@ module.exports = function(Chart) {
 \r
                return base;\r
        };\r
-       helpers.extendDeep = function(_base) {\r
-               return _extendDeep.apply(this, arguments);\r
-\r
-               function _extendDeep(dst) {\r
-                       helpers.each(arguments, function(obj) {\r
-                               if (obj !== dst) {\r
-                                       helpers.each(obj, function(value, key) {\r
-                                               if (dst[key] && dst[key].constructor && dst[key].constructor === Object) {\r
-                                                       _extendDeep(dst[key], value);\r
-                                               } else {\r
-                                                       dst[key] = value;\r
-                                               }\r
-                                       });\r
-                               }\r
-                       });\r
-                       return dst;\r
-               }\r
-       };\r
        helpers.scaleMerge = function(_base, extension) {\r
                var base = helpers.clone(_base);\r
 \r
@@ -4695,17 +4737,16 @@ module.exports = function(Chart) {
        helpers.getValueOrDefault = function(value, defaultValue) {\r
                return value === undefined ? defaultValue : value;\r
        };\r
-       helpers.indexOf = function(arrayToSearch, item) {\r
-               if (Array.prototype.indexOf) {\r
-                       return arrayToSearch.indexOf(item);\r
-               } else {\r
-                       for (var i = 0; i < arrayToSearch.length; i++) {\r
-                               if (arrayToSearch[i] === item)\r
+       helpers.indexOf = Array.prototype.indexOf?\r
+               function(array, item) { return array.indexOf(item); } :\r
+               function(array, item) {\r
+                       for (var i = 0, ilen = array.length; i < ilen; ++i) {\r
+                               if (array[i] === item) {\r
                                        return i;\r
+                               }\r
                        }\r
                        return -1;\r
-               }\r
-       };\r
+               };\r
        helpers.where = function(collection, filterCallback) {\r
                if (helpers.isArray(collection) && Array.prototype.filter) {\r
                        return collection.filter(filterCallback);\r
@@ -4721,23 +4762,17 @@ module.exports = function(Chart) {
                        return filtered;\r
                }\r
        };\r
-       helpers.findIndex = function(arrayToSearch, callback, thisArg) {\r
-               var index = -1;\r
-               if (Array.prototype.findIndex) {\r
-                       index = arrayToSearch.findIndex(callback, thisArg);\r
-               } else {\r
-                       for (var i = 0; i < arrayToSearch.length; ++i) {\r
-                               thisArg = thisArg !== undefined ? thisArg : arrayToSearch;\r
-\r
-                               if (callback.call(thisArg, arrayToSearch[i], i, arrayToSearch)) {\r
-                                       index = i;\r
-                                       break;\r
+       helpers.findIndex = Array.prototype.findIndex?\r
+               function(array, callback, scope) { return array.findIndex(callback, scope); } :\r
+               function(array, callback, scope) {\r
+                       scope = scope === undefined? array : scope;\r
+                       for (var i = 0, ilen = array.length; i < ilen; ++i) {\r
+                               if (callback.call(scope, array[i], i, array)) {\r
+                                       return i;\r
                                }\r
                        }\r
-               }\r
-\r
-               return index;\r
-       };\r
+                       return -1;\r
+               };\r
        helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {\r
                // Default to start of the array\r
                if (startIndex === undefined || startIndex === null) {\r
@@ -4792,12 +4827,6 @@ module.exports = function(Chart) {
                        return id++;\r
                };\r
        })();\r
-       helpers.warn = function(str) {\r
-               //Method for warning of errors\r
-               if (console && typeof console.warn === "function") {\r
-                       console.warn(str);\r
-               }\r
-       };\r
        //-- Math methods\r
        helpers.isNumber = function(n) {\r
                return !isNaN(parseFloat(n)) && isFinite(n);\r
@@ -4823,24 +4852,20 @@ module.exports = function(Chart) {
                        }\r
                }, Number.POSITIVE_INFINITY);\r
        };\r
-       helpers.sign = function(x) {\r
-               if (Math.sign) {\r
-                       return Math.sign(x);\r
-               } else {\r
+       helpers.sign = Math.sign?\r
+               function(x) { return Math.sign(x); } :\r
+               function(x) {\r
                        x = +x; // convert to a number\r
                        if (x === 0 || isNaN(x)) {\r
                                return x;\r
                        }\r
                        return x > 0 ? 1 : -1;\r
-               }\r
-       };\r
-       helpers.log10 = function(x) {\r
-               if (Math.log10) {\r
-                       return Math.log10(x);\r
-               } else {\r
+               };\r
+       helpers.log10 = Math.log10?\r
+               function(x) { return Math.log10(x); } :\r
+               function(x) {\r
                        return Math.log(x) / Math.LN10;\r
-               }\r
-       };\r
+               };\r
        helpers.toRadians = function(degrees) {\r
                return degrees * (Math.PI / 180);\r
        };\r
@@ -5339,7 +5364,7 @@ module.exports = function(Chart) {
        helpers.fontString = function(pixelSize, fontStyle, fontFamily) {\r
                return fontStyle + " " + pixelSize + "px " + fontFamily;\r
        };\r
-       helpers.longestText = function(ctx, font, arrayOfStrings, cache) {\r
+       helpers.longestText = function(ctx, font, arrayOfThings, cache) {\r
                cache = cache || {};\r
                var data = cache.data = cache.data || {};\r
                var gc = cache.garbageCollect = cache.garbageCollect || [];\r
@@ -5352,31 +5377,53 @@ module.exports = function(Chart) {
 \r
                ctx.font = font;\r
                var longest = 0;\r
-               helpers.each(arrayOfStrings, function(string) {\r
-                       // Undefined strings should not be measured\r
-                       if (string !== undefined && string !== null) {\r
-                               var textWidth = data[string];\r
-                               if (!textWidth) {\r
-                                       textWidth = data[string] = ctx.measureText(string).width;\r
-                                       gc.push(string);\r
-                               }\r
-\r
-                               if (textWidth > longest) {\r
-                                       longest = textWidth;\r
-                               }\r
+               helpers.each(arrayOfThings, function(thing) {\r
+                       // Undefined strings and arrays should not be measured\r
+                       if (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) {\r
+                               longest = helpers.measureText(ctx, data, gc, longest, thing);\r
+                       } else if (helpers.isArray(thing)) {\r
+                               // if it is an array lets measure each element\r
+                               // to do maybe simplify this function a bit so we can do this more recursively?\r
+                               helpers.each(thing, function(nestedThing) {\r
+                                       // Undefined strings and arrays should not be measured\r
+                                       if (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) {\r
+                                               longest = helpers.measureText(ctx, data, gc, longest, nestedThing);\r
+                                       }\r
+                               });\r
                        }\r
                });\r
 \r
                var gcLen = gc.length / 2;\r
-               if (gcLen > arrayOfStrings.length) {\r
+               if (gcLen > arrayOfThings.length) {\r
                        for (var i = 0; i < gcLen; i++) {\r
                                delete data[gc[i]];\r
                        }\r
                        gc.splice(0, gcLen);\r
                }\r
-\r
                return longest;\r
        };\r
+       helpers.measureText = function (ctx, data, gc, longest, string) {\r
+               var textWidth = data[string];\r
+               if (!textWidth) {\r
+                       textWidth = data[string] = ctx.measureText(string).width;\r
+                       gc.push(string);\r
+               }\r
+               if (textWidth > longest) {\r
+                       longest = textWidth;\r
+               }\r
+               return longest;\r
+       };\r
+       helpers.numberOfLabelLines = function(arrayOfThings) {\r
+               var numberOfLines = 1;\r
+               helpers.each(arrayOfThings, function(thing) {\r
+                       if (helpers.isArray(thing)) {\r
+                               if (thing.length > numberOfLines) {\r
+                                       numberOfLines = thing.length;\r
+                               }\r
+                       }\r
+               });\r
+               return numberOfLines;\r
+       };\r
        helpers.drawRoundedRectangle = function(ctx, x, y, width, height, radius) {\r
                ctx.beginPath();\r
                ctx.moveTo(x + radius, y);\r
@@ -5445,12 +5492,11 @@ module.exports = function(Chart) {
                        hiddenIframe.parentNode.removeChild(hiddenIframe);\r
                }\r
        };\r
-       helpers.isArray = function(obj) {\r
-               if (!Array.isArray) {\r
+       helpers.isArray = Array.isArray?\r
+               function(obj) { return Array.isArray(obj); } :\r
+               function(obj) {\r
                        return Object.prototype.toString.call(obj) === '[object Array]';\r
-               }\r
-               return Array.isArray(obj);\r
-       };\r
+               };\r
        //! @see http://stackoverflow.com/a/14853974\r
        helpers.arrayEquals = function(a0, a1) {\r
                var i, ilen, v0, v1;\r
@@ -5475,20 +5521,9 @@ module.exports = function(Chart) {
 \r
                return true;\r
        };\r
-       helpers.pushAllIfDefined = function(element, array) {\r
-               if (typeof element === "undefined") {\r
-                       return;\r
-               }\r
-\r
-               if (helpers.isArray(element)) {\r
-                       array.push.apply(array, element);\r
-               } else {\r
-                       array.push(element);\r
-               }\r
-       };\r
-       helpers.callCallback = function(fn, args, _tArg) {\r
-               if (fn && typeof fn.call === 'function') {\r
-                       fn.apply(_tArg, args);\r
+       helpers.callCallback = function(fn, args, _tArg) {\r
+               if (fn && typeof fn.call === 'function') {\r
+                       fn.apply(_tArg, args);\r
                }\r
        };\r
        helpers.getHoverColor = function(color) {\r
@@ -5499,14 +5534,16 @@ module.exports = function(Chart) {
        };\r
 };\r
 
-},{"chartjs-color":3}],26:[function(require,module,exports){
+},{"3":3}],26:[function(require,module,exports){
 "use strict";\r
 \r
 module.exports = function() {\r
 \r
        //Occupy the global variable of Chart, and create a simple base class\r
        var Chart = function(context, config) {\r
-               this.config = config;\r
+               var me = this;\r
+               var helpers = Chart.helpers;\r
+               me.config = config;\r
 \r
                // Support a jQuery'd canvas element\r
                if (context.length && context[0].getContext) {\r
@@ -5518,45 +5555,46 @@ module.exports = function() {
                        context = context.getContext("2d");\r
                }\r
 \r
-               this.ctx = context;\r
-               this.canvas = context.canvas;\r
+               me.ctx = context;\r
+               me.canvas = context.canvas;\r
+\r
+               context.canvas.style.display = context.canvas.style.display || 'block';\r
 \r
                // Figure out what the size of the chart will be.\r
                // If the canvas has a specified width and height, we use those else\r
                // we look to see if the canvas node has a CSS width and height.\r
                // If there is still no height, fill the parent container\r
-               this.width = context.canvas.width || parseInt(Chart.helpers.getStyle(context.canvas, 'width')) || Chart.helpers.getMaximumWidth(context.canvas);\r
-               this.height = context.canvas.height || parseInt(Chart.helpers.getStyle(context.canvas, 'height')) || Chart.helpers.getMaximumHeight(context.canvas);\r
+               me.width = context.canvas.width || parseInt(helpers.getStyle(context.canvas, 'width'), 10) || helpers.getMaximumWidth(context.canvas);\r
+               me.height = context.canvas.height || parseInt(helpers.getStyle(context.canvas, 'height'), 10) || helpers.getMaximumHeight(context.canvas);\r
 \r
-               this.aspectRatio = this.width / this.height;\r
+               me.aspectRatio = me.width / me.height;\r
 \r
-               if (isNaN(this.aspectRatio) || isFinite(this.aspectRatio) === false) {\r
+               if (isNaN(me.aspectRatio) || isFinite(me.aspectRatio) === false) {\r
                        // If the canvas has no size, try and figure out what the aspect ratio will be.\r
                        // Some charts prefer square canvases (pie, radar, etc). If that is specified, use that\r
                        // else use the canvas default ratio of 2\r
-                       this.aspectRatio = config.aspectRatio !== undefined ? config.aspectRatio : 2;\r
+                       me.aspectRatio = config.aspectRatio !== undefined ? config.aspectRatio : 2;\r
                }\r
 \r
                // Store the original style of the element so we can set it back\r
-               this.originalCanvasStyleWidth = context.canvas.style.width;\r
-               this.originalCanvasStyleHeight = context.canvas.style.height;\r
+               me.originalCanvasStyleWidth = context.canvas.style.width;\r
+               me.originalCanvasStyleHeight = context.canvas.style.height;\r
 \r
                // High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale.\r
-               Chart.helpers.retinaScale(this);\r
+               helpers.retinaScale(me);\r
 \r
                if (config) {\r
-                       this.controller = new Chart.Controller(this);\r
+                       me.controller = new Chart.Controller(me);\r
                }\r
 \r
                // Always bind this so that if the responsive state changes we still work\r
-               var _this = this;\r
-               Chart.helpers.addResizeListener(context.canvas.parentNode, function() {\r
-                       if (_this.controller && _this.controller.config.options.responsive) {\r
-                               _this.controller.resize();\r
+               helpers.addResizeListener(context.canvas.parentNode, function() {\r
+                       if (me.controller && me.controller.config.options.responsive) {\r
+                               me.controller.resize();\r
                        }\r
                });\r
 \r
-               return this.controller ? this.controller : this;\r
+               return me.controller ? me.controller : me;\r
 \r
        };\r
 \r
@@ -5601,6 +5639,8 @@ module.exports = function() {
                }\r
        };\r
 \r
+       Chart.Chart = Chart;\r
+\r
        return Chart;\r
 \r
 };\r
@@ -5977,7 +6017,7 @@ module.exports = function(Chart) {
                                return helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {\r
                                        return {\r
                                                text: dataset.label,\r
-                                               fillStyle: dataset.backgroundColor,\r
+                                               fillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),\r
                                                hidden: !chart.isDatasetVisible(i),\r
                                                lineCap: dataset.borderCapStyle,\r
                                                lineDash: dataset.borderDash,\r
@@ -6012,32 +6052,33 @@ module.exports = function(Chart) {
 \r
                beforeUpdate: noop,\r
                update: function(maxWidth, maxHeight, margins) {\r
+                       var me = this;\r
 \r
                        // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\r
-                       this.beforeUpdate();\r
+                       me.beforeUpdate();\r
 \r
                        // Absorb the master measurements\r
-                       this.maxWidth = maxWidth;\r
-                       this.maxHeight = maxHeight;\r
-                       this.margins = margins;\r
+                       me.maxWidth = maxWidth;\r
+                       me.maxHeight = maxHeight;\r
+                       me.margins = margins;\r
 \r
                        // Dimensions\r
-                       this.beforeSetDimensions();\r
-                       this.setDimensions();\r
-                       this.afterSetDimensions();\r
+                       me.beforeSetDimensions();\r
+                       me.setDimensions();\r
+                       me.afterSetDimensions();\r
                        // Labels\r
-                       this.beforeBuildLabels();\r
-                       this.buildLabels();\r
-                       this.afterBuildLabels();\r
+                       me.beforeBuildLabels();\r
+                       me.buildLabels();\r
+                       me.afterBuildLabels();\r
 \r
                        // Fit\r
-                       this.beforeFit();\r
-                       this.fit();\r
-                       this.afterFit();\r
+                       me.beforeFit();\r
+                       me.fit();\r
+                       me.afterFit();\r
                        //\r
-                       this.afterUpdate();\r
+                       me.afterUpdate();\r
 \r
-                       return this.minSize;\r
+                       return me.minSize;\r
                },\r
                afterUpdate: noop,\r
 \r
@@ -6045,28 +6086,29 @@ module.exports = function(Chart) {
 \r
                beforeSetDimensions: noop,\r
                setDimensions: function() {\r
+                       var me = this;\r
                        // Set the unconstrained dimension before label rotation\r
-                       if (this.isHorizontal()) {\r
+                       if (me.isHorizontal()) {\r
                                // Reset position before calculating rotation\r
-                               this.width = this.maxWidth;\r
-                               this.left = 0;\r
-                               this.right = this.width;\r
+                               me.width = me.maxWidth;\r
+                               me.left = 0;\r
+                               me.right = me.width;\r
                        } else {\r
-                               this.height = this.maxHeight;\r
+                               me.height = me.maxHeight;\r
 \r
                                // Reset position before calculating rotation\r
-                               this.top = 0;\r
-                               this.bottom = this.height;\r
+                               me.top = 0;\r
+                               me.bottom = me.height;\r
                        }\r
 \r
                        // Reset padding\r
-                       this.paddingLeft = 0;\r
-                       this.paddingTop = 0;\r
-                       this.paddingRight = 0;\r
-                       this.paddingBottom = 0;\r
+                       me.paddingLeft = 0;\r
+                       me.paddingTop = 0;\r
+                       me.paddingRight = 0;\r
+                       me.paddingBottom = 0;\r
 \r
                        // Reset minSize\r
-                       this.minSize = {\r
+                       me.minSize = {\r
                                width: 0,\r
                                height: 0\r
                        };\r
@@ -6077,9 +6119,10 @@ module.exports = function(Chart) {
 \r
                beforeBuildLabels: noop,\r
                buildLabels: function() {\r
-                       this.legendItems = this.options.labels.generateLabels.call(this, this.chart);\r
-                       if(this.options.reverse){\r
-                               this.legendItems.reverse();\r
+                       var me = this;\r
+                       me.legendItems = me.options.labels.generateLabels.call(me, me.chart);\r
+                       if(me.options.reverse){\r
+                               me.legendItems.reverse();\r
                        }\r
                },\r
                afterBuildLabels: noop,\r
@@ -6088,11 +6131,12 @@ module.exports = function(Chart) {
 \r
                beforeFit: noop,\r
                fit: function() {\r
-                       var opts = this.options;\r
+                       var me = this;\r
+                       var opts = me.options;\r
                        var labelOpts = opts.labels;\r
                        var display = opts.display;\r
 \r
-                       var ctx = this.ctx;\r
+                       var ctx = me.ctx;\r
 \r
                        var globalDefault = Chart.defaults.global,\r
                                itemOrDefault = helpers.getValueOrDefault,\r
@@ -6102,37 +6146,38 @@ module.exports = function(Chart) {
                                labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\r
 \r
                        // Reset hit boxes\r
-                       var hitboxes = this.legendHitBoxes = [];\r
+                       var hitboxes = me.legendHitBoxes = [];\r
 \r
-                       var minSize = this.minSize;\r
-                       var isHorizontal = this.isHorizontal();\r
+                       var minSize = me.minSize;\r
+                       var isHorizontal = me.isHorizontal();\r
 \r
                        if (isHorizontal) {\r
-                               minSize.width = this.maxWidth; // fill all the width\r
+                               minSize.width = me.maxWidth; // fill all the width\r
                                minSize.height = display ? 10 : 0;\r
                        } else {\r
                                minSize.width = display ? 10 : 0;\r
-                               minSize.height = this.maxHeight; // fill all the height\r
+                               minSize.height = me.maxHeight; // fill all the height\r
                        }\r
 \r
                        // Increase sizes here\r
                        if (display) {\r
+                               ctx.font = labelFont;\r
+\r
                                if (isHorizontal) {\r
                                        // Labels\r
 \r
                                        // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\r
-                                       var lineWidths = this.lineWidths = [0];\r
-                                       var totalHeight = this.legendItems.length ? fontSize + (labelOpts.padding) : 0;\r
+                                       var lineWidths = me.lineWidths = [0];\r
+                                       var totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0;\r
 \r
                                        ctx.textAlign = "left";\r
                                        ctx.textBaseline = 'top';\r
-                                       ctx.font = labelFont;\r
 \r
-                                       helpers.each(this.legendItems, function(legendItem, i) {\r
+                                       helpers.each(me.legendItems, function(legendItem, i) {\r
                                                var width = labelOpts.boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\r
-                                               if (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= this.width) {\r
+                                               if (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) {\r
                                                        totalHeight += fontSize + (labelOpts.padding);\r
-                                                       lineWidths[lineWidths.length] = this.left;\r
+                                                       lineWidths[lineWidths.length] = me.left;\r
                                                }\r
 \r
                                                // Store the hitbox width and height here. Final position will be updated in `draw`\r
@@ -6144,17 +6189,51 @@ module.exports = function(Chart) {
                                                };\r
 \r
                                                lineWidths[lineWidths.length - 1] += width + labelOpts.padding;\r
-                                       }, this);\r
+                                       });\r
 \r
                                        minSize.height += totalHeight;\r
 \r
                                } else {\r
-                                       // TODO vertical\r
+                                       var vPadding = labelOpts.padding;\r
+                                       var columnWidths = me.columnWidths = [];\r
+                                       var totalWidth = labelOpts.padding;\r
+                                       var currentColWidth = 0;\r
+                                       var currentColHeight = 0;\r
+                                       var itemHeight = fontSize + vPadding;\r
+\r
+                                       helpers.each(me.legendItems, function(legendItem, i) {\r
+                                               var itemWidth = labelOpts.boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\r
+\r
+                                               // If too tall, go to new column\r
+                                               if (currentColHeight + itemHeight > minSize.height) {\r
+                                                       totalWidth += currentColWidth + labelOpts.padding;\r
+                                                       columnWidths.push(currentColWidth); // previous column width\r
+\r
+                                                       currentColWidth = 0;\r
+                                                       currentColHeight = 0;\r
+                                               }\r
+\r
+                                               // Get max width\r
+                                               currentColWidth = Math.max(currentColWidth, itemWidth);\r
+                                               currentColHeight += itemHeight;\r
+\r
+                                               // Store the hitbox width and height here. Final position will be updated in `draw`\r
+                                               hitboxes[i] = {\r
+                                                       left: 0,\r
+                                                       top: 0,\r
+                                                       width: itemWidth,\r
+                                                       height: fontSize\r
+                                               };\r
+                                       });\r
+\r
+                                       totalWidth += currentColWidth;\r
+                                       columnWidths.push(currentColWidth);\r
+                                       minSize.width += totalWidth;\r
                                }\r
                        }\r
 \r
-                       this.width = minSize.width;\r
-                       this.height = minSize.height;\r
+                       me.width = minSize.width;\r
+                       me.height = minSize.height;\r
                },\r
                afterFit: noop,\r
 \r
@@ -6165,20 +6244,18 @@ module.exports = function(Chart) {
 \r
                // Actualy draw the legend on the canvas\r
                draw: function() {\r
-                       var opts = this.options;\r
+                       var me = this;\r
+                       var opts = me.options;\r
                        var labelOpts = opts.labels;\r
                        var globalDefault = Chart.defaults.global,\r
                                lineDefault = globalDefault.elements.line,\r
-                               legendWidth = this.width,\r
-                               lineWidths = this.lineWidths;\r
+                               legendWidth = me.width,\r
+                               legendHeight = me.height,\r
+                               lineWidths = me.lineWidths;\r
 \r
                        if (opts.display) {\r
-                               var ctx = this.ctx,\r
-                                       cursor = {\r
-                                               x: this.left + ((legendWidth - lineWidths[0]) / 2),\r
-                                               y: this.top + labelOpts.padding,\r
-                                               line: 0\r
-                                       },\r
+                               var ctx = me.ctx,\r
+                                       cursor,\r
                                        itemOrDefault = helpers.getValueOrDefault,\r
                                        fontColor = itemOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor),\r
                                        fontSize = itemOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize),\r
@@ -6186,92 +6263,127 @@ module.exports = function(Chart) {
                                        fontFamily = itemOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily),\r
                                        labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\r
 \r
-                               // Horizontal\r
-                               if (this.isHorizontal()) {\r
-                                       // Labels\r
-                                       ctx.textAlign = "left";\r
-                                       ctx.textBaseline = 'top';\r
-                                       ctx.lineWidth = 0.5;\r
-                                       ctx.strokeStyle = fontColor; // for strikethrough effect\r
-                                       ctx.fillStyle = fontColor; // render in correct colour\r
-                                       ctx.font = labelFont;\r
+                               // Canvas setup\r
+                               ctx.textAlign = "left";\r
+                               ctx.textBaseline = 'top';\r
+                               ctx.lineWidth = 0.5;\r
+                               ctx.strokeStyle = fontColor; // for strikethrough effect\r
+                               ctx.fillStyle = fontColor; // render in correct colour\r
+                               ctx.font = labelFont;\r
+\r
+                               var boxWidth = labelOpts.boxWidth,\r
+                                       hitboxes = me.legendHitBoxes;\r
+\r
+                               // current position\r
+                               var drawLegendBox = function(x, y, legendItem) {\r
+                                       // Set the ctx for the box\r
+                                       ctx.save();\r
+\r
+                                       ctx.fillStyle = itemOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\r
+                                       ctx.lineCap = itemOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\r
+                                       ctx.lineDashOffset = itemOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\r
+                                       ctx.lineJoin = itemOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\r
+                                       ctx.lineWidth = itemOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\r
+                                       ctx.strokeStyle = itemOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\r
+\r
+                                       if (ctx.setLineDash) {\r
+                                               // IE 9 and 10 do not support line dash\r
+                                               ctx.setLineDash(itemOrDefault(legendItem.lineDash, lineDefault.borderDash));\r
+                                       }\r
 \r
-                                       var boxWidth = labelOpts.boxWidth,\r
-                                               hitboxes = this.legendHitBoxes;\r
+                                       // Draw the box\r
+                                       ctx.strokeRect(x, y, boxWidth, fontSize);\r
+                                       ctx.fillRect(x, y, boxWidth, fontSize);\r
 \r
-                                       helpers.each(this.legendItems, function(legendItem, i) {\r
-                                               var textWidth = ctx.measureText(legendItem.text).width,\r
-                                                       width = boxWidth + (fontSize / 2) + textWidth,\r
-                                                       x = cursor.x,\r
-                                                       y = cursor.y;\r
+                                       ctx.restore();\r
+                               };\r
+                               var fillText = function(x, y, legendItem, textWidth) {\r
+                                       ctx.fillText(legendItem.text, boxWidth + (fontSize / 2) + x, y);\r
+\r
+                                       if (legendItem.hidden) {\r
+                                               // Strikethrough the text if hidden\r
+                                               ctx.beginPath();\r
+                                               ctx.lineWidth = 2;\r
+                                               ctx.moveTo(boxWidth + (fontSize / 2) + x, y + (fontSize / 2));\r
+                                               ctx.lineTo(boxWidth + (fontSize / 2) + x + textWidth, y + (fontSize / 2));\r
+                                               ctx.stroke();\r
+                                       }\r
+                               };\r
 \r
+                               // Horizontal\r
+                               var isHorizontal = me.isHorizontal();\r
+                               if (isHorizontal) {\r
+                                       cursor = {\r
+                                               x: me.left + ((legendWidth - lineWidths[0]) / 2),\r
+                                               y: me.top + labelOpts.padding,\r
+                                               line: 0\r
+                                       };\r
+                               } else {\r
+                                       cursor = {\r
+                                               x: me.left + labelOpts.padding,\r
+                                               y: me.top,\r
+                                               line: 0\r
+                                       };\r
+                               }\r
+\r
+                               var itemHeight = fontSize + labelOpts.padding;\r
+                               helpers.each(me.legendItems, function(legendItem, i) {\r
+                                       var textWidth = ctx.measureText(legendItem.text).width,\r
+                                               width = boxWidth + (fontSize / 2) + textWidth,\r
+                                               x = cursor.x,\r
+                                               y = cursor.y;\r
+\r
+                                       if (isHorizontal) {\r
                                                if (x + width >= legendWidth) {\r
                                                        y = cursor.y += fontSize + (labelOpts.padding);\r
                                                        cursor.line++;\r
-                                                       x = cursor.x = this.left + ((legendWidth - lineWidths[cursor.line]) / 2);\r
+                                                       x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2);\r
                                                }\r
-\r
-                                               // Set the ctx for the box\r
-                                               ctx.save();\r
-\r
-                                               ctx.fillStyle = itemOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\r
-                                               ctx.lineCap = itemOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\r
-                                               ctx.lineDashOffset = itemOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\r
-                                               ctx.lineJoin = itemOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\r
-                                               ctx.lineWidth = itemOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\r
-                                               ctx.strokeStyle = itemOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\r
-\r
-                                               if (ctx.setLineDash) {\r
-                                                       // IE 9 and 10 do not support line dash\r
-                                                       ctx.setLineDash(itemOrDefault(legendItem.lineDash, lineDefault.borderDash));\r
+                                       } else {\r
+                                               if (y + itemHeight > me.bottom) {\r
+                                                       x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\r
+                                                       y = cursor.y = me.top;\r
+                                                       cursor.line++;\r
                                                }\r
+                                       }\r
+                                       \r
 \r
-                                               // Draw the box\r
-                                               ctx.strokeRect(x, y, boxWidth, fontSize);\r
-                                               ctx.fillRect(x, y, boxWidth, fontSize);\r
-\r
-                                               ctx.restore();\r
-\r
-                                               hitboxes[i].left = x;\r
-                                               hitboxes[i].top = y;\r
+                                       drawLegendBox(x, y, legendItem);\r
 \r
-                                               // Fill the actual label\r
-                                               ctx.fillText(legendItem.text, boxWidth + (fontSize / 2) + x, y);\r
+                                       hitboxes[i].left = x;\r
+                                       hitboxes[i].top = y;\r
 \r
-                                               if (legendItem.hidden) {\r
-                                                       // Strikethrough the text if hidden\r
-                                                       ctx.beginPath();\r
-                                                       ctx.lineWidth = 2;\r
-                                                       ctx.moveTo(boxWidth + (fontSize / 2) + x, y + (fontSize / 2));\r
-                                                       ctx.lineTo(boxWidth + (fontSize / 2) + x + textWidth, y + (fontSize / 2));\r
-                                                       ctx.stroke();\r
-                                               }\r
+                                       // Fill the actual label\r
+                                       fillText(x, y, legendItem, textWidth);\r
 \r
+                                       if (isHorizontal) {\r
                                                cursor.x += width + (labelOpts.padding);\r
-                                       }, this);\r
-                               } else {\r
-\r
-                               }\r
+                                       } else {\r
+                                               cursor.y += itemHeight;\r
+                                       }\r
+                                       \r
+                               });\r
                        }\r
                },\r
 \r
                // Handle an event\r
                handleEvent: function(e) {\r
-                       var position = helpers.getRelativePosition(e, this.chart.chart),\r
+                       var me = this;\r
+                       var position = helpers.getRelativePosition(e, me.chart.chart),\r
                                x = position.x,\r
                                y = position.y,\r
-                               opts = this.options;\r
+                               opts = me.options;\r
 \r
-                       if (x >= this.left && x <= this.right && y >= this.top && y <= this.bottom) {\r
+                       if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\r
                                // See if we are touching one of the dataset boxes\r
-                               var lh = this.legendHitBoxes;\r
+                               var lh = me.legendHitBoxes;\r
                                for (var i = 0; i < lh.length; ++i) {\r
                                        var hitBox = lh[i];\r
 \r
                                        if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\r
                                                // Touching an element\r
                                                if (opts.onClick) {\r
-                                                       opts.onClick.call(this, e, this.legendItems[i]);\r
+                                                       opts.onClick.call(me, e, me.legendItems[i]);\r
                                                }\r
                                                break;\r
                                        }\r
@@ -6280,48 +6392,125 @@ module.exports = function(Chart) {
                }\r
        });\r
 \r
+       // Register the legend plugin\r
+       Chart.plugins.register({\r
+               beforeInit: function(chartInstance) {\r
+                       var opts = chartInstance.options;\r
+                       var legendOpts = opts.legend;\r
+\r
+                       if (legendOpts) {\r
+                               chartInstance.legend = new Chart.Legend({\r
+                                       ctx: chartInstance.chart.ctx,\r
+                                       options: legendOpts,\r
+                                       chart: chartInstance\r
+                               });\r
+\r
+                               Chart.layoutService.addBox(chartInstance, chartInstance.legend);\r
+                       }\r
+               }\r
+       });\r
 };\r
 
 },{}],29:[function(require,module,exports){
 "use strict";\r
 \r
 module.exports = function(Chart) {\r
-       var helpers = Chart.helpers;\r
 \r
-       // Plugins are stored here\r
-       Chart.plugins = [];\r
-       Chart.pluginService = {\r
-               // Register a new plugin\r
-               register: function(plugin) {\r
-                       var p = Chart.plugins;\r
-                       if (p.indexOf(plugin) === -1) {\r
-                               p.push(plugin);\r
-                       }\r
+       var noop = Chart.helpers.noop;\r
+\r
+       /**\r
+        * The plugin service singleton\r
+        * @namespace Chart.plugins\r
+        * @since 2.1.0\r
+        */\r
+       Chart.plugins = {\r
+               _plugins: [],\r
+\r
+               /**\r
+                * Registers the given plugin(s) if not already registered.\r
+                * @param {Array|Object} plugins plugin instance(s).\r
+                */\r
+               register: function(plugins) {\r
+                       var p = this._plugins;\r
+                       ([]).concat(plugins).forEach(function(plugin) {\r
+                               if (p.indexOf(plugin) === -1) {\r
+                                       p.push(plugin);\r
+                               }\r
+                       });\r
                },\r
 \r
-               // Remove a registered plugin\r
-               remove: function(plugin) {\r
-                       var p = Chart.plugins;\r
-                       var idx = p.indexOf(plugin);\r
-                       if (idx !== -1) {\r
-                               p.splice(idx, 1);\r
-                       }\r
+               /**\r
+                * Unregisters the given plugin(s) only if registered.\r
+                * @param {Array|Object} plugins plugin instance(s).\r
+                */\r
+               unregister: function(plugins) {\r
+                       var p = this._plugins;\r
+                       ([]).concat(plugins).forEach(function(plugin) {\r
+                               var idx = p.indexOf(plugin);\r
+                               if (idx !== -1) {\r
+                                       p.splice(idx, 1);\r
+                               }\r
+                       });\r
                },\r
 \r
-               // Iterate over all plugins\r
-               notifyPlugins: function(method, args, scope) {\r
-                       helpers.each(Chart.plugins, function(plugin) {\r
-                               if (plugin[method] && typeof plugin[method] === 'function') {\r
-                                       plugin[method].apply(scope, args);\r
+               /**\r
+                * Remove all registered p^lugins.\r
+                * @since 2.1.5\r
+                */\r
+               clear: function() {\r
+                       this._plugins = [];\r
+               },\r
+\r
+               /**\r
+                * Returns the number of registered plugins?\r
+                * @returns {Number}\r
+                * @since 2.1.5\r
+                */\r
+               count: function() {\r
+                       return this._plugins.length;\r
+               },\r
+\r
+               /**\r
+                * Returns all registered plugin intances.\r
+                * @returns {Array} array of plugin objects.\r
+                * @since 2.1.5\r
+                */\r
+               getAll: function() {\r
+                       return this._plugins;\r
+               },\r
+\r
+               /**\r
+                * Calls registered plugins on the specified extension, with the given args. This\r
+                * method immediately returns as soon as a plugin explicitly returns false. The\r
+                * returned value can be used, for instance, to interrupt the current action.\r
+                * @param {String} extension the name of the plugin method to call (e.g. 'beforeUpdate').\r
+                * @param {Array} [args] extra arguments to apply to the extension call.\r
+                * @returns {Boolean} false if any of the plugins return false, else returns true.\r
+                */\r
+               notify: function(extension, args) {\r
+                       var plugins = this._plugins;\r
+                       var ilen = plugins.length;\r
+                       var i, plugin;\r
+\r
+                       for (i=0; i<ilen; ++i) {\r
+                               plugin = plugins[i];\r
+                               if (typeof plugin[extension] === 'function') {\r
+                                       if (plugin[extension].apply(plugin, args || []) === false) {\r
+                                               return false;\r
+                                       }\r
                                }\r
-                       }, scope);\r
+                       }\r
+\r
+                       return true;\r
                }\r
        };\r
 \r
-       var noop = helpers.noop;\r
+       /**\r
+        * Plugin extension methods.\r
+        * @interface Chart.PluginBase\r
+        * @since 2.1.0\r
+        */\r
        Chart.PluginBase = Chart.Element.extend({\r
-               // Plugin methods. All functions are passed the chart instance\r
-\r
                // Called at start of chart init\r
                beforeInit: noop,\r
 \r
@@ -6343,6 +6532,14 @@ module.exports = function(Chart) {
                // Called during destroy\r
                destroy: noop\r
        });\r
+\r
+       /**\r
+        * Provided for backward compatibility, use Chart.plugins instead\r
+        * @namespace Chart.pluginService\r
+        * @deprecated since version 2.1.5\r
+        * @todo remove me at version 3\r
+        */\r
+       Chart.pluginService = Chart.plugins;\r
 };\r
 
 },{}],30:[function(require,module,exports){
@@ -6391,8 +6588,9 @@ module.exports = function(Chart) {
                        autoSkip: true,\r
                        autoSkipPadding: 0,\r
                        labelOffset: 0,\r
+                       // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\r
                        callback: function(value) {\r
-                               return '' + value;\r
+                               return helpers.isArray(value) ? value : '' + value;\r
                        }\r
                }\r
        };\r
@@ -6407,14 +6605,15 @@ module.exports = function(Chart) {
                        helpers.callCallback(this.options.beforeUpdate, [this]);\r
                },\r
                update: function(maxWidth, maxHeight, margins) {\r
+                       var me = this;\r
 \r
                        // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\r
-                       this.beforeUpdate();\r
+                       me.beforeUpdate();\r
 \r
                        // Absorb the master measurements\r
-                       this.maxWidth = maxWidth;\r
-                       this.maxHeight = maxHeight;\r
-                       this.margins = helpers.extend({\r
+                       me.maxWidth = maxWidth;\r
+                       me.maxHeight = maxHeight;\r
+                       me.margins = helpers.extend({\r
                                left: 0,\r
                                right: 0,\r
                                top: 0,\r
@@ -6422,36 +6621,36 @@ module.exports = function(Chart) {
                        }, margins);\r
 \r
                        // Dimensions\r
-                       this.beforeSetDimensions();\r
-                       this.setDimensions();\r
-                       this.afterSetDimensions();\r
+                       me.beforeSetDimensions();\r
+                       me.setDimensions();\r
+                       me.afterSetDimensions();\r
 \r
                        // Data min/max\r
-                       this.beforeDataLimits();\r
-                       this.determineDataLimits();\r
-                       this.afterDataLimits();\r
+                       me.beforeDataLimits();\r
+                       me.determineDataLimits();\r
+                       me.afterDataLimits();\r
 \r
                        // Ticks\r
-                       this.beforeBuildTicks();\r
-                       this.buildTicks();\r
-                       this.afterBuildTicks();\r
+                       me.beforeBuildTicks();\r
+                       me.buildTicks();\r
+                       me.afterBuildTicks();\r
 \r
-                       this.beforeTickToLabelConversion();\r
-                       this.convertTicksToLabels();\r
-                       this.afterTickToLabelConversion();\r
+                       me.beforeTickToLabelConversion();\r
+                       me.convertTicksToLabels();\r
+                       me.afterTickToLabelConversion();\r
 \r
                        // Tick Rotation\r
-                       this.beforeCalculateTickRotation();\r
-                       this.calculateTickRotation();\r
-                       this.afterCalculateTickRotation();\r
+                       me.beforeCalculateTickRotation();\r
+                       me.calculateTickRotation();\r
+                       me.afterCalculateTickRotation();\r
                        // Fit\r
-                       this.beforeFit();\r
-                       this.fit();\r
-                       this.afterFit();\r
+                       me.beforeFit();\r
+                       me.fit();\r
+                       me.afterFit();\r
                        //\r
-                       this.afterUpdate();\r
+                       me.afterUpdate();\r
 \r
-                       return this.minSize;\r
+                       return me.minSize;\r
 \r
                },\r
                afterUpdate: function() {\r
@@ -6464,25 +6663,26 @@ module.exports = function(Chart) {
                        helpers.callCallback(this.options.beforeSetDimensions, [this]);\r
                },\r
                setDimensions: function() {\r
+                       var me = this;\r
                        // Set the unconstrained dimension before label rotation\r
-                       if (this.isHorizontal()) {\r
+                       if (me.isHorizontal()) {\r
                                // Reset position before calculating rotation\r
-                               this.width = this.maxWidth;\r
-                               this.left = 0;\r
-                               this.right = this.width;\r
+                               me.width = me.maxWidth;\r
+                               me.left = 0;\r
+                               me.right = me.width;\r
                        } else {\r
-                               this.height = this.maxHeight;\r
+                               me.height = me.maxHeight;\r
 \r
                                // Reset position before calculating rotation\r
-                               this.top = 0;\r
-                               this.bottom = this.height;\r
+                               me.top = 0;\r
+                               me.bottom = me.height;\r
                        }\r
 \r
                        // Reset padding\r
-                       this.paddingLeft = 0;\r
-                       this.paddingTop = 0;\r
-                       this.paddingRight = 0;\r
-                       this.paddingBottom = 0;\r
+                       me.paddingLeft = 0;\r
+                       me.paddingTop = 0;\r
+                       me.paddingRight = 0;\r
+                       me.paddingBottom = 0;\r
                },\r
                afterSetDimensions: function() {\r
                        helpers.callCallback(this.options.afterSetDimensions, [this]);\r
@@ -6510,14 +6710,15 @@ module.exports = function(Chart) {
                        helpers.callCallback(this.options.beforeTickToLabelConversion, [this]);\r
                },\r
                convertTicksToLabels: function() {\r
+                       var me = this;\r
                        // Convert ticks to strings\r
-                       this.ticks = this.ticks.map(function(numericalTick, index, ticks) {\r
-                                       if (this.options.ticks.userCallback) {\r
-                                               return this.options.ticks.userCallback(numericalTick, index, ticks);\r
+                       me.ticks = me.ticks.map(function(numericalTick, index, ticks) {\r
+                                       if (me.options.ticks.userCallback) {\r
+                                               return me.options.ticks.userCallback(numericalTick, index, ticks);\r
                                        }\r
-                                       return this.options.ticks.callback(numericalTick, index, ticks);\r
+                                       return me.options.ticks.callback(numericalTick, index, ticks);\r
                                },\r
-                               this);\r
+                               me);\r
                },\r
                afterTickToLabelConversion: function() {\r
                        helpers.callCallback(this.options.afterTickToLabelConversion, [this]);\r
@@ -6529,9 +6730,10 @@ module.exports = function(Chart) {
                        helpers.callCallback(this.options.beforeCalculateTickRotation, [this]);\r
                },\r
                calculateTickRotation: function() {\r
-                       var context = this.ctx;\r
+                       var me = this;\r
+                       var context = me.ctx;\r
                        var globalDefaults = Chart.defaults.global;\r
-                       var optionTicks = this.options.ticks;\r
+                       var optionTicks = me.options.ticks;\r
 \r
                        //Get the width of each grid by calculating the difference\r
                        //between x offsets between 0 and 1.\r
@@ -6541,60 +6743,60 @@ module.exports = function(Chart) {
                        var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\r
                        context.font = tickLabelFont;\r
 \r
-                       var firstWidth = context.measureText(this.ticks[0]).width;\r
-                       var lastWidth = context.measureText(this.ticks[this.ticks.length - 1]).width;\r
+                       var firstWidth = context.measureText(me.ticks[0]).width;\r
+                       var lastWidth = context.measureText(me.ticks[me.ticks.length - 1]).width;\r
                        var firstRotated;\r
 \r
-                       this.labelRotation = optionTicks.minRotation || 0;\r
-                       this.paddingRight = 0;\r
-                       this.paddingLeft = 0;\r
+                       me.labelRotation = optionTicks.minRotation || 0;\r
+                       me.paddingRight = 0;\r
+                       me.paddingLeft = 0;\r
 \r
-                       if (this.options.display) {\r
-                               if (this.isHorizontal()) {\r
-                                       this.paddingRight = lastWidth / 2 + 3;\r
-                                       this.paddingLeft = firstWidth / 2 + 3;\r
+                       if (me.options.display) {\r
+                               if (me.isHorizontal()) {\r
+                                       me.paddingRight = lastWidth / 2 + 3;\r
+                                       me.paddingLeft = firstWidth / 2 + 3;\r
 \r
-                                       if (!this.longestTextCache) {\r
-                                               this.longestTextCache = {};\r
+                                       if (!me.longestTextCache) {\r
+                                               me.longestTextCache = {};\r
                                        }\r
-                                       var originalLabelWidth = helpers.longestText(context, tickLabelFont, this.ticks, this.longestTextCache);\r
+                                       var originalLabelWidth = helpers.longestText(context, tickLabelFont, me.ticks, me.longestTextCache);\r
                                        var labelWidth = originalLabelWidth;\r
                                        var cosRotation;\r
                                        var sinRotation;\r
 \r
                                        // Allow 3 pixels x2 padding either side for label readability\r
                                        // only the index matters for a dataset scale, but we want a consistent interface between scales\r
-                                       var tickWidth = this.getPixelForTick(1) - this.getPixelForTick(0) - 6;\r
+                                       var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\r
 \r
                                        //Max label rotation can be set or default to 90 - also act as a loop counter\r
-                                       while (labelWidth > tickWidth && this.labelRotation < optionTicks.maxRotation) {\r
-                                               cosRotation = Math.cos(helpers.toRadians(this.labelRotation));\r
-                                               sinRotation = Math.sin(helpers.toRadians(this.labelRotation));\r
+                                       while (labelWidth > tickWidth && me.labelRotation < optionTicks.maxRotation) {\r
+                                               cosRotation = Math.cos(helpers.toRadians(me.labelRotation));\r
+                                               sinRotation = Math.sin(helpers.toRadians(me.labelRotation));\r
 \r
                                                firstRotated = cosRotation * firstWidth;\r
 \r
                                                // We're right aligning the text now.\r
-                                               if (firstRotated + tickFontSize / 2 > this.yLabelWidth) {\r
-                                                       this.paddingLeft = firstRotated + tickFontSize / 2;\r
+                                               if (firstRotated + tickFontSize / 2 > me.yLabelWidth) {\r
+                                                       me.paddingLeft = firstRotated + tickFontSize / 2;\r
                                                }\r
 \r
-                                               this.paddingRight = tickFontSize / 2;\r
+                                               me.paddingRight = tickFontSize / 2;\r
 \r
-                                               if (sinRotation * originalLabelWidth > this.maxHeight) {\r
+                                               if (sinRotation * originalLabelWidth > me.maxHeight) {\r
                                                        // go back one step\r
-                                                       this.labelRotation--;\r
+                                                       me.labelRotation--;\r
                                                        break;\r
                                                }\r
 \r
-                                               this.labelRotation++;\r
+                                               me.labelRotation++;\r
                                                labelWidth = cosRotation * originalLabelWidth;\r
                                        }\r
                                }\r
                        }\r
 \r
-                       if (this.margins) {\r
-                               this.paddingLeft = Math.max(this.paddingLeft - this.margins.left, 0);\r
-                               this.paddingRight = Math.max(this.paddingRight - this.margins.right, 0);\r
+                       if (me.margins) {\r
+                               me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\r
+                               me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\r
                        }\r
                },\r
                afterCalculateTickRotation: function() {\r
@@ -6607,18 +6809,19 @@ module.exports = function(Chart) {
                        helpers.callCallback(this.options.beforeFit, [this]);\r
                },\r
                fit: function() {\r
+                       var me = this;\r
                        // Reset\r
-                       var minSize = this.minSize = {\r
+                       var minSize = me.minSize = {\r
                                width: 0,\r
                                height: 0\r
                        };\r
 \r
-                       var opts = this.options;\r
+                       var opts = me.options;\r
                        var globalDefaults = Chart.defaults.global;\r
                        var tickOpts = opts.ticks;\r
                        var scaleLabelOpts = opts.scaleLabel;\r
                        var display = opts.display;\r
-                       var isHorizontal = this.isHorizontal();\r
+                       var isHorizontal = me.isHorizontal();\r
 \r
                        var tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\r
                        var tickFontStyle = helpers.getValueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\r
@@ -6635,7 +6838,7 @@ module.exports = function(Chart) {
                        // Width\r
                        if (isHorizontal) {\r
                                // subtract the margins to line up with the chartArea if we are a full width scale\r
-                               minSize.width = this.isFullWidth() ? this.maxWidth - this.margins.left - this.margins.right : this.maxWidth;\r
+                               minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\r
                        } else {\r
                                minSize.width = display ? tickMarkLength : 0;\r
                        }\r
@@ -6644,7 +6847,7 @@ module.exports = function(Chart) {
                        if (isHorizontal) {\r
                                minSize.height = display ? tickMarkLength : 0;\r
                        } else {\r
-                               minSize.height = this.maxHeight; // fill all the height\r
+                               minSize.height = me.maxHeight; // fill all the height\r
                        }\r
 \r
                        // Are we showing a title for the scale?\r
@@ -6658,39 +6861,41 @@ module.exports = function(Chart) {
 \r
                        if (tickOpts.display && display) {\r
                                // Don't bother fitting the ticks if we are not showing them\r
-                               if (!this.longestTextCache) {\r
-                                       this.longestTextCache = {};\r
+                               if (!me.longestTextCache) {\r
+                                       me.longestTextCache = {};\r
                                }\r
 \r
-                               var largestTextWidth = helpers.longestText(this.ctx, tickLabelFont, this.ticks, this.longestTextCache);\r
+                               var largestTextWidth = helpers.longestText(me.ctx, tickLabelFont, me.ticks, me.longestTextCache);\r
+                               var tallestLabelHeightInLines = helpers.numberOfLabelLines(me.ticks);\r
+                               var lineSpace = tickFontSize * 0.5;\r
 \r
                                if (isHorizontal) {\r
                                        // A horizontal axis is more constrained by the height.\r
-                                       this.longestLabelWidth = largestTextWidth;\r
+                                       me.longestLabelWidth = largestTextWidth;\r
 \r
                                        // TODO - improve this calculation\r
-                                       var labelHeight = (Math.sin(helpers.toRadians(this.labelRotation)) * this.longestLabelWidth) + 1.5 * tickFontSize;\r
+                                       var labelHeight = (Math.sin(helpers.toRadians(me.labelRotation)) * me.longestLabelWidth) + (tickFontSize * tallestLabelHeightInLines) + (lineSpace * tallestLabelHeightInLines);\r
 \r
-                                       minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight);\r
-                                       this.ctx.font = tickLabelFont;\r
+                                       minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight);\r
+                                       me.ctx.font = tickLabelFont;\r
 \r
-                                       var firstLabelWidth = this.ctx.measureText(this.ticks[0]).width;\r
-                                       var lastLabelWidth = this.ctx.measureText(this.ticks[this.ticks.length - 1]).width;\r
+                                       var firstLabelWidth = me.ctx.measureText(me.ticks[0]).width;\r
+                                       var lastLabelWidth = me.ctx.measureText(me.ticks[me.ticks.length - 1]).width;\r
 \r
                                        // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned which means that the right padding is dominated\r
                                        // by the font height\r
-                                       var cosRotation = Math.cos(helpers.toRadians(this.labelRotation));\r
-                                       var sinRotation = Math.sin(helpers.toRadians(this.labelRotation));\r
-                                       this.paddingLeft = this.labelRotation !== 0 ? (cosRotation * firstLabelWidth) + 3 : firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\r
-                                       this.paddingRight = this.labelRotation !== 0 ? (sinRotation * (tickFontSize / 2)) + 3 : lastLabelWidth / 2 + 3; // when rotated\r
+                                       var cosRotation = Math.cos(helpers.toRadians(me.labelRotation));\r
+                                       var sinRotation = Math.sin(helpers.toRadians(me.labelRotation));\r
+                                       me.paddingLeft = me.labelRotation !== 0 ? (cosRotation * firstLabelWidth) + 3 : firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\r
+                                       me.paddingRight = me.labelRotation !== 0 ? (sinRotation * (tickFontSize / 2)) + 3 : lastLabelWidth / 2 + 3; // when rotated\r
                                } else {\r
                                        // A vertical axis is more constrained by the width. Labels are the dominant factor here, so get that length first\r
-                                       var maxLabelWidth = this.maxWidth - minSize.width;\r
+                                       var maxLabelWidth = me.maxWidth - minSize.width;\r
 \r
                                        // Account for padding\r
                                        var mirror = tickOpts.mirror;\r
                                        if (!mirror) {\r
-                                               largestTextWidth += this.options.ticks.padding;\r
+                                               largestTextWidth += me.options.ticks.padding;\r
                                        } else {\r
                                                // If mirrored text is on the inside so don't expand\r
                                                largestTextWidth = 0;\r
@@ -6701,23 +6906,23 @@ module.exports = function(Chart) {
                                                minSize.width += largestTextWidth;\r
                                        } else {\r
                                                // Expand to max size\r
-                                               minSize.width = this.maxWidth;\r
+                                               minSize.width = me.maxWidth;\r
                                        }\r
 \r
-                                       this.paddingTop = tickFontSize / 2;\r
-                                       this.paddingBottom = tickFontSize / 2;\r
+                                       me.paddingTop = tickFontSize / 2;\r
+                                       me.paddingBottom = tickFontSize / 2;\r
                                }\r
                        }\r
 \r
-                       if (this.margins) {\r
-                               this.paddingLeft = Math.max(this.paddingLeft - this.margins.left, 0);\r
-                               this.paddingTop = Math.max(this.paddingTop - this.margins.top, 0);\r
-                               this.paddingRight = Math.max(this.paddingRight - this.margins.right, 0);\r
-                               this.paddingBottom = Math.max(this.paddingBottom - this.margins.bottom, 0);\r
+                       if (me.margins) {\r
+                               me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\r
+                               me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\r
+                               me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\r
+                               me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\r
                        }\r
 \r
-                       this.width = minSize.width;\r
-                       this.height = minSize.height;\r
+                       me.width = minSize.width;\r
+                       me.height = minSize.height;\r
 \r
                },\r
                afterFit: function() {\r
@@ -6767,35 +6972,37 @@ module.exports = function(Chart) {
 \r
                // Used for tick location, should\r
                getPixelForTick: function(index, includeOffset) {\r
-                       if (this.isHorizontal()) {\r
-                               var innerWidth = this.width - (this.paddingLeft + this.paddingRight);\r
-                               var tickWidth = innerWidth / Math.max((this.ticks.length - ((this.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\r
-                               var pixel = (tickWidth * index) + this.paddingLeft;\r
+                       var me = this;\r
+                       if (me.isHorizontal()) {\r
+                               var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\r
+                               var tickWidth = innerWidth / Math.max((me.ticks.length - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\r
+                               var pixel = (tickWidth * index) + me.paddingLeft;\r
 \r
                                if (includeOffset) {\r
                                        pixel += tickWidth / 2;\r
                                }\r
 \r
-                               var finalVal = this.left + Math.round(pixel);\r
-                               finalVal += this.isFullWidth() ? this.margins.left : 0;\r
+                               var finalVal = me.left + Math.round(pixel);\r
+                               finalVal += me.isFullWidth() ? me.margins.left : 0;\r
                                return finalVal;\r
                        } else {\r
-                               var innerHeight = this.height - (this.paddingTop + this.paddingBottom);\r
-                               return this.top + (index * (innerHeight / (this.ticks.length - 1)));\r
+                               var innerHeight = me.height - (me.paddingTop + me.paddingBottom);\r
+                               return me.top + (index * (innerHeight / (me.ticks.length - 1)));\r
                        }\r
                },\r
 \r
                // Utility for getting the pixel location of a percentage of scale\r
                getPixelForDecimal: function(decimal /*, includeOffset*/ ) {\r
-                       if (this.isHorizontal()) {\r
-                               var innerWidth = this.width - (this.paddingLeft + this.paddingRight);\r
-                               var valueOffset = (innerWidth * decimal) + this.paddingLeft;\r
+                       var me = this;\r
+                       if (me.isHorizontal()) {\r
+                               var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\r
+                               var valueOffset = (innerWidth * decimal) + me.paddingLeft;\r
 \r
-                               var finalVal = this.left + Math.round(valueOffset);\r
-                               finalVal += this.isFullWidth() ? this.margins.left : 0;\r
+                               var finalVal = me.left + Math.round(valueOffset);\r
+                               finalVal += me.isFullWidth() ? me.margins.left : 0;\r
                                return finalVal;\r
                        } else {\r
-                               return this.top + (decimal * this.height);\r
+                               return me.top + (decimal * me.height);\r
                        }\r
                },\r
 \r
@@ -6814,23 +7021,22 @@ module.exports = function(Chart) {
                // Actualy draw the scale on the canvas\r
                // @param {rectangle} chartArea : the area of the chart to draw full grid lines on\r
                draw: function(chartArea) {\r
-                       var options = this.options;\r
+                       var me = this;\r
+                       var options = me.options;\r
                        if (!options.display) {\r
                                return;\r
                        }\r
 \r
-                       var context = this.ctx;\r
+                       var context = me.ctx;\r
                        var globalDefaults = Chart.defaults.global;\r
                        var optionTicks = options.ticks;\r
                        var gridLines = options.gridLines;\r
                        var scaleLabel = options.scaleLabel;\r
 \r
-                       var setContextLineSettings;\r
-                       var isRotated = this.labelRotation !== 0;\r
+                       var isRotated = me.labelRotation !== 0;\r
                        var skipRatio;\r
-                       var scaleLabelX;\r
-                       var scaleLabelY;\r
                        var useAutoskipper = optionTicks.autoSkip;\r
+                       var isHorizontal = me.isHorizontal();\r
 \r
                        // figure out the maximum number of gridlines to show\r
                        var maxTicks;\r
@@ -6851,19 +7057,18 @@ module.exports = function(Chart) {
                        var scaleLabelFontFamily = helpers.getValueOrDefault(scaleLabel.fontFamily, globalDefaults.defaultFontFamily);\r
                        var scaleLabelFont = helpers.fontString(scaleLabelFontSize, scaleLabelFontStyle, scaleLabelFontFamily);\r
 \r
-                       var labelRotationRadians = helpers.toRadians(this.labelRotation);\r
+                       var labelRotationRadians = helpers.toRadians(me.labelRotation);\r
                        var cosRotation = Math.cos(labelRotationRadians);\r
                        var sinRotation = Math.sin(labelRotationRadians);\r
-                       var longestRotatedLabel = this.longestLabelWidth * cosRotation;\r
+                       var longestRotatedLabel = me.longestLabelWidth * cosRotation;\r
                        var rotatedLabelHeight = tickFontSize * sinRotation;\r
 \r
                        // Make sure we draw text in the correct color and font\r
                        context.fillStyle = tickFontColor;\r
 \r
-                       if (this.isHorizontal()) {\r
-                               setContextLineSettings = true;\r
-                               var yTickStart = options.position === "bottom" ? this.top : this.bottom - tl;\r
-                               var yTickEnd = options.position === "bottom" ? this.top + tl : this.bottom;\r
+                       var itemsToDraw = [];\r
+\r
+                       if (isHorizontal) {\r
                                skipRatio = false;\r
 \r
                 // Only calculate the skip ratio with the half width of longestRotateLabel if we got an actual rotation\r
@@ -6872,14 +7077,14 @@ module.exports = function(Chart) {
                     longestRotatedLabel /= 2;\r
                 }\r
 \r
-                               if ((longestRotatedLabel + optionTicks.autoSkipPadding) * this.ticks.length > (this.width - (this.paddingLeft + this.paddingRight))) {\r
-                                       skipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * this.ticks.length) / (this.width - (this.paddingLeft + this.paddingRight)));\r
+                               if ((longestRotatedLabel + optionTicks.autoSkipPadding) * me.ticks.length > (me.width - (me.paddingLeft + me.paddingRight))) {\r
+                                       skipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * me.ticks.length) / (me.width - (me.paddingLeft + me.paddingRight)));\r
                                }\r
 \r
                                // if they defined a max number of optionTicks,\r
                                // increase skipRatio until that number is met\r
-                               if (maxTicks && this.ticks.length > maxTicks) {\r
-                                       while (!skipRatio || this.ticks.length / (skipRatio || 1) > maxTicks) {\r
+                               if (maxTicks && me.ticks.length > maxTicks) {\r
+                                       while (!skipRatio || me.ticks.length / (skipRatio || 1) > maxTicks) {\r
                                                if (!skipRatio) {\r
                                                        skipRatio = 1;\r
                                                }\r
@@ -6890,189 +7095,196 @@ module.exports = function(Chart) {
                                if (!useAutoskipper) {\r
                                        skipRatio = false;\r
                                }\r
+                       }\r
 \r
-                               helpers.each(this.ticks, function (label, index) {\r
-                                       // Blank optionTicks\r
-                                       var isLastTick = this.ticks.length === index + 1;\r
 \r
-                                       // Since we always show the last tick,we need may need to hide the last shown one before\r
-                                       var shouldSkip = (skipRatio > 1 && index % skipRatio > 0) || (index % skipRatio === 0 && index + skipRatio >= this.ticks.length);\r
-                                       if (shouldSkip && !isLastTick || (label === undefined || label === null)) {\r
-                                               return;\r
-                                       }\r
-                                       var xLineValue = this.getPixelForTick(index); // xvalues for grid lines\r
-                                       var xLabelValue = this.getPixelForTick(index, gridLines.offsetGridLines); // x values for optionTicks (need to consider offsetLabel option)\r
-\r
-                                       if (gridLines.display) {\r
-                                               if (index === (typeof this.zeroLineIndex !== 'undefined' ? this.zeroLineIndex : 0)) {\r
-                                                       // Draw the first index specially\r
-                                                       context.lineWidth = gridLines.zeroLineWidth;\r
-                                                       context.strokeStyle = gridLines.zeroLineColor;\r
-                                                       setContextLineSettings = true; // reset next time\r
-                                               } else if (setContextLineSettings) {\r
-                                                       context.lineWidth = gridLines.lineWidth;\r
-                                                       context.strokeStyle = gridLines.color;\r
-                                                       setContextLineSettings = false;\r
-                                               }\r
+                       var xTickStart = options.position === "right" ? me.left : me.right - tl;\r
+                       var xTickEnd = options.position === "right" ? me.left + tl : me.right;\r
+                       var yTickStart = options.position === "bottom" ? me.top : me.bottom - tl;\r
+                       var yTickEnd = options.position === "bottom" ? me.top + tl : me.bottom;\r
 \r
-                                               xLineValue += helpers.aliasPixel(context.lineWidth);\r
+                       helpers.each(me.ticks, function(label, index) {\r
+                               // If the callback returned a null or undefined value, do not draw this line\r
+                               if (label === undefined || label === null) {\r
+                                       return;\r
+                               }\r
 \r
-                                               // Draw the label area\r
-                                               context.beginPath();\r
+                               var isLastTick = me.ticks.length === index + 1;\r
 \r
-                                               if (gridLines.drawTicks) {\r
-                                                       context.moveTo(xLineValue, yTickStart);\r
-                                                       context.lineTo(xLineValue, yTickEnd);\r
-                                               }\r
+                               // Since we always show the last tick,we need may need to hide the last shown one before\r
+                               var shouldSkip = (skipRatio > 1 && index % skipRatio > 0) || (index % skipRatio === 0 && index + skipRatio >= me.ticks.length);\r
+                               if (shouldSkip && !isLastTick || (label === undefined || label === null)) {\r
+                                       return;\r
+                               }\r
 \r
-                                               // Draw the chart area\r
-                                               if (gridLines.drawOnChartArea) {\r
-                                                       context.moveTo(xLineValue, chartArea.top);\r
-                                                       context.lineTo(xLineValue, chartArea.bottom);\r
-                                               }\r
+                               var lineWidth, lineColor;\r
+                               if (index === (typeof me.zeroLineIndex !== 'undefined' ? me.zeroLineIndex : 0)) {\r
+                                       // Draw the first index specially\r
+                                       lineWidth = gridLines.zeroLineWidth;\r
+                                       lineColor = gridLines.zeroLineColor;\r
+                               } else  {\r
+                                       lineWidth = helpers.getValueAtIndexOrDefault(gridLines.lineWidth, index);\r
+                                       lineColor = helpers.getValueAtIndexOrDefault(gridLines.color, index);\r
+                               }\r
 \r
-                                               // Need to stroke in the loop because we are potentially changing line widths & colours\r
-                                               context.stroke();\r
-                                       }\r
+                               // Common properties\r
+                               var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY;\r
+                               var textAlign, textBaseline = 'middle';\r
 \r
-                                       if (optionTicks.display) {\r
-                                               context.save();\r
-                                               context.translate(xLabelValue + optionTicks.labelOffset, (isRotated) ? this.top + 12 : options.position === "top" ? this.bottom - tl : this.top + tl);\r
-                                               context.rotate(labelRotationRadians * -1);\r
-                                               context.font = tickLabelFont;\r
-                                               context.textAlign = (isRotated) ? "right" : "center";\r
-                                               context.textBaseline = (isRotated) ? "middle" : options.position === "top" ? "bottom" : "top";\r
-                                               context.fillText(label, 0, 0);\r
-                                               context.restore();\r
+                               if (isHorizontal) {\r
+                                       if (!isRotated) {\r
+                                               textBaseline = options.position === 'top' ? 'bottom' : 'top';\r
                                        }\r
-                               }, this);\r
-\r
-                               if (scaleLabel.display) {\r
-                                       // Draw the scale label\r
-                                       context.textAlign = "center";\r
-                                       context.textBaseline = 'middle';\r
-                                       context.fillStyle = scaleLabelFontColor; // render in correct colour\r
-                                       context.font = scaleLabelFont;\r
 \r
-                                       scaleLabelX = this.left + ((this.right - this.left) / 2); // midpoint of the width\r
-                                       scaleLabelY = options.position === 'bottom' ? this.bottom - (scaleLabelFontSize / 2) : this.top + (scaleLabelFontSize / 2);\r
+                                       textAlign = isRotated ? 'right' : 'center';\r
 \r
-                                       context.fillText(scaleLabel.labelString, scaleLabelX, scaleLabelY);\r
-                               }\r
+                                       var xLineValue = me.getPixelForTick(index) + helpers.aliasPixel(lineWidth); // xvalues for grid lines\r
+                                       labelX = me.getPixelForTick(index, gridLines.offsetGridLines) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option)\r
+                                       labelY = (isRotated) ? me.top + 12 : options.position === 'top' ? me.bottom - tl : me.top + tl;\r
 \r
-                       } else {\r
-                               setContextLineSettings = true;\r
-                               var xTickStart = options.position === "right" ? this.left : this.right - 5;\r
-                               var xTickEnd = options.position === "right" ? this.left + 5 : this.right;\r
-\r
-                               helpers.each(this.ticks, function (label, index) {\r
-                                       // If the callback returned a null or undefined value, do not draw this line\r
-                                       if (label === undefined || label === null) {\r
-                                               return;\r
-                                       }\r
-\r
-                                       var yLineValue = this.getPixelForTick(index); // xvalues for grid lines\r
-\r
-                                       if (gridLines.display) {\r
-                                               if (index === (typeof this.zeroLineIndex !== 'undefined' ? this.zeroLineIndex : 0)) {\r
-                                                       // Draw the first index specially\r
-                                                       context.lineWidth = gridLines.zeroLineWidth;\r
-                                                       context.strokeStyle = gridLines.zeroLineColor;\r
-                                                       setContextLineSettings = true; // reset next time\r
-                                               } else if (setContextLineSettings) {\r
-                                                       context.lineWidth = gridLines.lineWidth;\r
-                                                       context.strokeStyle = gridLines.color;\r
-                                                       setContextLineSettings = false;\r
+                                       tx1 = tx2 = x1 = x2 = xLineValue;\r
+                                       ty1 = yTickStart;\r
+                                       ty2 = yTickEnd;\r
+                                       y1 = chartArea.top;\r
+                                       y2 = chartArea.bottom;\r
+                               } else {\r
+                                       if (options.position === 'left') {\r
+                                               if (optionTicks.mirror) {\r
+                                                       labelX = me.right + optionTicks.padding;\r
+                                                       textAlign = 'left';\r
+                                               } else {\r
+                                                       labelX = me.right - optionTicks.padding;\r
+                                                       textAlign = 'right';\r
                                                }\r
+                                       } else {\r
+                                               // right side\r
+                                               if (optionTicks.mirror) {\r
+                                                       labelX = me.left - optionTicks.padding;\r
+                                                       textAlign = 'right';\r
+                                               } else {\r
+                                                       labelX = me.left + optionTicks.padding;\r
+                                                       textAlign = 'left';\r
+                                               }\r
+                                       }\r
 \r
-                                               yLineValue += helpers.aliasPixel(context.lineWidth);\r
-\r
-                                               // Draw the label area\r
-                                               context.beginPath();\r
+                                       var yLineValue = me.getPixelForTick(index); // xvalues for grid lines\r
+                                       yLineValue += helpers.aliasPixel(lineWidth);\r
+                                       labelY = me.getPixelForTick(index, gridLines.offsetGridLines);\r
+\r
+                                       tx1 = xTickStart;\r
+                                       tx2 = xTickEnd;\r
+                                       x1 = chartArea.left;\r
+                                       x2 = chartArea.right;\r
+                                       ty1 = ty2 = y1 = y2 = yLineValue;\r
+                               }\r
+\r
+                               itemsToDraw.push({\r
+                                       tx1: tx1,\r
+                                       ty1: ty1,\r
+                                       tx2: tx2,\r
+                                       ty2: ty2,\r
+                                       x1: x1,\r
+                                       y1: y1,\r
+                                       x2: x2,\r
+                                       y2: y2,\r
+                                       labelX: labelX,\r
+                                       labelY: labelY,\r
+                                       glWidth: lineWidth,\r
+                                       glColor: lineColor,\r
+                                       rotation: -1 * labelRotationRadians,\r
+                                       label: label,\r
+                                       textBaseline: textBaseline,\r
+                                       textAlign: textAlign\r
+                               });\r
+                       });\r
 \r
-                                               if (gridLines.drawTicks) {\r
-                                                       context.moveTo(xTickStart, yLineValue);\r
-                                                       context.lineTo(xTickEnd, yLineValue);\r
-                                               }\r
+                       // Draw all of the tick labels, tick marks, and grid lines at the correct places\r
+                       helpers.each(itemsToDraw, function(itemToDraw) {\r
+                               if (gridLines.display) {\r
+                                       context.lineWidth = itemToDraw.glWidth;\r
+                                       context.strokeStyle = itemToDraw.glColor;\r
 \r
-                                               // Draw the chart area\r
-                                               if (gridLines.drawOnChartArea) {\r
-                                                       context.moveTo(chartArea.left, yLineValue);\r
-                                                       context.lineTo(chartArea.right, yLineValue);\r
-                                               }\r
+                                       context.beginPath();\r
 \r
-                                               // Need to stroke in the loop because we are potentially changing line widths & colours\r
-                                               context.stroke();\r
+                                       if (gridLines.drawTicks) {\r
+                                               context.moveTo(itemToDraw.tx1, itemToDraw.ty1);\r
+                                               context.lineTo(itemToDraw.tx2, itemToDraw.ty2);\r
                                        }\r
 \r
-                                       if (optionTicks.display) {\r
-                                               var xLabelValue;\r
-                                               var yLabelValue = this.getPixelForTick(index, gridLines.offsetGridLines); // x values for optionTicks (need to consider offsetLabel option)\r
+                                       if (gridLines.drawOnChartArea) {\r
+                                               context.moveTo(itemToDraw.x1, itemToDraw.y1);\r
+                                               context.lineTo(itemToDraw.x2, itemToDraw.y2);\r
+                                       }\r
 \r
-                                               context.save();\r
+                                       context.stroke();\r
+                               }\r
 \r
-                                               if (options.position === "left") {\r
-                                                       if (optionTicks.mirror) {\r
-                                                               xLabelValue = this.right + optionTicks.padding;\r
-                                                               context.textAlign = "left";\r
-                                                       } else {\r
-                                                               xLabelValue = this.right - optionTicks.padding;\r
-                                                               context.textAlign = "right";\r
-                                                       }\r
-                                               } else {\r
-                                                       // right side\r
-                                                       if (optionTicks.mirror) {\r
-                                                               xLabelValue = this.left - optionTicks.padding;\r
-                                                               context.textAlign = "right";\r
-                                                       } else {\r
-                                                               xLabelValue = this.left + optionTicks.padding;\r
-                                                               context.textAlign = "left";\r
-                                                       }\r
+                               if (optionTicks.display) {\r
+                                       context.save();\r
+                                       context.translate(itemToDraw.labelX, itemToDraw.labelY);\r
+                                       context.rotate(itemToDraw.rotation);\r
+                                       context.font = tickLabelFont;\r
+                                       context.textBaseline = itemToDraw.textBaseline;\r
+                                       context.textAlign = itemToDraw.textAlign;\r
+\r
+                                       var label = itemToDraw.label;\r
+                                       if (helpers.isArray(label)) {\r
+                                               for (var i = 0, y = 0; i < label.length; ++i) {\r
+                                                       // We just make sure the multiline element is a string here..\r
+                                                       context.fillText('' + label[i], 0, y);\r
+                                                       // apply same lineSpacing as calculated @ L#320\r
+                                                       y += (tickFontSize * 1.5);\r
                                                }\r
-\r
-                                               context.translate(xLabelValue, yLabelValue + optionTicks.labelOffset);\r
-                                               context.rotate(labelRotationRadians * -1);\r
-                                               context.font = tickLabelFont;\r
-                                               context.textBaseline = "middle";\r
+                                       } else {\r
                                                context.fillText(label, 0, 0);\r
-                                               context.restore();\r
                                        }\r
-                               }, this);\r
-\r
-                               if (scaleLabel.display) {\r
-                                       // Draw the scale label\r
-                                       scaleLabelX = options.position === 'left' ? this.left + (scaleLabelFontSize / 2) : this.right - (scaleLabelFontSize / 2);\r
-                                       scaleLabelY = this.top + ((this.bottom - this.top) / 2);\r
-                                       var rotation = options.position === 'left' ? -0.5 * Math.PI : 0.5 * Math.PI;\r
-\r
-                                       context.save();\r
-                                       context.translate(scaleLabelX, scaleLabelY);\r
-                                       context.rotate(rotation);\r
-                                       context.textAlign = "center";\r
-                                       context.fillStyle = scaleLabelFontColor; // render in correct colour\r
-                                       context.font = scaleLabelFont;\r
-                                       context.textBaseline = 'middle';\r
-                                       context.fillText(scaleLabel.labelString, 0, 0);\r
                                        context.restore();\r
                                }\r
+                       });\r
+\r
+                       if (scaleLabel.display) {\r
+                               // Draw the scale label\r
+                               var scaleLabelX;\r
+                               var scaleLabelY;\r
+                               var rotation = 0;\r
+\r
+                               if (isHorizontal) {\r
+                                       scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width\r
+                                       scaleLabelY = options.position === 'bottom' ? me.bottom - (scaleLabelFontSize / 2) : me.top + (scaleLabelFontSize / 2);\r
+                               } else {\r
+                                       var isLeft = options.position === 'left';\r
+                                       scaleLabelX = isLeft ? me.left + (scaleLabelFontSize / 2) : me.right - (scaleLabelFontSize / 2);\r
+                                       scaleLabelY = me.top + ((me.bottom - me.top) / 2);\r
+                                       rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\r
+                               }\r
+                               \r
+                               context.save();\r
+                               context.translate(scaleLabelX, scaleLabelY);\r
+                               context.rotate(rotation);\r
+                               context.textAlign = 'center';\r
+                               context.textBaseline = 'middle';\r
+                               context.fillStyle = scaleLabelFontColor; // render in correct colour\r
+                               context.font = scaleLabelFont;\r
+                               context.fillText(scaleLabel.labelString, 0, 0);\r
+                               context.restore();\r
                        }\r
 \r
                        if (gridLines.drawBorder) {\r
                                // Draw the line at the edge of the axis\r
-                               context.lineWidth = gridLines.lineWidth;\r
-                               context.strokeStyle = gridLines.color;\r
-                               var x1 = this.left,\r
-                                       x2 = this.right,\r
-                                       y1 = this.top,\r
-                                       y2 = this.bottom;\r
+                               context.lineWidth = helpers.getValueAtIndexOrDefault(gridLines.lineWidth, 0);\r
+                               context.strokeStyle = helpers.getValueAtIndexOrDefault(gridLines.color, 0);\r
+                               var x1 = me.left,\r
+                                       x2 = me.right,\r
+                                       y1 = me.top,\r
+                                       y2 = me.bottom;\r
 \r
                                var aliasPixel = helpers.aliasPixel(context.lineWidth);\r
-                               if (this.isHorizontal()) {\r
-                                       y1 = y2 = options.position === 'top' ? this.bottom : this.top;\r
+                               if (isHorizontal) {\r
+                                       y1 = y2 = options.position === 'top' ? me.bottom : me.top;\r
                                        y1 += aliasPixel;\r
                                        y2 += aliasPixel;\r
                                } else {\r
-                                       x1 = x2 = options.position === 'left' ? this.right : this.left;\r
+                                       x1 = x2 = options.position === 'left' ? me.right : me.left;\r
                                        x1 += aliasPixel;\r
                                        x2 += aliasPixel;\r
                                }\r
@@ -7150,43 +7362,50 @@ module.exports = function(Chart) {
        Chart.Title = Chart.Element.extend({\r
 \r
                initialize: function(config) {\r
-                       helpers.extend(this, config);\r
-                       this.options = helpers.configMerge(Chart.defaults.global.title, config.options);\r
+                       var me = this;\r
+                       helpers.extend(me, config);\r
+                       me.options = helpers.configMerge(Chart.defaults.global.title, config.options);\r
 \r
                        // Contains hit boxes for each dataset (in dataset order)\r
-                       this.legendHitBoxes = [];\r
+                       me.legendHitBoxes = [];\r
                },\r
 \r
                // These methods are ordered by lifecyle. Utilities then follow.\r
 \r
-               beforeUpdate: noop,\r
+               beforeUpdate: function () {\r
+                       var chartOpts = this.chart.options;\r
+                       if (chartOpts && chartOpts.title) {\r
+                               this.options = helpers.configMerge(Chart.defaults.global.title, chartOpts.title);\r
+                       }\r
+               },\r
                update: function(maxWidth, maxHeight, margins) {\r
+                       var me = this;\r
 \r
                        // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\r
-                       this.beforeUpdate();\r
+                       me.beforeUpdate();\r
 \r
                        // Absorb the master measurements\r
-                       this.maxWidth = maxWidth;\r
-                       this.maxHeight = maxHeight;\r
-                       this.margins = margins;\r
+                       me.maxWidth = maxWidth;\r
+                       me.maxHeight = maxHeight;\r
+                       me.margins = margins;\r
 \r
                        // Dimensions\r
-                       this.beforeSetDimensions();\r
-                       this.setDimensions();\r
-                       this.afterSetDimensions();\r
+                       me.beforeSetDimensions();\r
+                       me.setDimensions();\r
+                       me.afterSetDimensions();\r
                        // Labels\r
-                       this.beforeBuildLabels();\r
-                       this.buildLabels();\r
-                       this.afterBuildLabels();\r
+                       me.beforeBuildLabels();\r
+                       me.buildLabels();\r
+                       me.afterBuildLabels();\r
 \r
                        // Fit\r
-                       this.beforeFit();\r
-                       this.fit();\r
-                       this.afterFit();\r
+                       me.beforeFit();\r
+                       me.fit();\r
+                       me.afterFit();\r
                        //\r
-                       this.afterUpdate();\r
+                       me.afterUpdate();\r
 \r
-                       return this.minSize;\r
+                       return me.minSize;\r
 \r
                },\r
                afterUpdate: noop,\r
@@ -7195,28 +7414,29 @@ module.exports = function(Chart) {
 \r
                beforeSetDimensions: noop,\r
                setDimensions: function() {\r
+                       var me = this;\r
                        // Set the unconstrained dimension before label rotation\r
-                       if (this.isHorizontal()) {\r
+                       if (me.isHorizontal()) {\r
                                // Reset position before calculating rotation\r
-                               this.width = this.maxWidth;\r
-                               this.left = 0;\r
-                               this.right = this.width;\r
+                               me.width = me.maxWidth;\r
+                               me.left = 0;\r
+                               me.right = me.width;\r
                        } else {\r
-                               this.height = this.maxHeight;\r
+                               me.height = me.maxHeight;\r
 \r
                                // Reset position before calculating rotation\r
-                               this.top = 0;\r
-                               this.bottom = this.height;\r
+                               me.top = 0;\r
+                               me.bottom = me.height;\r
                        }\r
 \r
                        // Reset padding\r
-                       this.paddingLeft = 0;\r
-                       this.paddingTop = 0;\r
-                       this.paddingRight = 0;\r
-                       this.paddingBottom = 0;\r
+                       me.paddingLeft = 0;\r
+                       me.paddingTop = 0;\r
+                       me.paddingRight = 0;\r
+                       me.paddingBottom = 0;\r
 \r
                        // Reset minSize\r
-                       this.minSize = {\r
+                       me.minSize = {\r
                                width: 0,\r
                                height: 0\r
                        };\r
@@ -7234,25 +7454,25 @@ module.exports = function(Chart) {
                beforeFit: noop,\r
                fit: function() {\r
 \r
-                       var _this = this,\r
-                               ctx = _this.ctx,\r
+                       var me = this,\r
+                               ctx = me.ctx,\r
                                valueOrDefault = helpers.getValueOrDefault,\r
-                               opts = _this.options,\r
+                               opts = me.options,\r
                                globalDefaults = Chart.defaults.global,\r
                                display = opts.display,\r
                                fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize),\r
-                               minSize = _this.minSize;\r
+                               minSize = me.minSize;\r
 \r
-                       if (_this.isHorizontal()) {\r
-                               minSize.width = _this.maxWidth; // fill all the width\r
+                       if (me.isHorizontal()) {\r
+                               minSize.width = me.maxWidth; // fill all the width\r
                                minSize.height = display ? fontSize + (opts.padding * 2) : 0;\r
                        } else {\r
                                minSize.width = display ? fontSize + (opts.padding * 2) : 0;\r
-                               minSize.height = _this.maxHeight; // fill all the height\r
+                               minSize.height = me.maxHeight; // fill all the height\r
                        }\r
 \r
-                       _this.width = minSize.width;\r
-                       _this.height = minSize.height;\r
+                       me.width = minSize.width;\r
+                       me.height = minSize.height;\r
 \r
                },\r
                afterFit: noop,\r
@@ -7265,10 +7485,10 @@ module.exports = function(Chart) {
 \r
                // Actualy draw the title block on the canvas\r
                draw: function() {\r
-                       var _this = this,\r
-                               ctx = _this.ctx,\r
+                       var me = this,\r
+                               ctx = me.ctx,\r
                                valueOrDefault = helpers.getValueOrDefault,\r
-                               opts = _this.options,\r
+                               opts = me.options,\r
                                globalDefaults = Chart.defaults.global;\r
 \r
                        if (opts.display) {\r
@@ -7277,18 +7497,18 @@ module.exports = function(Chart) {
                                        fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily),\r
                                        titleFont = helpers.fontString(fontSize, fontStyle, fontFamily),\r
                                        rotation = 0,\r
-                                       titleX, \r
+                                       titleX,\r
                                        titleY,\r
-                                       top = _this.top,\r
-                                       left = _this.left,\r
-                                       bottom = _this.bottom,\r
-                                       right = _this.right;\r
+                                       top = me.top,\r
+                                       left = me.left,\r
+                                       bottom = me.bottom,\r
+                                       right = me.right;\r
 \r
                                ctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour\r
                                ctx.font = titleFont;\r
 \r
                                // Horizontal\r
-                               if (_this.isHorizontal()) {\r
+                               if (me.isHorizontal()) {\r
                                        titleX = left + ((right - left) / 2); // midpoint of the width\r
                                        titleY = top + ((bottom - top) / 2); // midpoint of the height\r
                                } else {\r
@@ -7307,7 +7527,26 @@ module.exports = function(Chart) {
                        }\r
                }\r
        });\r
-};
+\r
+       // Register the title plugin\r
+       Chart.plugins.register({\r
+               beforeInit: function(chartInstance) {\r
+                       var opts = chartInstance.options;\r
+                       var titleOpts = opts.title;\r
+\r
+                       if (titleOpts) {\r
+                               chartInstance.titleBlock = new Chart.Title({\r
+                                       ctx: chartInstance.chart.ctx,\r
+                                       options: titleOpts,\r
+                                       chart: chartInstance\r
+                               });\r
+\r
+                               Chart.layoutService.addBox(chartInstance, chartInstance.titleBlock);\r
+                       }\r
+               }\r
+       });\r
+};\r
+
 },{}],33:[function(require,module,exports){
 "use strict";\r
 \r
@@ -7323,15 +7562,15 @@ module.exports = function(Chart) {
                titleFontStyle: "bold",\r
                titleSpacing: 2,\r
                titleMarginBottom: 6,\r
-               titleColor: "#fff",\r
+               titleFontColor: "#fff",\r
                titleAlign: "left",\r
                bodySpacing: 2,\r
-               bodyColor: "#fff",\r
+               bodyFontColor: "#fff",\r
                bodyAlign: "left",\r
                footerFontStyle: "bold",\r
                footerSpacing: 2,\r
                footerMarginTop: 6,\r
-               footerColor: "#fff",\r
+               footerFontColor: "#fff",\r
                footerAlign: "left",\r
                yPadding: 6,\r
                xPadding: 6,\r
@@ -7346,12 +7585,16 @@ module.exports = function(Chart) {
                        title: function(tooltipItems, data) {\r
                                // Pick first xLabel for now\r
                                var title = '';\r
+                               var labels = data.labels;\r
+                               var labelCount = labels ? labels.length : 0;\r
 \r
                                if (tooltipItems.length > 0) {\r
-                                       if (tooltipItems[0].xLabel) {\r
-                                               title = tooltipItems[0].xLabel;\r
-                                       } else if (data.labels.length > 0 && tooltipItems[0].index < data.labels.length) {\r
-                                               title = data.labels[tooltipItems[0].index];\r
+                                       var item = tooltipItems[0];\r
+\r
+                                       if (item.xLabel) {\r
+                                               title = item.xLabel;\r
+                                       } else if (labelCount > 0 && item.index < labelCount) {\r
+                                               title = labels[item.index];\r
                                        }\r
                                }\r
 \r
@@ -7368,6 +7611,15 @@ module.exports = function(Chart) {
                                var datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';\r
                                return datasetLabel + ': ' + tooltipItem.yLabel;\r
                        },\r
+                       labelColor: function(tooltipItem, chartInstance) {\r
+                               var meta = chartInstance.getDatasetMeta(tooltipItem.datasetIndex);\r
+                               var activeElement = meta.data[tooltipItem.index];\r
+                               var view = activeElement._view;\r
+                               return {\r
+                                       borderColor: view.borderColor,\r
+                                       backgroundColor: view.backgroundColor\r
+                               };\r
+                       },\r
                        afterLabel: helpers.noop,\r
 \r
                        // Args are: (tooltipItems, data)\r
@@ -7393,52 +7645,101 @@ module.exports = function(Chart) {
                return base;\r
        }\r
 \r
+       function getAveragePosition(elements) {\r
+               if (!elements.length) {\r
+                       return false;\r
+               }\r
+\r
+               var i, len;\r
+               var xPositions = [];\r
+               var yPositions = [];\r
+\r
+               for (i = 0, len = elements.length; i < len; ++i) {\r
+                       var el = elements[i];\r
+                       if (el && el.hasValue()){\r
+                               var pos = el.tooltipPosition();\r
+                               xPositions.push(pos.x);\r
+                               yPositions.push(pos.y);\r
+                       }\r
+               }\r
+\r
+               var x = 0,\r
+                       y = 0;\r
+               for (i = 0, len - xPositions.length; i < len; ++i) {\r
+                       x += xPositions[i];\r
+                       y += yPositions[i];\r
+               }\r
+\r
+               return {\r
+                       x: Math.round(x / xPositions.length),\r
+                       y: Math.round(y / xPositions.length)\r
+               };\r
+       }\r
+\r
+       // Private helper to create a tooltip iteam model\r
+       // @param element : the chart element (point, arc, bar) to create the tooltip item for\r
+       // @return : new tooltip item\r
+       function createTooltipItem(element) {\r
+               var xScale = element._xScale;\r
+               var yScale = element._yScale || element._scale; // handle radar || polarArea charts\r
+               var index = element._index,\r
+                       datasetIndex = element._datasetIndex;\r
+\r
+               return {\r
+                       xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\r
+                       yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\r
+                       index: index,\r
+                       datasetIndex: datasetIndex\r
+               };\r
+       }\r
+\r
        Chart.Tooltip = Chart.Element.extend({\r
                initialize: function() {\r
+                       var me = this;\r
                        var globalDefaults = Chart.defaults.global;\r
-                       var options = this._options;\r
-                       var tooltips = options.tooltips;\r
+                       var tooltipOpts = me._options;\r
+                       var getValueOrDefault = helpers.getValueOrDefault;\r
 \r
-                       helpers.extend(this, {\r
+                       helpers.extend(me, {\r
                                _model: {\r
                                        // Positioning\r
-                                       xPadding: tooltips.xPadding,\r
-                                       yPadding: tooltips.yPadding,\r
-                                       xAlign : tooltips.yAlign,\r
-                                       yAlign : tooltips.xAlign,\r
+                                       xPadding: tooltipOpts.xPadding,\r
+                                       yPadding: tooltipOpts.yPadding,\r
+                                       xAlign : tooltipOpts.yAlign,\r
+                                       yAlign : tooltipOpts.xAlign,\r
 \r
                                        // Body\r
-                                       bodyColor: tooltips.bodyColor,\r
-                                       _bodyFontFamily: helpers.getValueOrDefault(tooltips.bodyFontFamily, globalDefaults.defaultFontFamily),\r
-                                       _bodyFontStyle: helpers.getValueOrDefault(tooltips.bodyFontStyle, globalDefaults.defaultFontStyle),\r
-                                       _bodyAlign: tooltips.bodyAlign,\r
-                                       bodyFontSize: helpers.getValueOrDefault(tooltips.bodyFontSize, globalDefaults.defaultFontSize),\r
-                                       bodySpacing: tooltips.bodySpacing,\r
+                                       bodyFontColor: tooltipOpts.bodyFontColor,\r
+                                       _bodyFontFamily: getValueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\r
+                                       _bodyFontStyle: getValueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\r
+                                       _bodyAlign: tooltipOpts.bodyAlign,\r
+                                       bodyFontSize: getValueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\r
+                                       bodySpacing: tooltipOpts.bodySpacing,\r
 \r
                                        // Title\r
-                                       titleColor: tooltips.titleColor,\r
-                                       _titleFontFamily: helpers.getValueOrDefault(tooltips.titleFontFamily, globalDefaults.defaultFontFamily),\r
-                                       _titleFontStyle: helpers.getValueOrDefault(tooltips.titleFontStyle, globalDefaults.defaultFontStyle),\r
-                                       titleFontSize: helpers.getValueOrDefault(tooltips.titleFontSize, globalDefaults.defaultFontSize),\r
-                                       _titleAlign: tooltips.titleAlign,\r
-                                       titleSpacing: tooltips.titleSpacing,\r
-                                       titleMarginBottom: tooltips.titleMarginBottom,\r
+                                       titleFontColor: tooltipOpts.titleFontColor,\r
+                                       _titleFontFamily: getValueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\r
+                                       _titleFontStyle: getValueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\r
+                                       titleFontSize: getValueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\r
+                                       _titleAlign: tooltipOpts.titleAlign,\r
+                                       titleSpacing: tooltipOpts.titleSpacing,\r
+                                       titleMarginBottom: tooltipOpts.titleMarginBottom,\r
 \r
                                        // Footer\r
-                                       footerColor: tooltips.footerColor,\r
-                                       _footerFontFamily: helpers.getValueOrDefault(tooltips.footerFontFamily, globalDefaults.defaultFontFamily),\r
-                                       _footerFontStyle: helpers.getValueOrDefault(tooltips.footerFontStyle, globalDefaults.defaultFontStyle),\r
-                                       footerFontSize: helpers.getValueOrDefault(tooltips.footerFontSize, globalDefaults.defaultFontSize),\r
-                                       _footerAlign: tooltips.footerAlign,\r
-                                       footerSpacing: tooltips.footerSpacing,\r
-                                       footerMarginTop: tooltips.footerMarginTop,\r
+                                       footerFontColor: tooltipOpts.footerFontColor,\r
+                                       _footerFontFamily: getValueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\r
+                                       _footerFontStyle: getValueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\r
+                                       footerFontSize: getValueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\r
+                                       _footerAlign: tooltipOpts.footerAlign,\r
+                                       footerSpacing: tooltipOpts.footerSpacing,\r
+                                       footerMarginTop: tooltipOpts.footerMarginTop,\r
 \r
                                        // Appearance\r
-                                       caretSize: tooltips.caretSize,\r
-                                       cornerRadius: tooltips.cornerRadius,\r
-                                       backgroundColor: tooltips.backgroundColor,\r
+                                       caretSize: tooltipOpts.caretSize,\r
+                                       cornerRadius: tooltipOpts.cornerRadius,\r
+                                       backgroundColor: tooltipOpts.backgroundColor,\r
                                        opacity: 0,\r
-                                       legendColorBackground: tooltips.multiKeyBackground\r
+                                       legendColorBackground: tooltipOpts.multiKeyBackground\r
                                }\r
                        });\r
                },\r
@@ -7446,9 +7747,13 @@ module.exports = function(Chart) {
                // Get the title\r
                // Args are: (tooltipItem, data)\r
                getTitle: function() {\r
-                       var beforeTitle = this._options.tooltips.callbacks.beforeTitle.apply(this, arguments),\r
-                               title = this._options.tooltips.callbacks.title.apply(this, arguments),\r
-                               afterTitle = this._options.tooltips.callbacks.afterTitle.apply(this, arguments);\r
+                       var me = this;\r
+                       var opts = me._options;\r
+                       var callbacks = opts.callbacks;\r
+\r
+                       var beforeTitle = callbacks.beforeTitle.apply(me, arguments),\r
+                               title = callbacks.title.apply(me, arguments),\r
+                               afterTitle = callbacks.afterTitle.apply(me, arguments);\r
 \r
                        var lines = [];\r
                        lines = pushOrConcat(lines, beforeTitle);\r
@@ -7460,35 +7765,47 @@ module.exports = function(Chart) {
 \r
                // Args are: (tooltipItem, data)\r
                getBeforeBody: function() {\r
-                       var lines = this._options.tooltips.callbacks.beforeBody.apply(this, arguments);\r
+                       var lines = this._options.callbacks.beforeBody.apply(this, arguments);\r
                        return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\r
                },\r
 \r
                // Args are: (tooltipItem, data)\r
                getBody: function(tooltipItems, data) {\r
-                       var lines = [];\r
+                       var me = this;\r
+                       var callbacks = me._options.callbacks;\r
+                       var bodyItems = [];\r
+\r
+                       helpers.each(tooltipItems, function(tooltipItem) {\r
+                               var bodyItem = {\r
+                                       before: [],\r
+                                       lines: [],\r
+                                       after: []\r
+                               };\r
+                               pushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data));\r
+                               pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\r
+                               pushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data));\r
 \r
-                       helpers.each(tooltipItems, function(bodyItem) {\r
-                               helpers.pushAllIfDefined(this._options.tooltips.callbacks.beforeLabel.call(this, bodyItem, data), lines);\r
-                               helpers.pushAllIfDefined(this._options.tooltips.callbacks.label.call(this, bodyItem, data), lines);\r
-                               helpers.pushAllIfDefined(this._options.tooltips.callbacks.afterLabel.call(this, bodyItem, data), lines);\r
-                       }, this);\r
+                               bodyItems.push(bodyItem);\r
+                       });\r
 \r
-                       return lines;\r
+                       return bodyItems;\r
                },\r
 \r
                // Args are: (tooltipItem, data)\r
                getAfterBody: function() {\r
-                       var lines = this._options.tooltips.callbacks.afterBody.apply(this, arguments);\r
+                       var lines = this._options.callbacks.afterBody.apply(this, arguments);\r
                        return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\r
                },\r
 \r
                // Get the footer and beforeFooter and afterFooter lines\r
                // Args are: (tooltipItem, data)\r
                getFooter: function() {\r
-                       var beforeFooter = this._options.tooltips.callbacks.beforeFooter.apply(this, arguments);\r
-                       var footer = this._options.tooltips.callbacks.footer.apply(this, arguments);\r
-                       var afterFooter = this._options.tooltips.callbacks.afterFooter.apply(this, arguments);\r
+                       var me = this;\r
+                       var callbacks = me._options.callbacks;\r
+\r
+                       var beforeFooter = callbacks.beforeFooter.apply(me, arguments);\r
+                       var footer = callbacks.footer.apply(me, arguments);\r
+                       var afterFooter = callbacks.afterFooter.apply(me, arguments);\r
 \r
                        var lines = [];\r
                        lines = pushOrConcat(lines, beforeFooter);\r
@@ -7498,98 +7815,47 @@ module.exports = function(Chart) {
                        return lines;\r
                },\r
 \r
-               getAveragePosition: function(elements) {\r
-\r
-                       if (!elements.length) {\r
-                               return false;\r
-                       }\r
-\r
-                       var xPositions = [];\r
-                       var yPositions = [];\r
-\r
-                       helpers.each(elements, function(el) {\r
-                               if (el && el.hasValue()){\r
-                                       var pos = el.tooltipPosition();\r
-                                       xPositions.push(pos.x);\r
-                                       yPositions.push(pos.y);\r
-                               }\r
-                       });\r
-\r
-                       var x = 0,\r
-                               y = 0;\r
-                       for (var i = 0; i < xPositions.length; i++) {\r
-                               x += xPositions[i];\r
-                               y += yPositions[i];\r
-                       }\r
+               update: function(changed) {\r
+                       var me = this;\r
+                       var opts = me._options;\r
+                       var model = me._model;\r
+                       var active = me._active;\r
 \r
-                       return {\r
-                               x: Math.round(x / xPositions.length),\r
-                               y: Math.round(y / xPositions.length)\r
-                       };\r
+                       var data = me._data;\r
+                       var chartInstance = me._chartInstance;\r
 \r
-               },\r
+                       var i, len;\r
 \r
-               update: function(changed) {\r
-                       if (this._active.length) {\r
-                               this._model.opacity = 1;\r
+                       if (active.length) {\r
+                               model.opacity = 1;\r
 \r
-                               var element = this._active[0],\r
-                                       labelColors = [],\r
-                                       tooltipPosition;\r
+                               var labelColors = [],\r
+                                       tooltipPosition = getAveragePosition(active);\r
 \r
                                var tooltipItems = [];\r
+                               for (i = 0, len = active.length; i < len; ++i) {\r
+                                       tooltipItems.push(createTooltipItem(active[i]));\r
+                               }\r
 \r
-                               if (this._options.tooltips.mode === 'single') {\r
-                                       var yScale = element._yScale || element._scale; // handle radar || polarArea charts\r
-                                       tooltipItems.push({\r
-                                               xLabel: element._xScale ? element._xScale.getLabelForIndex(element._index, element._datasetIndex) : '',\r
-                                               yLabel: yScale ? yScale.getLabelForIndex(element._index, element._datasetIndex) : '',\r
-                                               index: element._index,\r
-                                               datasetIndex: element._datasetIndex\r
-                                       });\r
-                                       tooltipPosition = this.getAveragePosition(this._active);\r
-                               } else {\r
-                                       helpers.each(this._data.datasets, function(dataset, datasetIndex) {\r
-                                               if (!this._chartInstance.isDatasetVisible(datasetIndex)) {\r
-                                                       return;\r
-                                               }\r
-\r
-                                               var meta = this._chartInstance.getDatasetMeta(datasetIndex);\r
-                                               var currentElement = meta.data[element._index];\r
-                                               if (currentElement) {\r
-                                                       var yScale = element._yScale || element._scale; // handle radar || polarArea charts\r
-\r
-                                                       tooltipItems.push({\r
-                                                               xLabel: currentElement._xScale ? currentElement._xScale.getLabelForIndex(currentElement._index, currentElement._datasetIndex) : '',\r
-                                                               yLabel: yScale ? yScale.getLabelForIndex(currentElement._index, currentElement._datasetIndex) : '',\r
-                                                               index: element._index,\r
-                                                               datasetIndex: datasetIndex\r
-                                                       });\r
-                                               }\r
-                                       }, this);\r
-\r
-                                       helpers.each(this._active, function(active) {\r
-                                               if (active) {\r
-                                                       labelColors.push({\r
-                                                               borderColor: active._view.borderColor,\r
-                                                               backgroundColor: active._view.backgroundColor\r
-                                                       });\r
-                                               }\r
-                                       }, null);\r
+                               // If the user provided a sorting function, use it to modify the tooltip items\r
+                               if (opts.itemSort) {\r
+                                       tooltipItems = tooltipItems.sort(opts.itemSort);\r
+                               }\r
 \r
-                                       tooltipPosition = this.getAveragePosition(this._active);\r
+                               // If there is more than one item, show color items\r
+                               if (active.length > 1) {\r
+                                       helpers.each(tooltipItems, function(tooltipItem) {\r
+                                               labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, chartInstance));\r
+                                       });\r
                                }\r
 \r
                                // Build the Text Lines\r
-                               helpers.extend(this._model, {\r
-                                       title: this.getTitle(tooltipItems, this._data),\r
-                                       beforeBody: this.getBeforeBody(tooltipItems, this._data),\r
-                                       body: this.getBody(tooltipItems, this._data),\r
-                                       afterBody: this.getAfterBody(tooltipItems, this._data),\r
-                                       footer: this.getFooter(tooltipItems, this._data)\r
-                               });\r
-\r
-                               helpers.extend(this._model, {\r
+                               helpers.extend(model, {\r
+                                       title: me.getTitle(tooltipItems, data),\r
+                                       beforeBody: me.getBeforeBody(tooltipItems, data),\r
+                                       body: me.getBody(tooltipItems, data),\r
+                                       afterBody: me.getAfterBody(tooltipItems, data),\r
+                                       footer: me.getFooter(tooltipItems, data),\r
                                        x: Math.round(tooltipPosition.x),\r
                                        y: Math.round(tooltipPosition.y),\r
                                        caretPadding: helpers.getValueOrDefault(tooltipPosition.padding, 2),\r
@@ -7597,19 +7863,19 @@ module.exports = function(Chart) {
                                });\r
 \r
                                // We need to determine alignment of\r
-                               var tooltipSize = this.getTooltipSize(this._model);\r
-                               this.determineAlignment(tooltipSize); // Smart Tooltip placement to stay on the canvas\r
+                               var tooltipSize = me.getTooltipSize(model);\r
+                               me.determineAlignment(tooltipSize); // Smart Tooltip placement to stay on the canvas\r
 \r
-                               helpers.extend(this._model, this.getBackgroundPoint(this._model, tooltipSize));\r
+                               helpers.extend(model, me.getBackgroundPoint(model, tooltipSize));\r
                        } else {\r
-                               this._model.opacity = 0;\r
+                               me._model.opacity = 0;\r
                        }\r
 \r
-                       if (changed && this._options.tooltips.custom) {\r
-                               this._options.tooltips.custom.call(this, this._model);\r
+                       if (changed && opts.custom) {\r
+                               opts.custom.call(me, model);\r
                        }\r
 \r
-                       return this;\r
+                       return me;\r
                },\r
                getTooltipSize: function getTooltipSize(vm) {\r
                        var ctx = this._chart.ctx;\r
@@ -7618,54 +7884,81 @@ module.exports = function(Chart) {
                                height: vm.yPadding * 2, // Tooltip Padding\r
                                width: 0\r
                        };\r
-                       var combinedBodyLength = vm.body.length + vm.beforeBody.length + vm.afterBody.length;\r
 \r
-                       size.height += vm.title.length * vm.titleFontSize; // Title Lines\r
-                       size.height += (vm.title.length - 1) * vm.titleSpacing; // Title Line Spacing\r
-                       size.height += vm.title.length ? vm.titleMarginBottom : 0; // Title's bottom Margin\r
-                       size.height += combinedBodyLength * vm.bodyFontSize; // Body Lines\r
+                       // Count of all lines in the body\r
+                       var body = vm.body;\r
+                       var combinedBodyLength = body.reduce(function(count, bodyItem) {\r
+                               return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\r
+                       }, 0);\r
+                       combinedBodyLength += vm.beforeBody.length + vm.afterBody.length;\r
+\r
+                       var titleLineCount = vm.title.length;\r
+                       var footerLineCount = vm.footer.length;\r
+                       var titleFontSize = vm.titleFontSize,\r
+                               bodyFontSize = vm.bodyFontSize,\r
+                               footerFontSize = vm.footerFontSize;\r
+\r
+                       size.height += titleLineCount * titleFontSize; // Title Lines\r
+                       size.height += (titleLineCount - 1) * vm.titleSpacing; // Title Line Spacing\r
+                       size.height += titleLineCount ? vm.titleMarginBottom : 0; // Title's bottom Margin\r
+                       size.height += combinedBodyLength * bodyFontSize; // Body Lines\r
                        size.height += combinedBodyLength ? (combinedBodyLength - 1) * vm.bodySpacing : 0; // Body Line Spacing\r
-                       size.height += vm.footer.length ? vm.footerMarginTop : 0; // Footer Margin\r
-                       size.height += vm.footer.length * (vm.footerFontSize); // Footer Lines\r
-                       size.height += vm.footer.length ? (vm.footer.length - 1) * vm.footerSpacing : 0; // Footer Line Spacing\r
+                       size.height += footerLineCount ? vm.footerMarginTop : 0; // Footer Margin\r
+                       size.height += footerLineCount * (footerFontSize); // Footer Lines\r
+                       size.height += footerLineCount ? (footerLineCount - 1) * vm.footerSpacing : 0; // Footer Line Spacing\r
+\r
+                       // Title width\r
+                       var widthPadding = 0;\r
+                       var maxLineWidth = function(line) {\r
+                               size.width = Math.max(size.width, ctx.measureText(line).width + widthPadding);\r
+                       };\r
 \r
-                       // Width\r
-                       ctx.font = helpers.fontString(vm.titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\r
-                       helpers.each(vm.title, function(line) {\r
-                               size.width = Math.max(size.width, ctx.measureText(line).width);\r
-                       });\r
+                       ctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\r
+                       helpers.each(vm.title, maxLineWidth);\r
 \r
-                       ctx.font = helpers.fontString(vm.bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\r
-                       helpers.each(vm.beforeBody.concat(vm.afterBody), function(line) {\r
-                               size.width = Math.max(size.width, ctx.measureText(line).width);\r
-                       });\r
-                       helpers.each(vm.body, function(line) {\r
-                               size.width = Math.max(size.width, ctx.measureText(line).width + (this._options.tooltips.mode !== 'single' ? (vm.bodyFontSize + 2) : 0));\r
-                       }, this);\r
+                       // Body width\r
+                       ctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\r
+                       helpers.each(vm.beforeBody.concat(vm.afterBody), maxLineWidth);\r
 \r
-                       ctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\r
-                       helpers.each(vm.footer, function(line) {\r
-                               size.width = Math.max(size.width, ctx.measureText(line).width);\r
+                       // Body lines may include some extra width due to the color box\r
+                       widthPadding = body.length > 1 ? (bodyFontSize + 2) : 0;\r
+                       helpers.each(body, function(bodyItem) {\r
+                               helpers.each(bodyItem.before, maxLineWidth);\r
+                               helpers.each(bodyItem.lines, maxLineWidth);\r
+                               helpers.each(bodyItem.after, maxLineWidth);\r
                        });\r
+\r
+                       // Reset back to 0\r
+                       widthPadding = 0;\r
+\r
+                       // Footer width\r
+                       ctx.font = helpers.fontString(footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\r
+                       helpers.each(vm.footer, maxLineWidth);\r
+\r
+                       // Add padding\r
                        size.width += 2 * vm.xPadding;\r
 \r
                        return size;\r
                },\r
                determineAlignment: function determineAlignment(size) {\r
-                       if (this._model.y < size.height) {\r
-                               this._model.yAlign = 'top';\r
-                       } else if (this._model.y > (this._chart.height - size.height)) {\r
-                               this._model.yAlign = 'bottom';\r
+                       var me = this;\r
+                       var model = me._model;\r
+                       var chart = me._chart;\r
+                       var chartArea = me._chartInstance.chartArea;\r
+\r
+                       if (model.y < size.height) {\r
+                               model.yAlign = 'top';\r
+                       } else if (model.y > (chart.height - size.height)) {\r
+                               model.yAlign = 'bottom';\r
                        }\r
 \r
                        var lf, rf; // functions to determine left, right alignment\r
                        var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\r
                        var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\r
-                       var _this = this;\r
-                       var midX = (this._chartInstance.chartArea.left + this._chartInstance.chartArea.right) / 2;\r
-                       var midY = (this._chartInstance.chartArea.top + this._chartInstance.chartArea.bottom) / 2;\r
+                       var midX = (chartArea.left + chartArea.right) / 2;\r
+                       var midY = (chartArea.top + chartArea.bottom) / 2;\r
 \r
-                       if (this._model.yAlign === 'center') {\r
+                       if (model.yAlign === 'center') {\r
                                lf = function(x) {\r
                                        return x <= midX;\r
                                };\r
@@ -7677,12 +7970,12 @@ module.exports = function(Chart) {
                                        return x <= (size.width / 2);\r
                                };\r
                                rf = function(x) {\r
-                                       return x >= (_this._chart.width - (size.width / 2));\r
+                                       return x >= (chart.width - (size.width / 2));\r
                                };\r
                        }\r
 \r
                        olf = function(x) {\r
-                               return x + size.width > _this._chart.width;\r
+                               return x + size.width > chart.width;\r
                        };\r
                        orf = function(x) {\r
                                return x - size.width < 0;\r
@@ -7691,21 +7984,21 @@ module.exports = function(Chart) {
                                return y <= midY ? 'top' : 'bottom';\r
                        };\r
 \r
-                       if (lf(this._model.x)) {\r
-                               this._model.xAlign = 'left';\r
+                       if (lf(model.x)) {\r
+                               model.xAlign = 'left';\r
 \r
                                // Is tooltip too wide and goes over the right side of the chart.?\r
-                               if (olf(this._model.x)) {\r
-                                       this._model.xAlign = 'center';\r
-                                       this._model.yAlign = yf(this._model.y);\r
+                               if (olf(model.x)) {\r
+                                       model.xAlign = 'center';\r
+                                       model.yAlign = yf(model.y);\r
                                }\r
-                       } else if (rf(this._model.x)) {\r
-                               this._model.xAlign = 'right';\r
+                       } else if (rf(model.x)) {\r
+                               model.xAlign = 'right';\r
 \r
                                // Is tooltip too wide and goes outside left edge of canvas?\r
-                               if (orf(this._model.x)) {\r
-                                       this._model.xAlign = 'center';\r
-                                       this._model.yAlign = yf(this._model.y);\r
+                               if (orf(model.x)) {\r
+                                       model.xAlign = 'center';\r
+                                       model.yAlign = yf(model.y);\r
                                }\r
                        }\r
                },\r
@@ -7716,31 +8009,39 @@ module.exports = function(Chart) {
                                y: vm.y\r
                        };\r
 \r
-                       if (vm.xAlign === 'right') {\r
+                       var caretSize = vm.caretSize,\r
+                               caretPadding = vm.caretPadding,\r
+                               cornerRadius = vm.cornerRadius,\r
+                               xAlign = vm.xAlign,\r
+                               yAlign = vm.yAlign,\r
+                               paddingAndSize = caretSize + caretPadding,\r
+                               radiusAndPadding = cornerRadius + caretPadding;\r
+\r
+                       if (xAlign === 'right') {\r
                                pt.x -= size.width;\r
-                       } else if (vm.xAlign === 'center') {\r
+                       } else if (xAlign === 'center') {\r
                                pt.x -= (size.width / 2);\r
                        }\r
 \r
-                       if (vm.yAlign === 'top') {\r
-                               pt.y += vm.caretPadding + vm.caretSize;\r
-                       } else if (vm.yAlign === 'bottom') {\r
-                               pt.y -= size.height + vm.caretPadding + vm.caretSize;\r
+                       if (yAlign === 'top') {\r
+                               pt.y += paddingAndSize;\r
+                       } else if (yAlign === 'bottom') {\r
+                               pt.y -= size.height + paddingAndSize;\r
                        } else {\r
                                pt.y -= (size.height / 2);\r
                        }\r
 \r
-                       if (vm.yAlign === 'center') {\r
-                               if (vm.xAlign === 'left') {\r
-                                       pt.x += vm.caretPadding + vm.caretSize;\r
-                               } else if (vm.xAlign === 'right') {\r
-                                       pt.x -= vm.caretPadding + vm.caretSize;\r
+                       if (yAlign === 'center') {\r
+                               if (xAlign === 'left') {\r
+                                       pt.x += paddingAndSize;\r
+                               } else if (xAlign === 'right') {\r
+                                       pt.x -= paddingAndSize;\r
                                }\r
                        } else {\r
-                               if (vm.xAlign === 'left') {\r
-                                       pt.x -= vm.cornerRadius + vm.caretPadding;\r
-                               } else if (vm.xAlign === 'right') {\r
-                                       pt.x += vm.cornerRadius + vm.caretPadding;\r
+                               if (xAlign === 'left') {\r
+                                       pt.x -= radiusAndPadding;\r
+                               } else if (xAlign === 'right') {\r
+                                       pt.x += radiusAndPadding;\r
                                }\r
                        }\r
 \r
@@ -7751,44 +8052,52 @@ module.exports = function(Chart) {
                        var ctx = this._chart.ctx;\r
                        var x1, x2, x3;\r
                        var y1, y2, y3;\r
-\r
-                       if (vm.yAlign === 'center') {\r
+                       var caretSize = vm.caretSize;\r
+                       var cornerRadius = vm.cornerRadius;\r
+                       var xAlign = vm.xAlign,\r
+                               yAlign = vm.yAlign;\r
+                       var ptX = tooltipPoint.x,\r
+                               ptY = tooltipPoint.y;\r
+                       var width = size.width,\r
+                               height = size.height;\r
+\r
+                       if (yAlign === 'center') {\r
                                // Left or right side\r
-                               if (vm.xAlign === 'left') {\r
-                                       x1 = tooltipPoint.x;\r
-                                       x2 = x1 - vm.caretSize;\r
+                               if (xAlign === 'left') {\r
+                                       x1 = ptX;\r
+                                       x2 = x1 - caretSize;\r
                                        x3 = x1;\r
                                } else {\r
-                                       x1 = tooltipPoint.x + size.width;\r
-                                       x2 = x1 + vm.caretSize;\r
+                                       x1 = ptX + width;\r
+                                       x2 = x1 + caretSize;\r
                                        x3 = x1;\r
                                }\r
 \r
-                               y2 = tooltipPoint.y + (size.height / 2);\r
-                               y1 = y2 - vm.caretSize;\r
-                               y3 = y2 + vm.caretSize;\r
+                               y2 = ptY + (height / 2);\r
+                               y1 = y2 - caretSize;\r
+                               y3 = y2 + caretSize;\r
                        } else {\r
-                               if (vm.xAlign === 'left') {\r
-                                       x1 = tooltipPoint.x + vm.cornerRadius;\r
-                                       x2 = x1 + vm.caretSize;\r
-                                       x3 = x2 + vm.caretSize;\r
-                               } else if (vm.xAlign === 'right') {\r
-                                       x1 = tooltipPoint.x + size.width - vm.cornerRadius;\r
-                                       x2 = x1 - vm.caretSize;\r
-                                       x3 = x2 - vm.caretSize;\r
+                               if (xAlign === 'left') {\r
+                                       x1 = ptX + cornerRadius;\r
+                                       x2 = x1 + caretSize;\r
+                                       x3 = x2 + caretSize;\r
+                               } else if (xAlign === 'right') {\r
+                                       x1 = ptX + width - cornerRadius;\r
+                                       x2 = x1 - caretSize;\r
+                                       x3 = x2 - caretSize;\r
                                } else {\r
-                                       x2 = tooltipPoint.x + (size.width / 2);\r
-                                       x1 = x2 - vm.caretSize;\r
-                                       x3 = x2 + vm.caretSize;\r
+                                       x2 = ptX + (width / 2);\r
+                                       x1 = x2 - caretSize;\r
+                                       x3 = x2 + caretSize;\r
                                }\r
 \r
-                               if (vm.yAlign === 'top') {\r
-                                       y1 = tooltipPoint.y;\r
-                                       y2 = y1 - vm.caretSize;\r
+                               if (yAlign === 'top') {\r
+                                       y1 = ptY;\r
+                                       y2 = y1 - caretSize;\r
                                        y3 = y1;\r
                                } else {\r
-                                       y1 = tooltipPoint.y + size.height;\r
-                                       y2 = y1 + vm.caretSize;\r
+                                       y1 = ptY + height;\r
+                                       y2 = y1 + caretSize;\r
                                        y3 = y1;\r
                                }\r
                        }\r
@@ -7803,83 +8112,106 @@ module.exports = function(Chart) {
                        ctx.fill();\r
                },\r
                drawTitle: function drawTitle(pt, vm, ctx, opacity) {\r
-                       if (vm.title.length) {\r
+                       var title = vm.title;\r
+\r
+                       if (title.length) {\r
                                ctx.textAlign = vm._titleAlign;\r
                                ctx.textBaseline = "top";\r
 \r
-                               var titleColor = helpers.color(vm.titleColor);\r
-                               ctx.fillStyle = titleColor.alpha(opacity * titleColor.alpha()).rgbString();\r
-                               ctx.font = helpers.fontString(vm.titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\r
+                               var titleFontSize = vm.titleFontSize,\r
+                                       titleSpacing = vm.titleSpacing;\r
+\r
+                               var titleFontColor = helpers.color(vm.titleFontColor);\r
+                               ctx.fillStyle = titleFontColor.alpha(opacity * titleFontColor.alpha()).rgbString();\r
+                               ctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\r
 \r
-                               helpers.each(vm.title, function(title, i) {\r
-                                       ctx.fillText(title, pt.x, pt.y);\r
-                                       pt.y += vm.titleFontSize + vm.titleSpacing; // Line Height and spacing\r
+                               var i, len;\r
+                               for (i = 0, len = title.length; i < len; ++i) {\r
+                                       ctx.fillText(title[i], pt.x, pt.y);\r
+                                       pt.y += titleFontSize + titleSpacing; // Line Height and spacing\r
 \r
-                                       if (i + 1 === vm.title.length) {\r
-                                               pt.y += vm.titleMarginBottom - vm.titleSpacing; // If Last, add margin, remove spacing\r
+                                       if (i + 1 === title.length) {\r
+                                               pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\r
                                        }\r
-                               });\r
+                               }\r
                        }\r
                },\r
                drawBody: function drawBody(pt, vm, ctx, opacity) {\r
+                       var bodyFontSize = vm.bodyFontSize;\r
+                       var bodySpacing = vm.bodySpacing;\r
+                       var body = vm.body;\r
+\r
                        ctx.textAlign = vm._bodyAlign;\r
                        ctx.textBaseline = "top";\r
 \r
-                       var bodyColor = helpers.color(vm.bodyColor);\r
-                       ctx.fillStyle = bodyColor.alpha(opacity * bodyColor.alpha()).rgbString();\r
-                       ctx.font = helpers.fontString(vm.bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\r
+                       var bodyFontColor = helpers.color(vm.bodyFontColor);\r
+                       var textColor = bodyFontColor.alpha(opacity * bodyFontColor.alpha()).rgbString();\r
+                       ctx.fillStyle = textColor;\r
+                       ctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\r
 \r
                        // Before Body\r
-                       helpers.each(vm.beforeBody, function(beforeBody) {\r
-                               ctx.fillText(beforeBody, pt.x, pt.y);\r
-                               pt.y += vm.bodyFontSize + vm.bodySpacing;\r
-                       });\r
+                       var xLinePadding = 0;\r
+                       var fillLineOfText = function(line) {\r
+                               ctx.fillText(line, pt.x + xLinePadding, pt.y);\r
+                               pt.y += bodyFontSize + bodySpacing;\r
+                       };\r
 \r
-                       helpers.each(vm.body, function(body, i) {\r
-                               // Draw Legend-like boxes if needed\r
-                               if (this._options.tooltips.mode !== 'single') {\r
-                                       // Fill a white rect so that colours merge nicely if the opacity is < 1\r
-                                       ctx.fillStyle = helpers.color(vm.legendColorBackground).alpha(opacity).rgbaString();\r
-                                       ctx.fillRect(pt.x, pt.y, vm.bodyFontSize, vm.bodyFontSize);\r
+                       // Before body lines\r
+                       helpers.each(vm.beforeBody, fillLineOfText);\r
 \r
-                                       // Border\r
-                                       ctx.strokeStyle = helpers.color(vm.labelColors[i].borderColor).alpha(opacity).rgbaString();\r
-                                       ctx.strokeRect(pt.x, pt.y, vm.bodyFontSize, vm.bodyFontSize);\r
+                       var drawColorBoxes = body.length > 1;\r
+                       xLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0;\r
 \r
-                                       // Inner square\r
-                                       ctx.fillStyle = helpers.color(vm.labelColors[i].backgroundColor).alpha(opacity).rgbaString();\r
-                                       ctx.fillRect(pt.x + 1, pt.y + 1, vm.bodyFontSize - 2, vm.bodyFontSize - 2);\r
+                       // Draw body lines now\r
+                       helpers.each(body, function(bodyItem, i) {\r
+                               helpers.each(bodyItem.before, fillLineOfText);\r
 \r
-                                       ctx.fillStyle = helpers.color(vm.bodyColor).alpha(opacity).rgbaString(); // Return fill style for text\r
-                               }\r
+                               helpers.each(bodyItem.lines, function(line) {\r
+                                       // Draw Legend-like boxes if needed\r
+                                       if (drawColorBoxes) {\r
+                                               // Fill a white rect so that colours merge nicely if the opacity is < 1\r
+                                               ctx.fillStyle = helpers.color(vm.legendColorBackground).alpha(opacity).rgbaString();\r
+                                               ctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\r
+\r
+                                               // Border\r
+                                               ctx.strokeStyle = helpers.color(vm.labelColors[i].borderColor).alpha(opacity).rgbaString();\r
+                                               ctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\r
 \r
-                               // Body Line\r
-                               ctx.fillText(body, pt.x + (this._options.tooltips.mode !== 'single' ? (vm.bodyFontSize + 2) : 0), pt.y);\r
+                                               // Inner square\r
+                                               ctx.fillStyle = helpers.color(vm.labelColors[i].backgroundColor).alpha(opacity).rgbaString();\r
+                                               ctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\r
 \r
-                               pt.y += vm.bodyFontSize + vm.bodySpacing;\r
-                       }, this);\r
+                                               ctx.fillStyle = textColor;\r
+                                       }\r
 \r
-                       // After Body\r
-                       helpers.each(vm.afterBody, function(afterBody) {\r
-                               ctx.fillText(afterBody, pt.x, pt.y);\r
-                               pt.y += vm.bodyFontSize;\r
+                                       fillLineOfText(line);\r
+                               });\r
+\r
+                               helpers.each(bodyItem.after, fillLineOfText);\r
                        });\r
 \r
-                       pt.y -= vm.bodySpacing; // Remove last body spacing\r
+                       // Reset back to 0 for after body\r
+                       xLinePadding = 0;\r
+\r
+                       // After body lines\r
+                       helpers.each(vm.afterBody, fillLineOfText);\r
+                       pt.y -= bodySpacing; // Remove last body spacing\r
                },\r
                drawFooter: function drawFooter(pt, vm, ctx, opacity) {\r
-                       if (vm.footer.length) {\r
+                       var footer = vm.footer;\r
+\r
+                       if (footer.length) {\r
                                pt.y += vm.footerMarginTop;\r
 \r
                                ctx.textAlign = vm._footerAlign;\r
                                ctx.textBaseline = "top";\r
 \r
-                               var footerColor = helpers.color(vm.footerColor);\r
-                               ctx.fillStyle = footerColor.alpha(opacity * footerColor.alpha()).rgbString();\r
+                               var footerFontColor = helpers.color(vm.footerFontColor);\r
+                               ctx.fillStyle = footerFontColor.alpha(opacity * footerFontColor.alpha()).rgbString();\r
                                ctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\r
 \r
-                               helpers.each(vm.footer, function(footer) {\r
-                                       ctx.fillText(footer, pt.x, pt.y);\r
+                               helpers.each(footer, function(line) {\r
+                                       ctx.fillText(line, pt.x, pt.y);\r
                                        pt.y += vm.footerFontSize + vm.footerSpacing;\r
                                });\r
                        }\r
@@ -7892,7 +8224,6 @@ module.exports = function(Chart) {
                                return;\r
                        }\r
 \r
-                       var caretPadding = vm.caretPadding;\r
                        var tooltipSize = this.getTooltipSize(vm);\r
                        var pt = {\r
                                x: vm.x,\r
@@ -7902,7 +8233,7 @@ module.exports = function(Chart) {
                        // IE11/Edge does not like very small opacities, so snap to 0\r
                        var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\r
 \r
-                       if (this._options.tooltips.enabled) {\r
+                       if (this._options.enabled) {\r
                                // Draw Background\r
                                var bgColor = helpers.color(vm.backgroundColor);\r
                                ctx.fillStyle = bgColor.alpha(opacity * bgColor.alpha()).rgbString();\r
@@ -7910,7 +8241,7 @@ module.exports = function(Chart) {
                                ctx.fill();\r
 \r
                                // Draw Caret\r
-                               this.drawCaret(pt, tooltipSize, opacity, caretPadding);\r
+                               this.drawCaret(pt, tooltipSize, opacity, vm.caretPadding);\r
 \r
                                // Draw Title, Body, and Footer\r
                                pt.x += vm.xPadding;\r
@@ -8046,12 +8377,14 @@ module.exports = function(Chart) {
 \r
        Chart.elements.Line = Chart.Element.extend({\r
                lineToNextPoint: function(previousPoint, point, nextPoint, skipHandler, previousSkipHandler) {\r
-                       var ctx = this._chart.ctx;\r
+                       var me = this;\r
+                       var ctx = me._chart.ctx;\r
+                       var spanGaps = me._view ? me._view.spanGaps : false;\r
 \r
-                       if (point._view.skip) {\r
-                               skipHandler.call(this, previousPoint, point, nextPoint);\r
-                       } else if (previousPoint._view.skip) {\r
-                               previousSkipHandler.call(this, previousPoint, point, nextPoint);\r
+                       if (point._view.skip && !spanGaps) {\r
+                               skipHandler.call(me, previousPoint, point, nextPoint);\r
+                       } else if (previousPoint._view.skip && !spanGaps) {\r
+                               previousSkipHandler.call(me, previousPoint, point, nextPoint);\r
                        } else if (point._view.tension === 0) {\r
                                ctx.lineTo(point._view.x, point._view.y);\r
                        } else {\r
@@ -8068,12 +8401,12 @@ module.exports = function(Chart) {
                },\r
 \r
                draw: function() {\r
-                       var _this = this;\r
+                       var me = this;\r
 \r
-                       var vm = this._view;\r
-                       var ctx = this._chart.ctx;\r
-                       var first = this._children[0];\r
-                       var last = this._children[this._children.length - 1];\r
+                       var vm = me._view;\r
+                       var ctx = me._chart.ctx;\r
+                       var first = me._children[0];\r
+                       var last = me._children[me._children.length - 1];\r
 \r
                        function loopBackToStart(drawLineToCenter) {\r
                                if (!first._view.skip && !last._view.skip) {\r
@@ -8088,59 +8421,59 @@ module.exports = function(Chart) {
                                        );\r
                                } else if (drawLineToCenter) {\r
                                        // Go to center\r
-                                       ctx.lineTo(_this._view.scaleZero.x, _this._view.scaleZero.y);\r
+                                       ctx.lineTo(me._view.scaleZero.x, me._view.scaleZero.y);\r
                                }\r
                        }\r
 \r
                        ctx.save();\r
 \r
                        // If we had points and want to fill this line, do so.\r
-                       if (this._children.length > 0 && vm.fill) {\r
+                       if (me._children.length > 0 && vm.fill) {\r
                                // Draw the background first (so the border is always on top)\r
                                ctx.beginPath();\r
 \r
-                               helpers.each(this._children, function(point, index) {\r
-                                       var previous = helpers.previousItem(this._children, index);\r
-                                       var next = helpers.nextItem(this._children, index);\r
+                               helpers.each(me._children, function(point, index) {\r
+                                       var previous = helpers.previousItem(me._children, index);\r
+                                       var next = helpers.nextItem(me._children, index);\r
 \r
                                        // First point moves to it's starting position no matter what\r
                                        if (index === 0) {\r
-                                               if (this._loop) {\r
+                                               if (me._loop) {\r
                                                        ctx.moveTo(vm.scaleZero.x, vm.scaleZero.y);\r
                                                } else {\r
                                                        ctx.moveTo(point._view.x, vm.scaleZero);\r
                                                }\r
 \r
                                                if (point._view.skip) {\r
-                                                       if (!this._loop) {\r
-                                                               ctx.moveTo(next._view.x, this._view.scaleZero);\r
+                                                       if (!me._loop) {\r
+                                                               ctx.moveTo(next._view.x, me._view.scaleZero);\r
                                                        }\r
                                                } else {\r
                                                        ctx.lineTo(point._view.x, point._view.y);\r
                                                }\r
                                        } else {\r
-                                               this.lineToNextPoint(previous, point, next, function(previousPoint, point, nextPoint) {\r
-                                                       if (this._loop) {\r
+                                               me.lineToNextPoint(previous, point, next, function(previousPoint, point, nextPoint) {\r
+                                                       if (me._loop) {\r
                                                                // Go to center\r
-                                                               ctx.lineTo(this._view.scaleZero.x, this._view.scaleZero.y);\r
+                                                               ctx.lineTo(me._view.scaleZero.x, me._view.scaleZero.y);\r
                                                        } else {\r
-                                                               ctx.lineTo(previousPoint._view.x, this._view.scaleZero);\r
-                                                               ctx.moveTo(nextPoint._view.x, this._view.scaleZero);\r
+                                                               ctx.lineTo(previousPoint._view.x, me._view.scaleZero);\r
+                                                               ctx.moveTo(nextPoint._view.x, me._view.scaleZero);\r
                                                        }\r
                                                }, function(previousPoint, point) {\r
                                                        // If we skipped the last point, draw a line to ourselves so that the fill is nice\r
                                                        ctx.lineTo(point._view.x, point._view.y);\r
                                                });\r
                                        }\r
-                               }, this);\r
+                               }, me);\r
 \r
                                // For radial scales, loop back around to the first point\r
-                               if (this._loop) {\r
+                               if (me._loop) {\r
                                        loopBackToStart(true);\r
                                } else {\r
                                        //Round off the line by going to the base of the chart, back to the start, then fill.\r
-                                       ctx.lineTo(this._children[this._children.length - 1]._view.x, vm.scaleZero);\r
-                                       ctx.lineTo(this._children[0]._view.x, vm.scaleZero);\r
+                                       ctx.lineTo(me._children[me._children.length - 1]._view.x, vm.scaleZero);\r
+                                       ctx.lineTo(me._children[0]._view.x, vm.scaleZero);\r
                                }\r
 \r
                                ctx.fillStyle = vm.backgroundColor || globalDefaults.defaultColor;\r
@@ -8163,23 +8496,23 @@ module.exports = function(Chart) {
                        ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\r
                        ctx.beginPath();\r
 \r
-                       helpers.each(this._children, function(point, index) {\r
-                               var previous = helpers.previousItem(this._children, index);\r
-                               var next = helpers.nextItem(this._children, index);\r
+                       helpers.each(me._children, function(point, index) {\r
+                               var previous = helpers.previousItem(me._children, index);\r
+                               var next = helpers.nextItem(me._children, index);\r
 \r
                                if (index === 0) {\r
                                        ctx.moveTo(point._view.x, point._view.y);\r
                                } else {\r
-                                       this.lineToNextPoint(previous, point, next, function(previousPoint, point, nextPoint) {\r
+                                       me.lineToNextPoint(previous, point, next, function(previousPoint, point, nextPoint) {\r
                                                ctx.moveTo(nextPoint._view.x, nextPoint._view.y);\r
                                        }, function(previousPoint, point) {\r
                                                // If we skipped the last point, move up to our point preventing a line from being drawn\r
                                                ctx.moveTo(point._view.x, point._view.y);\r
                                        });\r
                                }\r
-                       }, this);\r
+                       }, me);\r
 \r
-                       if (this._loop && this._children.length > 0) {\r
+                       if (me._loop && me._children.length > 0) {\r
                                loopBackToStart();\r
                        }\r
 \r
@@ -8279,12 +8612,14 @@ module.exports = function(Chart) {
                                ctx.strokeRect(x - size, y - size, 2 * size, 2 * size);\r
                                break;\r
                        case 'rectRot':\r
-                               ctx.translate(x, y);\r
-                               ctx.rotate(Math.PI / 4);\r
                                size = 1 / Math.SQRT2 * radius;\r
-                               ctx.fillRect(-size, -size, 2 * size, 2 * size);\r
-                               ctx.strokeRect(-size, -size, 2 * size, 2 * size);\r
-                               ctx.setTransform(1, 0, 0, 1, 0, 0);\r
+                               ctx.beginPath();\r
+                               ctx.moveTo(x - size, y);\r
+                               ctx.lineTo(x, y + size);\r
+                               ctx.lineTo(x + size, y);\r
+                               ctx.lineTo(x, y - size);\r
+                               ctx.closePath();\r
+                               ctx.fill();\r
                                break;\r
                        case 'cross':\r
                                ctx.beginPath();\r
@@ -8446,29 +8781,31 @@ module.exports = function(Chart) {
        var DatasetScale = Chart.Scale.extend({\r
                // Implement this so that \r
                determineDataLimits: function() {\r
-                       this.minIndex = 0;\r
-                       this.maxIndex = this.chart.data.labels.length - 1;\r
+                       var me = this;\r
+                       me.minIndex = 0;\r
+                       me.maxIndex = me.chart.data.labels.length - 1;\r
                        var findIndex;\r
 \r
-                       if (this.options.ticks.min !== undefined) {\r
+                       if (me.options.ticks.min !== undefined) {\r
                                // user specified min value\r
-                               findIndex = helpers.indexOf(this.chart.data.labels, this.options.ticks.min);\r
-                               this.minIndex = findIndex !== -1 ? findIndex : this.minIndex;\r
+                               findIndex = helpers.indexOf(me.chart.data.labels, me.options.ticks.min);\r
+                               me.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\r
                        }\r
 \r
-                       if (this.options.ticks.max !== undefined) {\r
+                       if (me.options.ticks.max !== undefined) {\r
                                // user specified max value\r
-                               findIndex = helpers.indexOf(this.chart.data.labels, this.options.ticks.max);\r
-                               this.maxIndex = findIndex !== -1 ? findIndex : this.maxIndex;\r
+                               findIndex = helpers.indexOf(me.chart.data.labels, me.options.ticks.max);\r
+                               me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\r
                        }\r
 \r
-                       this.min = this.chart.data.labels[this.minIndex];\r
-                       this.max = this.chart.data.labels[this.maxIndex];\r
+                       me.min = me.chart.data.labels[me.minIndex];\r
+                       me.max = me.chart.data.labels[me.maxIndex];\r
                },\r
 \r
                buildTicks: function(index) {\r
+                       var me = this;\r
                        // If we are viewing some subset of labels, slice the original array\r
-                       this.ticks = (this.minIndex === 0 && this.maxIndex === this.chart.data.labels.length - 1) ? this.chart.data.labels : this.chart.data.labels.slice(this.minIndex, this.maxIndex + 1);\r
+                       me.ticks = (me.minIndex === 0 && me.maxIndex === me.chart.data.labels.length - 1) ? me.chart.data.labels : me.chart.data.labels.slice(me.minIndex, me.maxIndex + 1);\r
                },\r
 \r
                getLabelForIndex: function(index, datasetIndex) {\r
@@ -8477,45 +8814,47 @@ module.exports = function(Chart) {
 \r
                // Used to get data value locations.  Value can either be an index or a numerical value\r
                getPixelForValue: function(value, index, datasetIndex, includeOffset) {\r
+                       var me = this;\r
                        // 1 is added because we need the length but we have the indexes\r
-                       var offsetAmt = Math.max((this.maxIndex + 1 - this.minIndex - ((this.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\r
+                       var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\r
 \r
-                       if (this.isHorizontal()) {\r
-                               var innerWidth = this.width - (this.paddingLeft + this.paddingRight);\r
+                       if (me.isHorizontal()) {\r
+                               var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\r
                                var valueWidth = innerWidth / offsetAmt;\r
-                               var widthOffset = (valueWidth * (index - this.minIndex)) + this.paddingLeft;\r
+                               var widthOffset = (valueWidth * (index - me.minIndex)) + me.paddingLeft;\r
 \r
-                               if (this.options.gridLines.offsetGridLines && includeOffset) {\r
+                               if (me.options.gridLines.offsetGridLines && includeOffset) {\r
                                        widthOffset += (valueWidth / 2);\r
                                }\r
 \r
-                               return this.left + Math.round(widthOffset);\r
+                               return me.left + Math.round(widthOffset);\r
                        } else {\r
-                               var innerHeight = this.height - (this.paddingTop + this.paddingBottom);\r
+                               var innerHeight = me.height - (me.paddingTop + me.paddingBottom);\r
                                var valueHeight = innerHeight / offsetAmt;\r
-                               var heightOffset = (valueHeight * (index - this.minIndex)) + this.paddingTop;\r
+                               var heightOffset = (valueHeight * (index - me.minIndex)) + me.paddingTop;\r
 \r
-                               if (this.options.gridLines.offsetGridLines && includeOffset) {\r
+                               if (me.options.gridLines.offsetGridLines && includeOffset) {\r
                                        heightOffset += (valueHeight / 2);\r
                                }\r
 \r
-                               return this.top + Math.round(heightOffset);\r
+                               return me.top + Math.round(heightOffset);\r
                        }\r
                },\r
                getPixelForTick: function(index, includeOffset) {\r
                        return this.getPixelForValue(this.ticks[index], index + this.minIndex, null, includeOffset);\r
                },\r
                getValueForPixel: function(pixel) {\r
-                       var value\r
-;                      var offsetAmt = Math.max((this.ticks.length - ((this.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\r
-                       var horz = this.isHorizontal();\r
-                       var innerDimension = horz ? this.width - (this.paddingLeft + this.paddingRight) : this.height - (this.paddingTop + this.paddingBottom);\r
+                       var me = this;\r
+                       var value;\r
+                       var offsetAmt = Math.max((me.ticks.length - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\r
+                       var horz = me.isHorizontal();\r
+                       var innerDimension = horz ? me.width - (me.paddingLeft + me.paddingRight) : me.height - (me.paddingTop + me.paddingBottom);\r
                        var valueDimension = innerDimension / offsetAmt;\r
 \r
-                       if (this.options.gridLines.offsetGridLines) {\r
+                       if (me.options.gridLines.offsetGridLines) {\r
                                pixel -= (valueDimension / 2);\r
                        }\r
-                       pixel -= horz ? this.paddingLeft : this.paddingTop;\r
+                       pixel -= horz ? me.paddingLeft : me.paddingTop;\r
 \r
                        if (pixel <= 0) {\r
                                value = 0;\r
@@ -8568,23 +8907,23 @@ module.exports = function(Chart) {
                }\r
        };\r
 \r
-       var LinearScale = Chart.Scale.extend({\r
+       var LinearScale = Chart.LinearScaleBase.extend({\r
                determineDataLimits: function() {\r
-                       var _this = this;\r
-                       var opts = _this.options;\r
+                       var me = this;\r
+                       var opts = me.options;\r
                        var tickOpts = opts.ticks;\r
-                       var chart = _this.chart;\r
+                       var chart = me.chart;\r
                        var data = chart.data;\r
                        var datasets = data.datasets;\r
-                       var isHorizontal = _this.isHorizontal();\r
+                       var isHorizontal = me.isHorizontal();\r
 \r
                        function IDMatches(meta) {\r
-                               return isHorizontal ? meta.xAxisID === _this.id : meta.yAxisID === _this.id;\r
+                               return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\r
                        }\r
 \r
                        // First Calculate the range\r
-                       _this.min = null;\r
-                       _this.max = null;\r
+                       me.min = null;\r
+                       me.max = null;\r
 \r
                        if (opts.stacked) {\r
                                var valuesPerType = {};\r
@@ -8606,7 +8945,7 @@ module.exports = function(Chart) {
 \r
                                        if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\r
                                                helpers.each(dataset.data, function(rawValue, index) {\r
-                                                       var value = +_this.getRightValue(rawValue);\r
+                                                       var value = +me.getRightValue(rawValue);\r
                                                        if (isNaN(value) || meta.data[index].hidden) {\r
                                                                return;\r
                                                        }\r
@@ -8633,8 +8972,8 @@ module.exports = function(Chart) {
                                        var values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\r
                                        var minVal = helpers.min(values);\r
                                        var maxVal = helpers.max(values);\r
-                                       _this.min = _this.min === null ? minVal : Math.min(_this.min, minVal);\r
-                                       _this.max = _this.max === null ? maxVal : Math.max(_this.max, maxVal);\r
+                                       me.min = me.min === null ? minVal : Math.min(me.min, minVal);\r
+                                       me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\r
                                });\r
 \r
                        } else {\r
@@ -8642,86 +8981,163 @@ module.exports = function(Chart) {
                                        var meta = chart.getDatasetMeta(datasetIndex);\r
                                        if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\r
                                                helpers.each(dataset.data, function(rawValue, index) {\r
-                                                       var value = +_this.getRightValue(rawValue);\r
+                                                       var value = +me.getRightValue(rawValue);\r
                                                        if (isNaN(value) || meta.data[index].hidden) {\r
                                                                return;\r
                                                        }\r
 \r
-                                                       if (_this.min === null) {\r
-                                                               _this.min = value;\r
-                                                       } else if (value < _this.min) {\r
-                                                               _this.min = value;\r
+                                                       if (me.min === null) {\r
+                                                               me.min = value;\r
+                                                       } else if (value < me.min) {\r
+                                                               me.min = value;\r
                                                        }\r
 \r
-                                                       if (_this.max === null) {\r
-                                                               _this.max = value;\r
-                                                       } else if (value > _this.max) {\r
-                                                               _this.max = value;\r
+                                                       if (me.max === null) {\r
+                                                               me.max = value;\r
+                                                       } else if (value > me.max) {\r
+                                                               me.max = value;\r
                                                        }\r
                                                });\r
                                        }\r
                                });\r
                        }\r
 \r
+                       // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\r
+                       this.handleTickRangeOptions();\r
+               },\r
+               getTickLimit: function() {\r
+                       var maxTicks;\r
+                       var me = this;\r
+                       var tickOpts = me.options.ticks;\r
+\r
+                       if (me.isHorizontal()) {\r
+                               maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));\r
+                       } else {\r
+                               // The factor of 2 used to scale the font size has been experimentally determined.\r
+                               var tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, Chart.defaults.global.defaultFontSize);\r
+                               maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));\r
+                       }\r
+\r
+                       return maxTicks;\r
+               },\r
+               // Called after the ticks are built. We need \r
+               handleDirectionalChanges: function() {\r
+                       if (!this.isHorizontal()) {\r
+                               // We are in a vertical orientation. The top value is the highest. So reverse the array\r
+                               this.ticks.reverse();\r
+                       }\r
+               },\r
+               getLabelForIndex: function(index, datasetIndex) {\r
+                       return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\r
+               },\r
+               // Utils\r
+               getPixelForValue: function(value, index, datasetIndex, includeOffset) {\r
+                       // This must be called after fit has been run so that\r
+                       //      this.left, this.top, this.right, and this.bottom have been defined\r
+                       var me = this;\r
+                       var paddingLeft = me.paddingLeft;\r
+                       var paddingBottom = me.paddingBottom;\r
+                       var start = me.start;\r
+\r
+                       var rightValue = +me.getRightValue(value);\r
+                       var pixel;\r
+                       var innerDimension;\r
+                       var range = me.end - start;\r
+\r
+                       if (me.isHorizontal()) {\r
+                               innerDimension = me.width - (paddingLeft + me.paddingRight);\r
+                               pixel = me.left + (innerDimension / range * (rightValue - start));\r
+                               return Math.round(pixel + paddingLeft);\r
+                       } else {\r
+                               innerDimension = me.height - (me.paddingTop + paddingBottom);\r
+                               pixel = (me.bottom - paddingBottom) - (innerDimension / range * (rightValue - start));\r
+                               return Math.round(pixel);\r
+                       }\r
+               },\r
+               getValueForPixel: function(pixel) {\r
+                       var me = this;\r
+                       var isHorizontal = me.isHorizontal();\r
+                       var paddingLeft = me.paddingLeft;\r
+                       var paddingBottom = me.paddingBottom;\r
+                       var innerDimension = isHorizontal ? me.width - (paddingLeft + me.paddingRight) : me.height - (me.paddingTop + paddingBottom);\r
+                       var offset = (isHorizontal ? pixel - me.left - paddingLeft : me.bottom - paddingBottom - pixel) / innerDimension;\r
+                       return me.start + ((me.end - me.start) * offset);\r
+               },\r
+               getPixelForTick: function(index, includeOffset) {\r
+                       return this.getPixelForValue(this.ticksAsNumbers[index], null, null, includeOffset);\r
+               }\r
+       });\r
+       Chart.scaleService.registerScaleType("linear", LinearScale, defaultConfig);\r
+\r
+};
+},{}],40:[function(require,module,exports){
+"use strict";\r
+\r
+module.exports = function(Chart) {\r
+\r
+       var helpers = Chart.helpers,\r
+               noop = helpers.noop;\r
+\r
+       Chart.LinearScaleBase = Chart.Scale.extend({\r
+               handleTickRangeOptions: function() {\r
+                       var me = this;\r
+                       var opts = me.options;\r
+                       var tickOpts = opts.ticks;\r
+\r
                        // If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\r
                        // do nothing since that would make the chart weird. If the user really wants a weird chart\r
                        // axis, they can manually override it\r
                        if (tickOpts.beginAtZero) {\r
-                               var minSign = helpers.sign(_this.min);\r
-                               var maxSign = helpers.sign(_this.max);\r
+                               var minSign = helpers.sign(me.min);\r
+                               var maxSign = helpers.sign(me.max);\r
 \r
                                if (minSign < 0 && maxSign < 0) {\r
                                        // move the top up to 0\r
-                                       _this.max = 0;\r
+                                       me.max = 0;\r
                                } else if (minSign > 0 && maxSign > 0) {\r
                                        // move the botttom down to 0\r
-                                       _this.min = 0;\r
+                                       me.min = 0;\r
                                }\r
                        }\r
 \r
                        if (tickOpts.min !== undefined) {\r
-                               _this.min = tickOpts.min;\r
+                               me.min = tickOpts.min;\r
                        } else if (tickOpts.suggestedMin !== undefined) {\r
-                               _this.min = Math.min(_this.min, tickOpts.suggestedMin);\r
+                               me.min = Math.min(me.min, tickOpts.suggestedMin);\r
                        }\r
 \r
                        if (tickOpts.max !== undefined) {\r
-                               _this.max = tickOpts.max;\r
+                               me.max = tickOpts.max;\r
                        } else if (tickOpts.suggestedMax !== undefined) {\r
-                               _this.max = Math.max(_this.max, tickOpts.suggestedMax);\r
+                               me.max = Math.max(me.max, tickOpts.suggestedMax);\r
                        }\r
 \r
-                       if (_this.min === _this.max) {\r
-                               _this.max++;\r
+                       if (me.min === me.max) {\r
+                               me.max++;\r
 \r
                                if (!tickOpts.beginAtZero) {\r
-                                       _this.min--;\r
+                                       me.min--;\r
                                }\r
                        }\r
                },\r
+               getTickLimit: noop,\r
+               handleDirectionalChanges: noop,\r
+\r
                buildTicks: function() {\r
-                       var _this = this;\r
-                       var opts = _this.options;\r
+                       var me = this;\r
+                       var opts = me.options;\r
                        var tickOpts = opts.ticks;\r
                        var getValueOrDefault = helpers.getValueOrDefault;\r
-                       var isHorizontal = _this.isHorizontal();\r
+                       var isHorizontal = me.isHorizontal();\r
 \r
-                       var ticks = _this.ticks = [];\r
+                       var ticks = me.ticks = [];\r
 \r
                        // Figure out what the max number of ticks we can support it is based on the size of\r
                        // the axis area. For now, we say that the minimum tick spacing in pixels must be 50\r
                        // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\r
                        // the graph\r
 \r
-                       var maxTicks;\r
-\r
-                       if (isHorizontal) {\r
-                               maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(_this.width / 50));\r
-                       } else {\r
-                               // The factor of 2 used to scale the font size has been experimentally determined.\r
-                               var tickFontSize = getValueOrDefault(tickOpts.fontSize, Chart.defaults.global.defaultFontSize);\r
-                               maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(_this.height / (2 * tickFontSize)));\r
-                       }\r
+                       var maxTicks = me.getTickLimit();\r
 \r
                        // Make sure we always have at least 2 ticks\r
                        maxTicks = Math.max(2, maxTicks);\r
@@ -8735,11 +9151,11 @@ module.exports = function(Chart) {
                        if (fixedStepSizeSet) {\r
                                spacing = getValueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize);\r
                        } else {\r
-                               var niceRange = helpers.niceNum(_this.max - _this.min, false);\r
+                               var niceRange = helpers.niceNum(me.max - me.min, false);\r
                                spacing = helpers.niceNum(niceRange / (maxTicks - 1), true);\r
                        }\r
-                       var niceMin = Math.floor(_this.min / spacing) * spacing;\r
-                       var niceMax = Math.ceil(_this.max / spacing) * spacing;\r
+                       var niceMin = Math.floor(me.min / spacing) * spacing;\r
+                       var niceMax = Math.ceil(me.max / spacing) * spacing;\r
                        var numSpaces = (niceMax - niceMin) / spacing;\r
 \r
                        // If very close to our rounded value, use it.\r
@@ -8756,77 +9172,33 @@ module.exports = function(Chart) {
                        }\r
                        ticks.push(tickOpts.max !== undefined ? tickOpts.max : niceMax);\r
 \r
-                       if (!isHorizontal) {\r
-                               // We are in a vertical orientation. The top value is the highest. So reverse the array\r
-                               ticks.reverse();\r
-                       }\r
+                       me.handleDirectionalChanges();\r
 \r
                        // At this point, we need to update our max and min given the tick values since we have expanded the\r
                        // range of the scale\r
-                       _this.max = helpers.max(ticks);\r
-                       _this.min = helpers.min(ticks);\r
+                       me.max = helpers.max(ticks);\r
+                       me.min = helpers.min(ticks);\r
 \r
                        if (tickOpts.reverse) {\r
                                ticks.reverse();\r
 \r
-                               _this.start = _this.max;\r
-                               _this.end = _this.min;\r
+                               me.start = me.max;\r
+                               me.end = me.min;\r
                        } else {\r
-                               _this.start = _this.min;\r
-                               _this.end = _this.max;\r
+                               me.start = me.min;\r
+                               me.end = me.max;\r
                        }\r
                },\r
-               getLabelForIndex: function(index, datasetIndex) {\r
-                       return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\r
-               },\r
                convertTicksToLabels: function() {\r
-                       var _this = this;\r
-                       _this.ticksAsNumbers = _this.ticks.slice();\r
-                       _this.zeroLineIndex = _this.ticks.indexOf(0);\r
-\r
-                       Chart.Scale.prototype.convertTicksToLabels.call(_this);\r
-               },\r
-               // Utils\r
-               getPixelForValue: function(value, index, datasetIndex, includeOffset) {\r
-                       // This must be called after fit has been run so that\r
-                       //      this.left, this.top, this.right, and this.bottom have been defined\r
-                       var _this = this;\r
-                       var paddingLeft = _this.paddingLeft;\r
-                       var paddingBottom = _this.paddingBottom;\r
-                       var start = _this.start;\r
-\r
-                       var rightValue = +_this.getRightValue(value);\r
-                       var pixel;\r
-                       var innerDimension;\r
-                       var range = _this.end - start;\r
+                       var me = this;\r
+                       me.ticksAsNumbers = me.ticks.slice();\r
+                       me.zeroLineIndex = me.ticks.indexOf(0);\r
 \r
-                       if (_this.isHorizontal()) {\r
-                               innerDimension = _this.width - (paddingLeft + _this.paddingRight);\r
-                               pixel = _this.left + (innerDimension / range * (rightValue - start));\r
-                               return Math.round(pixel + paddingLeft);\r
-                       } else {\r
-                               innerDimension = _this.height - (_this.paddingTop + paddingBottom);\r
-                               pixel = (_this.bottom - paddingBottom) - (innerDimension / range * (rightValue - start));\r
-                               return Math.round(pixel);\r
-                       }\r
-               },\r
-               getValueForPixel: function(pixel) {\r
-                       var _this = this;\r
-                       var isHorizontal = _this.isHorizontal();\r
-                       var paddingLeft = _this.paddingLeft;\r
-                       var paddingBottom = _this.paddingBottom;\r
-                       var innerDimension = isHorizontal ? _this.width - (paddingLeft + _this.paddingRight) : _this.height - (_this.paddingTop + paddingBottom);\r
-                       var offset = (isHorizontal ? pixel - _this.left - paddingLeft : _this.bottom - paddingBottom - pixel) / innerDimension;\r
-                       return _this.start + ((_this.end - _this.start) * offset);\r
+                       Chart.Scale.prototype.convertTicksToLabels.call(me);\r
                },\r
-               getPixelForTick: function(index, includeOffset) {\r
-                       return this.getPixelForValue(this.ticksAsNumbers[index], null, null, includeOffset);\r
-               }\r
        });\r
-       Chart.scaleService.registerScaleType("linear", LinearScale, defaultConfig);\r
-\r
 };
-},{}],40:[function(require,module,exports){
+},{}],41:[function(require,module,exports){
 "use strict";\r
 \r
 module.exports = function(Chart) {\r
@@ -8852,21 +9224,21 @@ module.exports = function(Chart) {
 \r
        var LogarithmicScale = Chart.Scale.extend({\r
                determineDataLimits: function() {\r
-                       var _this = this;\r
-                       var opts = _this.options;\r
+                       var me = this;\r
+                       var opts = me.options;\r
                        var tickOpts = opts.ticks;\r
-                       var chart = _this.chart;\r
+                       var chart = me.chart;\r
                        var data = chart.data;\r
                        var datasets = data.datasets;\r
                        var getValueOrDefault = helpers.getValueOrDefault;\r
-                       var isHorizontal = _this.isHorizontal();\r
+                       var isHorizontal = me.isHorizontal();\r
                        function IDMatches(meta) {\r
-                               return isHorizontal ? meta.xAxisID === _this.id : meta.yAxisID === _this.id;\r
+                               return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\r
                        }\r
 \r
                        // Calculate Range\r
-                       _this.min = null;\r
-                       _this.max = null;\r
+                       me.min = null;\r
+                       me.max = null;\r
 \r
                        if (opts.stacked) {\r
                                var valuesPerType = {};\r
@@ -8880,7 +9252,7 @@ module.exports = function(Chart) {
 \r
                                                helpers.each(dataset.data, function(rawValue, index) {\r
                                                        var values = valuesPerType[meta.type];\r
-                                                       var value = +_this.getRightValue(rawValue);\r
+                                                       var value = +me.getRightValue(rawValue);\r
                                                        if (isNaN(value) || meta.data[index].hidden) {\r
                                                                return;\r
                                                        }\r
@@ -8900,8 +9272,8 @@ module.exports = function(Chart) {
                                helpers.each(valuesPerType, function(valuesForType) {\r
                                        var minVal = helpers.min(valuesForType);\r
                                        var maxVal = helpers.max(valuesForType);\r
-                                       _this.min = _this.min === null ? minVal : Math.min(_this.min, minVal);\r
-                                       _this.max = _this.max === null ? maxVal : Math.max(_this.max, maxVal);\r
+                                       me.min = me.min === null ? minVal : Math.min(me.min, minVal);\r
+                                       me.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\r
                                });\r
 \r
                        } else {\r
@@ -8909,58 +9281,58 @@ module.exports = function(Chart) {
                                        var meta = chart.getDatasetMeta(datasetIndex);\r
                                        if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\r
                                                helpers.each(dataset.data, function(rawValue, index) {\r
-                                                       var value = +_this.getRightValue(rawValue);\r
+                                                       var value = +me.getRightValue(rawValue);\r
                                                        if (isNaN(value) || meta.data[index].hidden) {\r
                                                                return;\r
                                                        }\r
 \r
-                                                       if (_this.min === null) {\r
-                                                               _this.min = value;\r
-                                                       } else if (value < _this.min) {\r
-                                                               _this.min = value;\r
+                                                       if (me.min === null) {\r
+                                                               me.min = value;\r
+                                                       } else if (value < me.min) {\r
+                                                               me.min = value;\r
                                                        }\r
 \r
-                                                       if (_this.max === null) {\r
-                                                               _this.max = value;\r
-                                                       } else if (value > _this.max) {\r
-                                                               _this.max = value;\r
+                                                       if (me.max === null) {\r
+                                                               me.max = value;\r
+                                                       } else if (value > me.max) {\r
+                                                               me.max = value;\r
                                                        }\r
                                                });\r
                                        }\r
                                });\r
                        }\r
 \r
-                       _this.min = getValueOrDefault(tickOpts.min, _this.min);\r
-                       _this.max = getValueOrDefault(tickOpts.max, _this.max);\r
+                       me.min = getValueOrDefault(tickOpts.min, me.min);\r
+                       me.max = getValueOrDefault(tickOpts.max, me.max);\r
 \r
-                       if (_this.min === _this.max) {\r
-                               if (_this.min !== 0 && _this.min !== null) {\r
-                                       _this.min = Math.pow(10, Math.floor(helpers.log10(_this.min)) - 1);\r
-                                       _this.max = Math.pow(10, Math.floor(helpers.log10(_this.max)) + 1);\r
+                       if (me.min === me.max) {\r
+                               if (me.min !== 0 && me.min !== null) {\r
+                                       me.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1);\r
+                                       me.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1);\r
                                } else {\r
-                                       _this.min = 1;\r
-                                       _this.max = 10;\r
+                                       me.min = 1;\r
+                                       me.max = 10;\r
                                }\r
                        }\r
                },\r
                buildTicks: function() {\r
-                       var _this = this;\r
-                       var opts = _this.options;\r
+                       var me = this;\r
+                       var opts = me.options;\r
                        var tickOpts = opts.ticks;\r
                        var getValueOrDefault = helpers.getValueOrDefault;\r
 \r
                        // Reset the ticks array. Later on, we will draw a grid line at these positions\r
                        // The array simply contains the numerical value of the spots where ticks will be\r
-                       var ticks = _this.ticks = [];\r
+                       var ticks = me.ticks = [];\r
 \r
                        // Figure out what the max number of ticks we can support it is based on the size of\r
                        // the axis area. For now, we say that the minimum tick spacing in pixels must be 50\r
                        // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\r
                        // the graph\r
 \r
-                       var tickVal = getValueOrDefault(tickOpts.min, Math.pow(10, Math.floor(helpers.log10(_this.min))));\r
+                       var tickVal = getValueOrDefault(tickOpts.min, Math.pow(10, Math.floor(helpers.log10(me.min))));\r
 \r
-                       while (tickVal < _this.max) {\r
+                       while (tickVal < me.max) {\r
                                ticks.push(tickVal);\r
 \r
                                var exp = Math.floor(helpers.log10(tickVal));\r
@@ -8977,24 +9349,24 @@ module.exports = function(Chart) {
                        var lastTick = getValueOrDefault(tickOpts.max, tickVal);\r
                        ticks.push(lastTick);\r
 \r
-                       if (!_this.isHorizontal()) {\r
+                       if (!me.isHorizontal()) {\r
                                // We are in a vertical orientation. The top value is the highest. So reverse the array\r
                                ticks.reverse();\r
                        }\r
 \r
                        // At this point, we need to update our max and min given the tick values since we have expanded the\r
                        // range of the scale\r
-                       _this.max = helpers.max(ticks);\r
-                       _this.min = helpers.min(ticks);\r
+                       me.max = helpers.max(ticks);\r
+                       me.min = helpers.min(ticks);\r
 \r
                        if (tickOpts.reverse) {\r
                                ticks.reverse();\r
 \r
-                               _this.start = _this.max;\r
-                               _this.end = _this.min;\r
+                               me.start = me.max;\r
+                               me.end = me.min;\r
                        } else {\r
-                               _this.start = _this.min;\r
-                               _this.end = _this.max;\r
+                               me.start = me.min;\r
+                               me.end = me.max;\r
                        }\r
                },\r
                convertTicksToLabels: function() {\r
@@ -9010,51 +9382,51 @@ module.exports = function(Chart) {
                        return this.getPixelForValue(this.tickValues[index], null, null, includeOffset);\r
                },\r
                getPixelForValue: function(value, index, datasetIndex, includeOffset) {\r
-                       var _this = this;\r
+                       var me = this;\r
                        var innerDimension;\r
                        var pixel;\r
 \r
-                       var start = _this.start;\r
-                       var newVal = +_this.getRightValue(value);\r
-                       var range = helpers.log10(_this.end) - helpers.log10(start);\r
-                       var paddingTop = _this.paddingTop;\r
-                       var paddingBottom = _this.paddingBottom;\r
-                       var paddingLeft = _this.paddingLeft;\r
+                       var start = me.start;\r
+                       var newVal = +me.getRightValue(value);\r
+                       var range = helpers.log10(me.end) - helpers.log10(start);\r
+                       var paddingTop = me.paddingTop;\r
+                       var paddingBottom = me.paddingBottom;\r
+                       var paddingLeft = me.paddingLeft;\r
 \r
-                       if (_this.isHorizontal()) {\r
+                       if (me.isHorizontal()) {\r
 \r
                                if (newVal === 0) {\r
-                                       pixel = _this.left + paddingLeft;\r
+                                       pixel = me.left + paddingLeft;\r
                                } else {\r
-                                       innerDimension = _this.width - (paddingLeft + _this.paddingRight);\r
-                                       pixel = _this.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\r
+                                       innerDimension = me.width - (paddingLeft + me.paddingRight);\r
+                                       pixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\r
                                        pixel += paddingLeft;\r
                                }\r
                        } else {\r
                                // Bottom - top since pixels increase downard on a screen\r
                                if (newVal === 0) {\r
-                                       pixel = _this.top + paddingTop;\r
+                                       pixel = me.top + paddingTop;\r
                                } else {\r
-                                       innerDimension = _this.height - (paddingTop + paddingBottom);\r
-                                       pixel = (_this.bottom - paddingBottom) - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\r
+                                       innerDimension = me.height - (paddingTop + paddingBottom);\r
+                                       pixel = (me.bottom - paddingBottom) - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\r
                                }\r
                        }\r
 \r
                        return pixel;\r
                },\r
                getValueForPixel: function(pixel) {\r
-                       var _this = this;\r
+                       var me = this;\r
                        var offset;\r
-                       var range = helpers.log10(_this.end) - helpers.log10(_this.start);\r
+                       var range = helpers.log10(me.end) - helpers.log10(me.start);\r
                        var value;\r
                        var innerDimension;\r
 \r
-                       if (_this.isHorizontal()) {\r
-                               innerDimension = _this.width - (_this.paddingLeft + _this.paddingRight);\r
-                               value = _this.start * Math.pow(10, (pixel - _this.left - _this.paddingLeft) * range / innerDimension);\r
+                       if (me.isHorizontal()) {\r
+                               innerDimension = me.width - (me.paddingLeft + me.paddingRight);\r
+                               value = me.start * Math.pow(10, (pixel - me.left - me.paddingLeft) * range / innerDimension);\r
                        } else {\r
-                               innerDimension = _this.height - (_this.paddingTop + _this.paddingBottom);\r
-                               value = Math.pow(10, (_this.bottom - _this.paddingBottom - pixel) * range / innerDimension) / _this.start;\r
+                               innerDimension = me.height - (me.paddingTop + me.paddingBottom);\r
+                               value = Math.pow(10, (me.bottom - me.paddingBottom - pixel) * range / innerDimension) / me.start;\r
                        }\r
 \r
                        return value;\r
@@ -9063,7 +9435,7 @@ module.exports = function(Chart) {
        Chart.scaleService.registerScaleType("logarithmic", LogarithmicScale, defaultConfig);\r
 \r
 };
-},{}],41:[function(require,module,exports){
+},{}],42:[function(require,module,exports){
 "use strict";\r
 \r
 module.exports = function(Chart) {\r
@@ -9111,136 +9483,70 @@ module.exports = function(Chart) {
                }\r
        };\r
 \r
-       var LinearRadialScale = Chart.Scale.extend({\r
+       var LinearRadialScale = Chart.LinearScaleBase.extend({\r
                getValueCount: function() {\r
                        return this.chart.data.labels.length;\r
                },\r
                setDimensions: function() {\r
-                       var options = this.options;\r
+                       var me = this;\r
+                       var opts = me.options;\r
+                       var tickOpts = opts.ticks;\r
                        // Set the unconstrained dimension before label rotation\r
-                       this.width = this.maxWidth;\r
-                       this.height = this.maxHeight;\r
-                       this.xCenter = Math.round(this.width / 2);\r
-                       this.yCenter = Math.round(this.height / 2);\r
+                       me.width = me.maxWidth;\r
+                       me.height = me.maxHeight;\r
+                       me.xCenter = Math.round(me.width / 2);\r
+                       me.yCenter = Math.round(me.height / 2);\r
 \r
-                       var minSize = helpers.min([this.height, this.width]);\r
-                       var tickFontSize = helpers.getValueOrDefault(options.ticks.fontSize, globalDefaults.defaultFontSize);\r
-                       this.drawingArea = (options.display) ? (minSize / 2) - (tickFontSize / 2 + options.ticks.backdropPaddingY) : (minSize / 2);\r
+                       var minSize = helpers.min([me.height, me.width]);\r
+                       var tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\r
+                       me.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2);\r
                },\r
                determineDataLimits: function() {\r
-                       this.min = null;\r
-                       this.max = null;\r
+                       var me = this;\r
+                       var chart = me.chart;\r
+                       me.min = null;\r
+                       me.max = null;\r
+\r
+\r
+                       helpers.each(chart.data.datasets, function(dataset, datasetIndex) {\r
+                               if (chart.isDatasetVisible(datasetIndex)) {\r
+                                       var meta = chart.getDatasetMeta(datasetIndex);\r
 \r
-                       helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) {\r
-                               if (this.chart.isDatasetVisible(datasetIndex)) {\r
-                                       var meta = this.chart.getDatasetMeta(datasetIndex);\r
                                        helpers.each(dataset.data, function(rawValue, index) {\r
-                                               var value = +this.getRightValue(rawValue);\r
+                                               var value = +me.getRightValue(rawValue);\r
                                                if (isNaN(value) || meta.data[index].hidden) {\r
                                                        return;\r
                                                }\r
 \r
-                                               if (this.min === null) {\r
-                                                       this.min = value;\r
-                                               } else if (value < this.min) {\r
-                                                       this.min = value;\r
+                                               if (me.min === null) {\r
+                                                       me.min = value;\r
+                                               } else if (value < me.min) {\r
+                                                       me.min = value;\r
                                                }\r
 \r
-                                               if (this.max === null) {\r
-                                                       this.max = value;\r
-                                               } else if (value > this.max) {\r
-                                                       this.max = value;\r
+                                               if (me.max === null) {\r
+                                                       me.max = value;\r
+                                               } else if (value > me.max) {\r
+                                                       me.max = value;\r
                                                }\r
-                                       }, this);\r
-                               }\r
-                       }, this);\r
-\r
-                       // If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\r
-                       // do nothing since that would make the chart weird. If the user really wants a weird chart\r
-                       // axis, they can manually override it\r
-                       if (this.options.ticks.beginAtZero) {\r
-                               var minSign = helpers.sign(this.min);\r
-                               var maxSign = helpers.sign(this.max);\r
-\r
-                               if (minSign < 0 && maxSign < 0) {\r
-                                       // move the top up to 0\r
-                                       this.max = 0;\r
-                               } else if (minSign > 0 && maxSign > 0) {\r
-                                       // move the botttom down to 0\r
-                                       this.min = 0;\r
+                                       });\r
                                }\r
-                       }\r
-\r
-                       if (this.options.ticks.min !== undefined) {\r
-                               this.min = this.options.ticks.min;\r
-                       } else if (this.options.ticks.suggestedMin !== undefined) {\r
-                               this.min = Math.min(this.min, this.options.ticks.suggestedMin);\r
-                       }\r
-\r
-                       if (this.options.ticks.max !== undefined) {\r
-                               this.max = this.options.ticks.max;\r
-                       } else if (this.options.ticks.suggestedMax !== undefined) {\r
-                               this.max = Math.max(this.max, this.options.ticks.suggestedMax);\r
-                       }\r
+                       });\r
 \r
-                       if (this.min === this.max) {\r
-                               this.min--;\r
-                               this.max++;\r
-                       }\r
+                       // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\r
+                       me.handleTickRangeOptions();\r
                },\r
-               buildTicks: function() {\r
-\r
-\r
-                       this.ticks = [];\r
-\r
-                       // Figure out what the max number of ticks we can support it is based on the size of\r
-                       // the axis area. For now, we say that the minimum tick spacing in pixels must be 50\r
-                       // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\r
-                       // the graph\r
-                       var tickFontSize = helpers.getValueOrDefault(this.options.ticks.fontSize, globalDefaults.defaultFontSize);\r
-                       var maxTicks = Math.min(this.options.ticks.maxTicksLimit ? this.options.ticks.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\r
-                       maxTicks = Math.max(2, maxTicks); // Make sure we always have at least 2 ticks\r
-\r
-                       // To get a "nice" value for the tick spacing, we will use the appropriately named\r
-                       // "nice number" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\r
-                       // for details.\r
-\r
-                       var niceRange = helpers.niceNum(this.max - this.min, false);\r
-                       var spacing = helpers.niceNum(niceRange / (maxTicks - 1), true);\r
-                       var niceMin = Math.floor(this.min / spacing) * spacing;\r
-                       var niceMax = Math.ceil(this.max / spacing) * spacing;\r
-\r
-                       var numSpaces = Math.ceil((niceMax - niceMin) / spacing);\r
-\r
-                       // Put the values into the ticks array\r
-                       this.ticks.push(this.options.ticks.min !== undefined ? this.options.ticks.min : niceMin);\r
-                       for (var j = 1; j < numSpaces; ++j) {\r
-                               this.ticks.push(niceMin + (j * spacing));\r
-                       }\r
-                       this.ticks.push(this.options.ticks.max !== undefined ? this.options.ticks.max : niceMax);\r
-\r
-                       // At this point, we need to update our max and min given the tick values since we have expanded the\r
-                       // range of the scale\r
-                       this.max = helpers.max(this.ticks);\r
-                       this.min = helpers.min(this.ticks);\r
-\r
-                       if (this.options.ticks.reverse) {\r
-                               this.ticks.reverse();\r
-\r
-                               this.start = this.max;\r
-                               this.end = this.min;\r
-                       } else {\r
-                               this.start = this.min;\r
-                               this.end = this.max;\r
-                       }\r
-\r
-                       this.zeroLineIndex = this.ticks.indexOf(0);\r
+               getTickLimit: function() {\r
+                       var tickOpts = this.options.ticks;\r
+                       var tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\r
+                       return Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\r
                },\r
                convertTicksToLabels: function() {\r
-                       Chart.Scale.prototype.convertTicksToLabels.call(this);\r
+                       var me = this;\r
+                       Chart.LinearScaleBase.prototype.convertTicksToLabels.call(me);\r
 \r
                        // Point labels\r
-                       this.pointLabels = this.chart.data.labels.map(this.options.pointLabels.callback, this);\r
+                       me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\r
                },\r
                getLabelForIndex: function(index, datasetIndex) {\r
                        return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\r
@@ -9349,13 +9655,13 @@ module.exports = function(Chart) {
                        this.setCenterPoint(radiusReductionLeft, radiusReductionRight);\r
                },\r
                setCenterPoint: function(leftMovement, rightMovement) {\r
+                       var me = this;\r
+                       var maxRight = me.width - rightMovement - me.drawingArea,\r
+                               maxLeft = leftMovement + me.drawingArea;\r
 \r
-                       var maxRight = this.width - rightMovement - this.drawingArea,\r
-                               maxLeft = leftMovement + this.drawingArea;\r
-\r
-                       this.xCenter = Math.round(((maxLeft + maxRight) / 2) + this.left);\r
+                       me.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left);\r
                        // Always vertically in the centre as the text height doesn't change\r
-                       this.yCenter = Math.round((this.height / 2) + this.top);\r
+                       me.yCenter = Math.round((me.height / 2) + me.top);\r
                },\r
 \r
                getIndexAngle: function(index) {\r
@@ -9365,23 +9671,26 @@ module.exports = function(Chart) {
                        return index * angleMultiplier - (Math.PI / 2);\r
                },\r
                getDistanceFromCenterForValue: function(value) {\r
+                       var me = this;\r
+\r
                        if (value === null) {\r
                                return 0; // null always in center\r
                        }\r
 \r
                        // Take into account half font size + the yPadding of the top value\r
-                       var scalingFactor = this.drawingArea / (this.max - this.min);\r
-                       if (this.options.reverse) {\r
-                               return (this.max - value) * scalingFactor;\r
+                       var scalingFactor = me.drawingArea / (me.max - me.min);\r
+                       if (me.options.reverse) {\r
+                               return (me.max - value) * scalingFactor;\r
                        } else {\r
-                               return (value - this.min) * scalingFactor;\r
+                               return (value - me.min) * scalingFactor;\r
                        }\r
                },\r
                getPointPosition: function(index, distanceFromCenter) {\r
-                       var thisAngle = this.getIndexAngle(index);\r
+                       var me = this;\r
+                       var thisAngle = me.getIndexAngle(index);\r
                        return {\r
-                               x: Math.round(Math.cos(thisAngle) * distanceFromCenter) + this.xCenter,\r
-                               y: Math.round(Math.sin(thisAngle) * distanceFromCenter) + this.yCenter\r
+                               x: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter,\r
+                               y: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter\r
                        };\r
                },\r
                getPointPositionForValue: function(index, value) {\r
@@ -9401,30 +9710,45 @@ module.exports = function(Chart) {
                },\r
 \r
                draw: function() {\r
-                       if (this.options.display) {\r
-                               var ctx = this.ctx;\r
-                               helpers.each(this.ticks, function(label, index) {\r
+                       var me = this;\r
+                       var opts = me.options;\r
+                       var gridLineOpts = opts.gridLines;\r
+                       var tickOpts = opts.ticks;\r
+                       var angleLineOpts = opts.angleLines;\r
+                       var pointLabelOpts = opts.pointLabels;\r
+                       var getValueOrDefault = helpers.getValueOrDefault;\r
+\r
+                       if (opts.display) {\r
+                               var ctx = me.ctx;\r
+\r
+                               // Tick Font\r
+                               var tickFontSize = getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\r
+                               var tickFontStyle = getValueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\r
+                               var tickFontFamily = getValueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily);\r
+                               var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\r
+\r
+                               helpers.each(me.ticks, function(label, index) {\r
                                        // Don't draw a centre value (if it is minimum)\r
-                                       if (index > 0 || this.options.reverse) {\r
-                                               var yCenterOffset = this.getDistanceFromCenterForValue(this.ticks[index]);\r
-                                               var yHeight = this.yCenter - yCenterOffset;\r
+                                       if (index > 0 || opts.reverse) {\r
+                                               var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\r
+                                               var yHeight = me.yCenter - yCenterOffset;\r
 \r
                                                // Draw circular lines around the scale\r
-                                               if (this.options.gridLines.display) {\r
-                                                       ctx.strokeStyle = this.options.gridLines.color;\r
-                                                       ctx.lineWidth = this.options.gridLines.lineWidth;\r
+                                               if (gridLineOpts.display && index !== 0) {\r
+                                                       ctx.strokeStyle = helpers.getValueAtIndexOrDefault(gridLineOpts.color, index - 1);\r
+                                                       ctx.lineWidth = helpers.getValueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1);\r
 \r
-                                                       if (this.options.lineArc) {\r
+                                                       if (opts.lineArc) {\r
                                                                // Draw circular arcs between the points\r
                                                                ctx.beginPath();\r
-                                                               ctx.arc(this.xCenter, this.yCenter, yCenterOffset, 0, Math.PI * 2);\r
+                                                               ctx.arc(me.xCenter, me.yCenter, yCenterOffset, 0, Math.PI * 2);\r
                                                                ctx.closePath();\r
                                                                ctx.stroke();\r
                                                        } else {\r
                                                                // Draw straight lines connecting each index\r
                                                                ctx.beginPath();\r
-                                                               for (var i = 0; i < this.getValueCount(); i++) {\r
-                                                                       var pointPosition = this.getPointPosition(i, this.getDistanceFromCenterForValue(this.ticks[index]));\r
+                                                               for (var i = 0; i < me.getValueCount(); i++) {\r
+                                                                       var pointPosition = me.getPointPosition(i, yCenterOffset);\r
                                                                        if (i === 0) {\r
                                                                                ctx.moveTo(pointPosition.x, pointPosition.y);\r
                                                                        } else {\r
@@ -9436,60 +9760,61 @@ module.exports = function(Chart) {
                                                        }\r
                                                }\r
 \r
-                                               if (this.options.ticks.display) {\r
-                                                       var tickFontColor = helpers.getValueOrDefault(this.options.ticks.fontColor, globalDefaults.defaultFontColor);\r
-                                                       var tickFontSize = helpers.getValueOrDefault(this.options.ticks.fontSize, globalDefaults.defaultFontSize);\r
-                                                       var tickFontStyle = helpers.getValueOrDefault(this.options.ticks.fontStyle, globalDefaults.defaultFontStyle);\r
-                                                       var tickFontFamily = helpers.getValueOrDefault(this.options.ticks.fontFamily, globalDefaults.defaultFontFamily);\r
-                                                       var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\r
+                                               if (tickOpts.display) {\r
+                                                       var tickFontColor = getValueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor);\r
                                                        ctx.font = tickLabelFont;\r
 \r
-                                                       if (this.options.ticks.showLabelBackdrop) {\r
+                                                       if (tickOpts.showLabelBackdrop) {\r
                                                                var labelWidth = ctx.measureText(label).width;\r
-                                                               ctx.fillStyle = this.options.ticks.backdropColor;\r
+                                                               ctx.fillStyle = tickOpts.backdropColor;\r
                                                                ctx.fillRect(\r
-                                                                       this.xCenter - labelWidth / 2 - this.options.ticks.backdropPaddingX,\r
-                                                                       yHeight - tickFontSize / 2 - this.options.ticks.backdropPaddingY,\r
-                                                                       labelWidth + this.options.ticks.backdropPaddingX * 2,\r
-                                                                       tickFontSize + this.options.ticks.backdropPaddingY * 2\r
+                                                                       me.xCenter - labelWidth / 2 - tickOpts.backdropPaddingX,\r
+                                                                       yHeight - tickFontSize / 2 - tickOpts.backdropPaddingY,\r
+                                                                       labelWidth + tickOpts.backdropPaddingX * 2,\r
+                                                                       tickFontSize + tickOpts.backdropPaddingY * 2\r
                                                                );\r
                                                        }\r
 \r
                                                        ctx.textAlign = 'center';\r
                                                        ctx.textBaseline = "middle";\r
                                                        ctx.fillStyle = tickFontColor;\r
-                                                       ctx.fillText(label, this.xCenter, yHeight);\r
+                                                       ctx.fillText(label, me.xCenter, yHeight);\r
                                                }\r
                                        }\r
-                               }, this);\r
+                               });\r
+\r
+                               if (!opts.lineArc) {\r
+                                       ctx.lineWidth = angleLineOpts.lineWidth;\r
+                                       ctx.strokeStyle = angleLineOpts.color;\r
 \r
-                               if (!this.options.lineArc) {\r
-                                       ctx.lineWidth = this.options.angleLines.lineWidth;\r
-                                       ctx.strokeStyle = this.options.angleLines.color;\r
+                                       var outerDistance = me.getDistanceFromCenterForValue(opts.reverse ? me.min : me.max);\r
 \r
-                                       for (var i = this.getValueCount() - 1; i >= 0; i--) {\r
-                                               if (this.options.angleLines.display) {\r
-                                                       var outerPosition = this.getPointPosition(i, this.getDistanceFromCenterForValue(this.options.reverse ? this.min : this.max));\r
+                                       // Point Label Font\r
+                                       var pointLabelFontSize = getValueOrDefault(pointLabelOpts.fontSize, globalDefaults.defaultFontSize);\r
+                                       var pointLabeFontStyle = getValueOrDefault(pointLabelOpts.fontStyle, globalDefaults.defaultFontStyle);\r
+                                       var pointLabeFontFamily = getValueOrDefault(pointLabelOpts.fontFamily, globalDefaults.defaultFontFamily);\r
+                                       var pointLabeFont = helpers.fontString(pointLabelFontSize, pointLabeFontStyle, pointLabeFontFamily);\r
+\r
+                                       for (var i = me.getValueCount() - 1; i >= 0; i--) {\r
+                                               if (angleLineOpts.display) {\r
+                                                       var outerPosition = me.getPointPosition(i, outerDistance);\r
                                                        ctx.beginPath();\r
-                                                       ctx.moveTo(this.xCenter, this.yCenter);\r
+                                                       ctx.moveTo(me.xCenter, me.yCenter);\r
                                                        ctx.lineTo(outerPosition.x, outerPosition.y);\r
                                                        ctx.stroke();\r
                                                        ctx.closePath();\r
                                                }\r
                                                // Extra 3px out for some label spacing\r
-                                               var pointLabelPosition = this.getPointPosition(i, this.getDistanceFromCenterForValue(this.options.reverse ? this.min : this.max) + 5);\r
-\r
-                                               var pointLabelFontColor = helpers.getValueOrDefault(this.options.pointLabels.fontColor, globalDefaults.defaultFontColor);\r
-                                               var pointLabelFontSize = helpers.getValueOrDefault(this.options.pointLabels.fontSize, globalDefaults.defaultFontSize);\r
-                                               var pointLabeFontStyle = helpers.getValueOrDefault(this.options.pointLabels.fontStyle, globalDefaults.defaultFontStyle);\r
-                                               var pointLabeFontFamily = helpers.getValueOrDefault(this.options.pointLabels.fontFamily, globalDefaults.defaultFontFamily);\r
-                                               var pointLabeFont = helpers.fontString(pointLabelFontSize, pointLabeFontStyle, pointLabeFontFamily);\r
+                                               var pointLabelPosition = me.getPointPosition(i, outerDistance + 5);\r
 \r
+                                               // Keep this in loop since we may support array properties here\r
+                                               var pointLabelFontColor = getValueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor);\r
                                                ctx.font = pointLabeFont;\r
                                                ctx.fillStyle = pointLabelFontColor;\r
 \r
-                                               var labelsCount = this.pointLabels.length,\r
-                                                       halfLabelsCount = this.pointLabels.length / 2,\r
+                                               var pointLabels = me.pointLabels,\r
+                                                       labelsCount = pointLabels.length,\r
+                                                       halfLabelsCount = pointLabels.length / 2,\r
                                                        quarterLabelsCount = halfLabelsCount / 2,\r
                                                        upperHalf = (i < quarterLabelsCount || i > labelsCount - quarterLabelsCount),\r
                                                        exactQuarter = (i === quarterLabelsCount || i === labelsCount - quarterLabelsCount);\r
@@ -9512,7 +9837,7 @@ module.exports = function(Chart) {
                                                        ctx.textBaseline = 'top';\r
                                                }\r
 \r
-                                               ctx.fillText(this.pointLabels[i] ? this.pointLabels[i] : '', pointLabelPosition.x, pointLabelPosition.y);\r
+                                               ctx.fillText(pointLabels[i] ? pointLabels[i] : '', pointLabelPosition.x, pointLabelPosition.y);\r
                                        }\r
                                }\r
                        }\r
@@ -9520,12 +9845,13 @@ module.exports = function(Chart) {
        });\r
        Chart.scaleService.registerScaleType("radialLinear", LinearRadialScale, defaultConfig);\r
 \r
-};
-},{}],42:[function(require,module,exports){
+};\r
+
+},{}],43:[function(require,module,exports){
 /*global window: false */\r
 "use strict";\r
 \r
-var moment = require('moment');\r
+var moment = require(1);\r
 moment = typeof(moment) === 'function' ? moment : window.moment;\r
 \r
 module.exports = function(Chart) {\r
@@ -9603,114 +9929,117 @@ module.exports = function(Chart) {
                        return this.labelMoments[datasetIndex][index];\r
                },\r
                getMomentStartOf: function(tick) {\r
-                       if (this.options.time.unit === 'week' && this.options.time.isoWeekday !== false) {\r
-                               return tick.clone().startOf('isoWeek').isoWeekday(this.options.time.isoWeekday);\r
+                       var me = this;\r
+                       if (me.options.time.unit === 'week' && me.options.time.isoWeekday !== false) {\r
+                               return tick.clone().startOf('isoWeek').isoWeekday(me.options.time.isoWeekday);\r
                        } else {\r
-                               return tick.clone().startOf(this.tickUnit);\r
+                               return tick.clone().startOf(me.tickUnit);\r
                        }\r
                },\r
                determineDataLimits: function() {\r
-                       this.labelMoments = [];\r
+                       var me = this;\r
+                       me.labelMoments = [];\r
 \r
                        // Only parse these once. If the dataset does not have data as x,y pairs, we will use\r
                        // these\r
                        var scaleLabelMoments = [];\r
-                       if (this.chart.data.labels && this.chart.data.labels.length > 0) {\r
-                               helpers.each(this.chart.data.labels, function(label, index) {\r
-                                       var labelMoment = this.parseTime(label);\r
+                       if (me.chart.data.labels && me.chart.data.labels.length > 0) {\r
+                               helpers.each(me.chart.data.labels, function(label, index) {\r
+                                       var labelMoment = me.parseTime(label);\r
 \r
                                        if (labelMoment.isValid()) {\r
-                                               if (this.options.time.round) {\r
-                                                       labelMoment.startOf(this.options.time.round);\r
+                                               if (me.options.time.round) {\r
+                                                       labelMoment.startOf(me.options.time.round);\r
                                                }\r
                                                scaleLabelMoments.push(labelMoment);\r
                                        }\r
-                               }, this);\r
+                               }, me);\r
 \r
-                               this.firstTick = moment.min.call(this, scaleLabelMoments);\r
-                               this.lastTick = moment.max.call(this, scaleLabelMoments);\r
+                               me.firstTick = moment.min.call(me, scaleLabelMoments);\r
+                               me.lastTick = moment.max.call(me, scaleLabelMoments);\r
                        } else {\r
-                               this.firstTick = null;\r
-                               this.lastTick = null;\r
+                               me.firstTick = null;\r
+                               me.lastTick = null;\r
                        }\r
 \r
-                       helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) {\r
+                       helpers.each(me.chart.data.datasets, function(dataset, datasetIndex) {\r
                                var momentsForDataset = [];\r
-                               var datasetVisible = this.chart.isDatasetVisible(datasetIndex);\r
+                               var datasetVisible = me.chart.isDatasetVisible(datasetIndex);\r
 \r
                                if (typeof dataset.data[0] === 'object' && dataset.data[0] !== null) {\r
                                        helpers.each(dataset.data, function(value, index) {\r
-                                               var labelMoment = this.parseTime(this.getRightValue(value));\r
+                                               var labelMoment = me.parseTime(me.getRightValue(value));\r
 \r
                                                if (labelMoment.isValid()) {\r
-                                                       if (this.options.time.round) {\r
-                                                               labelMoment.startOf(this.options.time.round);\r
+                                                       if (me.options.time.round) {\r
+                                                               labelMoment.startOf(me.options.time.round);\r
                                                        }\r
                                                        momentsForDataset.push(labelMoment);\r
 \r
                                                        if (datasetVisible) {\r
                                                                // May have gone outside the scale ranges, make sure we keep the first and last ticks updated\r
-                                                               this.firstTick = this.firstTick !== null ? moment.min(this.firstTick, labelMoment) : labelMoment;\r
-                                                               this.lastTick = this.lastTick !== null ? moment.max(this.lastTick, labelMoment) : labelMoment;\r
+                                                               me.firstTick = me.firstTick !== null ? moment.min(me.firstTick, labelMoment) : labelMoment;\r
+                                                               me.lastTick = me.lastTick !== null ? moment.max(me.lastTick, labelMoment) : labelMoment;\r
                                                        }\r
                                                }\r
-                                       }, this);\r
+                                       }, me);\r
                                } else {\r
                                        // We have no labels. Use the ones from the scale\r
                                        momentsForDataset = scaleLabelMoments;\r
                                }\r
 \r
-                               this.labelMoments.push(momentsForDataset);\r
-                       }, this);\r
+                               me.labelMoments.push(momentsForDataset);\r
+                       }, me);\r
 \r
                        // Set these after we've done all the data\r
-                       if (this.options.time.min) {\r
-                               this.firstTick = this.parseTime(this.options.time.min);\r
+                       if (me.options.time.min) {\r
+                               me.firstTick = me.parseTime(me.options.time.min);\r
                        }\r
 \r
-                       if (this.options.time.max) {\r
-                               this.lastTick = this.parseTime(this.options.time.max);\r
+                       if (me.options.time.max) {\r
+                               me.lastTick = me.parseTime(me.options.time.max);\r
                        }\r
 \r
                        // We will modify these, so clone for later\r
-                       this.firstTick = (this.firstTick || moment()).clone();\r
-                       this.lastTick = (this.lastTick || moment()).clone();\r
+                       me.firstTick = (me.firstTick || moment()).clone();\r
+                       me.lastTick = (me.lastTick || moment()).clone();\r
                },\r
                buildTicks: function(index) {\r
+                       var me = this;\r
 \r
-                       this.ctx.save();\r
-                       var tickFontSize = helpers.getValueOrDefault(this.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);\r
-                       var tickFontStyle = helpers.getValueOrDefault(this.options.ticks.fontStyle, Chart.defaults.global.defaultFontStyle);\r
-                       var tickFontFamily = helpers.getValueOrDefault(this.options.ticks.fontFamily, Chart.defaults.global.defaultFontFamily);\r
+                       me.ctx.save();\r
+                       var tickFontSize = helpers.getValueOrDefault(me.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);\r
+                       var tickFontStyle = helpers.getValueOrDefault(me.options.ticks.fontStyle, Chart.defaults.global.defaultFontStyle);\r
+                       var tickFontFamily = helpers.getValueOrDefault(me.options.ticks.fontFamily, Chart.defaults.global.defaultFontFamily);\r
                        var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\r
-                       this.ctx.font = tickLabelFont;\r
+                       me.ctx.font = tickLabelFont;\r
 \r
-                       this.ticks = [];\r
-                       this.unitScale = 1; // How much we scale the unit by, ie 2 means 2x unit per step\r
-                       this.scaleSizeInUnits = 0; // How large the scale is in the base unit (seconds, minutes, etc)\r
+                       me.ticks = [];\r
+                       me.unitScale = 1; // How much we scale the unit by, ie 2 means 2x unit per step\r
+                       me.scaleSizeInUnits = 0; // How large the scale is in the base unit (seconds, minutes, etc)\r
 \r
                        // Set unit override if applicable\r
-                       if (this.options.time.unit) {\r
-                               this.tickUnit = this.options.time.unit || 'day';\r
-                               this.displayFormat = this.options.time.displayFormats[this.tickUnit];\r
-                               this.scaleSizeInUnits = this.lastTick.diff(this.firstTick, this.tickUnit, true);\r
-                               this.unitScale = helpers.getValueOrDefault(this.options.time.unitStepSize, 1);\r
+                       if (me.options.time.unit) {\r
+                               me.tickUnit = me.options.time.unit || 'day';\r
+                               me.displayFormat = me.options.time.displayFormats[me.tickUnit];\r
+                               me.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);\r
+                               me.unitScale = helpers.getValueOrDefault(me.options.time.unitStepSize, 1);\r
                        } else {\r
                                // Determine the smallest needed unit of the time\r
-                               var innerWidth = this.isHorizontal() ? this.width - (this.paddingLeft + this.paddingRight) : this.height - (this.paddingTop + this.paddingBottom);\r
+                               var innerWidth = me.isHorizontal() ? me.width - (me.paddingLeft + me.paddingRight) : me.height - (me.paddingTop + me.paddingBottom);\r
 \r
                                // Crude approximation of what the label length might be\r
-                               var tempFirstLabel = this.tickFormatFunction(this.firstTick, 0, []);\r
-                               var tickLabelWidth = this.ctx.measureText(tempFirstLabel).width;\r
-                               var cosRotation = Math.cos(helpers.toRadians(this.options.ticks.maxRotation));\r
-                               var sinRotation = Math.sin(helpers.toRadians(this.options.ticks.maxRotation));\r
+                               var tempFirstLabel = me.tickFormatFunction(me.firstTick, 0, []);\r
+                               var tickLabelWidth = me.ctx.measureText(tempFirstLabel).width;\r
+                               var cosRotation = Math.cos(helpers.toRadians(me.options.ticks.maxRotation));\r
+                               var sinRotation = Math.sin(helpers.toRadians(me.options.ticks.maxRotation));\r
                                tickLabelWidth = (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);\r
                                var labelCapacity = innerWidth / (tickLabelWidth);\r
 \r
                                // Start as small as possible\r
-                               this.tickUnit = 'millisecond';\r
-                               this.scaleSizeInUnits = this.lastTick.diff(this.firstTick, this.tickUnit, true);\r
-                               this.displayFormat = this.options.time.displayFormats[this.tickUnit];\r
+                               me.tickUnit = 'millisecond';\r
+                               me.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);\r
+                               me.displayFormat = me.options.time.displayFormats[me.tickUnit];\r
 \r
                                var unitDefinitionIndex = 0;\r
                                var unitDefinition = time.units[unitDefinitionIndex];\r
@@ -9718,32 +10047,32 @@ module.exports = function(Chart) {
                                // While we aren't ideal and we don't have units left\r
                                while (unitDefinitionIndex < time.units.length) {\r
                                        // Can we scale this unit. If `false` we can scale infinitely\r
-                                       this.unitScale = 1;\r
+                                       me.unitScale = 1;\r
 \r
-                                       if (helpers.isArray(unitDefinition.steps) && Math.ceil(this.scaleSizeInUnits / labelCapacity) < helpers.max(unitDefinition.steps)) {\r
+                                       if (helpers.isArray(unitDefinition.steps) && Math.ceil(me.scaleSizeInUnits / labelCapacity) < helpers.max(unitDefinition.steps)) {\r
                                                // Use one of the prefedined steps\r
                                                for (var idx = 0; idx < unitDefinition.steps.length; ++idx) {\r
-                                                       if (unitDefinition.steps[idx] >= Math.ceil(this.scaleSizeInUnits / labelCapacity)) {\r
-                                                               this.unitScale = helpers.getValueOrDefault(this.options.time.unitStepSize, unitDefinition.steps[idx]);\r
+                                                       if (unitDefinition.steps[idx] >= Math.ceil(me.scaleSizeInUnits / labelCapacity)) {\r
+                                                               me.unitScale = helpers.getValueOrDefault(me.options.time.unitStepSize, unitDefinition.steps[idx]);\r
                                                                break;\r
                                                        }\r
                                                }\r
 \r
                                                break;\r
-                                       } else if ((unitDefinition.maxStep === false) || (Math.ceil(this.scaleSizeInUnits / labelCapacity) < unitDefinition.maxStep)) {\r
+                                       } else if ((unitDefinition.maxStep === false) || (Math.ceil(me.scaleSizeInUnits / labelCapacity) < unitDefinition.maxStep)) {\r
                                                // We have a max step. Scale this unit\r
-                                               this.unitScale = helpers.getValueOrDefault(this.options.time.unitStepSize, Math.ceil(this.scaleSizeInUnits / labelCapacity));\r
+                                               me.unitScale = helpers.getValueOrDefault(me.options.time.unitStepSize, Math.ceil(me.scaleSizeInUnits / labelCapacity));\r
                                                break;\r
                                        } else {\r
                                                // Move to the next unit up\r
                                                ++unitDefinitionIndex;\r
                                                unitDefinition = time.units[unitDefinitionIndex];\r
 \r
-                                               this.tickUnit = unitDefinition.name;\r
-                                               var leadingUnitBuffer = this.firstTick.diff(this.getMomentStartOf(this.firstTick), this.tickUnit, true);\r
-                                               var trailingUnitBuffer = this.getMomentStartOf(this.lastTick.clone().add(1, this.tickUnit)).diff(this.lastTick, this.tickUnit, true);\r
-                                               this.scaleSizeInUnits = this.lastTick.diff(this.firstTick, this.tickUnit, true) + leadingUnitBuffer + trailingUnitBuffer;\r
-                                               this.displayFormat = this.options.time.displayFormats[unitDefinition.name];\r
+                                               me.tickUnit = unitDefinition.name;\r
+                                               var leadingUnitBuffer = me.firstTick.diff(me.getMomentStartOf(me.firstTick), me.tickUnit, true);\r
+                                               var trailingUnitBuffer = me.getMomentStartOf(me.lastTick.clone().add(1, me.tickUnit)).diff(me.lastTick, me.tickUnit, true);\r
+                                               me.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true) + leadingUnitBuffer + trailingUnitBuffer;\r
+                                               me.displayFormat = me.options.time.displayFormats[unitDefinition.name];\r
                                        }\r
                                }\r
                        }\r
@@ -9751,79 +10080,80 @@ module.exports = function(Chart) {
                        var roundedStart;\r
 \r
                        // Only round the first tick if we have no hard minimum\r
-                       if (!this.options.time.min) {\r
-                               this.firstTick = this.getMomentStartOf(this.firstTick);\r
-                               roundedStart = this.firstTick;\r
+                       if (!me.options.time.min) {\r
+                               me.firstTick = me.getMomentStartOf(me.firstTick);\r
+                               roundedStart = me.firstTick;\r
                        } else {\r
-                               roundedStart = this.getMomentStartOf(this.firstTick);\r
+                               roundedStart = me.getMomentStartOf(me.firstTick);\r
                        }\r
 \r
                        // Only round the last tick if we have no hard maximum\r
-                       if (!this.options.time.max) {\r
-                               var roundedEnd = this.getMomentStartOf(this.lastTick);\r
-                               if (roundedEnd.diff(this.lastTick, this.tickUnit, true) !== 0) {\r
-                                       // Do not use end of because we need this to be in the next time unit\r
-                                       this.lastTick = this.getMomentStartOf(this.lastTick.add(1, this.tickUnit));\r
+                       if (!me.options.time.max) {\r
+                               var roundedEnd = me.getMomentStartOf(me.lastTick);\r
+                               if (roundedEnd.diff(me.lastTick, me.tickUnit, true) !== 0) {\r
+                                       // Do not use end of because we need me to be in the next time unit\r
+                                       me.lastTick = me.getMomentStartOf(me.lastTick.add(1, me.tickUnit));\r
                                }\r
                        }\r
 \r
-                       this.smallestLabelSeparation = this.width;\r
+                       me.smallestLabelSeparation = me.width;\r
 \r
-                       helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) {\r
-                               for (var i = 1; i < this.labelMoments[datasetIndex].length; i++) {\r
-                                       this.smallestLabelSeparation = Math.min(this.smallestLabelSeparation, this.labelMoments[datasetIndex][i].diff(this.labelMoments[datasetIndex][i - 1], this.tickUnit, true));\r
+                       helpers.each(me.chart.data.datasets, function(dataset, datasetIndex) {\r
+                               for (var i = 1; i < me.labelMoments[datasetIndex].length; i++) {\r
+                                       me.smallestLabelSeparation = Math.min(me.smallestLabelSeparation, me.labelMoments[datasetIndex][i].diff(me.labelMoments[datasetIndex][i - 1], me.tickUnit, true));\r
                                }\r
-                       }, this);\r
+                       }, me);\r
 \r
                        // Tick displayFormat override\r
-                       if (this.options.time.displayFormat) {\r
-                               this.displayFormat = this.options.time.displayFormat;\r
+                       if (me.options.time.displayFormat) {\r
+                               me.displayFormat = me.options.time.displayFormat;\r
                        }\r
 \r
                        // first tick. will have been rounded correctly if options.time.min is not specified\r
-                       this.ticks.push(this.firstTick.clone());\r
+                       me.ticks.push(me.firstTick.clone());\r
 \r
                        // For every unit in between the first and last moment, create a moment and add it to the ticks tick\r
-                       for (var i = 1; i <= this.scaleSizeInUnits; ++i) {\r
-                               var newTick = roundedStart.clone().add(i, this.tickUnit);\r
+                       for (var i = 1; i <= me.scaleSizeInUnits; ++i) {\r
+                               var newTick = roundedStart.clone().add(i, me.tickUnit);\r
 \r
                                // Are we greater than the max time\r
-                               if (this.options.time.max && newTick.diff(this.lastTick, this.tickUnit, true) >= 0) {\r
+                               if (me.options.time.max && newTick.diff(me.lastTick, me.tickUnit, true) >= 0) {\r
                                        break;\r
                                }\r
 \r
-                               if (i % this.unitScale === 0) {\r
-                                       this.ticks.push(newTick);\r
+                               if (i % me.unitScale === 0) {\r
+                                       me.ticks.push(newTick);\r
                                }\r
                        }\r
 \r
                        // Always show the right tick\r
-                       var diff = this.ticks[this.ticks.length - 1].diff(this.lastTick, this.tickUnit);\r
-                       if (diff !== 0 || this.scaleSizeInUnits === 0) {\r
+                       var diff = me.ticks[me.ticks.length - 1].diff(me.lastTick, me.tickUnit);\r
+                       if (diff !== 0 || me.scaleSizeInUnits === 0) {\r
                                // this is a weird case. If the <max> option is the same as the end option, we can't just diff the times because the tick was created from the roundedStart\r
                                // but the last tick was not rounded.\r
-                               if (this.options.time.max) {\r
-                                       this.ticks.push(this.lastTick.clone());\r
-                                       this.scaleSizeInUnits = this.lastTick.diff(this.ticks[0], this.tickUnit, true);\r
+                               if (me.options.time.max) {\r
+                                       me.ticks.push(me.lastTick.clone());\r
+                                       me.scaleSizeInUnits = me.lastTick.diff(me.ticks[0], me.tickUnit, true);\r
                                } else {\r
-                                       this.ticks.push(this.lastTick.clone());\r
-                                       this.scaleSizeInUnits = this.lastTick.diff(this.firstTick, this.tickUnit, true);\r
+                                       me.ticks.push(me.lastTick.clone());\r
+                                       me.scaleSizeInUnits = me.lastTick.diff(me.firstTick, me.tickUnit, true);\r
                                }\r
                        }\r
 \r
-                       this.ctx.restore();\r
+                       me.ctx.restore();\r
                },\r
                // Get tooltip label\r
                getLabelForIndex: function(index, datasetIndex) {\r
-                       var label = this.chart.data.labels && index < this.chart.data.labels.length ? this.chart.data.labels[index] : '';\r
+                       var me = this;\r
+                       var label = me.chart.data.labels && index < me.chart.data.labels.length ? me.chart.data.labels[index] : '';\r
 \r
-                       if (typeof this.chart.data.datasets[datasetIndex].data[0] === 'object') {\r
-                               label = this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\r
+                       if (typeof me.chart.data.datasets[datasetIndex].data[0] === 'object') {\r
+                               label = me.getRightValue(me.chart.data.datasets[datasetIndex].data[index]);\r
                        }\r
 \r
                        // Format nicely\r
-                       if (this.options.time.tooltipFormat) {\r
-                               label = this.parseTime(label).format(this.options.time.tooltipFormat);\r
+                       if (me.options.time.tooltipFormat) {\r
+                               label = me.parseTime(label).format(me.options.time.tooltipFormat);\r
                        }\r
 \r
                        return label;\r
@@ -9841,29 +10171,31 @@ module.exports = function(Chart) {
                        }\r
                },\r
                convertTicksToLabels: function() {\r
-                       this.tickMoments = this.ticks;\r
-                       this.ticks = this.ticks.map(this.tickFormatFunction, this);\r
+                       var me = this;\r
+                       me.tickMoments = me.ticks;\r
+                       me.ticks = me.ticks.map(me.tickFormatFunction, me);\r
                },\r
                getPixelForValue: function(value, index, datasetIndex, includeOffset) {\r
-                       var labelMoment = value && value.isValid && value.isValid() ? value : this.getLabelMoment(datasetIndex, index);\r
+                       var me = this;\r
+                       var labelMoment = value && value.isValid && value.isValid() ? value : me.getLabelMoment(datasetIndex, index);\r
 \r
                        if (labelMoment) {\r
-                               var offset = labelMoment.diff(this.firstTick, this.tickUnit, true);\r
+                               var offset = labelMoment.diff(me.firstTick, me.tickUnit, true);\r
 \r
-                               var decimal = offset / this.scaleSizeInUnits;\r
+                               var decimal = offset / me.scaleSizeInUnits;\r
 \r
-                               if (this.isHorizontal()) {\r
-                                       var innerWidth = this.width - (this.paddingLeft + this.paddingRight);\r
-                                       var valueWidth = innerWidth / Math.max(this.ticks.length - 1, 1);\r
-                                       var valueOffset = (innerWidth * decimal) + this.paddingLeft;\r
+                               if (me.isHorizontal()) {\r
+                                       var innerWidth = me.width - (me.paddingLeft + me.paddingRight);\r
+                                       var valueWidth = innerWidth / Math.max(me.ticks.length - 1, 1);\r
+                                       var valueOffset = (innerWidth * decimal) + me.paddingLeft;\r
 \r
-                                       return this.left + Math.round(valueOffset);\r
+                                       return me.left + Math.round(valueOffset);\r
                                } else {\r
-                                       var innerHeight = this.height - (this.paddingTop + this.paddingBottom);\r
-                                       var valueHeight = innerHeight / Math.max(this.ticks.length - 1, 1);\r
-                                       var heightOffset = (innerHeight * decimal) + this.paddingTop;\r
+                                       var innerHeight = me.height - (me.paddingTop + me.paddingBottom);\r
+                                       var valueHeight = innerHeight / Math.max(me.ticks.length - 1, 1);\r
+                                       var heightOffset = (innerHeight * decimal) + me.paddingTop;\r
 \r
-                                       return this.top + Math.round(heightOffset);\r
+                                       return me.top + Math.round(heightOffset);\r
                                }\r
                        }\r
                },\r
@@ -9871,17 +10203,19 @@ module.exports = function(Chart) {
                        return this.getPixelForValue(this.tickMoments[index], null, null, includeOffset);\r
                },\r
                getValueForPixel: function(pixel) {\r
-                       var innerDimension = this.isHorizontal() ? this.width - (this.paddingLeft + this.paddingRight) : this.height - (this.paddingTop + this.paddingBottom);\r
-                       var offset = (pixel - (this.isHorizontal() ? this.left + this.paddingLeft : this.top + this.paddingTop)) / innerDimension;\r
-                       offset *= this.scaleSizeInUnits;\r
-                       return this.firstTick.clone().add(moment.duration(offset, this.tickUnit).asSeconds(), 'seconds');\r
+                       var me = this;\r
+                       var innerDimension = me.isHorizontal() ? me.width - (me.paddingLeft + me.paddingRight) : me.height - (me.paddingTop + me.paddingBottom);\r
+                       var offset = (pixel - (me.isHorizontal() ? me.left + me.paddingLeft : me.top + me.paddingTop)) / innerDimension;\r
+                       offset *= me.scaleSizeInUnits;\r
+                       return me.firstTick.clone().add(moment.duration(offset, me.tickUnit).asSeconds(), 'seconds');\r
                },\r
                parseTime: function(label) {\r
-                       if (typeof this.options.time.parser === 'string') {\r
-                               return moment(label, this.options.time.parser);\r
+                       var me = this;\r
+                       if (typeof me.options.time.parser === 'string') {\r
+                               return moment(label, me.options.time.parser);\r
                        }\r
-                       if (typeof this.options.time.parser === 'function') {\r
-                               return this.options.time.parser(label);\r
+                       if (typeof me.options.time.parser === 'function') {\r
+                               return me.options.time.parser(label);\r
                        }\r
                        // Date objects\r
                        if (typeof label.getMonth === 'function' || typeof label === 'number') {\r
@@ -9892,16 +10226,17 @@ module.exports = function(Chart) {
                                return label;\r
                        }\r
                        // Custom parsing (return an instance of moment)\r
-                       if (typeof this.options.time.format !== 'string' && this.options.time.format.call) {\r
+                       if (typeof me.options.time.format !== 'string' && me.options.time.format.call) {\r
                                console.warn("options.time.format is deprecated and replaced by options.time.parser. See http://nnnick.github.io/Chart.js/docs-v2/#scales-time-scale");\r
-                               return this.options.time.format(label);\r
+                               return me.options.time.format(label);\r
                        }\r
                        // Moment format parsing\r
-                       return moment(label, this.options.time.format);\r
+                       return moment(label, me.options.time.format);\r
                }\r
        });\r
        Chart.scaleService.registerScaleType("time", TimeScale, defaultConfig);\r
 \r
 };\r
 
-},{"moment":1}]},{},[7]);
+},{"1":1}]},{},[7])(7)
+});
\ No newline at end of file
index 149a8806ce53ea72e781101552f3f7ce04ce00b2..0feb32fb6e3f309d1dd081eb6cb7fca671ed639f 100644 (file)
@@ -1,14 +1,14 @@
 /*!
  * Chart.js
  * http://chartjs.org/
- * Version: 2.1.4
+ * Version: 2.1.5
  *
  * Copyright 2016 Nick Downie
  * Released under the MIT license
  * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md
  */
-!function t(e,i,a){function o(r,s){if(!i[r]){if(!e[r]){var l="function"==typeof require&&require;if(!s&&l)return l(r,!0);if(n)return n(r,!0);var h=new Error("Cannot find module '"+r+"'");throw h.code="MODULE_NOT_FOUND",h}var d=i[r]={exports:{}};e[r][0].call(d.exports,function(t){var i=e[r][1][t];return o(i?i:t)},d,d.exports,t,e,i,a)}return i[r].exports}for(var n="function"==typeof require&&require,r=0;r<a.length;r++)o(a[r]);return o}({1:[function(t,e,i){},{}],2:[function(t,e,i){function a(t){if(t){var e=/^#([a-fA-F0-9]{3})$/,i=/^#([a-fA-F0-9]{6})$/,a=/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,o=/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,n=/(\w+)/,r=[0,0,0],s=1,l=t.match(e);if(l){l=l[1];for(var h=0;h<r.length;h++)r[h]=parseInt(l[h]+l[h],16)}else if(l=t.match(i)){l=l[1];for(var h=0;h<r.length;h++)r[h]=parseInt(l.slice(2*h,2*h+2),16)}else if(l=t.match(a)){for(var h=0;h<r.length;h++)r[h]=parseInt(l[h+1]);s=parseFloat(l[4])}else if(l=t.match(o)){for(var h=0;h<r.length;h++)r[h]=Math.round(2.55*parseFloat(l[h+1]));s=parseFloat(l[4])}else if(l=t.match(n)){if("transparent"==l[1])return[0,0,0,0];if(r=y[l[1]],!r)return}for(var h=0;h<r.length;h++)r[h]=v(r[h],0,255);return s=s||0==s?v(s,0,1):1,r[3]=s,r}}function o(t){if(t){var e=/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/,i=t.match(e);if(i){var a=parseFloat(i[4]),o=v(parseInt(i[1]),0,360),n=v(parseFloat(i[2]),0,100),r=v(parseFloat(i[3]),0,100),s=v(isNaN(a)?1:a,0,1);return[o,n,r,s]}}}function n(t){if(t){var e=/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/,i=t.match(e);if(i){var a=parseFloat(i[4]),o=v(parseInt(i[1]),0,360),n=v(parseFloat(i[2]),0,100),r=v(parseFloat(i[3]),0,100),s=v(isNaN(a)?1:a,0,1);return[o,n,r,s]}}}function r(t){var e=a(t);return e&&e.slice(0,3)}function s(t){var e=o(t);return e&&e.slice(0,3)}function l(t){var e=a(t);return e?e[3]:(e=o(t))?e[3]:(e=n(t))?e[3]:void 0}function h(t){return"#"+x(t[0])+x(t[1])+x(t[2])}function d(t,e){return 1>e||t[3]&&t[3]<1?c(t,e):"rgb("+t[0]+", "+t[1]+", "+t[2]+")"}function c(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function u(t,e){if(1>e||t[3]&&t[3]<1)return f(t,e);var i=Math.round(t[0]/255*100),a=Math.round(t[1]/255*100),o=Math.round(t[2]/255*100);return"rgb("+i+"%, "+a+"%, "+o+"%)"}function f(t,e){var i=Math.round(t[0]/255*100),a=Math.round(t[1]/255*100),o=Math.round(t[2]/255*100);return"rgba("+i+"%, "+a+"%, "+o+"%, "+(e||t[3]||1)+")"}function g(t,e){return 1>e||t[3]&&t[3]<1?p(t,e):"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"}function p(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function m(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"}function b(t){return k[t.slice(0,3)]}function v(t,e,i){return Math.min(Math.max(e,t),i)}function x(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var y=t("color-name");e.exports={getRgba:a,getHsla:o,getRgb:r,getHsl:s,getHwb:n,getAlpha:l,hexString:h,rgbString:d,rgbaString:c,percentString:u,percentaString:f,hslString:g,hslaString:p,hwbString:m,keyword:b};var k={};for(var S in y)k[y[S]]=S},{"color-name":6}],3:[function(t,e,i){var a=t("color-convert"),o=t("chartjs-color-string"),n=function(t){if(t instanceof n)return t;if(!(this instanceof n))return new n(t);this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1};var e;if("string"==typeof t)if(e=o.getRgba(t))this.setValues("rgb",e);else if(e=o.getHsla(t))this.setValues("hsl",e);else{if(!(e=o.getHwb(t)))throw new Error('Unable to parse color from string "'+t+'"');this.setValues("hwb",e)}else if("object"==typeof t)if(e=t,void 0!==e.r||void 0!==e.red)this.setValues("rgb",e);else if(void 0!==e.l||void 0!==e.lightness)this.setValues("hsl",e);else if(void 0!==e.v||void 0!==e.value)this.setValues("hsv",e);else if(void 0!==e.w||void 0!==e.whiteness)this.setValues("hwb",e);else{if(void 0===e.c&&void 0===e.cyan)throw new Error("Unable to parse color from object "+JSON.stringify(t));this.setValues("cmyk",e)}};n.prototype={rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t%=360,t=0>t?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return o.hexString(this.values.rgb)},rgbString:function(){return o.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return o.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return o.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return o.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return o.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return o.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return o.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],i=0;i<t.length;i++){var a=t[i]/255;e[i]=.03928>=a?a/12.92:Math.pow((a+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),i=t.luminosity();return e>i?(e+.05)/(i+.05):(i+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb,e=(299*t[0]+587*t[1]+114*t[2])/1e3;return 128>e},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;3>e;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,i=(e[0]+t)%360;return e[0]=0>i?360+i:i,this.setValues("hsl",e),this},mix:function(t,e){var i=this,a=t,o=void 0===e?.5:e,n=2*o-1,r=i.alpha()-a.alpha(),s=((n*r===-1?n:(n+r)/(1+n*r))+1)/2,l=1-s;return this.rgb(s*i.red()+l*a.red(),s*i.green()+l*a.green(),s*i.blue()+l*a.blue()).alpha(i.alpha()*o+a.alpha()*(1-o))},toJSON:function(){return this.rgb()},clone:function(){var t,e,i=new n,a=this.values,o=i.values;for(var r in a)a.hasOwnProperty(r)&&(t=a[r],e={}.toString.call(t),"[object Array]"===e?o[r]=t.slice(0):"[object Number]"===e?o[r]=t:console.error("unexpected color value:",t));return i}},n.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},n.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},n.prototype.getValues=function(t){for(var e=this.values,i={},a=0;a<t.length;a++)i[t.charAt(a)]=e[t][a];return 1!==e.alpha&&(i.a=e.alpha),i},n.prototype.setValues=function(t,e){var i,o=this.values,n=this.spaces,r=this.maxes,s=1;if("alpha"===t)s=e;else if(e.length)o[t]=e.slice(0,t.length),s=e[t.length];else if(void 0!==e[t.charAt(0)]){for(i=0;i<t.length;i++)o[t][i]=e[t.charAt(i)];s=e.a}else if(void 0!==e[n[t][0]]){var l=n[t];for(i=0;i<t.length;i++)o[t][i]=e[l[i]];s=e.alpha}if(o.alpha=Math.max(0,Math.min(1,void 0===s?o.alpha:s)),"alpha"===t)return!1;var h;for(i=0;i<t.length;i++)h=Math.max(0,Math.min(r[t][i],o[t][i])),o[t][i]=Math.round(h);for(var d in n)d!==t&&(o[d]=a[t][d](o[t]));return!0},n.prototype.setSpace=function(t,e){var i=e[0];return void 0===i?this.getValues(t):("number"==typeof i&&(i=Array.prototype.slice.call(e)),this.setValues(t,i),this)},n.prototype.setChannel=function(t,e,i){var a=this.values[t];return void 0===i?a[e]:i===a[e]?this:(a[e]=i,this.setValues(t,a),this)},"undefined"!=typeof window&&(window.Color=n),e.exports=n},{"chartjs-color-string":2,"color-convert":5}],4:[function(t,e,i){function a(t){var e,i,a,o=t[0]/255,n=t[1]/255,r=t[2]/255,s=Math.min(o,n,r),l=Math.max(o,n,r),h=l-s;return l==s?e=0:o==l?e=(n-r)/h:n==l?e=2+(r-o)/h:r==l&&(e=4+(o-n)/h),e=Math.min(60*e,360),0>e&&(e+=360),a=(s+l)/2,i=l==s?0:.5>=a?h/(l+s):h/(2-l-s),[e,100*i,100*a]}function o(t){var e,i,a,o=t[0],n=t[1],r=t[2],s=Math.min(o,n,r),l=Math.max(o,n,r),h=l-s;return i=0==l?0:h/l*1e3/10,l==s?e=0:o==l?e=(n-r)/h:n==l?e=2+(r-o)/h:r==l&&(e=4+(o-n)/h),e=Math.min(60*e,360),0>e&&(e+=360),a=l/255*1e3/10,[e,i,a]}function n(t){var e=t[0],i=t[1],o=t[2],n=a(t)[0],r=1/255*Math.min(e,Math.min(i,o)),o=1-1/255*Math.max(e,Math.max(i,o));return[n,100*r,100*o]}function s(t){var e,i,a,o,n=t[0]/255,r=t[1]/255,s=t[2]/255;return o=Math.min(1-n,1-r,1-s),e=(1-n-o)/(1-o)||0,i=(1-r-o)/(1-o)||0,a=(1-s-o)/(1-o)||0,[100*e,100*i,100*a,100*o]}function l(t){return G[JSON.stringify(t)]}function h(t){var e=t[0]/255,i=t[1]/255,a=t[2]/255;e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92,i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92,a=a>.04045?Math.pow((a+.055)/1.055,2.4):a/12.92;var o=.4124*e+.3576*i+.1805*a,n=.2126*e+.7152*i+.0722*a,r=.0193*e+.1192*i+.9505*a;return[100*o,100*n,100*r]}function d(t){var e,i,a,o=h(t),n=o[0],r=o[1],s=o[2];return n/=95.047,r/=100,s/=108.883,n=n>.008856?Math.pow(n,1/3):7.787*n+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,s=s>.008856?Math.pow(s,1/3):7.787*s+16/116,e=116*r-16,i=500*(n-r),a=200*(r-s),[e,i,a]}function c(t){return B(d(t))}function u(t){var e,i,a,o,n,r=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return n=255*l,[n,n,n];i=.5>l?l*(1+s):l+s-l*s,e=2*l-i,o=[0,0,0];for(var h=0;3>h;h++)a=r+1/3*-(h-1),0>a&&a++,a>1&&a--,n=1>6*a?e+6*(i-e)*a:1>2*a?i:2>3*a?e+(i-e)*(2/3-a)*6:e,o[h]=255*n;return o}function f(t){var e,i,a=t[0],o=t[1]/100,n=t[2]/100;return 0===n?[0,0,0]:(n*=2,o*=1>=n?n:2-n,i=(n+o)/2,e=2*o/(n+o),[a,100*e,100*i])}function p(t){return n(u(t))}function m(t){return s(u(t))}function v(t){return l(u(t))}function x(t){var e=t[0]/60,i=t[1]/100,a=t[2]/100,o=Math.floor(e)%6,n=e-Math.floor(e),r=255*a*(1-i),s=255*a*(1-i*n),l=255*a*(1-i*(1-n)),a=255*a;switch(o){case 0:return[a,l,r];case 1:return[s,a,r];case 2:return[r,a,l];case 3:return[r,s,a];case 4:return[l,r,a];case 5:return[a,r,s]}}function y(t){var e,i,a=t[0],o=t[1]/100,n=t[2]/100;return i=(2-o)*n,e=o*n,e/=1>=i?i:2-i,e=e||0,i/=2,[a,100*e,100*i]}function k(t){return n(x(t))}function S(t){return s(x(t))}function C(t){return l(x(t))}function w(t){var e,i,a,o,n=t[0]/360,s=t[1]/100,l=t[2]/100,h=s+l;switch(h>1&&(s/=h,l/=h),e=Math.floor(6*n),i=1-l,a=6*n-e,0!=(1&e)&&(a=1-a),o=s+a*(i-s),e){default:case 6:case 0:r=i,g=o,b=s;break;case 1:r=o,g=i,b=s;break;case 2:r=s,g=i,b=o;break;case 3:r=s,g=o,b=i;break;case 4:r=o,g=s,b=i;break;case 5:r=i,g=s,b=o}return[255*r,255*g,255*b]}function M(t){return a(w(t))}function D(t){return o(w(t))}function A(t){return s(w(t))}function I(t){return l(w(t))}function F(t){var e,i,a,o=t[0]/100,n=t[1]/100,r=t[2]/100,s=t[3]/100;return e=1-Math.min(1,o*(1-s)+s),i=1-Math.min(1,n*(1-s)+s),a=1-Math.min(1,r*(1-s)+s),[255*e,255*i,255*a]}function _(t){return a(F(t))}function P(t){return o(F(t))}function T(t){return n(F(t))}function V(t){return l(F(t))}function R(t){var e,i,a,o=t[0]/100,n=t[1]/100,r=t[2]/100;return e=3.2406*o+-1.5372*n+r*-.4986,i=o*-.9689+1.8758*n+.0415*r,a=.0557*o+n*-.204+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e=12.92*e,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i=12.92*i,a=a>.0031308?1.055*Math.pow(a,1/2.4)-.055:a=12.92*a,e=Math.min(Math.max(0,e),1),i=Math.min(Math.max(0,i),1),a=Math.min(Math.max(0,a),1),[255*e,255*i,255*a]}function O(t){var e,i,a,o=t[0],n=t[1],r=t[2];return o/=95.047,n/=100,r/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,n=n>.008856?Math.pow(n,1/3):7.787*n+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*n-16,i=500*(o-n),a=200*(n-r),[e,i,a]}function W(t){return B(O(t))}function L(t){var e,i,a,o,n=t[0],r=t[1],s=t[2];return 8>=n?(i=100*n/903.3,o=7.787*(i/100)+16/116):(i=100*Math.pow((n+16)/116,3),o=Math.pow(i/100,1/3)),e=.008856>=e/95.047?e=95.047*(r/500+o-16/116)/7.787:95.047*Math.pow(r/500+o,3),a=.008859>=a/108.883?a=108.883*(o-s/200-16/116)/7.787:108.883*Math.pow(o-s/200,3),[e,i,a]}function B(t){var e,i,a,o=t[0],n=t[1],r=t[2];return e=Math.atan2(r,n),i=360*e/2/Math.PI,0>i&&(i+=360),a=Math.sqrt(n*n+r*r),[o,a,i]}function z(t){return R(L(t))}function H(t){var e,i,a,o=t[0],n=t[1],r=t[2];return a=r/360*2*Math.PI,e=n*Math.cos(a),i=n*Math.sin(a),[o,e,i]}function N(t){return L(H(t))}function E(t){return z(H(t))}function U(t){return Q[t]}function j(t){return a(U(t))}function q(t){return o(U(t))}function Y(t){return n(U(t))}function J(t){return s(U(t))}function Z(t){return d(U(t))}function X(t){return h(U(t))}e.exports={rgb2hsl:a,rgb2hsv:o,rgb2hwb:n,rgb2cmyk:s,rgb2keyword:l,rgb2xyz:h,rgb2lab:d,rgb2lch:c,hsl2rgb:u,hsl2hsv:f,hsl2hwb:p,hsl2cmyk:m,hsl2keyword:v,hsv2rgb:x,hsv2hsl:y,hsv2hwb:k,hsv2cmyk:S,hsv2keyword:C,hwb2rgb:w,hwb2hsl:M,hwb2hsv:D,hwb2cmyk:A,hwb2keyword:I,cmyk2rgb:F,cmyk2hsl:_,cmyk2hsv:P,cmyk2hwb:T,cmyk2keyword:V,keyword2rgb:U,keyword2hsl:j,keyword2hsv:q,keyword2hwb:Y,keyword2cmyk:J,keyword2lab:Z,keyword2xyz:X,xyz2rgb:R,xyz2lab:O,xyz2lch:W,lab2xyz:L,lab2rgb:z,lab2lch:B,lch2lab:H,lch2xyz:N,lch2rgb:E};var Q={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},G={};for(var $ in Q)G[JSON.stringify(Q[$])]=$},{}],5:[function(t,e,i){var a=t("./conversions"),o=function(){return new h};for(var n in a){o[n+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),a[t](e)}}(n);var r=/(\w+)2(\w+)/.exec(n),s=r[1],l=r[2];o[s]=o[s]||{},o[s][l]=o[n]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var i=a[t](e);if("string"==typeof i||void 0===i)return i;for(var o=0;o<i.length;o++)i[o]=Math.round(i[o]);return i}}(n)}var h=function(){this.convs={}};h.prototype.routeSpace=function(t,e){var i=e[0];return void 0===i?this.getValues(t):("number"==typeof i&&(i=Array.prototype.slice.call(e)),this.setValues(t,i))},h.prototype.setValues=function(t,e){return this.space=t,this.convs={},this.convs[t]=e,this},h.prototype.getValues=function(t){var e=this.convs[t];if(!e){var i=this.space,a=this.convs[i];e=o[i][t](a),this.convs[t]=e}return e},["rgb","hsl","hsv","cmyk","keyword"].forEach(function(t){h.prototype[t]=function(e){return this.routeSpace(t,arguments)}}),e.exports=o},{"./conversions":4}],6:[function(t,e,i){e.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},{}],7:[function(t,e,i){var a=t("./core/core.js")();t("./core/core.helpers")(a),t("./core/core.element")(a),t("./core/core.animation")(a),t("./core/core.controller")(a),t("./core/core.datasetController")(a),t("./core/core.layoutService")(a),t("./core/core.legend")(a),t("./core/core.plugin.js")(a),t("./core/core.scale")(a),t("./core/core.scaleService")(a),t("./core/core.title")(a),t("./core/core.tooltip")(a),t("./elements/element.arc")(a),t("./elements/element.line")(a),t("./elements/element.point")(a),t("./elements/element.rectangle")(a),t("./scales/scale.category")(a),t("./scales/scale.linear")(a),t("./scales/scale.logarithmic")(a),t("./scales/scale.radialLinear")(a),t("./scales/scale.time")(a),t("./controllers/controller.bar")(a),t("./controllers/controller.bubble")(a),t("./controllers/controller.doughnut")(a),t("./controllers/controller.line")(a),t("./controllers/controller.polarArea")(a),t("./controllers/controller.radar")(a),t("./charts/Chart.Bar")(a),t("./charts/Chart.Bubble")(a),t("./charts/Chart.Doughnut")(a),t("./charts/Chart.Line")(a),t("./charts/Chart.PolarArea")(a),t("./charts/Chart.Radar")(a),t("./charts/Chart.Scatter")(a),window.Chart=e.exports=a},{"./charts/Chart.Bar":8,"./charts/Chart.Bubble":9,"./charts/Chart.Doughnut":10,"./charts/Chart.Line":11,"./charts/Chart.PolarArea":12,"./charts/Chart.Radar":13,"./charts/Chart.Scatter":14,"./controllers/controller.bar":15,"./controllers/controller.bubble":16,"./controllers/controller.doughnut":17,"./controllers/controller.line":18,"./controllers/controller.polarArea":19,"./controllers/controller.radar":20,"./core/core.animation":21,"./core/core.controller":22,"./core/core.datasetController":23,"./core/core.element":24,"./core/core.helpers":25,"./core/core.js":26,"./core/core.layoutService":27,"./core/core.legend":28,"./core/core.plugin.js":29,"./core/core.scale":30,"./core/core.scaleService":31,"./core/core.title":32,"./core/core.tooltip":33,"./elements/element.arc":34,"./elements/element.line":35,"./elements/element.point":36,"./elements/element.rectangle":37,"./scales/scale.category":38,"./scales/scale.linear":39,"./scales/scale.logarithmic":40,"./scales/scale.radialLinear":41,"./scales/scale.time":42}],8:[function(t,e,i){"use strict";e.exports=function(t){t.Bar=function(e,i){return i.type="bar",new t(e,i)}}},{}],9:[function(t,e,i){"use strict";e.exports=function(t){t.Bubble=function(e,i){return i.type="bubble",new t(e,i)}}},{}],10:[function(t,e,i){"use strict";e.exports=function(t){t.Doughnut=function(e,i){return i.type="doughnut",new t(e,i)}}},{}],11:[function(t,e,i){"use strict";e.exports=function(t){t.Line=function(e,i){return i.type="line",new t(e,i)}}},{}],12:[function(t,e,i){"use strict";e.exports=function(t){t.PolarArea=function(e,i){return i.type="polarArea",new t(e,i)}}},{}],13:[function(t,e,i){"use strict";e.exports=function(t){t.Radar=function(e,i){return i.options=t.helpers.configMerge({aspectRatio:1},i.options),i.type="radar",new t(e,i)}}},{}],14:[function(t,e,i){"use strict";e.exports=function(t){var e={hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-1"}],yAxes:[{type:"linear",position:"left",id:"y-axis-1"}]},tooltips:{callbacks:{title:function(t,e){return""},label:function(t,e){return"("+t.xLabel+", "+t.yLabel+")"}}}};t.defaults.scatter=e,t.controllers.scatter=t.controllers.line,t.Scatter=function(e,i){return i.type="scatter",new t(e,i)}}},{}],15:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.bar={hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}},t.controllers.bar=t.DatasetController.extend({dataElementType:t.elements.Rectangle,initialize:function(e,i){t.DatasetController.prototype.initialize.call(this,e,i),this.getMeta().bar=!0},getBarCount:function(){var t=0;return e.each(this.chart.data.datasets,function(e,i){var a=this.chart.getDatasetMeta(i);a.bar&&this.chart.isDatasetVisible(i)&&++t},this),t},update:function(t){e.each(this.getMeta().data,function(e,i){this.updateElement(e,i,t)},this)},updateElement:function(t,i,a){var o=this.getMeta(),n=this.getScaleForId(o.xAxisID),r=this.getScaleForId(o.yAxisID),s=r.getBasePixel(),l=this.chart.options.elements.rectangle,h=t.custom||{},d=this.getDataset();e.extend(t,{_xScale:n,_yScale:r,_datasetIndex:this.index,_index:i,_model:{x:this.calculateBarX(i,this.index),y:a?s:this.calculateBarY(i,this.index),label:this.chart.data.labels[i],datasetLabel:d.label,base:a?s:this.calculateBarBase(this.index,i),width:this.calculateBarWidth(i),backgroundColor:h.backgroundColor?h.backgroundColor:e.getValueAtIndexOrDefault(d.backgroundColor,i,l.backgroundColor),borderSkipped:h.borderSkipped?h.borderSkipped:l.borderSkipped,borderColor:h.borderColor?h.borderColor:e.getValueAtIndexOrDefault(d.borderColor,i,l.borderColor),borderWidth:h.borderWidth?h.borderWidth:e.getValueAtIndexOrDefault(d.borderWidth,i,l.borderWidth)}}),t.pivot()},calculateBarBase:function(t,e){var i=this.getMeta(),a=this.getScaleForId(i.yAxisID),o=0;if(a.options.stacked){var n=this.chart,r=n.data.datasets,s=r[t].data[e];if(0>s)for(var l=0;t>l;l++){var h=r[l],d=n.getDatasetMeta(l);d.bar&&d.yAxisID===a.id&&n.isDatasetVisible(l)&&(o+=h.data[e]<0?h.data[e]:0)}else for(var c=0;t>c;c++){var u=r[c],f=n.getDatasetMeta(c);f.bar&&f.yAxisID===a.id&&n.isDatasetVisible(c)&&(o+=u.data[e]>0?u.data[e]:0)}return a.getPixelForValue(o)}return a.getBasePixel()},getRuler:function(t){var e,i=this.getMeta(),a=this.getScaleForId(i.xAxisID),o=this.getBarCount();e="category"===a.options.type?a.getPixelForTick(t+1)-a.getPixelForTick(t):a.width/a.ticks.length;var n=e*a.options.categoryPercentage,r=(e-e*a.options.categoryPercentage)/2,s=n/o;if(a.ticks.length!==this.chart.data.labels.length){var l=a.ticks.length/this.chart.data.labels.length;s*=l}var h=s*a.options.barPercentage,d=s-s*a.options.barPercentage;return{datasetCount:o,tickWidth:e,categoryWidth:n,categorySpacing:r,fullBarWidth:s,barWidth:h,barSpacing:d}},calculateBarWidth:function(t){var e=this.getScaleForId(this.getMeta().xAxisID),i=this.getRuler(t);return e.options.stacked?i.categoryWidth:i.barWidth},getBarIndex:function(t){var e,i,a=0;for(i=0;t>i;++i)e=this.chart.getDatasetMeta(i),e.bar&&this.chart.isDatasetVisible(i)&&++a;return a},calculateBarX:function(t,e){var i=this.getMeta(),a=this.getScaleForId(i.xAxisID),o=this.getBarIndex(e),n=this.getRuler(t),r=a.getPixelForValue(null,t,e,this.chart.isCombo);return r-=this.chart.isCombo?n.tickWidth/2:0,a.options.stacked?r+n.categoryWidth/2+n.categorySpacing:r+n.barWidth/2+n.categorySpacing+n.barWidth*o+n.barSpacing/2+n.barSpacing*o},calculateBarY:function(t,e){var i=this.getMeta(),a=this.getScaleForId(i.yAxisID),o=this.getDataset().data[t];if(a.options.stacked){for(var n=0,r=0,s=0;e>s;s++){var l=this.chart.data.datasets[s],h=this.chart.getDatasetMeta(s);h.bar&&h.yAxisID===a.id&&this.chart.isDatasetVisible(s)&&(l.data[t]<0?r+=l.data[t]||0:n+=l.data[t]||0)}return 0>o?a.getPixelForValue(r+o):a.getPixelForValue(n+o)}return a.getPixelForValue(o)},draw:function(t){var i=t||1;e.each(this.getMeta().data,function(t,e){var a=this.getDataset().data[e];null===a||void 0===a||isNaN(a)||t.transition(i).draw()},this)},setHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],a=t._index,o=t.custom||{},n=t._model;n.backgroundColor=o.hoverBackgroundColor?o.hoverBackgroundColor:e.getValueAtIndexOrDefault(i.hoverBackgroundColor,a,e.getHoverColor(n.backgroundColor)),n.borderColor=o.hoverBorderColor?o.hoverBorderColor:e.getValueAtIndexOrDefault(i.hoverBorderColor,a,e.getHoverColor(n.borderColor)),n.borderWidth=o.hoverBorderWidth?o.hoverBorderWidth:e.getValueAtIndexOrDefault(i.hoverBorderWidth,a,n.borderWidth)},removeHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],a=t._index,o=t.custom||{},n=t._model,r=this.chart.options.elements.rectangle;n.backgroundColor=o.backgroundColor?o.backgroundColor:e.getValueAtIndexOrDefault(i.backgroundColor,a,r.backgroundColor),n.borderColor=o.borderColor?o.borderColor:e.getValueAtIndexOrDefault(i.borderColor,a,r.borderColor),n.borderWidth=o.borderWidth?o.borderWidth:e.getValueAtIndexOrDefault(i.borderWidth,a,r.borderWidth)}}),t.defaults.horizontalBar={hover:{mode:"label"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{position:"left",type:"category",categoryPercentage:.8,barPercentage:.9,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{callbacks:{title:function(t,e){var i="";return t.length>0&&(t[0].yLabel?i=t[0].yLabel:e.labels.length>0&&t[0].index<e.labels.length&&(i=e.labels[t[0].index])),i},label:function(t,e){var i=e.datasets[t.datasetIndex].label||"";return i+": "+t.xLabel}}}},t.controllers.horizontalBar=t.controllers.bar.extend({updateElement:function(t,i,a,o){var n=this.getMeta(),r=this.getScaleForId(n.xAxisID),s=this.getScaleForId(n.yAxisID),l=r.getBasePixel(),h=t.custom||{},d=this.getDataset(),c=this.chart.options.elements.rectangle;
-e.extend(t,{_xScale:r,_yScale:s,_datasetIndex:this.index,_index:i,_model:{x:a?l:this.calculateBarX(i,this.index),y:this.calculateBarY(i,this.index),label:this.chart.data.labels[i],datasetLabel:d.label,base:a?l:this.calculateBarBase(this.index,i),height:this.calculateBarHeight(i),backgroundColor:h.backgroundColor?h.backgroundColor:e.getValueAtIndexOrDefault(d.backgroundColor,i,c.backgroundColor),borderSkipped:h.borderSkipped?h.borderSkipped:c.borderSkipped,borderColor:h.borderColor?h.borderColor:e.getValueAtIndexOrDefault(d.borderColor,i,c.borderColor),borderWidth:h.borderWidth?h.borderWidth:e.getValueAtIndexOrDefault(d.borderWidth,i,c.borderWidth)},draw:function(){function t(t){return l[(d+t)%4]}var e=this._chart.ctx,i=this._view,a=i.height/2,o=i.y-a,n=i.y+a,r=i.base-(i.base-i.x),s=i.borderWidth/2;i.borderWidth&&(o+=s,n-=s,r+=s),e.beginPath(),e.fillStyle=i.backgroundColor,e.strokeStyle=i.borderColor,e.lineWidth=i.borderWidth;var l=[[i.base,n],[i.base,o],[r,o],[r,n]],h=["bottom","left","top","right"],d=h.indexOf(i.borderSkipped,0);-1===d&&(d=0),e.moveTo.apply(e,t(0));for(var c=1;4>c;c++)e.lineTo.apply(e,t(c));e.fill(),i.borderWidth&&e.stroke()},inRange:function(t,e){var i=this._view,a=!1;return i&&(a=i.x<i.base?e>=i.y-i.height/2&&e<=i.y+i.height/2&&t>=i.x&&t<=i.base:e>=i.y-i.height/2&&e<=i.y+i.height/2&&t>=i.base&&t<=i.x),a}}),t.pivot()},calculateBarBase:function(t,e){var i=this.getMeta(),a=this.getScaleForId(i.xAxisID),o=0;if(a.options.stacked){var n=this.chart.data.datasets[t].data[e];if(0>n)for(var r=0;t>r;r++){var s=this.chart.data.datasets[r],l=this.chart.getDatasetMeta(r);l.bar&&l.xAxisID===a.id&&this.chart.isDatasetVisible(r)&&(o+=s.data[e]<0?s.data[e]:0)}else for(var h=0;t>h;h++){var d=this.chart.data.datasets[h],c=this.chart.getDatasetMeta(h);c.bar&&c.xAxisID===a.id&&this.chart.isDatasetVisible(h)&&(o+=d.data[e]>0?d.data[e]:0)}return a.getPixelForValue(o)}return a.getBasePixel()},getRuler:function(t){var e,i=this.getMeta(),a=this.getScaleForId(i.yAxisID),o=this.getBarCount();e="category"===a.options.type?a.getPixelForTick(t+1)-a.getPixelForTick(t):a.width/a.ticks.length;var n=e*a.options.categoryPercentage,r=(e-e*a.options.categoryPercentage)/2,s=n/o;if(a.ticks.length!==this.chart.data.labels.length){var l=a.ticks.length/this.chart.data.labels.length;s*=l}var h=s*a.options.barPercentage,d=s-s*a.options.barPercentage;return{datasetCount:o,tickHeight:e,categoryHeight:n,categorySpacing:r,fullBarHeight:s,barHeight:h,barSpacing:d}},calculateBarHeight:function(t){var e=this.getScaleForId(this.getMeta().yAxisID),i=this.getRuler(t);return e.options.stacked?i.categoryHeight:i.barHeight},calculateBarX:function(t,e){var i=this.getMeta(),a=this.getScaleForId(i.xAxisID),o=this.getDataset().data[t];if(a.options.stacked){for(var n=0,r=0,s=0;e>s;s++){var l=this.chart.data.datasets[s],h=this.chart.getDatasetMeta(s);h.bar&&h.xAxisID===a.id&&this.chart.isDatasetVisible(s)&&(l.data[t]<0?r+=l.data[t]||0:n+=l.data[t]||0)}return 0>o?a.getPixelForValue(r+o):a.getPixelForValue(n+o)}return a.getPixelForValue(o)},calculateBarY:function(t,e){var i=this.getMeta(),a=this.getScaleForId(i.yAxisID),o=this.getBarIndex(e),n=this.getRuler(t),r=a.getPixelForValue(null,t,e,this.chart.isCombo);return r-=this.chart.isCombo?n.tickHeight/2:0,a.options.stacked?r+n.categoryHeight/2+n.categorySpacing:r+n.barHeight/2+n.categorySpacing+n.barHeight*o+n.barSpacing/2+n.barSpacing*o}})}},{}],16:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.bubble={hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(t,e){return""},label:function(t,e){var i=e.datasets[t.datasetIndex].label||"",a=e.datasets[t.datasetIndex].data[t.index];return i+": ("+a.x+", "+a.y+", "+a.r+")"}}}},t.controllers.bubble=t.DatasetController.extend({dataElementType:t.elements.Point,update:function(t){var i=this.getMeta(),a=i.data;e.each(a,function(e,i){this.updateElement(e,i,t)},this)},updateElement:function(t,i,a){var o=this.getMeta(),n=this.getScaleForId(o.xAxisID),r=this.getScaleForId(o.yAxisID),s=t.custom||{},l=this.getDataset(),h=l.data[i],d=this.chart.options.elements.point;e.extend(t,{_xScale:n,_yScale:r,_datasetIndex:this.index,_index:i,_model:{x:a?n.getPixelForDecimal(.5):n.getPixelForValue(h,i,this.index,this.chart.isCombo),y:a?r.getBasePixel():r.getPixelForValue(h,i,this.index),radius:a?0:s.radius?s.radius:this.getRadius(h),backgroundColor:s.backgroundColor?s.backgroundColor:e.getValueAtIndexOrDefault(l.backgroundColor,i,d.backgroundColor),borderColor:s.borderColor?s.borderColor:e.getValueAtIndexOrDefault(l.borderColor,i,d.borderColor),borderWidth:s.borderWidth?s.borderWidth:e.getValueAtIndexOrDefault(l.borderWidth,i,d.borderWidth),hitRadius:s.hitRadius?s.hitRadius:e.getValueAtIndexOrDefault(l.hitRadius,i,d.hitRadius)}});var c=t._model;c.skip=s.skip?s.skip:isNaN(c.x)||isNaN(c.y),t.pivot()},getRadius:function(t){return t.r||this.chart.options.elements.point.radius},setHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],a=t._index,o=t.custom||{},n=t._model;n.radius=o.hoverRadius?o.hoverRadius:e.getValueAtIndexOrDefault(i.hoverRadius,a,this.chart.options.elements.point.hoverRadius)+this.getRadius(this.getDataset().data[t._index]),n.backgroundColor=o.hoverBackgroundColor?o.hoverBackgroundColor:e.getValueAtIndexOrDefault(i.hoverBackgroundColor,a,e.getHoverColor(n.backgroundColor)),n.borderColor=o.hoverBorderColor?o.hoverBorderColor:e.getValueAtIndexOrDefault(i.hoverBorderColor,a,e.getHoverColor(n.borderColor)),n.borderWidth=o.hoverBorderWidth?o.hoverBorderWidth:e.getValueAtIndexOrDefault(i.hoverBorderWidth,a,n.borderWidth)},removeHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],a=t._index,o=t.custom||{},n=t._model,r=this.chart.options.elements.point;n.radius=o.radius?o.radius:this.getRadius(i.data[t._index]),n.backgroundColor=o.backgroundColor?o.backgroundColor:e.getValueAtIndexOrDefault(i.backgroundColor,a,r.backgroundColor),n.borderColor=o.borderColor?o.borderColor:e.getValueAtIndexOrDefault(i.borderColor,a,r.borderColor),n.borderWidth=o.borderWidth?o.borderWidth:e.getValueAtIndexOrDefault(i.borderWidth,a,r.borderWidth)}})}},{}],17:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i=t.defaults;i.doughnut={animation:{animateRotate:!0,animateScale:!1},aspectRatio:1,hover:{mode:"single"},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var i=t.data,a=i.datasets,o=i.labels;if(a.length)for(var n=0;n<a[0].data.length;++n)e.push('<li><span style="background-color:'+a[0].backgroundColor[n]+'"></span>'),o[n]&&e.push(o[n]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var i=t.data;return i.labels.length&&i.datasets.length?i.labels.map(function(a,o){var n=t.getDatasetMeta(0),r=i.datasets[0],s=n.data[o],l=s.custom||{},h=e.getValueAtIndexOrDefault,d=t.options.elements.arc,c=l.backgroundColor?l.backgroundColor:h(r.backgroundColor,o,d.backgroundColor),u=l.borderColor?l.borderColor:h(r.borderColor,o,d.borderColor),f=l.borderWidth?l.borderWidth:h(r.borderWidth,o,d.borderWidth);return{text:a,fillStyle:c,strokeStyle:u,lineWidth:f,hidden:isNaN(r.data[o])||n.data[o].hidden,index:o}}):[]}},onClick:function(t,e){var i,a,o,n=e.index,r=this.chart;for(i=0,a=(r.data.datasets||[]).length;a>i;++i)o=r.getDatasetMeta(i),o.data[n].hidden=!o.data[n].hidden;r.update()}},cutoutPercentage:50,rotation:Math.PI*-.5,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+e.datasets[t.datasetIndex].data[t.index]}}}},i.pie=e.clone(i.doughnut),e.extend(i.pie,{cutoutPercentage:0}),t.controllers.doughnut=t.controllers.pie=t.DatasetController.extend({dataElementType:t.elements.Arc,linkScales:e.noop,getRingIndex:function(t){for(var e=0,i=0;t>i;++i)this.chart.isDatasetVisible(i)&&++e;return e},update:function(t){var i=this,a=i.chart,o=a.chartArea,n=a.options,r=n.elements.arc,s=o.right-o.left-r.borderWidth,l=o.bottom-o.top-r.borderWidth,h=Math.min(s,l),d={x:0,y:0},c=i.getMeta(),u=n.cutoutPercentage,f=n.circumference;if(f<2*Math.PI){var g=n.rotation%(2*Math.PI);g+=2*Math.PI*(g>=Math.PI?-1:g<-Math.PI?1:0);var p=g+f,m={x:Math.cos(g),y:Math.sin(g)},b={x:Math.cos(p),y:Math.sin(p)},v=0>=g&&p>=0||g<=2*Math.PI&&2*Math.PI<=p,x=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,y=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,S=u/100,C={x:y?-1:Math.min(m.x*(m.x<0?1:S),b.x*(b.x<0?1:S)),y:k?-1:Math.min(m.y*(m.y<0?1:S),b.y*(b.y<0?1:S))},w={x:v?1:Math.max(m.x*(m.x>0?1:S),b.x*(b.x>0?1:S)),y:x?1:Math.max(m.y*(m.y>0?1:S),b.y*(b.y>0?1:S))},M={width:.5*(w.x-C.x),height:.5*(w.y-C.y)};h=Math.min(s/M.width,l/M.height),d={x:(w.x+C.x)*-.5,y:(w.y+C.y)*-.5}}a.outerRadius=Math.max(h/2,0),a.innerRadius=Math.max(u?a.outerRadius/100*u:1,0),a.radiusLength=(a.outerRadius-a.innerRadius)/a.getVisibleDatasetCount(),a.offsetX=d.x*a.outerRadius,a.offsetY=d.y*a.outerRadius,c.total=i.calculateTotal(),i.outerRadius=a.outerRadius-a.radiusLength*i.getRingIndex(i.index),i.innerRadius=i.outerRadius-a.radiusLength,e.each(c.data,function(e,a){i.updateElement(e,a,t)})},updateElement:function(t,i,a){var o=this,n=o.chart,r=n.chartArea,s=n.options,l=s.animation,h=s.elements.arc,d=(r.left+r.right)/2,c=(r.top+r.bottom)/2,u=s.rotation,f=s.rotation,g=o.getDataset(),p=a&&l.animateRotate?0:t.hidden?0:o.calculateCircumference(g.data[i])*(s.circumference/(2*Math.PI)),m=a&&l.animateScale?0:o.innerRadius,b=a&&l.animateScale?0:o.outerRadius,v=t.custom||{},x=e.getValueAtIndexOrDefault;e.extend(t,{_datasetIndex:o.index,_index:i,_model:{x:d+n.offsetX,y:c+n.offsetY,startAngle:u,endAngle:f,circumference:p,outerRadius:b,innerRadius:m,label:x(g.label,i,n.data.labels[i])}});var y=t._model;y.backgroundColor=v.backgroundColor?v.backgroundColor:x(g.backgroundColor,i,h.backgroundColor),y.hoverBackgroundColor=v.hoverBackgroundColor?v.hoverBackgroundColor:x(g.hoverBackgroundColor,i,h.hoverBackgroundColor),y.borderWidth=v.borderWidth?v.borderWidth:x(g.borderWidth,i,h.borderWidth),y.borderColor=v.borderColor?v.borderColor:x(g.borderColor,i,h.borderColor),a&&l.animateRotate||(0===i?y.startAngle=s.rotation:y.startAngle=o.getMeta().data[i-1]._model.endAngle,y.endAngle=y.startAngle+y.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,i=this.getDataset(),a=this.getMeta(),o=0;return e.each(a.data,function(e,a){t=i.data[a],isNaN(t)||e.hidden||(o+=Math.abs(t))}),o},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0}})}},{}],18:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.line={showLines:!0,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}},t.controllers.line=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,addElementAndReset:function(e){var i=this,a=i.chart.options;t.DatasetController.prototype.addElementAndReset.call(i,e),a.showLines&&0!==a.elements.line.tension&&i.updateBezierControlPoints()},update:function(t){var i,a,o,n,r=this,s=r.getMeta(),l=s.dataset,h=s.data||[],d=r.chart.options,c=d.elements.line,u=r.getScaleForId(s.yAxisID);for(d.showLines&&(o=r.getDataset(),n=l.custom||{},void 0!==o.tension&&void 0===o.lineTension&&(o.lineTension=o.tension),l._scale=u,l._datasetIndex=r.index,l._children=h,l._model={tension:n.tension?n.tension:e.getValueOrDefault(o.lineTension,c.tension),backgroundColor:n.backgroundColor?n.backgroundColor:o.backgroundColor||c.backgroundColor,borderWidth:n.borderWidth?n.borderWidth:o.borderWidth||c.borderWidth,borderColor:n.borderColor?n.borderColor:o.borderColor||c.borderColor,borderCapStyle:n.borderCapStyle?n.borderCapStyle:o.borderCapStyle||c.borderCapStyle,borderDash:n.borderDash?n.borderDash:o.borderDash||c.borderDash,borderDashOffset:n.borderDashOffset?n.borderDashOffset:o.borderDashOffset||c.borderDashOffset,borderJoinStyle:n.borderJoinStyle?n.borderJoinStyle:o.borderJoinStyle||c.borderJoinStyle,fill:n.fill?n.fill:void 0!==o.fill?o.fill:c.fill,scaleTop:u.top,scaleBottom:u.bottom,scaleZero:u.getBasePixel()},l.pivot()),i=0,a=h.length;a>i;++i)r.updateElement(h[i],i,t);d.showLines&&0!==c.tension&&r.updateBezierControlPoints()},getPointBackgroundColor:function(t,i){var a=this.chart.options.elements.point.backgroundColor,o=this.getDataset(),n=t.custom||{};return n.backgroundColor?a=n.backgroundColor:o.pointBackgroundColor?a=e.getValueAtIndexOrDefault(o.pointBackgroundColor,i,a):o.backgroundColor&&(a=o.backgroundColor),a},getPointBorderColor:function(t,i){var a=this.chart.options.elements.point.borderColor,o=this.getDataset(),n=t.custom||{};return n.borderColor?a=n.borderColor:o.pointBorderColor?a=e.getValueAtIndexOrDefault(o.pointBorderColor,i,a):o.borderColor&&(a=o.borderColor),a},getPointBorderWidth:function(t,i){var a=this.chart.options.elements.point.borderWidth,o=this.getDataset(),n=t.custom||{};return n.borderWidth?a=n.borderWidth:o.pointBorderWidth?a=e.getValueAtIndexOrDefault(o.pointBorderWidth,i,a):o.borderWidth&&(a=o.borderWidth),a},updateElement:function(t,i,a){var o,n,r=this,s=r.getMeta(),l=t.custom||{},h=r.getDataset(),d=r.index,c=h.data[i],u=r.getScaleForId(s.yAxisID),f=r.getScaleForId(s.xAxisID),g=r.chart.options.elements.point;void 0!==h.radius&&void 0===h.pointRadius&&(h.pointRadius=h.radius),void 0!==h.hitRadius&&void 0===h.pointHitRadius&&(h.pointHitRadius=h.hitRadius),o=f.getPixelForValue(c,i,d,r.chart.isCombo),n=a?u.getBasePixel():r.calculatePointY(c,i,d,r.chart.isCombo),t._xScale=f,t._yScale=u,t._datasetIndex=d,t._index=i,t._model={x:o,y:n,skip:l.skip||isNaN(o)||isNaN(n),radius:l.radius||e.getValueAtIndexOrDefault(h.pointRadius,i,g.radius),pointStyle:l.pointStyle||e.getValueAtIndexOrDefault(h.pointStyle,i,g.pointStyle),backgroundColor:r.getPointBackgroundColor(t,i),borderColor:r.getPointBorderColor(t,i),borderWidth:r.getPointBorderWidth(t,i),tension:s.dataset._model?s.dataset._model.tension:0,hitRadius:l.hitRadius||e.getValueAtIndexOrDefault(h.pointHitRadius,i,g.hitRadius)}},calculatePointY:function(t,e,i,a){var o,n,r,s=this,l=s.chart,h=s.getMeta(),d=s.getScaleForId(h.yAxisID),c=0,u=0;if(d.options.stacked){for(o=0;i>o;o++)n=l.data.datasets[o],r=l.getDatasetMeta(o),"line"===r.type&&l.isDatasetVisible(o)&&(n.data[e]<0?u+=n.data[e]||0:c+=n.data[e]||0);return 0>t?d.getPixelForValue(u+t):d.getPixelForValue(c+t)}return d.getPixelForValue(t)},updateBezierControlPoints:function(){var t,i,a,o,n,r=this.getMeta(),s=this.chart.chartArea,l=r.data||[];for(t=0,i=l.length;i>t;++t)a=l[t],o=a._model,n=e.splineCurve(e.previousItem(l,t)._model,o,e.nextItem(l,t)._model,r.dataset._model.tension),o.controlPointPreviousX=Math.max(Math.min(n.previous.x,s.right),s.left),o.controlPointPreviousY=Math.max(Math.min(n.previous.y,s.bottom),s.top),o.controlPointNextX=Math.max(Math.min(n.next.x,s.right),s.left),o.controlPointNextY=Math.max(Math.min(n.next.y,s.bottom),s.top),a.pivot()},draw:function(t){var e,i,a=this.getMeta(),o=a.data||[],n=t||1;for(e=0,i=o.length;i>e;++e)o[e].transition(n);for(this.chart.options.showLines&&a.dataset.transition(n).draw(),e=0,i=o.length;i>e;++e)o[e].draw()},setHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],a=t._index,o=t.custom||{},n=t._model;n.radius=o.hoverRadius||e.getValueAtIndexOrDefault(i.pointHoverRadius,a,this.chart.options.elements.point.hoverRadius),n.backgroundColor=o.hoverBackgroundColor||e.getValueAtIndexOrDefault(i.pointHoverBackgroundColor,a,e.getHoverColor(n.backgroundColor)),n.borderColor=o.hoverBorderColor||e.getValueAtIndexOrDefault(i.pointHoverBorderColor,a,e.getHoverColor(n.borderColor)),n.borderWidth=o.hoverBorderWidth||e.getValueAtIndexOrDefault(i.pointHoverBorderWidth,a,n.borderWidth)},removeHoverStyle:function(t){var i=this,a=i.chart.data.datasets[t._datasetIndex],o=t._index,n=t.custom||{},r=t._model;void 0!==a.radius&&void 0===a.pointRadius&&(a.pointRadius=a.radius),r.radius=n.radius||e.getValueAtIndexOrDefault(a.pointRadius,o,i.chart.options.elements.point.radius),r.backgroundColor=i.getPointBackgroundColor(t,o),r.borderColor=i.getPointBorderColor(t,o),r.borderWidth=i.getPointBorderWidth(t,o)}})}},{}],19:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.polarArea={scale:{type:"radialLinear",lineArc:!0},animation:{animateRotate:!0,animateScale:!0},aspectRatio:1,legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var i=t.data,a=i.datasets,o=i.labels;if(a.length)for(var n=0;n<a[0].data.length;++n)e.push('<li><span style="background-color:'+a[0].backgroundColor[n]+'">'),o[n]&&e.push(o[n]),e.push("</span></li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var i=t.data;return i.labels.length&&i.datasets.length?i.labels.map(function(a,o){var n=t.getDatasetMeta(0),r=i.datasets[0],s=n.data[o],l=s.custom||{},h=e.getValueAtIndexOrDefault,d=t.options.elements.arc,c=l.backgroundColor?l.backgroundColor:h(r.backgroundColor,o,d.backgroundColor),u=l.borderColor?l.borderColor:h(r.borderColor,o,d.borderColor),f=l.borderWidth?l.borderWidth:h(r.borderWidth,o,d.borderWidth);return{text:a,fillStyle:c,strokeStyle:u,lineWidth:f,hidden:isNaN(r.data[o])||n.data[o].hidden,index:o}}):[]}},onClick:function(t,e){var i,a,o,n=e.index,r=this.chart;for(i=0,a=(r.data.datasets||[]).length;a>i;++i)o=r.getDatasetMeta(i),o.data[n].hidden=!o.data[n].hidden;r.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}},t.controllers.polarArea=t.DatasetController.extend({dataElementType:t.elements.Arc,linkScales:e.noop,update:function(t){var i=this,a=i.chart,o=a.chartArea,n=this.getMeta(),r=a.options,s=r.elements.arc,l=Math.min(o.right-o.left,o.bottom-o.top);a.outerRadius=Math.max((l-s.borderWidth/2)/2,0),a.innerRadius=Math.max(r.cutoutPercentage?a.outerRadius/100*r.cutoutPercentage:1,0),a.radiusLength=(a.outerRadius-a.innerRadius)/a.getVisibleDatasetCount(),i.outerRadius=a.outerRadius-a.radiusLength*i.index,i.innerRadius=i.outerRadius-a.radiusLength,n.count=i.countVisibleElements(),e.each(n.data,function(e,a){i.updateElement(e,a,t)})},updateElement:function(t,i,a){for(var o=this,n=o.chart,r=n.chartArea,s=o.getDataset(),l=n.options,h=l.animation,d=l.elements.arc,c=t.custom||{},u=n.scale,f=e.getValueAtIndexOrDefault,g=n.data.labels,p=o.calculateCircumference(s.data[i]),m=(r.left+r.right)/2,b=(r.top+r.bottom)/2,v=0,x=o.getMeta(),y=0;i>y;++y)isNaN(s.data[y])||x.data[y].hidden||++v;var k=t.hidden?0:u.getDistanceFromCenterForValue(s.data[i]),S=-.5*Math.PI+p*v,C=S+(t.hidden?0:p),w={x:m,y:b,innerRadius:0,outerRadius:h.animateScale?0:u.getDistanceFromCenterForValue(s.data[i]),startAngle:h.animateRotate?Math.PI*-.5:S,endAngle:h.animateRotate?Math.PI*-.5:C,backgroundColor:c.backgroundColor?c.backgroundColor:f(s.backgroundColor,i,d.backgroundColor),borderWidth:c.borderWidth?c.borderWidth:f(s.borderWidth,i,d.borderWidth),borderColor:c.borderColor?c.borderColor:f(s.borderColor,i,d.borderColor),label:f(g,i,g[i])};e.extend(t,{_datasetIndex:o.index,_index:i,_scale:u,_model:a?w:{x:m,y:b,innerRadius:0,outerRadius:k,startAngle:S,endAngle:C,backgroundColor:c.backgroundColor?c.backgroundColor:f(s.backgroundColor,i,d.backgroundColor),borderWidth:c.borderWidth?c.borderWidth:f(s.borderWidth,i,d.borderWidth),borderColor:c.borderColor?c.borderColor:f(s.borderColor,i,d.borderColor),label:f(g,i,g[i])}}),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},countVisibleElements:function(){var t=this.getDataset(),i=this.getMeta(),a=0;return e.each(i.data,function(e,i){isNaN(t.data[i])||e.hidden||a++}),a},calculateCircumference:function(t){var e=this.getMeta().count;return e>0&&!isNaN(t)?2*Math.PI/e:0}})}},{}],20:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.radar={scale:{type:"radialLinear"},elements:{line:{tension:0}}},t.controllers.radar=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,linkScales:e.noop,addElementAndReset:function(e){t.DatasetController.prototype.addElementAndReset.call(this,e),this.updateBezierControlPoints()},update:function(t){var i=this.getMeta(),a=i.dataset,o=i.data,n=a.custom||{},r=this.getDataset(),s=this.chart.options.elements.line,l=this.chart.scale;void 0!==r.tension&&void 0===r.lineTension&&(r.lineTension=r.tension),e.extend(i.dataset,{_datasetIndex:this.index,_children:o,_loop:!0,_model:{tension:n.tension?n.tension:e.getValueOrDefault(r.lineTension,s.tension),backgroundColor:n.backgroundColor?n.backgroundColor:r.backgroundColor||s.backgroundColor,borderWidth:n.borderWidth?n.borderWidth:r.borderWidth||s.borderWidth,borderColor:n.borderColor?n.borderColor:r.borderColor||s.borderColor,fill:n.fill?n.fill:void 0!==r.fill?r.fill:s.fill,borderCapStyle:n.borderCapStyle?n.borderCapStyle:r.borderCapStyle||s.borderCapStyle,borderDash:n.borderDash?n.borderDash:r.borderDash||s.borderDash,borderDashOffset:n.borderDashOffset?n.borderDashOffset:r.borderDashOffset||s.borderDashOffset,borderJoinStyle:n.borderJoinStyle?n.borderJoinStyle:r.borderJoinStyle||s.borderJoinStyle,scaleTop:l.top,scaleBottom:l.bottom,scaleZero:l.getBasePosition()}}),i.dataset.pivot(),e.each(o,function(e,i){this.updateElement(e,i,t)},this),this.updateBezierControlPoints()},updateElement:function(t,i,a){var o=t.custom||{},n=this.getDataset(),r=this.chart.scale,s=this.chart.options.elements.point,l=r.getPointPositionForValue(i,n.data[i]);e.extend(t,{_datasetIndex:this.index,_index:i,_scale:r,_model:{x:a?r.xCenter:l.x,y:a?r.yCenter:l.y,tension:o.tension?o.tension:e.getValueOrDefault(n.tension,this.chart.options.elements.line.tension),radius:o.radius?o.radius:e.getValueAtIndexOrDefault(n.pointRadius,i,s.radius),backgroundColor:o.backgroundColor?o.backgroundColor:e.getValueAtIndexOrDefault(n.pointBackgroundColor,i,s.backgroundColor),borderColor:o.borderColor?o.borderColor:e.getValueAtIndexOrDefault(n.pointBorderColor,i,s.borderColor),borderWidth:o.borderWidth?o.borderWidth:e.getValueAtIndexOrDefault(n.pointBorderWidth,i,s.borderWidth),pointStyle:o.pointStyle?o.pointStyle:e.getValueAtIndexOrDefault(n.pointStyle,i,s.pointStyle),hitRadius:o.hitRadius?o.hitRadius:e.getValueAtIndexOrDefault(n.hitRadius,i,s.hitRadius)}}),t._model.skip=o.skip?o.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,i=this.getMeta();e.each(i.data,function(a,o){var n=a._model,r=e.splineCurve(e.previousItem(i.data,o,!0)._model,n,e.nextItem(i.data,o,!0)._model,n.tension);n.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),n.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),n.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),n.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),a.pivot()},this)},draw:function(t){var i=this.getMeta(),a=t||1;e.each(i.data,function(t,e){t.transition(a)}),i.dataset.transition(a).draw(),e.each(i.data,function(t){t.draw()})},setHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],a=t.custom||{},o=t._index,n=t._model;n.radius=a.hoverRadius?a.hoverRadius:e.getValueAtIndexOrDefault(i.pointHoverRadius,o,this.chart.options.elements.point.hoverRadius),n.backgroundColor=a.hoverBackgroundColor?a.hoverBackgroundColor:e.getValueAtIndexOrDefault(i.pointHoverBackgroundColor,o,e.getHoverColor(n.backgroundColor)),n.borderColor=a.hoverBorderColor?a.hoverBorderColor:e.getValueAtIndexOrDefault(i.pointHoverBorderColor,o,e.getHoverColor(n.borderColor)),n.borderWidth=a.hoverBorderWidth?a.hoverBorderWidth:e.getValueAtIndexOrDefault(i.pointHoverBorderWidth,o,n.borderWidth)},removeHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],a=t.custom||{},o=t._index,n=t._model,r=this.chart.options.elements.point;n.radius=a.radius?a.radius:e.getValueAtIndexOrDefault(i.radius,o,r.radius),n.backgroundColor=a.backgroundColor?a.backgroundColor:e.getValueAtIndexOrDefault(i.pointBackgroundColor,o,r.backgroundColor),n.borderColor=a.borderColor?a.borderColor:e.getValueAtIndexOrDefault(i.pointBorderColor,o,r.borderColor),n.borderWidth=a.borderWidth?a.borderWidth:e.getValueAtIndexOrDefault(i.pointBorderWidth,o,r.borderWidth)}})}},{}],21:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.animation={duration:1e3,easing:"easeOutQuart",onProgress:e.noop,onComplete:e.noop},t.Animation=t.Element.extend({currentStep:null,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,i,a){a||(t.animating=!0);for(var o=0;o<this.animations.length;++o)if(this.animations[o].chartInstance===t)return void(this.animations[o].animationObject=e);this.animations.push({chartInstance:t,animationObject:e}),1===this.animations.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var i=e.findIndex(this.animations,function(e){return e.chartInstance===t});-1!==i&&(this.animations.splice(i,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=e.requestAnimFrame.call(window,function(){t.request=null,t.startDigest()}))},startDigest:function(){var t=Date.now(),e=0;this.dropFrames>1&&(e=Math.floor(this.dropFrames),this.dropFrames=this.dropFrames%1);for(var i=0;i<this.animations.length;)null===this.animations[i].animationObject.currentStep&&(this.animations[i].animationObject.currentStep=0),this.animations[i].animationObject.currentStep+=1+e,this.animations[i].animationObject.currentStep>this.animations[i].animationObject.numSteps&&(this.animations[i].animationObject.currentStep=this.animations[i].animationObject.numSteps),this.animations[i].animationObject.render(this.animations[i].chartInstance,this.animations[i].animationObject),this.animations[i].animationObject.onAnimationProgress&&this.animations[i].animationObject.onAnimationProgress.call&&this.animations[i].animationObject.onAnimationProgress.call(this.animations[i].chartInstance,this.animations[i]),this.animations[i].animationObject.currentStep===this.animations[i].animationObject.numSteps?(this.animations[i].animationObject.onAnimationComplete&&this.animations[i].animationObject.onAnimationComplete.call&&this.animations[i].animationObject.onAnimationComplete.call(this.animations[i].chartInstance,this.animations[i]),this.animations[i].chartInstance.animating=!1,this.animations.splice(i,1)):++i;var a=Date.now(),o=(a-t)/this.frameDuration;this.dropFrames+=o,this.animations.length>0&&this.requestAnimationFrame()}}}},{}],22:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.types={},t.instances={},t.controllers={},t.Controller=function(i){return this.chart=i,this.config=i.config,this.options=this.config.options=e.configMerge(t.defaults.global,t.defaults[this.config.type],this.config.options||{}),this.id=e.uid(),Object.defineProperty(this,"data",{get:function(){return this.config.data}}),t.instances[this.id]=this,this.options.responsive&&this.resize(!0),this.initialize(),this},e.extend(t.Controller.prototype,{initialize:function(){return t.pluginService.notifyPlugins("beforeInit",[this]),this.bindEvents(),this.ensureScalesHaveIDs(),this.buildOrUpdateControllers(),this.buildScales(),this.buildSurroundingItems(),this.updateLayout(),this.resetElements(),this.initToolTip(),this.update(),t.pluginService.notifyPlugins("afterInit",[this]),this},clear:function(){return e.clear(this.chart),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var i=this.chart.canvas,a=e.getMaximumWidth(this.chart.canvas),o=this.options.maintainAspectRatio&&isNaN(this.chart.aspectRatio)===!1&&isFinite(this.chart.aspectRatio)&&0!==this.chart.aspectRatio?a/this.chart.aspectRatio:e.getMaximumHeight(this.chart.canvas),n=this.chart.width!==a||this.chart.height!==o;return n?(i.width=this.chart.width=a,i.height=this.chart.height=o,e.retinaScale(this.chart),t||(this.stop(),this.update(this.options.responsiveAnimationDuration)),this):this},ensureScalesHaveIDs:function(){var t=this.options,i=t.scales||{},a=t.scale;e.each(i.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),e.each(i.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),a&&(a.id=a.id||"scale")},buildScales:function(){var i=this,a=i.options,o=i.scales={},n=[];a.scales&&(n=n.concat((a.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category"}}),(a.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear"}}))),a.scale&&n.push({options:a.scale,dtype:"radialLinear",isDefault:!0}),e.each(n,function(a,n){var r=a.options,s=e.getValueOrDefault(r.type,a.dtype),l=t.scaleService.getScaleConstructor(s);if(l){var h=new l({id:r.id,options:r,ctx:i.chart.ctx,chart:i});o[h.id]=h,a.isDefault&&(i.scale=h)}}),t.scaleService.addScalesToLayout(this)},buildSurroundingItems:function(){this.options.title&&(this.titleBlock=new t.Title({ctx:this.chart.ctx,options:this.options.title,chart:this}),t.layoutService.addBox(this,this.titleBlock)),this.options.legend&&(this.legend=new t.Legend({ctx:this.chart.ctx,options:this.options.legend,chart:this}),t.layoutService.addBox(this,this.legend))},updateLayout:function(){t.layoutService.update(this,this.chart.width,this.chart.height)},buildOrUpdateControllers:function(){var i=[],a=[];if(e.each(this.data.datasets,function(e,o){var n=this.getDatasetMeta(o);n.type||(n.type=e.type||this.config.type),i.push(n.type),n.controller?n.controller.updateIndex(o):(n.controller=new t.controllers[n.type](this,o),a.push(n.controller))},this),i.length>1)for(var o=1;o<i.length;o++)if(i[o]!==i[o-1]){this.isCombo=!0;break}return a},resetElements:function(){e.each(this.data.datasets,function(t,e){this.getDatasetMeta(e).controller.reset()},this)},update:function(i,a){t.pluginService.notifyPlugins("beforeUpdate",[this]),this.tooltip._data=this.data;var o=this.buildOrUpdateControllers();e.each(this.data.datasets,function(t,e){this.getDatasetMeta(e).controller.buildOrUpdateElements()},this),t.layoutService.update(this,this.chart.width,this.chart.height),t.pluginService.notifyPlugins("afterScaleUpdate",[this]),e.each(o,function(t){t.reset()}),e.each(this.data.datasets,function(t,e){this.getDatasetMeta(e).controller.update()},this),t.pluginService.notifyPlugins("afterUpdate",[this]),this.render(i,a)},render:function(i,a){t.pluginService.notifyPlugins("beforeRender",[this]);var o=this.options.animation;if(o&&("undefined"!=typeof i&&0!==i||"undefined"==typeof i&&0!==o.duration)){var n=new t.Animation;n.numSteps=(i||o.duration)/16.66,n.easing=o.easing,n.render=function(t,i){var a=e.easingEffects[i.easing],o=i.currentStep/i.numSteps,n=a(o);t.draw(n,o,i.currentStep)},n.onAnimationProgress=o.onProgress,n.onAnimationComplete=o.onComplete,t.animationService.addAnimation(this,n,i,a)}else this.draw(),o&&o.onComplete&&o.onComplete.call&&o.onComplete.call(this);return this},draw:function(i){var a=i||1;this.clear(),t.pluginService.notifyPlugins("beforeDraw",[this,a]),e.each(this.boxes,function(t){t.draw(this.chartArea)},this),this.scale&&this.scale.draw();var o=this.chart.ctx;o.save(),o.beginPath(),o.rect(this.chartArea.left,this.chartArea.top,this.chartArea.right-this.chartArea.left,this.chartArea.bottom-this.chartArea.top),o.clip(),e.each(this.data.datasets,function(t,e){this.isDatasetVisible(e)&&this.getDatasetMeta(e).controller.draw(i)},this,!0),o.restore(),this.tooltip.transition(a).draw(),t.pluginService.notifyPlugins("afterDraw",[this,a])},getElementAtEvent:function(t){var i=e.getRelativePosition(t,this.chart),a=[];return e.each(this.data.datasets,function(t,o){if(this.isDatasetVisible(o)){var n=this.getDatasetMeta(o);e.each(n.data,function(t,e){
-return t.inRange(i.x,i.y)?(a.push(t),a):void 0})}},this),a},getElementsAtEvent:function(t){var i=e.getRelativePosition(t,this.chart),a=[],o=function(){if(this.data.datasets)for(var t=0;t<this.data.datasets.length;t++){var e=this.getDatasetMeta(t);if(this.isDatasetVisible(t))for(var a=0;a<e.data.length;a++)if(e.data[a].inRange(i.x,i.y))return e.data[a]}}.call(this);return o?(e.each(this.data.datasets,function(t,e){if(this.isDatasetVisible(e)){var i=this.getDatasetMeta(e);a.push(i.data[o._index])}},this),a):a},getElementsAtEventForMode:function(t,e){var i=this;switch(e){case"single":return i.getElementAtEvent(t);case"label":return i.getElementsAtEvent(t);case"dataset":return i.getDatasetAtEvent(t);default:return t}},getDatasetAtEvent:function(t){var e=this.getElementAtEvent(t);return e.length>0&&(e=this.getDatasetMeta(e[0]._datasetIndex).data),e},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var i=e._meta[this.id];return i||(i=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,i=this.data.datasets.length;i>e;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroy:function(){this.clear(),e.unbindEvents(this,this.events),e.removeResizeListener(this.chart.canvas.parentNode);var i=this.chart.canvas;i.width=this.chart.width,i.height=this.chart.height,void 0!==this.chart.originalDevicePixelRatio&&this.chart.ctx.scale(1/this.chart.originalDevicePixelRatio,1/this.chart.originalDevicePixelRatio),i.style.width=this.chart.originalCanvasStyleWidth,i.style.height=this.chart.originalCanvasStyleHeight,t.pluginService.notifyPlugins("destroy",[this]),delete t.instances[this.id]},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)},initToolTip:function(){this.tooltip=new t.Tooltip({_chart:this.chart,_chartInstance:this,_data:this.data,_options:this.options},this)},bindEvents:function(){e.bindEvents(this,this.options.events,function(t){this.eventHandler(t)})},updateHoverStyle:function(t,e,i){var a,o,n,r=i?"setHoverStyle":"removeHoverStyle";switch(e){case"single":t=[t[0]];break;case"label":case"dataset":break;default:return}for(o=0,n=t.length;n>o;++o)a=t[o],a&&this.getDatasetMeta(a._datasetIndex).controller[r](a)},eventHandler:function(t){var i=this,a=i.tooltip,o=i.options||{},n=o.hover,r=o.tooltips;return i.lastActive=i.lastActive||[],i.lastTooltipActive=i.lastTooltipActive||[],"mouseout"===t.type?(i.active=[],i.tooltipActive=[]):(i.active=i.getElementsAtEventForMode(t,n.mode),i.tooltipActive=i.getElementsAtEventForMode(t,r.mode)),n.onHover&&n.onHover.call(i,i.active),("mouseup"===t.type||"click"===t.type)&&(o.onClick&&o.onClick.call(i,t,i.active),i.legend&&i.legend.handleEvent&&i.legend.handleEvent(t)),i.lastActive.length&&i.updateHoverStyle(i.lastActive,n.mode,!1),i.active.length&&n.mode&&i.updateHoverStyle(i.active,n.mode,!0),(r.enabled||r.custom)&&(a.initialize(),a._active=i.tooltipActive,a.update(!0)),a.pivot(),i.animating||e.arrayEquals(i.active,i.lastActive)&&e.arrayEquals(i.tooltipActive,i.lastTooltipActive)||(i.stop(),(r.enabled||r.custom)&&a.update(!0),i.render(n.animationDuration,!0)),i.lastActive=i.active,i.lastTooltipActive=i.tooltipActive,i}})}},{}],23:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i=e.noop;t.DatasetController=function(t,e){this.initialize.call(this,t,e)},e.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){this.chart=t,this.index=e,this.linkScales(),this.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this.getMeta(),e=this.getDataset();null===t.xAxisID&&(t.xAxisID=e.xAxisID||this.chart.options.scales.xAxes[0].id),null===t.yAxisID&&(t.yAxisID=e.yAxisID||this.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,i=e.dataElementType;return i&&new i({_chart:e.chart.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,i=this,a=i.getMeta(),o=i.getDataset().data||[],n=a.data;for(t=0,e=o.length;e>t;++t)n[t]=n[t]||i.createMetaData(a,t);a.dataset=a.dataset||i.createMetaDataset()},addElementAndReset:function(t){var e=this,i=e.createMetaData(t);e.getMeta().data.splice(t,0,i),e.updateElement(i,t,!0)},buildOrUpdateElements:function(){var t=this.getMeta(),e=t.data,i=this.getDataset().data.length,a=e.length;if(a>i)e.splice(i,a-i);else if(i>a)for(var o=a;i>o;++o)this.addElementAndReset(o)},update:i,draw:function(t){var i=t||1;e.each(this.getMeta().data,function(t,e){t.transition(i).draw()})},removeHoverStyle:function(t,i){var a=this.chart.data.datasets[t._datasetIndex],o=t._index,n=t.custom||{},r=e.getValueAtIndexOrDefault,s=(e.color,t._model);s.backgroundColor=n.backgroundColor?n.backgroundColor:r(a.backgroundColor,o,i.backgroundColor),s.borderColor=n.borderColor?n.borderColor:r(a.borderColor,o,i.borderColor),s.borderWidth=n.borderWidth?n.borderWidth:r(a.borderWidth,o,i.borderWidth)},setHoverStyle:function(t){var i=this.chart.data.datasets[t._datasetIndex],a=t._index,o=t.custom||{},n=e.getValueAtIndexOrDefault,r=(e.color,e.getHoverColor),s=t._model;s.backgroundColor=o.hoverBackgroundColor?o.hoverBackgroundColor:n(i.hoverBackgroundColor,a,r(s.backgroundColor)),s.borderColor=o.hoverBorderColor?o.hoverBorderColor:n(i.hoverBorderColor,a,r(s.borderColor)),s.borderWidth=o.hoverBorderWidth?o.hoverBorderWidth:n(i.hoverBorderWidth,a,s.borderWidth)}}),t.DatasetController.extend=e.inherits}},{}],24:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.elements={},t.Element=function(t){e.extend(this,t),this.initialize.apply(this,arguments)},e.extend(t.Element.prototype,{initialize:function(){this.hidden=!1},pivot:function(){return this._view||(this._view=e.clone(this._model)),this._start=e.clone(this._view),this},transition:function(t){return this._view||(this._view=e.clone(this._model)),1===t?(this._view=this._model,this._start=null,this):(this._start||this.pivot(),e.each(this._model,function(i,a){if("_"===a[0]);else if(this._view.hasOwnProperty(a))if(i===this._view[a]);else if("string"==typeof i)try{var o=e.color(this._model[a]).mix(e.color(this._start[a]),t);this._view[a]=o.rgbString()}catch(n){this._view[a]=i}else if("number"==typeof i){var r=void 0!==this._start[a]&&isNaN(this._start[a])===!1?this._start[a]:0;this._view[a]=(this._model[a]-r)*t+r}else this._view[a]=i;else"number"!=typeof i||isNaN(this._view[a])?this._view[a]=i:this._view[a]=i*t},this),this)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return e.isNumber(this._model.x)&&e.isNumber(this._model.y)}}),t.Element.extend=e.inherits}},{}],25:[function(t,e,i){"use strict";var a=t("chartjs-color");e.exports=function(t){function e(t,e,i){var a;return"string"==typeof t?(a=parseInt(t,10),-1!=t.indexOf("%")&&(a=a/100*e.parentNode[i])):a=t,a}function i(t){return void 0!==t&&null!==t&&"none"!==t}function o(t,a,o){var n=document.defaultView,r=t.parentNode,s=n.getComputedStyle(t)[a],l=n.getComputedStyle(r)[a],h=i(s),d=i(l),c=Number.POSITIVE_INFINITY;return h||d?Math.min(h?e(s,t,o):c,d?e(l,r,o):c):"none"}var n=t.helpers={};n.each=function(t,e,i,a){var o,r;if(n.isArray(t))if(r=t.length,a)for(o=r-1;o>=0;o--)e.call(i,t[o],o);else for(o=0;r>o;o++)e.call(i,t[o],o);else if("object"==typeof t){var s=Object.keys(t);for(r=s.length,o=0;r>o;o++)e.call(i,t[s[o]],s[o])}},n.clone=function(t){var e={};return n.each(t,function(t,i){n.isArray(t)?e[i]=t.slice(0):"object"==typeof t&&null!==t?e[i]=n.clone(t):e[i]=t}),e},n.extend=function(t){for(var e=arguments.length,i=[],a=1;e>a;a++)i.push(arguments[a]);return n.each(i,function(e){n.each(e,function(e,i){t[i]=e})}),t},n.configMerge=function(e){var i=n.clone(e);return n.each(Array.prototype.slice.call(arguments,1),function(e){n.each(e,function(e,a){if("scales"===a)i[a]=n.scaleMerge(i.hasOwnProperty(a)?i[a]:{},e);else if("scale"===a)i[a]=n.configMerge(i.hasOwnProperty(a)?i[a]:{},t.scaleService.getScaleDefaults(e.type),e);else if(i.hasOwnProperty(a)&&n.isArray(i[a])&&n.isArray(e)){var o=i[a];n.each(e,function(t,e){e<o.length?"object"==typeof o[e]&&null!==o[e]&&"object"==typeof t&&null!==t?o[e]=n.configMerge(o[e],t):o[e]=t:o.push(t)})}else i.hasOwnProperty(a)&&"object"==typeof i[a]&&null!==i[a]&&"object"==typeof e?i[a]=n.configMerge(i[a],e):i[a]=e})}),i},n.extendDeep=function(t){function e(t){return n.each(arguments,function(i){i!==t&&n.each(i,function(i,a){t[a]&&t[a].constructor&&t[a].constructor===Object?e(t[a],i):t[a]=i})}),t}return e.apply(this,arguments)},n.scaleMerge=function(e,i){var a=n.clone(e);return n.each(i,function(e,i){"xAxes"===i||"yAxes"===i?a.hasOwnProperty(i)?n.each(e,function(e,o){var r=n.getValueOrDefault(e.type,"xAxes"===i?"category":"linear"),s=t.scaleService.getScaleDefaults(r);o>=a[i].length||!a[i][o].type?a[i].push(n.configMerge(s,e)):e.type&&e.type!==a[i][o].type?a[i][o]=n.configMerge(a[i][o],s,e):a[i][o]=n.configMerge(a[i][o],e)}):(a[i]=[],n.each(e,function(e){var o=n.getValueOrDefault(e.type,"xAxes"===i?"category":"linear");a[i].push(n.configMerge(t.scaleService.getScaleDefaults(o),e))})):a.hasOwnProperty(i)&&"object"==typeof a[i]&&null!==a[i]&&"object"==typeof e?a[i]=n.configMerge(a[i],e):a[i]=e}),a},n.getValueAtIndexOrDefault=function(t,e,i){return void 0===t||null===t?i:n.isArray(t)?e<t.length?t[e]:i:t},n.getValueOrDefault=function(t,e){return void 0===t?e:t},n.indexOf=function(t,e){if(Array.prototype.indexOf)return t.indexOf(e);for(var i=0;i<t.length;i++)if(t[i]===e)return i;return-1},n.where=function(t,e){if(n.isArray(t)&&Array.prototype.filter)return t.filter(e);var i=[];return n.each(t,function(t){e(t)&&i.push(t)}),i},n.findIndex=function(t,e,i){var a=-1;if(Array.prototype.findIndex)a=t.findIndex(e,i);else for(var o=0;o<t.length;++o)if(i=void 0!==i?i:t,e.call(i,t[o],o,t)){a=o;break}return a},n.findNextWhere=function(t,e,i){(void 0===i||null===i)&&(i=-1);for(var a=i+1;a<t.length;a++){var o=t[a];if(e(o))return o}},n.findPreviousWhere=function(t,e,i){(void 0===i||null===i)&&(i=t.length);for(var a=i-1;a>=0;a--){var o=t[a];if(e(o))return o}},n.inherits=function(t){var e=this,i=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},a=function(){this.constructor=i};return a.prototype=e.prototype,i.prototype=new a,i.extend=n.inherits,t&&n.extend(i.prototype,t),i.__super__=e.prototype,i},n.noop=function(){},n.uid=function(){var t=0;return function(){return t++}}(),n.warn=function(t){console&&"function"==typeof console.warn&&console.warn(t)},n.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},n.almostEquals=function(t,e,i){return Math.abs(t-e)<i},n.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},n.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},n.sign=function(t){return Math.sign?Math.sign(t):(t=+t,0===t||isNaN(t)?t:t>0?1:-1)},n.log10=function(t){return Math.log10?Math.log10(t):Math.log(t)/Math.LN10},n.toRadians=function(t){return t*(Math.PI/180)},n.toDegrees=function(t){return t*(180/Math.PI)},n.getAngleFromPoint=function(t,e){var i=e.x-t.x,a=e.y-t.y,o=Math.sqrt(i*i+a*a),n=Math.atan2(a,i);return n<-.5*Math.PI&&(n+=2*Math.PI),{angle:n,distance:o}},n.aliasPixel=function(t){return t%2===0?0:.5},n.splineCurve=function(t,e,i,a){var o=t.skip?e:t,n=e,r=i.skip?e:i,s=Math.sqrt(Math.pow(n.x-o.x,2)+Math.pow(n.y-o.y,2)),l=Math.sqrt(Math.pow(r.x-n.x,2)+Math.pow(r.y-n.y,2)),h=s/(s+l),d=l/(s+l);h=isNaN(h)?0:h,d=isNaN(d)?0:d;var c=a*h,u=a*d;return{previous:{x:n.x-c*(r.x-o.x),y:n.y-c*(r.y-o.y)},next:{x:n.x+u*(r.x-o.x),y:n.y+u*(r.y-o.y)}}},n.nextItem=function(t,e,i){return i?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},n.previousItem=function(t,e,i){return i?0>=e?t[t.length-1]:t[e-1]:0>=e?t[0]:t[e-1]},n.niceNum=function(t,e){var i,a=Math.floor(n.log10(t)),o=t/Math.pow(10,a);return i=e?1.5>o?1:3>o?2:7>o?5:10:1>=o?1:2>=o?2:5>=o?5:10,i*Math.pow(10,a)};var r=n.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,i=0,a=1;return 0===t?0:1===(t/=1)?1:(i||(i=.3),a<Math.abs(1)?(a=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/a),-(a*Math.pow(2,10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/i)))},easeOutElastic:function(t){var e=1.70158,i=0,a=1;return 0===t?0:1===(t/=1)?1:(i||(i=.3),a<Math.abs(1)?(a=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/a),a*Math.pow(2,-10*t)*Math.sin((1*t-e)*(2*Math.PI)/i)+1)},easeInOutElastic:function(t){var e=1.70158,i=0,a=1;return 0===t?0:2===(t/=.5)?1:(i||(i=1*(.3*1.5)),a<Math.abs(1)?(a=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/a),1>t?-.5*(a*Math.pow(2,10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/i)):a*Math.pow(2,-10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/i)*.5+1)},easeInBack:function(t){var e=1.70158;return 1*(t/=1)*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return 1*((t=t/1-1)*t*((e+1)*t+e)+1)},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?.5*(t*t*(((e*=1.525)+1)*t-e)):.5*((t-=2)*t*(((e*=1.525)+1)*t+e)+2)},easeInBounce:function(t){return 1-r.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?1*(7.5625*t*t):2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*r.easeInBounce(2*t):.5*r.easeOutBounce(2*t-1)+.5}};n.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),n.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),n.getRelativePosition=function(t,e){var i,a,o=t.originalEvent||t,r=t.currentTarget||t.srcElement,s=r.getBoundingClientRect(),l=o.touches;l&&l.length>0?(i=l[0].clientX,a=l[0].clientY):(i=o.clientX,a=o.clientY);var h=parseFloat(n.getStyle(r,"padding-left")),d=parseFloat(n.getStyle(r,"padding-top")),c=parseFloat(n.getStyle(r,"padding-right")),u=parseFloat(n.getStyle(r,"padding-bottom")),f=s.right-s.left-h-c,g=s.bottom-s.top-d-u;return i=Math.round((i-s.left-h)/f*r.width/e.currentDevicePixelRatio),a=Math.round((a-s.top-d)/g*r.height/e.currentDevicePixelRatio),{x:i,y:a}},n.addEvent=function(t,e,i){t.addEventListener?t.addEventListener(e,i):t.attachEvent?t.attachEvent("on"+e,i):t["on"+e]=i},n.removeEvent=function(t,e,i){t.removeEventListener?t.removeEventListener(e,i,!1):t.detachEvent?t.detachEvent("on"+e,i):t["on"+e]=n.noop},n.bindEvents=function(t,e,i){var a=t.events=t.events||{};n.each(e,function(e){a[e]=function(){i.apply(t,arguments)},n.addEvent(t.chart.canvas,e,a[e])})},n.unbindEvents=function(t,e){var i=t.chart.canvas;n.each(e,function(t,e){n.removeEvent(i,e,t)})},n.getConstraintWidth=function(t){return o(t,"max-width","clientWidth")},n.getConstraintHeight=function(t){return o(t,"max-height","clientHeight")},n.getMaximumWidth=function(t){var e=t.parentNode,i=parseInt(n.getStyle(e,"padding-left"))+parseInt(n.getStyle(e,"padding-right")),a=e.clientWidth-i,o=n.getConstraintWidth(t);return isNaN(o)?a:Math.min(a,o)},n.getMaximumHeight=function(t){var e=t.parentNode,i=parseInt(n.getStyle(e,"padding-top"))+parseInt(n.getStyle(e,"padding-bottom")),a=e.clientHeight-i,o=n.getConstraintHeight(t);return isNaN(o)?a:Math.min(a,o)},n.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},n.retinaScale=function(t){var e=t.ctx,i=t.canvas,a=i.width,o=i.height,n=t.currentDevicePixelRatio=window.devicePixelRatio||1;1!==n&&(i.height=o*n,i.width=a*n,e.scale(n,n),t.originalDevicePixelRatio=t.originalDevicePixelRatio||n),i.style.width=a+"px",i.style.height=o+"px"},n.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},n.fontString=function(t,e,i){return e+" "+t+"px "+i},n.longestText=function(t,e,i,a){a=a||{};var o=a.data=a.data||{},r=a.garbageCollect=a.garbageCollect||[];a.font!==e&&(o=a.data={},r=a.garbageCollect=[],a.font=e),t.font=e;var s=0;n.each(i,function(e){if(void 0!==e&&null!==e){var i=o[e];i||(i=o[e]=t.measureText(e).width,r.push(e)),i>s&&(s=i)}});var l=r.length/2;if(l>i.length){for(var h=0;l>h;h++)delete o[r[h]];r.splice(0,l)}return s},n.drawRoundedRectangle=function(t,e,i,a,o,n){t.beginPath(),t.moveTo(e+n,i),t.lineTo(e+a-n,i),t.quadraticCurveTo(e+a,i,e+a,i+n),t.lineTo(e+a,i+o-n),t.quadraticCurveTo(e+a,i+o,e+a-n,i+o),t.lineTo(e+n,i+o),t.quadraticCurveTo(e,i+o,e,i+o-n),t.lineTo(e,i+n),t.quadraticCurveTo(e,i,e+n,i),t.closePath()},n.color=function(e){return a?a(e instanceof CanvasGradient?t.defaults.global.defaultColor:e):(console.log("Color.js not found!"),e)},n.addResizeListener=function(t,e){var i=document.createElement("iframe"),a="chartjs-hidden-iframe";i.classlist?i.classlist.add(a):i.setAttribute("class",a);var o=i.style;o.width="100%",o.display="block",o.border=0,o.height=0,o.margin=0,o.position="absolute",o.left=0,o.right=0,o.top=0,o.bottom=0,t.insertBefore(i,t.firstChild),(i.contentWindow||i).onresize=function(){e&&e()}},n.removeResizeListener=function(t){var e=t.querySelector(".chartjs-hidden-iframe");e&&e.parentNode.removeChild(e)},n.isArray=function(t){return Array.isArray?Array.isArray(t):"[object Array]"===Object.prototype.toString.call(t)},n.arrayEquals=function(t,e){var i,a,o,r;if(!t||!e||t.length!=e.length)return!1;for(i=0,a=t.length;a>i;++i)if(o=t[i],r=e[i],o instanceof Array&&r instanceof Array){if(!n.arrayEquals(o,r))return!1}else if(o!=r)return!1;return!0},n.pushAllIfDefined=function(t,e){"undefined"!=typeof t&&(n.isArray(t)?e.push.apply(e,t):e.push(t))},n.callCallback=function(t,e,i){t&&"function"==typeof t.call&&t.apply(i,e)},n.getHoverColor=function(t){return t instanceof CanvasPattern?t:n.color(t).saturate(.5).darken(.1).rgbString()}}},{"chartjs-color":3}],26:[function(t,e,i){"use strict";e.exports=function(){var t=function(e,i){this.config=i,e.length&&e[0].getContext&&(e=e[0]),e.getContext&&(e=e.getContext("2d")),this.ctx=e,this.canvas=e.canvas,this.width=e.canvas.width||parseInt(t.helpers.getStyle(e.canvas,"width"))||t.helpers.getMaximumWidth(e.canvas),this.height=e.canvas.height||parseInt(t.helpers.getStyle(e.canvas,"height"))||t.helpers.getMaximumHeight(e.canvas),this.aspectRatio=this.width/this.height,(isNaN(this.aspectRatio)||isFinite(this.aspectRatio)===!1)&&(this.aspectRatio=void 0!==i.aspectRatio?i.aspectRatio:2),this.originalCanvasStyleWidth=e.canvas.style.width,this.originalCanvasStyleHeight=e.canvas.style.height,t.helpers.retinaScale(this),i&&(this.controller=new t.Controller(this));var a=this;return t.helpers.addResizeListener(e.canvas.parentNode,function(){a.controller&&a.controller.config.options.responsive&&a.controller.resize()}),this.controller?this.controller:this};return t.defaults={global:{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"single",animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');for(var i=0;i<t.data.datasets.length;i++)e.push('<li><span style="background-color:'+t.data.datasets[i].backgroundColor+'"></span>'),t.data.datasets[i].label&&e.push(t.data.datasets[i].label),e.push("</li>");return e.push("</ul>"),e.join("")}}},t}},{}],27:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),t.boxes.push(e)},removeBox:function(t,e){t.boxes&&t.boxes.splice(t.boxes.indexOf(e),1)},update:function(t,i,a){function o(t){var e,i=t.isHorizontal();i?(e=t.update(t.options.fullWidth?p:k,y),S-=e.height):(e=t.update(x,v),k-=e.width),C.push({horizontal:i,minSize:e,box:t})}function n(t){var i=e.findNextWhere(C,function(e){return e.box===t});if(i)if(t.isHorizontal()){var a={left:w,right:M,top:0,bottom:0};t.update(t.options.fullWidth?p:k,m/2,a)}else t.update(i.minSize.width,S)}function r(t){var i=e.findNextWhere(C,function(e){return e.box===t}),a={left:0,right:0,top:D,bottom:A};i&&t.update(i.minSize.width,S,a)}function s(t){t.isHorizontal()?(t.left=t.options.fullWidth?l:w,t.right=t.options.fullWidth?i-l:w+k,t.top=P,t.bottom=P+t.height,P=t.bottom):(t.left=_,t.right=_+t.width,t.top=D,t.bottom=D+S,_=t.right)}if(t){var l=0,h=0,d=e.where(t.boxes,function(t){return"left"===t.options.position}),c=e.where(t.boxes,function(t){return"right"===t.options.position}),u=e.where(t.boxes,function(t){return"top"===t.options.position}),f=e.where(t.boxes,function(t){return"bottom"===t.options.position}),g=e.where(t.boxes,function(t){return"chartArea"===t.options.position});u.sort(function(t,e){return(e.options.fullWidth?1:0)-(t.options.fullWidth?1:0)}),f.sort(function(t,e){return(t.options.fullWidth?1:0)-(e.options.fullWidth?1:0)});var p=i-2*l,m=a-2*h,b=p/2,v=m/2,x=(i-b)/(d.length+c.length),y=(a-v)/(u.length+f.length),k=p,S=m,C=[];e.each(d.concat(c,u,f),o);var w=l,M=l,D=h,A=h;e.each(d.concat(c),n),e.each(d,function(t){w+=t.width}),e.each(c,function(t){M+=t.width}),e.each(u.concat(f),n),e.each(u,function(t){D+=t.height}),e.each(f,function(t){A+=t.height}),e.each(d.concat(c),r),w=l,M=l,D=h,A=h,e.each(d,function(t){w+=t.width}),e.each(c,function(t){M+=t.width}),e.each(u,function(t){D+=t.height}),e.each(f,function(t){A+=t.height});var I=a-D-A,F=i-w-M;(F!==k||I!==S)&&(e.each(d,function(t){t.height=I}),e.each(c,function(t){t.height=I}),e.each(u,function(t){t.options.fullWidth||(t.width=F)}),e.each(f,function(t){t.options.fullWidth||(t.width=F)}),S=I,k=F);var _=l,P=h;e.each(d.concat(u),s),_+=k,P+=S,e.each(c,s),e.each(f,s),t.chartArea={left:w,top:D,right:w+k,bottom:D+S},e.each(g,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(k,S)})}}}}},{}],28:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i=e.noop;t.defaults.global.legend={display:!0,position:"top",fullWidth:!0,reverse:!1,onClick:function(t,e){var i=e.datasetIndex,a=this.chart,o=a.getDatasetMeta(i);o.hidden=null===o.hidden?!a.data.datasets[i].hidden:null,a.update()},labels:{boxWidth:40,padding:10,generateLabels:function(t){var i=t.data;return e.isArray(i.datasets)?i.datasets.map(function(e,i){return{text:e.label,fillStyle:e.backgroundColor,hidden:!t.isDatasetVisible(i),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,datasetIndex:i}},this):[]}}},t.Legend=t.Element.extend({initialize:function(t){e.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:i,update:function(t,e,i){return this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this.margins=i,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this.beforeBuildLabels(),this.buildLabels(),this.afterBuildLabels(),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate(),this.minSize},afterUpdate:i,beforeSetDimensions:i,setDimensions:function(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0,this.minSize={width:0,height:0}},afterSetDimensions:i,beforeBuildLabels:i,buildLabels:function(){this.legendItems=this.options.labels.generateLabels.call(this,this.chart),this.options.reverse&&this.legendItems.reverse()},afterBuildLabels:i,beforeFit:i,fit:function(){var i=this.options,a=i.labels,o=i.display,n=this.ctx,r=t.defaults.global,s=e.getValueOrDefault,l=s(a.fontSize,r.defaultFontSize),h=s(a.fontStyle,r.defaultFontStyle),d=s(a.fontFamily,r.defaultFontFamily),c=e.fontString(l,h,d),u=this.legendHitBoxes=[],f=this.minSize,g=this.isHorizontal();if(g?(f.width=this.maxWidth,f.height=o?10:0):(f.width=o?10:0,f.height=this.maxHeight),o&&g){var p=this.lineWidths=[0],m=this.legendItems.length?l+a.padding:0;n.textAlign="left",n.textBaseline="top",n.font=c,e.each(this.legendItems,function(t,e){var i=a.boxWidth+l/2+n.measureText(t.text).width;p[p.length-1]+i+a.padding>=this.width&&(m+=l+a.padding,p[p.length]=this.left),u[e]={left:0,top:0,width:i,height:l},p[p.length-1]+=i+a.padding},this),f.height+=m}this.width=f.width,this.height=f.height},afterFit:i,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var i=this.options,a=i.labels,o=t.defaults.global,n=o.elements.line,r=this.width,s=this.lineWidths;if(i.display){var l=this.ctx,h={x:this.left+(r-s[0])/2,y:this.top+a.padding,line:0},d=e.getValueOrDefault,c=d(a.fontColor,o.defaultFontColor),u=d(a.fontSize,o.defaultFontSize),f=d(a.fontStyle,o.defaultFontStyle),g=d(a.fontFamily,o.defaultFontFamily),p=e.fontString(u,f,g);if(this.isHorizontal()){l.textAlign="left",l.textBaseline="top",l.lineWidth=.5,l.strokeStyle=c,l.fillStyle=c,l.font=p;var m=a.boxWidth,b=this.legendHitBoxes;e.each(this.legendItems,function(t,e){var i=l.measureText(t.text).width,c=m+u/2+i,f=h.x,g=h.y;f+c>=r&&(g=h.y+=u+a.padding,h.line++,f=h.x=this.left+(r-s[h.line])/2),l.save(),l.fillStyle=d(t.fillStyle,o.defaultColor),l.lineCap=d(t.lineCap,n.borderCapStyle),l.lineDashOffset=d(t.lineDashOffset,n.borderDashOffset),l.lineJoin=d(t.lineJoin,n.borderJoinStyle),l.lineWidth=d(t.lineWidth,n.borderWidth),l.strokeStyle=d(t.strokeStyle,o.defaultColor),l.setLineDash&&l.setLineDash(d(t.lineDash,n.borderDash)),l.strokeRect(f,g,m,u),l.fillRect(f,g,m,u),l.restore(),b[e].left=f,b[e].top=g,l.fillText(t.text,m+u/2+f,g),t.hidden&&(l.beginPath(),l.lineWidth=2,l.moveTo(m+u/2+f,g+u/2),l.lineTo(m+u/2+f+i,g+u/2),l.stroke()),h.x+=c+a.padding},this)}}},handleEvent:function(t){var i=e.getRelativePosition(t,this.chart.chart),a=i.x,o=i.y,n=this.options;if(a>=this.left&&a<=this.right&&o>=this.top&&o<=this.bottom)for(var r=this.legendHitBoxes,s=0;s<r.length;++s){var l=r[s];if(a>=l.left&&a<=l.left+l.width&&o>=l.top&&o<=l.top+l.height){n.onClick&&n.onClick.call(this,t,this.legendItems[s]);break}}}})}},{}],29:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.plugins=[],t.pluginService={register:function(e){var i=t.plugins;-1===i.indexOf(e)&&i.push(e)},remove:function(e){var i=t.plugins,a=i.indexOf(e);-1!==a&&i.splice(a,1)},notifyPlugins:function(i,a,o){e.each(t.plugins,function(t){t[i]&&"function"==typeof t[i]&&t[i].apply(o,a)},o)}};var i=e.noop;t.PluginBase=t.Element.extend({beforeInit:i,afterInit:i,beforeUpdate:i,afterUpdate:i,beforeDraw:i,afterDraw:i,destroy:i})}},{}],30:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.scale={display:!0,position:"left",gridLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",offsetGridLines:!1},scaleLabel:{labelString:"",display:!1},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:10,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:function(t){return""+t}}},t.Scale=t.Element.extend({beforeUpdate:function(){e.callCallback(this.options.beforeUpdate,[this])},update:function(t,i,a){return this.beforeUpdate(),this.maxWidth=t,this.maxHeight=i,this.margins=e.extend({left:0,right:0,top:0,bottom:0},a),this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this.beforeBuildTicks(),this.buildTicks(),this.afterBuildTicks(),this.beforeTickToLabelConversion(),this.convertTicksToLabels(),this.afterTickToLabelConversion(),this.beforeCalculateTickRotation(),this.calculateTickRotation(),this.afterCalculateTickRotation(),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate(),this.minSize},afterUpdate:function(){e.callCallback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){e.callCallback(this.options.beforeSetDimensions,[this])},setDimensions:function(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0},afterSetDimensions:function(){e.callCallback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){e.callCallback(this.options.beforeDataLimits,[this])},determineDataLimits:e.noop,afterDataLimits:function(){e.callCallback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){e.callCallback(this.options.beforeBuildTicks,[this])},buildTicks:e.noop,afterBuildTicks:function(){e.callCallback(this.options.afterBuildTicks,[this])},beforeTickToLabelConversion:function(){e.callCallback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){this.ticks=this.ticks.map(function(t,e,i){return this.options.ticks.userCallback?this.options.ticks.userCallback(t,e,i):this.options.ticks.callback(t,e,i)},this)},afterTickToLabelConversion:function(){e.callCallback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){e.callCallback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var i=this.ctx,a=t.defaults.global,o=this.options.ticks,n=e.getValueOrDefault(o.fontSize,a.defaultFontSize),r=e.getValueOrDefault(o.fontStyle,a.defaultFontStyle),s=e.getValueOrDefault(o.fontFamily,a.defaultFontFamily),l=e.fontString(n,r,s);i.font=l;var h,d=i.measureText(this.ticks[0]).width,c=i.measureText(this.ticks[this.ticks.length-1]).width;if(this.labelRotation=o.minRotation||0,this.paddingRight=0,this.paddingLeft=0,this.options.display&&this.isHorizontal()){this.paddingRight=c/2+3,this.paddingLeft=d/2+3,this.longestTextCache||(this.longestTextCache={});for(var u,f,g=e.longestText(i,l,this.ticks,this.longestTextCache),p=g,m=this.getPixelForTick(1)-this.getPixelForTick(0)-6;p>m&&this.labelRotation<o.maxRotation;){
-if(u=Math.cos(e.toRadians(this.labelRotation)),f=Math.sin(e.toRadians(this.labelRotation)),h=u*d,h+n/2>this.yLabelWidth&&(this.paddingLeft=h+n/2),this.paddingRight=n/2,f*g>this.maxHeight){this.labelRotation--;break}this.labelRotation++,p=u*g}}this.margins&&(this.paddingLeft=Math.max(this.paddingLeft-this.margins.left,0),this.paddingRight=Math.max(this.paddingRight-this.margins.right,0))},afterCalculateTickRotation:function(){e.callCallback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){e.callCallback(this.options.beforeFit,[this])},fit:function(){var i=this.minSize={width:0,height:0},a=this.options,o=t.defaults.global,n=a.ticks,r=a.scaleLabel,s=a.display,l=this.isHorizontal(),h=e.getValueOrDefault(n.fontSize,o.defaultFontSize),d=e.getValueOrDefault(n.fontStyle,o.defaultFontStyle),c=e.getValueOrDefault(n.fontFamily,o.defaultFontFamily),u=e.fontString(h,d,c),f=e.getValueOrDefault(r.fontSize,o.defaultFontSize),g=e.getValueOrDefault(r.fontStyle,o.defaultFontStyle),p=e.getValueOrDefault(r.fontFamily,o.defaultFontFamily),m=(e.fontString(f,g,p),a.gridLines.tickMarkLength);if(l?i.width=this.isFullWidth()?this.maxWidth-this.margins.left-this.margins.right:this.maxWidth:i.width=s?m:0,l?i.height=s?m:0:i.height=this.maxHeight,r.display&&s&&(l?i.height+=1.5*f:i.width+=1.5*f),n.display&&s){this.longestTextCache||(this.longestTextCache={});var b=e.longestText(this.ctx,u,this.ticks,this.longestTextCache);if(l){this.longestLabelWidth=b;var v=Math.sin(e.toRadians(this.labelRotation))*this.longestLabelWidth+1.5*h;i.height=Math.min(this.maxHeight,i.height+v),this.ctx.font=u;var x=this.ctx.measureText(this.ticks[0]).width,y=this.ctx.measureText(this.ticks[this.ticks.length-1]).width,k=Math.cos(e.toRadians(this.labelRotation)),S=Math.sin(e.toRadians(this.labelRotation));this.paddingLeft=0!==this.labelRotation?k*x+3:x/2+3,this.paddingRight=0!==this.labelRotation?S*(h/2)+3:y/2+3}else{var C=this.maxWidth-i.width,w=n.mirror;w?b=0:b+=this.options.ticks.padding,C>b?i.width+=b:i.width=this.maxWidth,this.paddingTop=h/2,this.paddingBottom=h/2}}this.margins&&(this.paddingLeft=Math.max(this.paddingLeft-this.margins.left,0),this.paddingTop=Math.max(this.paddingTop-this.margins.top,0),this.paddingRight=Math.max(this.paddingRight-this.margins.right,0),this.paddingBottom=Math.max(this.paddingBottom-this.margins.bottom,0)),this.width=i.width,this.height=i.height},afterFit:function(){e.callCallback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function i(t){return null===t||"undefined"==typeof t?NaN:"number"==typeof t&&isNaN(t)?NaN:"object"==typeof t?t instanceof Date||t.isValid?t:i(this.isHorizontal()?t.x:t.y):t},getLabelForIndex:e.noop,getPixelForValue:e.noop,getValueForPixel:e.noop,getPixelForTick:function(t,e){if(this.isHorizontal()){var i=this.width-(this.paddingLeft+this.paddingRight),a=i/Math.max(this.ticks.length-(this.options.gridLines.offsetGridLines?0:1),1),o=a*t+this.paddingLeft;e&&(o+=a/2);var n=this.left+Math.round(o);return n+=this.isFullWidth()?this.margins.left:0}var r=this.height-(this.paddingTop+this.paddingBottom);return this.top+t*(r/(this.ticks.length-1))},getPixelForDecimal:function(t){if(this.isHorizontal()){var e=this.width-(this.paddingLeft+this.paddingRight),i=e*t+this.paddingLeft,a=this.left+Math.round(i);return a+=this.isFullWidth()?this.margins.left:0}return this.top+t*this.height},getBasePixel:function(){var t=this,e=t.min,i=t.max;return t.getPixelForValue(t.beginAtZero?0:0>e&&0>i?i:e>0&&i>0?e:0)},draw:function(i){var a=this.options;if(a.display){var o,n,r,s,l,h=this.ctx,d=t.defaults.global,c=a.ticks,u=a.gridLines,f=a.scaleLabel,g=0!==this.labelRotation,p=c.autoSkip;c.maxTicksLimit&&(l=c.maxTicksLimit);var m=e.getValueOrDefault(c.fontColor,d.defaultFontColor),b=e.getValueOrDefault(c.fontSize,d.defaultFontSize),v=e.getValueOrDefault(c.fontStyle,d.defaultFontStyle),x=e.getValueOrDefault(c.fontFamily,d.defaultFontFamily),y=e.fontString(b,v,x),k=u.tickMarkLength,S=e.getValueOrDefault(f.fontColor,d.defaultFontColor),C=e.getValueOrDefault(f.fontSize,d.defaultFontSize),w=e.getValueOrDefault(f.fontStyle,d.defaultFontStyle),M=e.getValueOrDefault(f.fontFamily,d.defaultFontFamily),D=e.fontString(C,w,M),A=e.toRadians(this.labelRotation),I=Math.cos(A),F=(Math.sin(A),this.longestLabelWidth*I);if(h.fillStyle=m,this.isHorizontal()){o=!0;var _="bottom"===a.position?this.top:this.bottom-k,P="bottom"===a.position?this.top+k:this.bottom;if(n=!1,g&&(F/=2),(F+c.autoSkipPadding)*this.ticks.length>this.width-(this.paddingLeft+this.paddingRight)&&(n=1+Math.floor((F+c.autoSkipPadding)*this.ticks.length/(this.width-(this.paddingLeft+this.paddingRight)))),l&&this.ticks.length>l)for(;!n||this.ticks.length/(n||1)>l;)n||(n=1),n+=1;p||(n=!1),e.each(this.ticks,function(t,r){var s=this.ticks.length===r+1,l=n>1&&r%n>0||r%n===0&&r+n>=this.ticks.length;if((!l||s)&&void 0!==t&&null!==t){var d=this.getPixelForTick(r),f=this.getPixelForTick(r,u.offsetGridLines);u.display&&(r===("undefined"!=typeof this.zeroLineIndex?this.zeroLineIndex:0)?(h.lineWidth=u.zeroLineWidth,h.strokeStyle=u.zeroLineColor,o=!0):o&&(h.lineWidth=u.lineWidth,h.strokeStyle=u.color,o=!1),d+=e.aliasPixel(h.lineWidth),h.beginPath(),u.drawTicks&&(h.moveTo(d,_),h.lineTo(d,P)),u.drawOnChartArea&&(h.moveTo(d,i.top),h.lineTo(d,i.bottom)),h.stroke()),c.display&&(h.save(),h.translate(f+c.labelOffset,g?this.top+12:"top"===a.position?this.bottom-k:this.top+k),h.rotate(-1*A),h.font=y,h.textAlign=g?"right":"center",h.textBaseline=g?"middle":"top"===a.position?"bottom":"top",h.fillText(t,0,0),h.restore())}},this),f.display&&(h.textAlign="center",h.textBaseline="middle",h.fillStyle=S,h.font=D,r=this.left+(this.right-this.left)/2,s="bottom"===a.position?this.bottom-C/2:this.top+C/2,h.fillText(f.labelString,r,s))}else{o=!0;var T="right"===a.position?this.left:this.right-5,V="right"===a.position?this.left+5:this.right;if(e.each(this.ticks,function(t,n){if(void 0!==t&&null!==t){var r=this.getPixelForTick(n);if(u.display&&(n===("undefined"!=typeof this.zeroLineIndex?this.zeroLineIndex:0)?(h.lineWidth=u.zeroLineWidth,h.strokeStyle=u.zeroLineColor,o=!0):o&&(h.lineWidth=u.lineWidth,h.strokeStyle=u.color,o=!1),r+=e.aliasPixel(h.lineWidth),h.beginPath(),u.drawTicks&&(h.moveTo(T,r),h.lineTo(V,r)),u.drawOnChartArea&&(h.moveTo(i.left,r),h.lineTo(i.right,r)),h.stroke()),c.display){var s,l=this.getPixelForTick(n,u.offsetGridLines);h.save(),"left"===a.position?c.mirror?(s=this.right+c.padding,h.textAlign="left"):(s=this.right-c.padding,h.textAlign="right"):c.mirror?(s=this.left-c.padding,h.textAlign="right"):(s=this.left+c.padding,h.textAlign="left"),h.translate(s,l+c.labelOffset),h.rotate(-1*A),h.font=y,h.textBaseline="middle",h.fillText(t,0,0),h.restore()}}},this),f.display){r="left"===a.position?this.left+C/2:this.right-C/2,s=this.top+(this.bottom-this.top)/2;var R="left"===a.position?-.5*Math.PI:.5*Math.PI;h.save(),h.translate(r,s),h.rotate(R),h.textAlign="center",h.fillStyle=S,h.font=D,h.textBaseline="middle",h.fillText(f.labelString,0,0),h.restore()}}if(u.drawBorder){h.lineWidth=u.lineWidth,h.strokeStyle=u.color;var O=this.left,W=this.right,L=this.top,B=this.bottom,z=e.aliasPixel(h.lineWidth);this.isHorizontal()?(L=B="top"===a.position?this.bottom:this.top,L+=z,B+=z):(O=W="left"===a.position?this.right:this.left,O+=z,W+=z),h.beginPath(),h.moveTo(O,L),h.lineTo(W,B),h.stroke()}}}})}},{}],31:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.scaleService={constructors:{},defaults:{},registerScaleType:function(t,i,a){this.constructors[t]=i,this.defaults[t]=e.clone(a)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(i){return this.defaults.hasOwnProperty(i)?e.scaleMerge(t.defaults.scale,this.defaults[i]):{}},updateScaleDefaults:function(t,i){var a=this.defaults;a.hasOwnProperty(t)&&(a[t]=e.extend(a[t],i))},addScalesToLayout:function(i){e.each(i.scales,function(e){t.layoutService.addBox(i,e)})}}}},{}],32:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.title={display:!1,position:"top",fullWidth:!0,fontStyle:"bold",padding:10,text:""};var i=e.noop;t.Title=t.Element.extend({initialize:function(i){e.extend(this,i),this.options=e.configMerge(t.defaults.global.title,i.options),this.legendHitBoxes=[]},beforeUpdate:i,update:function(t,e,i){return this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this.margins=i,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this.beforeBuildLabels(),this.buildLabels(),this.afterBuildLabels(),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate(),this.minSize},afterUpdate:i,beforeSetDimensions:i,setDimensions:function(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0,this.minSize={width:0,height:0}},afterSetDimensions:i,beforeBuildLabels:i,buildLabels:i,afterBuildLabels:i,beforeFit:i,fit:function(){var i=this,a=(i.ctx,e.getValueOrDefault),o=i.options,n=t.defaults.global,r=o.display,s=a(o.fontSize,n.defaultFontSize),l=i.minSize;i.isHorizontal()?(l.width=i.maxWidth,l.height=r?s+2*o.padding:0):(l.width=r?s+2*o.padding:0,l.height=i.maxHeight),i.width=l.width,i.height=l.height},afterFit:i,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var i=this,a=i.ctx,o=e.getValueOrDefault,n=i.options,r=t.defaults.global;if(n.display){var s,l,h=o(n.fontSize,r.defaultFontSize),d=o(n.fontStyle,r.defaultFontStyle),c=o(n.fontFamily,r.defaultFontFamily),u=e.fontString(h,d,c),f=0,g=i.top,p=i.left,m=i.bottom,b=i.right;a.fillStyle=o(n.fontColor,r.defaultFontColor),a.font=u,i.isHorizontal()?(s=p+(b-p)/2,l=g+(m-g)/2):(s="left"===n.position?p+h/2:b-h/2,l=g+(m-g)/2,f=Math.PI*("left"===n.position?-.5:.5)),a.save(),a.translate(s,l),a.rotate(f),a.textAlign="center",a.textBaseline="middle",a.fillText(n.text,0,0),a.restore()}}})}},{}],33:[function(t,e,i){"use strict";e.exports=function(t){function e(t,e){return e&&(i.isArray(e)?t=t.concat(e):t.push(e)),t}var i=t.helpers;t.defaults.global.tooltips={enabled:!0,custom:null,mode:"single",backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleColor:"#fff",titleAlign:"left",bodySpacing:2,bodyColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,yAlign:"center",xAlign:"center",caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",callbacks:{beforeTitle:i.noop,title:function(t,e){var i="";return t.length>0&&(t[0].xLabel?i=t[0].xLabel:e.labels.length>0&&t[0].index<e.labels.length&&(i=e.labels[t[0].index])),i},afterTitle:i.noop,beforeBody:i.noop,beforeLabel:i.noop,label:function(t,e){var i=e.datasets[t.datasetIndex].label||"";return i+": "+t.yLabel},afterLabel:i.noop,afterBody:i.noop,beforeFooter:i.noop,footer:i.noop,afterFooter:i.noop}},t.Tooltip=t.Element.extend({initialize:function(){var e=t.defaults.global,a=this._options,o=a.tooltips;i.extend(this,{_model:{xPadding:o.xPadding,yPadding:o.yPadding,xAlign:o.yAlign,yAlign:o.xAlign,bodyColor:o.bodyColor,_bodyFontFamily:i.getValueOrDefault(o.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:i.getValueOrDefault(o.bodyFontStyle,e.defaultFontStyle),_bodyAlign:o.bodyAlign,bodyFontSize:i.getValueOrDefault(o.bodyFontSize,e.defaultFontSize),bodySpacing:o.bodySpacing,titleColor:o.titleColor,_titleFontFamily:i.getValueOrDefault(o.titleFontFamily,e.defaultFontFamily),_titleFontStyle:i.getValueOrDefault(o.titleFontStyle,e.defaultFontStyle),titleFontSize:i.getValueOrDefault(o.titleFontSize,e.defaultFontSize),_titleAlign:o.titleAlign,titleSpacing:o.titleSpacing,titleMarginBottom:o.titleMarginBottom,footerColor:o.footerColor,_footerFontFamily:i.getValueOrDefault(o.footerFontFamily,e.defaultFontFamily),_footerFontStyle:i.getValueOrDefault(o.footerFontStyle,e.defaultFontStyle),footerFontSize:i.getValueOrDefault(o.footerFontSize,e.defaultFontSize),_footerAlign:o.footerAlign,footerSpacing:o.footerSpacing,footerMarginTop:o.footerMarginTop,caretSize:o.caretSize,cornerRadius:o.cornerRadius,backgroundColor:o.backgroundColor,opacity:0,legendColorBackground:o.multiKeyBackground}})},getTitle:function(){var t=this._options.tooltips.callbacks.beforeTitle.apply(this,arguments),i=this._options.tooltips.callbacks.title.apply(this,arguments),a=this._options.tooltips.callbacks.afterTitle.apply(this,arguments),o=[];return o=e(o,t),o=e(o,i),o=e(o,a)},getBeforeBody:function(){var t=this._options.tooltips.callbacks.beforeBody.apply(this,arguments);return i.isArray(t)?t:void 0!==t?[t]:[]},getBody:function(t,e){var a=[];return i.each(t,function(t){i.pushAllIfDefined(this._options.tooltips.callbacks.beforeLabel.call(this,t,e),a),i.pushAllIfDefined(this._options.tooltips.callbacks.label.call(this,t,e),a),i.pushAllIfDefined(this._options.tooltips.callbacks.afterLabel.call(this,t,e),a)},this),a},getAfterBody:function(){var t=this._options.tooltips.callbacks.afterBody.apply(this,arguments);return i.isArray(t)?t:void 0!==t?[t]:[]},getFooter:function(){var t=this._options.tooltips.callbacks.beforeFooter.apply(this,arguments),i=this._options.tooltips.callbacks.footer.apply(this,arguments),a=this._options.tooltips.callbacks.afterFooter.apply(this,arguments),o=[];return o=e(o,t),o=e(o,i),o=e(o,a)},getAveragePosition:function(t){if(!t.length)return!1;var e=[],a=[];i.each(t,function(t){if(t&&t.hasValue()){var i=t.tooltipPosition();e.push(i.x),a.push(i.y)}});for(var o=0,n=0,r=0;r<e.length;r++)o+=e[r],n+=a[r];return{x:Math.round(o/e.length),y:Math.round(n/e.length)}},update:function(t){if(this._active.length){this._model.opacity=1;var e,a=this._active[0],o=[],n=[];if("single"===this._options.tooltips.mode){var r=a._yScale||a._scale;n.push({xLabel:a._xScale?a._xScale.getLabelForIndex(a._index,a._datasetIndex):"",yLabel:r?r.getLabelForIndex(a._index,a._datasetIndex):"",index:a._index,datasetIndex:a._datasetIndex}),e=this.getAveragePosition(this._active)}else i.each(this._data.datasets,function(t,e){if(this._chartInstance.isDatasetVisible(e)){var i=this._chartInstance.getDatasetMeta(e),o=i.data[a._index];if(o){var r=a._yScale||a._scale;n.push({xLabel:o._xScale?o._xScale.getLabelForIndex(o._index,o._datasetIndex):"",yLabel:r?r.getLabelForIndex(o._index,o._datasetIndex):"",index:a._index,datasetIndex:e})}}},this),i.each(this._active,function(t){t&&o.push({borderColor:t._view.borderColor,backgroundColor:t._view.backgroundColor})},null),e=this.getAveragePosition(this._active);i.extend(this._model,{title:this.getTitle(n,this._data),beforeBody:this.getBeforeBody(n,this._data),body:this.getBody(n,this._data),afterBody:this.getAfterBody(n,this._data),footer:this.getFooter(n,this._data)}),i.extend(this._model,{x:Math.round(e.x),y:Math.round(e.y),caretPadding:i.getValueOrDefault(e.padding,2),labelColors:o});var s=this.getTooltipSize(this._model);this.determineAlignment(s),i.extend(this._model,this.getBackgroundPoint(this._model,s))}else this._model.opacity=0;return t&&this._options.tooltips.custom&&this._options.tooltips.custom.call(this,this._model),this},getTooltipSize:function(t){var e=this._chart.ctx,a={height:2*t.yPadding,width:0},o=t.body.length+t.beforeBody.length+t.afterBody.length;return a.height+=t.title.length*t.titleFontSize,a.height+=(t.title.length-1)*t.titleSpacing,a.height+=t.title.length?t.titleMarginBottom:0,a.height+=o*t.bodyFontSize,a.height+=o?(o-1)*t.bodySpacing:0,a.height+=t.footer.length?t.footerMarginTop:0,a.height+=t.footer.length*t.footerFontSize,a.height+=t.footer.length?(t.footer.length-1)*t.footerSpacing:0,e.font=i.fontString(t.titleFontSize,t._titleFontStyle,t._titleFontFamily),i.each(t.title,function(t){a.width=Math.max(a.width,e.measureText(t).width)}),e.font=i.fontString(t.bodyFontSize,t._bodyFontStyle,t._bodyFontFamily),i.each(t.beforeBody.concat(t.afterBody),function(t){a.width=Math.max(a.width,e.measureText(t).width)}),i.each(t.body,function(i){a.width=Math.max(a.width,e.measureText(i).width+("single"!==this._options.tooltips.mode?t.bodyFontSize+2:0))},this),e.font=i.fontString(t.footerFontSize,t._footerFontStyle,t._footerFontFamily),i.each(t.footer,function(t){a.width=Math.max(a.width,e.measureText(t).width)}),a.width+=2*t.xPadding,a},determineAlignment:function(t){this._model.y<t.height?this._model.yAlign="top":this._model.y>this._chart.height-t.height&&(this._model.yAlign="bottom");var e,i,a,o,n,r=this,s=(this._chartInstance.chartArea.left+this._chartInstance.chartArea.right)/2,l=(this._chartInstance.chartArea.top+this._chartInstance.chartArea.bottom)/2;"center"===this._model.yAlign?(e=function(t){return s>=t},i=function(t){return t>s}):(e=function(e){return e<=t.width/2},i=function(e){return e>=r._chart.width-t.width/2}),a=function(e){return e+t.width>r._chart.width},o=function(e){return e-t.width<0},n=function(t){return l>=t?"top":"bottom"},e(this._model.x)?(this._model.xAlign="left",a(this._model.x)&&(this._model.xAlign="center",this._model.yAlign=n(this._model.y))):i(this._model.x)&&(this._model.xAlign="right",o(this._model.x)&&(this._model.xAlign="center",this._model.yAlign=n(this._model.y)))},getBackgroundPoint:function(t,e){var i={x:t.x,y:t.y};return"right"===t.xAlign?i.x-=e.width:"center"===t.xAlign&&(i.x-=e.width/2),"top"===t.yAlign?i.y+=t.caretPadding+t.caretSize:"bottom"===t.yAlign?i.y-=e.height+t.caretPadding+t.caretSize:i.y-=e.height/2,"center"===t.yAlign?"left"===t.xAlign?i.x+=t.caretPadding+t.caretSize:"right"===t.xAlign&&(i.x-=t.caretPadding+t.caretSize):"left"===t.xAlign?i.x-=t.cornerRadius+t.caretPadding:"right"===t.xAlign&&(i.x+=t.cornerRadius+t.caretPadding),i},drawCaret:function(t,e,a,o){var n,r,s,l,h,d,c=this._view,u=this._chart.ctx;"center"===c.yAlign?("left"===c.xAlign?(n=t.x,r=n-c.caretSize,s=n):(n=t.x+e.width,r=n+c.caretSize,s=n),h=t.y+e.height/2,l=h-c.caretSize,d=h+c.caretSize):("left"===c.xAlign?(n=t.x+c.cornerRadius,r=n+c.caretSize,s=r+c.caretSize):"right"===c.xAlign?(n=t.x+e.width-c.cornerRadius,r=n-c.caretSize,s=r-c.caretSize):(r=t.x+e.width/2,n=r-c.caretSize,s=r+c.caretSize),"top"===c.yAlign?(l=t.y,h=l-c.caretSize,d=l):(l=t.y+e.height,h=l+c.caretSize,d=l));var f=i.color(c.backgroundColor);u.fillStyle=f.alpha(a*f.alpha()).rgbString(),u.beginPath(),u.moveTo(n,l),u.lineTo(r,h),u.lineTo(s,d),u.closePath(),u.fill()},drawTitle:function(t,e,a,o){if(e.title.length){a.textAlign=e._titleAlign,a.textBaseline="top";var n=i.color(e.titleColor);a.fillStyle=n.alpha(o*n.alpha()).rgbString(),a.font=i.fontString(e.titleFontSize,e._titleFontStyle,e._titleFontFamily),i.each(e.title,function(i,o){a.fillText(i,t.x,t.y),t.y+=e.titleFontSize+e.titleSpacing,o+1===e.title.length&&(t.y+=e.titleMarginBottom-e.titleSpacing)})}},drawBody:function(t,e,a,o){a.textAlign=e._bodyAlign,a.textBaseline="top";var n=i.color(e.bodyColor);a.fillStyle=n.alpha(o*n.alpha()).rgbString(),a.font=i.fontString(e.bodyFontSize,e._bodyFontStyle,e._bodyFontFamily),i.each(e.beforeBody,function(i){a.fillText(i,t.x,t.y),t.y+=e.bodyFontSize+e.bodySpacing}),i.each(e.body,function(n,r){"single"!==this._options.tooltips.mode&&(a.fillStyle=i.color(e.legendColorBackground).alpha(o).rgbaString(),a.fillRect(t.x,t.y,e.bodyFontSize,e.bodyFontSize),a.strokeStyle=i.color(e.labelColors[r].borderColor).alpha(o).rgbaString(),a.strokeRect(t.x,t.y,e.bodyFontSize,e.bodyFontSize),a.fillStyle=i.color(e.labelColors[r].backgroundColor).alpha(o).rgbaString(),a.fillRect(t.x+1,t.y+1,e.bodyFontSize-2,e.bodyFontSize-2),a.fillStyle=i.color(e.bodyColor).alpha(o).rgbaString()),a.fillText(n,t.x+("single"!==this._options.tooltips.mode?e.bodyFontSize+2:0),t.y),t.y+=e.bodyFontSize+e.bodySpacing},this),i.each(e.afterBody,function(i){a.fillText(i,t.x,t.y),t.y+=e.bodyFontSize}),t.y-=e.bodySpacing},drawFooter:function(t,e,a,o){if(e.footer.length){t.y+=e.footerMarginTop,a.textAlign=e._footerAlign,a.textBaseline="top";var n=i.color(e.footerColor);a.fillStyle=n.alpha(o*n.alpha()).rgbString(),a.font=i.fontString(e.footerFontSize,e._footerFontStyle,e._footerFontFamily),i.each(e.footer,function(i){a.fillText(i,t.x,t.y),t.y+=e.footerFontSize+e.footerSpacing})}},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var a=e.caretPadding,o=this.getTooltipSize(e),n={x:e.x,y:e.y},r=Math.abs(e.opacity<.001)?0:e.opacity;if(this._options.tooltips.enabled){var s=i.color(e.backgroundColor);t.fillStyle=s.alpha(r*s.alpha()).rgbString(),i.drawRoundedRectangle(t,n.x,n.y,o.width,o.height,e.cornerRadius),t.fill(),this.drawCaret(n,o,r,a),n.x+=e.xPadding,n.y+=e.yPadding,this.drawTitle(n,e,t,r),this.drawBody(n,e,t,r),this.drawFooter(n,e,t,r)}}}})}},{}],34:[function(t,e,i){"use strict";e.exports=function(t,e){var i=t.helpers,a=t.defaults.global;a.elements.arc={backgroundColor:a.defaultColor,borderColor:"#fff",borderWidth:2},t.elements.Arc=t.Element.extend({inLabelRange:function(t){var e=this._view;return e?Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2):!1},inRange:function(t,e){var a=this._view;if(a){for(var o=i.getAngleFromPoint(a,{x:t,y:e}),n=o.angle,r=o.distance,s=a.startAngle,l=a.endAngle;s>l;)l+=2*Math.PI;for(;n>l;)n-=2*Math.PI;for(;s>n;)n+=2*Math.PI;var h=n>=s&&l>=n,d=r>=a.innerRadius&&r<=a.outerRadius;return h&&d}return!1},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,i=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},draw:function(){var t=this._chart.ctx,e=this._view,i=e.startAngle,a=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,i,a),t.arc(e.x,e.y,e.innerRadius,a,i,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})}},{}],35:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i=t.defaults.global;t.defaults.global.elements.line={tension:.4,backgroundColor:i.defaultColor,borderWidth:3,borderColor:i.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",fill:!0},t.elements.Line=t.Element.extend({lineToNextPoint:function(t,e,i,a,o){var n=this._chart.ctx;e._view.skip?a.call(this,t,e,i):t._view.skip?o.call(this,t,e,i):0===e._view.tension?n.lineTo(e._view.x,e._view.y):n.bezierCurveTo(t._view.controlPointNextX,t._view.controlPointNextY,e._view.controlPointPreviousX,e._view.controlPointPreviousY,e._view.x,e._view.y)},draw:function(){function t(t){r._view.skip||s._view.skip?t&&n.lineTo(a._view.scaleZero.x,a._view.scaleZero.y):n.bezierCurveTo(s._view.controlPointNextX,s._view.controlPointNextY,r._view.controlPointPreviousX,r._view.controlPointPreviousY,r._view.x,r._view.y)}var a=this,o=this._view,n=this._chart.ctx,r=this._children[0],s=this._children[this._children.length-1];n.save(),this._children.length>0&&o.fill&&(n.beginPath(),e.each(this._children,function(t,i){var a=e.previousItem(this._children,i),r=e.nextItem(this._children,i);0===i?(this._loop?n.moveTo(o.scaleZero.x,o.scaleZero.y):n.moveTo(t._view.x,o.scaleZero),t._view.skip?this._loop||n.moveTo(r._view.x,this._view.scaleZero):n.lineTo(t._view.x,t._view.y)):this.lineToNextPoint(a,t,r,function(t,e,i){this._loop?n.lineTo(this._view.scaleZero.x,this._view.scaleZero.y):(n.lineTo(t._view.x,this._view.scaleZero),n.moveTo(i._view.x,this._view.scaleZero))},function(t,e){n.lineTo(e._view.x,e._view.y)})},this),this._loop?t(!0):(n.lineTo(this._children[this._children.length-1]._view.x,o.scaleZero),n.lineTo(this._children[0]._view.x,o.scaleZero)),n.fillStyle=o.backgroundColor||i.defaultColor,n.closePath(),n.fill());var l=i.elements.line;n.lineCap=o.borderCapStyle||l.borderCapStyle,n.setLineDash&&n.setLineDash(o.borderDash||l.borderDash),n.lineDashOffset=o.borderDashOffset||l.borderDashOffset,n.lineJoin=o.borderJoinStyle||l.borderJoinStyle,n.lineWidth=o.borderWidth||l.borderWidth,n.strokeStyle=o.borderColor||i.defaultColor,n.beginPath(),e.each(this._children,function(t,i){var a=e.previousItem(this._children,i),o=e.nextItem(this._children,i);0===i?n.moveTo(t._view.x,t._view.y):this.lineToNextPoint(a,t,o,function(t,e,i){n.moveTo(i._view.x,i._view.y)},function(t,e){n.moveTo(e._view.x,e._view.y)})},this),this._loop&&this._children.length>0&&t(),n.stroke(),n.restore()}})}},{}],36:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i=t.defaults.global,a=i.defaultColor;i.elements.point={radius:3,pointStyle:"circle",backgroundColor:a,borderWidth:1,borderColor:a,hitRadius:1,hoverRadius:4,hoverBorderWidth:1},t.elements.Point=t.Element.extend({inRange:function(t,e){var i=this._view;return i?Math.pow(t-i.x,2)+Math.pow(e-i.y,2)<Math.pow(i.hitRadius+i.radius,2):!1},inLabelRange:function(t){var e=this._view;return e?Math.pow(t-e.x,2)<Math.pow(e.radius+e.hitRadius,2):!1},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(){var t,o,n,r,s,l,h=this._view,d=this._chart.ctx,c=h.pointStyle,u=h.radius,f=h.x,g=h.y;if(!h.skip){if("object"==typeof c&&(t=c.toString(),"[object HTMLImageElement]"===t||"[object HTMLCanvasElement]"===t))return void d.drawImage(c,f-c.width/2,g-c.height/2);if(!(isNaN(u)||0>=u)){switch(d.strokeStyle=h.borderColor||a,d.lineWidth=e.getValueOrDefault(h.borderWidth,i.elements.point.borderWidth),d.fillStyle=h.backgroundColor||a,c){default:d.beginPath(),d.arc(f,g,u,0,2*Math.PI),d.closePath(),d.fill();break;case"triangle":d.beginPath(),o=3*u/Math.sqrt(3),s=o*Math.sqrt(3)/2,d.moveTo(f-o/2,g+s/3),d.lineTo(f+o/2,g+s/3),d.lineTo(f,g-2*s/3),d.closePath(),d.fill();break;case"rect":l=1/Math.SQRT2*u,d.fillRect(f-l,g-l,2*l,2*l),d.strokeRect(f-l,g-l,2*l,2*l);break;case"rectRot":d.translate(f,g),d.rotate(Math.PI/4),l=1/Math.SQRT2*u,d.fillRect(-l,-l,2*l,2*l),d.strokeRect(-l,-l,2*l,2*l),d.setTransform(1,0,0,1,0,0);break;case"cross":d.beginPath(),d.moveTo(f,g+u),d.lineTo(f,g-u),d.moveTo(f-u,g),d.lineTo(f+u,g),d.closePath();break;case"crossRot":d.beginPath(),n=Math.cos(Math.PI/4)*u,r=Math.sin(Math.PI/4)*u,d.moveTo(f-n,g-r),d.lineTo(f+n,g+r),d.moveTo(f-n,g+r),d.lineTo(f+n,g-r),d.closePath();break;case"star":d.beginPath(),d.moveTo(f,g+u),d.lineTo(f,g-u),d.moveTo(f-u,g),d.lineTo(f+u,g),n=Math.cos(Math.PI/4)*u,r=Math.sin(Math.PI/4)*u,d.moveTo(f-n,g-r),d.lineTo(f+n,g+r),d.moveTo(f-n,g+r),d.lineTo(f+n,g-r),d.closePath();break;case"line":d.beginPath(),d.moveTo(f-u,g),d.lineTo(f+u,g),d.closePath();break;case"dash":d.beginPath(),d.moveTo(f,g),d.lineTo(f+u,g),d.closePath()}d.stroke()}}}})}},{}],37:[function(t,e,i){"use strict";e.exports=function(t){var e=(t.helpers,t.defaults.global);e.elements.rectangle={backgroundColor:e.defaultColor,borderWidth:0,borderColor:e.defaultColor,borderSkipped:"bottom"},t.elements.Rectangle=t.Element.extend({draw:function(){function t(t){return l[(d+t)%4]}var e=this._chart.ctx,i=this._view,a=i.width/2,o=i.x-a,n=i.x+a,r=i.base-(i.base-i.y),s=i.borderWidth/2;i.borderWidth&&(o+=s,n-=s,r+=s),e.beginPath(),e.fillStyle=i.backgroundColor,e.strokeStyle=i.borderColor,e.lineWidth=i.borderWidth;var l=[[o,i.base],[o,r],[n,r],[n,i.base]],h=["bottom","left","top","right"],d=h.indexOf(i.borderSkipped,0);-1===d&&(d=0),e.moveTo.apply(e,t(0));for(var c=1;4>c;c++)e.lineTo.apply(e,t(c));e.fill(),i.borderWidth&&e.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var i=this._view;return i?i.y<i.base?t>=i.x-i.width/2&&t<=i.x+i.width/2&&e>=i.y&&e<=i.base:t>=i.x-i.width/2&&t<=i.x+i.width/2&&e>=i.base&&e<=i.y:!1},inLabelRange:function(t){var e=this._view;return e?t>=e.x-e.width/2&&t<=e.x+e.width/2:!1},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})}},{}],38:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i={position:"bottom"},a=t.Scale.extend({determineDataLimits:function(){this.minIndex=0,this.maxIndex=this.chart.data.labels.length-1;var t;void 0!==this.options.ticks.min&&(t=e.indexOf(this.chart.data.labels,this.options.ticks.min),this.minIndex=-1!==t?t:this.minIndex),void 0!==this.options.ticks.max&&(t=e.indexOf(this.chart.data.labels,this.options.ticks.max),this.maxIndex=-1!==t?t:this.maxIndex),this.min=this.chart.data.labels[this.minIndex],this.max=this.chart.data.labels[this.maxIndex]},buildTicks:function(t){this.ticks=0===this.minIndex&&this.maxIndex===this.chart.data.labels.length-1?this.chart.data.labels:this.chart.data.labels.slice(this.minIndex,this.maxIndex+1)},getLabelForIndex:function(t,e){return this.ticks[t]},getPixelForValue:function(t,e,i,a){var o=Math.max(this.maxIndex+1-this.minIndex-(this.options.gridLines.offsetGridLines?0:1),1);if(this.isHorizontal()){var n=this.width-(this.paddingLeft+this.paddingRight),r=n/o,s=r*(e-this.minIndex)+this.paddingLeft;return this.options.gridLines.offsetGridLines&&a&&(s+=r/2),this.left+Math.round(s)}var l=this.height-(this.paddingTop+this.paddingBottom),h=l/o,d=h*(e-this.minIndex)+this.paddingTop;return this.options.gridLines.offsetGridLines&&a&&(d+=h/2),this.top+Math.round(d)},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null,e)},getValueForPixel:function(t){var e,i=Math.max(this.ticks.length-(this.options.gridLines.offsetGridLines?0:1),1),a=this.isHorizontal(),o=a?this.width-(this.paddingLeft+this.paddingRight):this.height-(this.paddingTop+this.paddingBottom),n=o/i;return this.options.gridLines.offsetGridLines&&(t-=n/2),t-=a?this.paddingLeft:this.paddingTop,e=0>=t?0:Math.round(t/n)}});t.scaleService.registerScaleType("category",a,i)}},{}],39:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i={position:"left",ticks:{callback:function(t,i,a){var o=a.length>3?a[2]-a[1]:a[1]-a[0];Math.abs(o)>1&&t!==Math.floor(t)&&(o=t-Math.floor(t));var n=e.log10(Math.abs(o)),r="";if(0!==t){var s=-1*Math.floor(n);s=Math.max(Math.min(s,20),0),r=t.toFixed(s)}else r="0";return r}}},a=t.Scale.extend({determineDataLimits:function(){function t(t){return l?t.xAxisID===i.id:t.yAxisID===i.id}var i=this,a=i.options,o=a.ticks,n=i.chart,r=n.data,s=r.datasets,l=i.isHorizontal();if(i.min=null,i.max=null,a.stacked){var h={},d=!1,c=!1;e.each(s,function(o,r){var s=n.getDatasetMeta(r);void 0===h[s.type]&&(h[s.type]={positiveValues:[],negativeValues:[]});var l=h[s.type].positiveValues,u=h[s.type].negativeValues;n.isDatasetVisible(r)&&t(s)&&e.each(o.data,function(t,e){var o=+i.getRightValue(t);isNaN(o)||s.data[e].hidden||(l[e]=l[e]||0,u[e]=u[e]||0,a.relativePoints?l[e]=100:0>o?(c=!0,u[e]+=o):(d=!0,l[e]+=o))})}),e.each(h,function(t){var a=t.positiveValues.concat(t.negativeValues),o=e.min(a),n=e.max(a);i.min=null===i.min?o:Math.min(i.min,o),i.max=null===i.max?n:Math.max(i.max,n)})}else e.each(s,function(a,o){var r=n.getDatasetMeta(o);n.isDatasetVisible(o)&&t(r)&&e.each(a.data,function(t,e){var a=+i.getRightValue(t);isNaN(a)||r.data[e].hidden||(null===i.min?i.min=a:a<i.min&&(i.min=a),null===i.max?i.max=a:a>i.max&&(i.max=a))})});if(o.beginAtZero){var u=e.sign(i.min),f=e.sign(i.max);0>u&&0>f?i.max=0:u>0&&f>0&&(i.min=0)}void 0!==o.min?i.min=o.min:void 0!==o.suggestedMin&&(i.min=Math.min(i.min,o.suggestedMin)),void 0!==o.max?i.max=o.max:void 0!==o.suggestedMax&&(i.max=Math.max(i.max,o.suggestedMax)),i.min===i.max&&(i.max++,o.beginAtZero||i.min--)},buildTicks:function(){var i,a=this,o=a.options,n=o.ticks,r=e.getValueOrDefault,s=a.isHorizontal(),l=a.ticks=[];if(s)i=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(a.width/50));else{var h=r(n.fontSize,t.defaults.global.defaultFontSize);i=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(a.height/(2*h)))}i=Math.max(2,i);var d,c=n.fixedStepSize&&n.fixedStepSize>0||n.stepSize&&n.stepSize>0;if(c)d=r(n.fixedStepSize,n.stepSize);else{var u=e.niceNum(a.max-a.min,!1);d=e.niceNum(u/(i-1),!0)}var f=Math.floor(a.min/d)*d,g=Math.ceil(a.max/d)*d,p=(g-f)/d;p=e.almostEquals(p,Math.round(p),d/1e3)?Math.round(p):Math.ceil(p),l.push(void 0!==n.min?n.min:f);for(var m=1;p>m;++m)l.push(f+m*d);l.push(void 0!==n.max?n.max:g),
-s||l.reverse(),a.max=e.max(l),a.min=e.min(l),n.reverse?(l.reverse(),a.start=a.max,a.end=a.min):(a.start=a.min,a.end=a.max)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)},getPixelForValue:function(t,e,i,a){var o,n,r=this,s=r.paddingLeft,l=r.paddingBottom,h=r.start,d=+r.getRightValue(t),c=r.end-h;return r.isHorizontal()?(n=r.width-(s+r.paddingRight),o=r.left+n/c*(d-h),Math.round(o+s)):(n=r.height-(r.paddingTop+l),o=r.bottom-l-n/c*(d-h),Math.round(o))},getValueForPixel:function(t){var e=this,i=e.isHorizontal(),a=e.paddingLeft,o=e.paddingBottom,n=i?e.width-(a+e.paddingRight):e.height-(e.paddingTop+o),r=(i?t-e.left-a:e.bottom-o-t)/n;return e.start+(e.end-e.start)*r},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticksAsNumbers[t],null,null,e)}});t.scaleService.registerScaleType("linear",a,i)}},{}],40:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i={position:"left",ticks:{callback:function(t,i,a){var o=t/Math.pow(10,Math.floor(e.log10(t)));return 1===o||2===o||5===o||0===i||i===a.length-1?t.toExponential():""}}},a=t.Scale.extend({determineDataLimits:function(){function t(t){return h?t.xAxisID===i.id:t.yAxisID===i.id}var i=this,a=i.options,o=a.ticks,n=i.chart,r=n.data,s=r.datasets,l=e.getValueOrDefault,h=i.isHorizontal();if(i.min=null,i.max=null,a.stacked){var d={};e.each(s,function(o,r){var s=n.getDatasetMeta(r);n.isDatasetVisible(r)&&t(s)&&(void 0===d[s.type]&&(d[s.type]=[]),e.each(o.data,function(t,e){var o=d[s.type],n=+i.getRightValue(t);isNaN(n)||s.data[e].hidden||(o[e]=o[e]||0,a.relativePoints?o[e]=100:o[e]+=n)}))}),e.each(d,function(t){var a=e.min(t),o=e.max(t);i.min=null===i.min?a:Math.min(i.min,a),i.max=null===i.max?o:Math.max(i.max,o)})}else e.each(s,function(a,o){var r=n.getDatasetMeta(o);n.isDatasetVisible(o)&&t(r)&&e.each(a.data,function(t,e){var a=+i.getRightValue(t);isNaN(a)||r.data[e].hidden||(null===i.min?i.min=a:a<i.min&&(i.min=a),null===i.max?i.max=a:a>i.max&&(i.max=a))})});i.min=l(o.min,i.min),i.max=l(o.max,i.max),i.min===i.max&&(0!==i.min&&null!==i.min?(i.min=Math.pow(10,Math.floor(e.log10(i.min))-1),i.max=Math.pow(10,Math.floor(e.log10(i.max))+1)):(i.min=1,i.max=10))},buildTicks:function(){for(var t=this,i=t.options,a=i.ticks,o=e.getValueOrDefault,n=t.ticks=[],r=o(a.min,Math.pow(10,Math.floor(e.log10(t.min))));r<t.max;){n.push(r);var s=Math.floor(e.log10(r)),l=Math.floor(r/Math.pow(10,s))+1;10===l&&(l=1,++s),r=l*Math.pow(10,s)}var h=o(a.max,r);n.push(h),t.isHorizontal()||n.reverse(),t.max=e.max(n),t.min=e.min(n),a.reverse?(n.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),t.Scale.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t,e){return this.getPixelForValue(this.tickValues[t],null,null,e)},getPixelForValue:function(t,i,a,o){var n,r,s=this,l=s.start,h=+s.getRightValue(t),d=e.log10(s.end)-e.log10(l),c=s.paddingTop,u=s.paddingBottom,f=s.paddingLeft;return s.isHorizontal()?0===h?r=s.left+f:(n=s.width-(f+s.paddingRight),r=s.left+n/d*(e.log10(h)-e.log10(l)),r+=f):0===h?r=s.top+c:(n=s.height-(c+u),r=s.bottom-u-n/d*(e.log10(h)-e.log10(l))),r},getValueForPixel:function(t){var i,a,o=this,n=e.log10(o.end)-e.log10(o.start);return o.isHorizontal()?(a=o.width-(o.paddingLeft+o.paddingRight),i=o.start*Math.pow(10,(t-o.left-o.paddingLeft)*n/a)):(a=o.height-(o.paddingTop+o.paddingBottom),i=Math.pow(10,(o.bottom-o.paddingBottom-t)*n/a)/o.start),i}});t.scaleService.registerScaleType("logarithmic",a,i)}},{}],41:[function(t,e,i){"use strict";e.exports=function(t){var e=t.helpers,i=t.defaults.global,a={display:!0,animate:!0,lineArc:!1,position:"chartArea",angleLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2},pointLabels:{fontSize:10,callback:function(t){return t}}},o=t.Scale.extend({getValueCount:function(){return this.chart.data.labels.length},setDimensions:function(){var t=this.options;this.width=this.maxWidth,this.height=this.maxHeight,this.xCenter=Math.round(this.width/2),this.yCenter=Math.round(this.height/2);var a=e.min([this.height,this.width]),o=e.getValueOrDefault(t.ticks.fontSize,i.defaultFontSize);this.drawingArea=t.display?a/2-(o/2+t.ticks.backdropPaddingY):a/2},determineDataLimits:function(){if(this.min=null,this.max=null,e.each(this.chart.data.datasets,function(t,i){if(this.chart.isDatasetVisible(i)){var a=this.chart.getDatasetMeta(i);e.each(t.data,function(t,e){var i=+this.getRightValue(t);isNaN(i)||a.data[e].hidden||(null===this.min?this.min=i:i<this.min&&(this.min=i),null===this.max?this.max=i:i>this.max&&(this.max=i))},this)}},this),this.options.ticks.beginAtZero){var t=e.sign(this.min),i=e.sign(this.max);0>t&&0>i?this.max=0:t>0&&i>0&&(this.min=0)}void 0!==this.options.ticks.min?this.min=this.options.ticks.min:void 0!==this.options.ticks.suggestedMin&&(this.min=Math.min(this.min,this.options.ticks.suggestedMin)),void 0!==this.options.ticks.max?this.max=this.options.ticks.max:void 0!==this.options.ticks.suggestedMax&&(this.max=Math.max(this.max,this.options.ticks.suggestedMax)),this.min===this.max&&(this.min--,this.max++)},buildTicks:function(){this.ticks=[];var t=e.getValueOrDefault(this.options.ticks.fontSize,i.defaultFontSize),a=Math.min(this.options.ticks.maxTicksLimit?this.options.ticks.maxTicksLimit:11,Math.ceil(this.drawingArea/(1.5*t)));a=Math.max(2,a);var o=e.niceNum(this.max-this.min,!1),n=e.niceNum(o/(a-1),!0),r=Math.floor(this.min/n)*n,s=Math.ceil(this.max/n)*n,l=Math.ceil((s-r)/n);this.ticks.push(void 0!==this.options.ticks.min?this.options.ticks.min:r);for(var h=1;l>h;++h)this.ticks.push(r+h*n);this.ticks.push(void 0!==this.options.ticks.max?this.options.ticks.max:s),this.max=e.max(this.ticks),this.min=e.min(this.ticks),this.options.ticks.reverse?(this.ticks.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),this.zeroLineIndex=this.ticks.indexOf(0)},convertTicksToLabels:function(){t.Scale.prototype.convertTicksToLabels.call(this),this.pointLabels=this.chart.data.labels.map(this.options.pointLabels.callback,this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t,a,o,n,r,s,l,h,d,c,u,f,g=this.options.pointLabels,p=e.getValueOrDefault(g.fontSize,i.defaultFontSize),m=e.getValueOrDefault(g.fontStyle,i.defaultFontStyle),b=e.getValueOrDefault(g.fontFamily,i.defaultFontFamily),v=e.fontString(p,m,b),x=e.min([this.height/2-p-5,this.width/2]),y=this.width,k=0;for(this.ctx.font=v,a=0;a<this.getValueCount();a++)t=this.getPointPosition(a,x),o=this.ctx.measureText(this.pointLabels[a]?this.pointLabels[a]:"").width+5,0===a||a===this.getValueCount()/2?(n=o/2,t.x+n>y&&(y=t.x+n,r=a),t.x-n<k&&(k=t.x-n,l=a)):a<this.getValueCount()/2?t.x+o>y&&(y=t.x+o,r=a):a>this.getValueCount()/2&&t.x-o<k&&(k=t.x-o,l=a);d=k,c=Math.ceil(y-this.width),s=this.getIndexAngle(r),h=this.getIndexAngle(l),u=c/Math.sin(s+Math.PI/2),f=d/Math.sin(h+Math.PI/2),u=e.isNumber(u)?u:0,f=e.isNumber(f)?f:0,this.drawingArea=Math.round(x-(f+u)/2),this.setCenterPoint(f,u)},setCenterPoint:function(t,e){var i=this.width-e-this.drawingArea,a=t+this.drawingArea;this.xCenter=Math.round((a+i)/2+this.left),this.yCenter=Math.round(this.height/2+this.top)},getIndexAngle:function(t){var e=2*Math.PI/this.getValueCount();return t*e-Math.PI/2},getDistanceFromCenterForValue:function(t){if(null===t)return 0;var e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e},getPointPosition:function(t,e){var i=this.getIndexAngle(t);return{x:Math.round(Math.cos(i)*e)+this.xCenter,y:Math.round(Math.sin(i)*e)+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this,e=t.min,i=t.max;return t.getPointPositionForValue(0,t.beginAtZero?0:0>e&&0>i?i:e>0&&i>0?e:0)},draw:function(){if(this.options.display){var t=this.ctx;if(e.each(this.ticks,function(a,o){if(o>0||this.options.reverse){var n=this.getDistanceFromCenterForValue(this.ticks[o]),r=this.yCenter-n;if(this.options.gridLines.display)if(t.strokeStyle=this.options.gridLines.color,t.lineWidth=this.options.gridLines.lineWidth,this.options.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,n,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var s=0;s<this.getValueCount();s++){var l=this.getPointPosition(s,this.getDistanceFromCenterForValue(this.ticks[o]));0===s?t.moveTo(l.x,l.y):t.lineTo(l.x,l.y)}t.closePath(),t.stroke()}if(this.options.ticks.display){var h=e.getValueOrDefault(this.options.ticks.fontColor,i.defaultFontColor),d=e.getValueOrDefault(this.options.ticks.fontSize,i.defaultFontSize),c=e.getValueOrDefault(this.options.ticks.fontStyle,i.defaultFontStyle),u=e.getValueOrDefault(this.options.ticks.fontFamily,i.defaultFontFamily),f=e.fontString(d,c,u);if(t.font=f,this.options.ticks.showLabelBackdrop){var g=t.measureText(a).width;t.fillStyle=this.options.ticks.backdropColor,t.fillRect(this.xCenter-g/2-this.options.ticks.backdropPaddingX,r-d/2-this.options.ticks.backdropPaddingY,g+2*this.options.ticks.backdropPaddingX,d+2*this.options.ticks.backdropPaddingY)}t.textAlign="center",t.textBaseline="middle",t.fillStyle=h,t.fillText(a,this.xCenter,r)}}},this),!this.options.lineArc){t.lineWidth=this.options.angleLines.lineWidth,t.strokeStyle=this.options.angleLines.color;for(var a=this.getValueCount()-1;a>=0;a--){if(this.options.angleLines.display){var o=this.getPointPosition(a,this.getDistanceFromCenterForValue(this.options.reverse?this.min:this.max));t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(o.x,o.y),t.stroke(),t.closePath()}var n=this.getPointPosition(a,this.getDistanceFromCenterForValue(this.options.reverse?this.min:this.max)+5),r=e.getValueOrDefault(this.options.pointLabels.fontColor,i.defaultFontColor),s=e.getValueOrDefault(this.options.pointLabels.fontSize,i.defaultFontSize),l=e.getValueOrDefault(this.options.pointLabels.fontStyle,i.defaultFontStyle),h=e.getValueOrDefault(this.options.pointLabels.fontFamily,i.defaultFontFamily),d=e.fontString(s,l,h);t.font=d,t.fillStyle=r;var c=this.pointLabels.length,u=this.pointLabels.length/2,f=u/2,g=f>a||a>c-f,p=a===f||a===c-f;0===a?t.textAlign="center":a===u?t.textAlign="center":u>a?t.textAlign="left":t.textAlign="right",p?t.textBaseline="middle":g?t.textBaseline="bottom":t.textBaseline="top",t.fillText(this.pointLabels[a]?this.pointLabels[a]:"",n.x,n.y)}}}}});t.scaleService.registerScaleType("radialLinear",o,a)}},{}],42:[function(t,e,i){"use strict";var a=t("moment");a="function"==typeof a?a:window.moment,e.exports=function(t){var e=t.helpers,i={units:[{name:"millisecond",steps:[1,2,5,10,20,50,100,250,500]},{name:"second",steps:[1,2,5,10,30]},{name:"minute",steps:[1,2,5,10,30]},{name:"hour",steps:[1,2,3,6,12]},{name:"day",steps:[1,2,5]},{name:"week",maxStep:4},{name:"month",maxStep:3},{name:"quarter",maxStep:4},{name:"year",maxStep:!1}]},o={position:"bottom",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,displayFormats:{millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm:ss a",hour:"MMM D, hA",day:"ll",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"}},ticks:{autoSkip:!1}},n=t.Scale.extend({initialize:function(){if(!a)throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com");t.Scale.prototype.initialize.call(this)},getLabelMoment:function(t,e){return this.labelMoments[t][e]},getMomentStartOf:function(t){return"week"===this.options.time.unit&&this.options.time.isoWeekday!==!1?t.clone().startOf("isoWeek").isoWeekday(this.options.time.isoWeekday):t.clone().startOf(this.tickUnit)},determineDataLimits:function(){this.labelMoments=[];var t=[];this.chart.data.labels&&this.chart.data.labels.length>0?(e.each(this.chart.data.labels,function(e,i){var a=this.parseTime(e);a.isValid()&&(this.options.time.round&&a.startOf(this.options.time.round),t.push(a))},this),this.firstTick=a.min.call(this,t),this.lastTick=a.max.call(this,t)):(this.firstTick=null,this.lastTick=null),e.each(this.chart.data.datasets,function(i,o){var n=[],r=this.chart.isDatasetVisible(o);"object"==typeof i.data[0]&&null!==i.data[0]?e.each(i.data,function(t,e){var i=this.parseTime(this.getRightValue(t));i.isValid()&&(this.options.time.round&&i.startOf(this.options.time.round),n.push(i),r&&(this.firstTick=null!==this.firstTick?a.min(this.firstTick,i):i,this.lastTick=null!==this.lastTick?a.max(this.lastTick,i):i))},this):n=t,this.labelMoments.push(n)},this),this.options.time.min&&(this.firstTick=this.parseTime(this.options.time.min)),this.options.time.max&&(this.lastTick=this.parseTime(this.options.time.max)),this.firstTick=(this.firstTick||a()).clone(),this.lastTick=(this.lastTick||a()).clone()},buildTicks:function(a){this.ctx.save();var o=e.getValueOrDefault(this.options.ticks.fontSize,t.defaults.global.defaultFontSize),n=e.getValueOrDefault(this.options.ticks.fontStyle,t.defaults.global.defaultFontStyle),r=e.getValueOrDefault(this.options.ticks.fontFamily,t.defaults.global.defaultFontFamily),s=e.fontString(o,n,r);if(this.ctx.font=s,this.ticks=[],this.unitScale=1,this.scaleSizeInUnits=0,this.options.time.unit)this.tickUnit=this.options.time.unit||"day",this.displayFormat=this.options.time.displayFormats[this.tickUnit],this.scaleSizeInUnits=this.lastTick.diff(this.firstTick,this.tickUnit,!0),this.unitScale=e.getValueOrDefault(this.options.time.unitStepSize,1);else{var l=this.isHorizontal()?this.width-(this.paddingLeft+this.paddingRight):this.height-(this.paddingTop+this.paddingBottom),h=this.tickFormatFunction(this.firstTick,0,[]),d=this.ctx.measureText(h).width,c=Math.cos(e.toRadians(this.options.ticks.maxRotation)),u=Math.sin(e.toRadians(this.options.ticks.maxRotation));d=d*c+o*u;var f=l/d;this.tickUnit="millisecond",this.scaleSizeInUnits=this.lastTick.diff(this.firstTick,this.tickUnit,!0),this.displayFormat=this.options.time.displayFormats[this.tickUnit];for(var g=0,p=i.units[g];g<i.units.length;){if(this.unitScale=1,e.isArray(p.steps)&&Math.ceil(this.scaleSizeInUnits/f)<e.max(p.steps)){for(var m=0;m<p.steps.length;++m)if(p.steps[m]>=Math.ceil(this.scaleSizeInUnits/f)){this.unitScale=e.getValueOrDefault(this.options.time.unitStepSize,p.steps[m]);break}break}if(p.maxStep===!1||Math.ceil(this.scaleSizeInUnits/f)<p.maxStep){this.unitScale=e.getValueOrDefault(this.options.time.unitStepSize,Math.ceil(this.scaleSizeInUnits/f));break}++g,p=i.units[g],this.tickUnit=p.name;var b=this.firstTick.diff(this.getMomentStartOf(this.firstTick),this.tickUnit,!0),v=this.getMomentStartOf(this.lastTick.clone().add(1,this.tickUnit)).diff(this.lastTick,this.tickUnit,!0);this.scaleSizeInUnits=this.lastTick.diff(this.firstTick,this.tickUnit,!0)+b+v,this.displayFormat=this.options.time.displayFormats[p.name]}}var x;if(this.options.time.min?x=this.getMomentStartOf(this.firstTick):(this.firstTick=this.getMomentStartOf(this.firstTick),x=this.firstTick),!this.options.time.max){var y=this.getMomentStartOf(this.lastTick);0!==y.diff(this.lastTick,this.tickUnit,!0)&&(this.lastTick=this.getMomentStartOf(this.lastTick.add(1,this.tickUnit)))}this.smallestLabelSeparation=this.width,e.each(this.chart.data.datasets,function(t,e){for(var i=1;i<this.labelMoments[e].length;i++)this.smallestLabelSeparation=Math.min(this.smallestLabelSeparation,this.labelMoments[e][i].diff(this.labelMoments[e][i-1],this.tickUnit,!0))},this),this.options.time.displayFormat&&(this.displayFormat=this.options.time.displayFormat),this.ticks.push(this.firstTick.clone());for(var k=1;k<=this.scaleSizeInUnits;++k){var S=x.clone().add(k,this.tickUnit);if(this.options.time.max&&S.diff(this.lastTick,this.tickUnit,!0)>=0)break;k%this.unitScale===0&&this.ticks.push(S)}var C=this.ticks[this.ticks.length-1].diff(this.lastTick,this.tickUnit);(0!==C||0===this.scaleSizeInUnits)&&(this.options.time.max?(this.ticks.push(this.lastTick.clone()),this.scaleSizeInUnits=this.lastTick.diff(this.ticks[0],this.tickUnit,!0)):(this.ticks.push(this.lastTick.clone()),this.scaleSizeInUnits=this.lastTick.diff(this.firstTick,this.tickUnit,!0))),this.ctx.restore()},getLabelForIndex:function(t,e){var i=this.chart.data.labels&&t<this.chart.data.labels.length?this.chart.data.labels[t]:"";return"object"==typeof this.chart.data.datasets[e].data[0]&&(i=this.getRightValue(this.chart.data.datasets[e].data[t])),this.options.time.tooltipFormat&&(i=this.parseTime(i).format(this.options.time.tooltipFormat)),i},tickFormatFunction:function(t,i,a){var o=t.format(this.displayFormat),n=this.options.ticks,r=e.getValueOrDefault(n.callback,n.userCallback);return r?r(o,i,a):o},convertTicksToLabels:function(){this.tickMoments=this.ticks,this.ticks=this.ticks.map(this.tickFormatFunction,this)},getPixelForValue:function(t,e,i,a){var o=t&&t.isValid&&t.isValid()?t:this.getLabelMoment(i,e);if(o){var n=o.diff(this.firstTick,this.tickUnit,!0),r=n/this.scaleSizeInUnits;if(this.isHorizontal()){var s=this.width-(this.paddingLeft+this.paddingRight),l=(s/Math.max(this.ticks.length-1,1),s*r+this.paddingLeft);return this.left+Math.round(l)}var h=this.height-(this.paddingTop+this.paddingBottom),d=(h/Math.max(this.ticks.length-1,1),h*r+this.paddingTop);return this.top+Math.round(d)}},getPixelForTick:function(t,e){return this.getPixelForValue(this.tickMoments[t],null,null,e)},getValueForPixel:function(t){var e=this.isHorizontal()?this.width-(this.paddingLeft+this.paddingRight):this.height-(this.paddingTop+this.paddingBottom),i=(t-(this.isHorizontal()?this.left+this.paddingLeft:this.top+this.paddingTop))/e;return i*=this.scaleSizeInUnits,this.firstTick.clone().add(a.duration(i,this.tickUnit).asSeconds(),"seconds")},parseTime:function(t){return"string"==typeof this.options.time.parser?a(t,this.options.time.parser):"function"==typeof this.options.time.parser?this.options.time.parser(t):"function"==typeof t.getMonth||"number"==typeof t?a(t):t.isValid&&t.isValid()?t:"string"!=typeof this.options.time.format&&this.options.time.format.call?(console.warn("options.time.format is deprecated and replaced by options.time.parser. See http://nnnick.github.io/Chart.js/docs-v2/#scales-time-scale"),this.options.time.format(t)):a(t,this.options.time.format)}});t.scaleService.registerScaleType("time",n,o)}},{moment:1}]},{},[7]);
\ No newline at end of file
+!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Chart=t()}}(function(){return function t(e,a,i){function n(r,l){if(!a[r]){if(!e[r]){var s="function"==typeof require&&require;if(!l&&s)return s(r,!0);if(o)return o(r,!0);var d=new Error("Cannot find module '"+r+"'");throw d.code="MODULE_NOT_FOUND",d}var u=a[r]={exports:{}};e[r][0].call(u.exports,function(t){var a=e[r][1][t];return n(a?a:t)},u,u.exports,t,e,a,i)}return a[r].exports}for(var o="function"==typeof require&&require,r=0;r<i.length;r++)n(i[r]);return n}({1:[function(t,e,a){},{}],2:[function(t,e,a){function i(t){if(t){var e=/^#([a-fA-F0-9]{3})$/,a=/^#([a-fA-F0-9]{6})$/,i=/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,n=/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,o=/(\w+)/,r=[0,0,0],l=1,s=t.match(e);if(s){s=s[1];for(var d=0;d<r.length;d++)r[d]=parseInt(s[d]+s[d],16)}else if(s=t.match(a)){s=s[1];for(var d=0;d<r.length;d++)r[d]=parseInt(s.slice(2*d,2*d+2),16)}else if(s=t.match(i)){for(var d=0;d<r.length;d++)r[d]=parseInt(s[d+1]);l=parseFloat(s[4])}else if(s=t.match(n)){for(var d=0;d<r.length;d++)r[d]=Math.round(2.55*parseFloat(s[d+1]));l=parseFloat(s[4])}else if(s=t.match(o)){if("transparent"==s[1])return[0,0,0,0];if(r=y[s[1]],!r)return}for(var d=0;d<r.length;d++)r[d]=v(r[d],0,255);return l=l||0==l?v(l,0,1):1,r[3]=l,r}}function n(t){if(t){var e=/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/,a=t.match(e);if(a){var i=parseFloat(a[4]),n=v(parseInt(a[1]),0,360),o=v(parseFloat(a[2]),0,100),r=v(parseFloat(a[3]),0,100),l=v(isNaN(i)?1:i,0,1);return[n,o,r,l]}}}function o(t){if(t){var e=/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/,a=t.match(e);if(a){var i=parseFloat(a[4]),n=v(parseInt(a[1]),0,360),o=v(parseFloat(a[2]),0,100),r=v(parseFloat(a[3]),0,100),l=v(isNaN(i)?1:i,0,1);return[n,o,r,l]}}}function r(t){var e=i(t);return e&&e.slice(0,3)}function l(t){var e=n(t);return e&&e.slice(0,3)}function s(t){var e=i(t);return e?e[3]:(e=n(t))?e[3]:(e=o(t))?e[3]:void 0}function d(t){return"#"+x(t[0])+x(t[1])+x(t[2])}function u(t,e){return 1>e||t[3]&&t[3]<1?c(t,e):"rgb("+t[0]+", "+t[1]+", "+t[2]+")"}function c(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function h(t,e){if(1>e||t[3]&&t[3]<1)return f(t,e);var a=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),n=Math.round(t[2]/255*100);return"rgb("+a+"%, "+i+"%, "+n+"%)"}function f(t,e){var a=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),n=Math.round(t[2]/255*100);return"rgba("+a+"%, "+i+"%, "+n+"%, "+(e||t[3]||1)+")"}function g(t,e){return 1>e||t[3]&&t[3]<1?p(t,e):"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"}function p(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function m(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"}function b(t){return k[t.slice(0,3)]}function v(t,e,a){return Math.min(Math.max(e,t),a)}function x(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var y=t(6);e.exports={getRgba:i,getHsla:n,getRgb:r,getHsl:l,getHwb:o,getAlpha:s,hexString:d,rgbString:u,rgbaString:c,percentString:h,percentaString:f,hslString:g,hslaString:p,hwbString:m,keyword:b};var k={};for(var S in y)k[y[S]]=S},{6:6}],3:[function(t,e,a){var i=t(5),n=t(2),o=function(t){if(t instanceof o)return t;if(!(this instanceof o))return new o(t);this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1};var e;if("string"==typeof t)if(e=n.getRgba(t))this.setValues("rgb",e);else if(e=n.getHsla(t))this.setValues("hsl",e);else{if(!(e=n.getHwb(t)))throw new Error('Unable to parse color from string "'+t+'"');this.setValues("hwb",e)}else if("object"==typeof t)if(e=t,void 0!==e.r||void 0!==e.red)this.setValues("rgb",e);else if(void 0!==e.l||void 0!==e.lightness)this.setValues("hsl",e);else if(void 0!==e.v||void 0!==e.value)this.setValues("hsv",e);else if(void 0!==e.w||void 0!==e.whiteness)this.setValues("hwb",e);else{if(void 0===e.c&&void 0===e.cyan)throw new Error("Unable to parse color from object "+JSON.stringify(t));this.setValues("cmyk",e)}};o.prototype={rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t%=360,t=0>t?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return n.hexString(this.values.rgb)},rgbString:function(){return n.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return n.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return n.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return n.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return n.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return n.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return n.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],a=0;a<t.length;a++){var i=t[a]/255;e[a]=.03928>=i?i/12.92:Math.pow((i+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),a=t.luminosity();return e>a?(e+.05)/(a+.05):(a+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb,e=(299*t[0]+587*t[1]+114*t[2])/1e3;return 128>e},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;3>e;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,a=(e[0]+t)%360;return e[0]=0>a?360+a:a,this.setValues("hsl",e),this},mix:function(t,e){var a=this,i=t,n=void 0===e?.5:e,o=2*n-1,r=a.alpha()-i.alpha(),l=((o*r===-1?o:(o+r)/(1+o*r))+1)/2,s=1-l;return this.rgb(l*a.red()+s*i.red(),l*a.green()+s*i.green(),l*a.blue()+s*i.blue()).alpha(a.alpha()*n+i.alpha()*(1-n))},toJSON:function(){return this.rgb()},clone:function(){var t,e,a=new o,i=this.values,n=a.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],e={}.toString.call(t),"[object Array]"===e?n[r]=t.slice(0):"[object Number]"===e?n[r]=t:console.error("unexpected color value:",t));return a}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,a={},i=0;i<t.length;i++)a[t.charAt(i)]=e[t][i];return 1!==e.alpha&&(a.a=e.alpha),a},o.prototype.setValues=function(t,e){var a,n=this.values,o=this.spaces,r=this.maxes,l=1;if("alpha"===t)l=e;else if(e.length)n[t]=e.slice(0,t.length),l=e[t.length];else if(void 0!==e[t.charAt(0)]){for(a=0;a<t.length;a++)n[t][a]=e[t.charAt(a)];l=e.a}else if(void 0!==e[o[t][0]]){var s=o[t];for(a=0;a<t.length;a++)n[t][a]=e[s[a]];l=e.alpha}if(n.alpha=Math.max(0,Math.min(1,void 0===l?n.alpha:l)),"alpha"===t)return!1;var d;for(a=0;a<t.length;a++)d=Math.max(0,Math.min(r[t][a],n[t][a])),n[t][a]=Math.round(d);for(var u in o)u!==t&&(n[u]=i[t][u](n[t]));return!0},o.prototype.setSpace=function(t,e){var a=e[0];return void 0===a?this.getValues(t):("number"==typeof a&&(a=Array.prototype.slice.call(e)),this.setValues(t,a),this)},o.prototype.setChannel=function(t,e,a){var i=this.values[t];return void 0===a?i[e]:a===i[e]?this:(i[e]=a,this.setValues(t,i),this)},"undefined"!=typeof window&&(window.Color=o),e.exports=o},{2:2,5:5}],4:[function(t,e,a){function i(t){var e,a,i,n=t[0]/255,o=t[1]/255,r=t[2]/255,l=Math.min(n,o,r),s=Math.max(n,o,r),d=s-l;return s==l?e=0:n==s?e=(o-r)/d:o==s?e=2+(r-n)/d:r==s&&(e=4+(n-o)/d),e=Math.min(60*e,360),0>e&&(e+=360),i=(l+s)/2,a=s==l?0:.5>=i?d/(s+l):d/(2-s-l),[e,100*a,100*i]}function n(t){var e,a,i,n=t[0],o=t[1],r=t[2],l=Math.min(n,o,r),s=Math.max(n,o,r),d=s-l;return a=0==s?0:d/s*1e3/10,s==l?e=0:n==s?e=(o-r)/d:o==s?e=2+(r-n)/d:r==s&&(e=4+(n-o)/d),e=Math.min(60*e,360),0>e&&(e+=360),i=s/255*1e3/10,[e,a,i]}function o(t){var e=t[0],a=t[1],n=t[2],o=i(t)[0],r=1/255*Math.min(e,Math.min(a,n)),n=1-1/255*Math.max(e,Math.max(a,n));return[o,100*r,100*n]}function l(t){var e,a,i,n,o=t[0]/255,r=t[1]/255,l=t[2]/255;return n=Math.min(1-o,1-r,1-l),e=(1-o-n)/(1-n)||0,a=(1-r-n)/(1-n)||0,i=(1-l-n)/(1-n)||0,[100*e,100*a,100*i,100*n]}function s(t){return Q[JSON.stringify(t)]}function d(t){var e=t[0]/255,a=t[1]/255,i=t[2]/255;e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92,a=a>.04045?Math.pow((a+.055)/1.055,2.4):a/12.92,i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92;var n=.4124*e+.3576*a+.1805*i,o=.2126*e+.7152*a+.0722*i,r=.0193*e+.1192*a+.9505*i;return[100*n,100*o,100*r]}function u(t){var e,a,i,n=d(t),o=n[0],r=n[1],l=n[2];return o/=95.047,r/=100,l/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,l=l>.008856?Math.pow(l,1/3):7.787*l+16/116,e=116*r-16,a=500*(o-r),i=200*(r-l),[e,a,i]}function c(t){return W(u(t))}function h(t){var e,a,i,n,o,r=t[0]/360,l=t[1]/100,s=t[2]/100;if(0==l)return o=255*s,[o,o,o];a=.5>s?s*(1+l):s+l-s*l,e=2*s-a,n=[0,0,0];for(var d=0;3>d;d++)i=r+1/3*-(d-1),0>i&&i++,i>1&&i--,o=1>6*i?e+6*(a-e)*i:1>2*i?a:2>3*i?e+(a-e)*(2/3-i)*6:e,n[d]=255*o;return n}function f(t){var e,a,i=t[0],n=t[1]/100,o=t[2]/100;return 0===o?[0,0,0]:(o*=2,n*=1>=o?o:2-o,a=(o+n)/2,e=2*n/(o+n),[i,100*e,100*a])}function p(t){return o(h(t))}function m(t){return l(h(t))}function v(t){return s(h(t))}function x(t){var e=t[0]/60,a=t[1]/100,i=t[2]/100,n=Math.floor(e)%6,o=e-Math.floor(e),r=255*i*(1-a),l=255*i*(1-a*o),s=255*i*(1-a*(1-o)),i=255*i;switch(n){case 0:return[i,s,r];case 1:return[l,i,r];case 2:return[r,i,s];case 3:return[r,l,i];case 4:return[s,r,i];case 5:return[i,r,l]}}function y(t){var e,a,i=t[0],n=t[1]/100,o=t[2]/100;return a=(2-n)*o,e=n*o,e/=1>=a?a:2-a,e=e||0,a/=2,[i,100*e,100*a]}function k(t){return o(x(t))}function S(t){return l(x(t))}function w(t){return s(x(t))}function C(t){var e,a,i,n,o=t[0]/360,l=t[1]/100,s=t[2]/100,d=l+s;switch(d>1&&(l/=d,s/=d),e=Math.floor(6*o),a=1-s,i=6*o-e,0!=(1&e)&&(i=1-i),n=l+i*(a-l),e){default:case 6:case 0:r=a,g=n,b=l;break;case 1:r=n,g=a,b=l;break;case 2:r=l,g=a,b=n;break;case 3:r=l,g=n,b=a;break;case 4:r=n,g=l,b=a;break;case 5:r=a,g=l,b=n}return[255*r,255*g,255*b]}function M(t){return i(C(t))}function D(t){return n(C(t))}function A(t){return l(C(t))}function I(t){return s(C(t))}function F(t){var e,a,i,n=t[0]/100,o=t[1]/100,r=t[2]/100,l=t[3]/100;return e=1-Math.min(1,n*(1-l)+l),a=1-Math.min(1,o*(1-l)+l),i=1-Math.min(1,r*(1-l)+l),[255*e,255*a,255*i]}function T(t){return i(F(t))}function P(t){return n(F(t))}function _(t){return o(F(t))}function R(t){return s(F(t))}function V(t){var e,a,i,n=t[0]/100,o=t[1]/100,r=t[2]/100;return e=3.2406*n+-1.5372*o+r*-.4986,a=n*-.9689+1.8758*o+.0415*r,i=.0557*n+o*-.204+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e=12.92*e,a=a>.0031308?1.055*Math.pow(a,1/2.4)-.055:a=12.92*a,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i=12.92*i,e=Math.min(Math.max(0,e),1),a=Math.min(Math.max(0,a),1),i=Math.min(Math.max(0,i),1),[255*e,255*a,255*i]}function O(t){var e,a,i,n=t[0],o=t[1],r=t[2];return n/=95.047,o/=100,r/=108.883,n=n>.008856?Math.pow(n,1/3):7.787*n+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*o-16,a=500*(n-o),i=200*(o-r),[e,a,i]}function L(t){return W(O(t))}function B(t){var e,a,i,n,o=t[0],r=t[1],l=t[2];return 8>=o?(a=100*o/903.3,n=7.787*(a/100)+16/116):(a=100*Math.pow((o+16)/116,3),n=Math.pow(a/100,1/3)),e=.008856>=e/95.047?e=95.047*(r/500+n-16/116)/7.787:95.047*Math.pow(r/500+n,3),i=.008859>=i/108.883?i=108.883*(n-l/200-16/116)/7.787:108.883*Math.pow(n-l/200,3),[e,a,i]}function W(t){var e,a,i,n=t[0],o=t[1],r=t[2];return e=Math.atan2(r,o),a=360*e/2/Math.PI,0>a&&(a+=360),i=Math.sqrt(o*o+r*r),[n,i,a]}function z(t){return V(B(t))}function H(t){var e,a,i,n=t[0],o=t[1],r=t[2];return i=r/360*2*Math.PI,e=o*Math.cos(i),a=o*Math.sin(i),[n,e,a]}function N(t){return B(H(t))}function E(t){return z(H(t))}function U(t){return G[t]}function q(t){return i(U(t))}function j(t){return n(U(t))}function Y(t){return o(U(t))}function J(t){return l(U(t))}function X(t){return u(U(t))}function Z(t){return d(U(t))}e.exports={rgb2hsl:i,rgb2hsv:n,rgb2hwb:o,rgb2cmyk:l,rgb2keyword:s,rgb2xyz:d,rgb2lab:u,rgb2lch:c,hsl2rgb:h,hsl2hsv:f,hsl2hwb:p,hsl2cmyk:m,hsl2keyword:v,hsv2rgb:x,hsv2hsl:y,hsv2hwb:k,hsv2cmyk:S,hsv2keyword:w,hwb2rgb:C,hwb2hsl:M,hwb2hsv:D,hwb2cmyk:A,hwb2keyword:I,cmyk2rgb:F,cmyk2hsl:T,cmyk2hsv:P,cmyk2hwb:_,cmyk2keyword:R,keyword2rgb:U,keyword2hsl:q,keyword2hsv:j,keyword2hwb:Y,keyword2cmyk:J,keyword2lab:X,keyword2xyz:Z,xyz2rgb:V,xyz2lab:O,xyz2lch:L,lab2xyz:B,lab2rgb:z,lab2lch:W,lch2lab:H,lch2xyz:N,lch2rgb:E};var G={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Q={};for(var $ in G)Q[JSON.stringify(G[$])]=$},{}],5:[function(t,e,a){var i=t(4),n=function(){return new d};for(var o in i){n[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),l=r[1],s=r[2];n[l]=n[l]||{},n[l][s]=n[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var a=i[t](e);if("string"==typeof a||void 0===a)return a;for(var n=0;n<a.length;n++)a[n]=Math.round(a[n]);return a}}(o)}var d=function(){this.convs={}};d.prototype.routeSpace=function(t,e){var a=e[0];return void 0===a?this.getValues(t):("number"==typeof a&&(a=Array.prototype.slice.call(e)),this.setValues(t,a))},d.prototype.setValues=function(t,e){return this.space=t,this.convs={},this.convs[t]=e,this},d.prototype.getValues=function(t){var e=this.convs[t];if(!e){var a=this.space,i=this.convs[a];e=n[a][t](i),this.convs[t]=e}return e},["rgb","hsl","hsv","cmyk","keyword"].forEach(function(t){d.prototype[t]=function(e){return this.routeSpace(t,arguments)}}),e.exports=n},{4:4}],6:[function(t,e,a){e.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},{}],7:[function(t,e,a){var i=t(26)();t(25)(i),t(24)(i),t(21)(i),t(22)(i),t(23)(i),t(27)(i),t(31)(i),t(29)(i),t(30)(i),t(32)(i),t(28)(i),t(33)(i),t(34)(i),t(35)(i),t(36)(i),t(37)(i),t(40)(i),t(38)(i),t(39)(i),t(41)(i),t(42)(i),t(43)(i),t(15)(i),t(16)(i),t(17)(i),t(18)(i),t(19)(i),t(20)(i),t(8)(i),t(9)(i),t(10)(i),t(11)(i),t(12)(i),t(13)(i),t(14)(i),window.Chart=e.exports=i},{10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,34:34,35:35,36:36,37:37,38:38,39:39,40:40,41:41,42:42,43:43,8:8,9:9}],8:[function(t,e,a){"use strict";e.exports=function(t){t.Bar=function(e,a){return a.type="bar",new t(e,a)}}},{}],9:[function(t,e,a){"use strict";e.exports=function(t){t.Bubble=function(e,a){return a.type="bubble",new t(e,a)}}},{}],10:[function(t,e,a){"use strict";e.exports=function(t){t.Doughnut=function(e,a){return a.type="doughnut",new t(e,a)}}},{}],11:[function(t,e,a){"use strict";e.exports=function(t){t.Line=function(e,a){return a.type="line",new t(e,a)}}},{}],12:[function(t,e,a){"use strict";e.exports=function(t){t.PolarArea=function(e,a){return a.type="polarArea",new t(e,a)}}},{}],13:[function(t,e,a){"use strict";e.exports=function(t){t.Radar=function(e,a){return a.options=t.helpers.configMerge({aspectRatio:1},a.options),a.type="radar",new t(e,a)}}},{}],14:[function(t,e,a){"use strict";e.exports=function(t){var e={hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-1"}],yAxes:[{type:"linear",position:"left",id:"y-axis-1"}]},tooltips:{callbacks:{title:function(t,e){return""},label:function(t,e){return"("+t.xLabel+", "+t.yLabel+")"}}}};t.defaults.scatter=e,t.controllers.scatter=t.controllers.line,t.Scatter=function(e,a){return a.type="scatter",new t(e,a)}}},{}],15:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.bar={hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}},t.controllers.bar=t.DatasetController.extend({dataElementType:t.elements.Rectangle,initialize:function(e,a){t.DatasetController.prototype.initialize.call(this,e,a),this.getMeta().bar=!0},getBarCount:function(){var t=this,a=0;return e.each(t.chart.data.datasets,function(e,i){var n=t.chart.getDatasetMeta(i);n.bar&&t.chart.isDatasetVisible(i)&&++a},t),a},update:function(t){var a=this;e.each(a.getMeta().data,function(e,i){a.updateElement(e,i,t)},a)},updateElement:function(t,a,i){var n=this,o=n.getMeta(),r=n.getScaleForId(o.xAxisID),l=n.getScaleForId(o.yAxisID),s=l.getBasePixel(),d=n.chart.options.elements.rectangle,u=t.custom||{},c=n.getDataset();e.extend(t,{_xScale:r,_yScale:l,_datasetIndex:n.index,_index:a,_model:{x:n.calculateBarX(a,n.index),y:i?s:n.calculateBarY(a,n.index),label:n.chart.data.labels[a],datasetLabel:c.label,base:i?s:n.calculateBarBase(n.index,a),width:n.calculateBarWidth(a),backgroundColor:u.backgroundColor?u.backgroundColor:e.getValueAtIndexOrDefault(c.backgroundColor,a,d.backgroundColor),borderSkipped:u.borderSkipped?u.borderSkipped:d.borderSkipped,borderColor:u.borderColor?u.borderColor:e.getValueAtIndexOrDefault(c.borderColor,a,d.borderColor),borderWidth:u.borderWidth?u.borderWidth:e.getValueAtIndexOrDefault(c.borderWidth,a,d.borderWidth)}}),t.pivot()},calculateBarBase:function(t,e){var a=this,i=a.getMeta(),n=a.getScaleForId(i.yAxisID),o=0;if(n.options.stacked){var r=a.chart,l=r.data.datasets,s=l[t].data[e];if(0>s)for(var d=0;t>d;d++){var u=l[d],c=r.getDatasetMeta(d);c.bar&&c.yAxisID===n.id&&r.isDatasetVisible(d)&&(o+=u.data[e]<0?u.data[e]:0)}else for(var h=0;t>h;h++){var f=l[h],g=r.getDatasetMeta(h);g.bar&&g.yAxisID===n.id&&r.isDatasetVisible(h)&&(o+=f.data[e]>0?f.data[e]:0)}return n.getPixelForValue(o)}return n.getBasePixel()},getRuler:function(t){var e,a=this,i=a.getMeta(),n=a.getScaleForId(i.xAxisID),o=a.getBarCount();e="category"===n.options.type?n.getPixelForTick(t+1)-n.getPixelForTick(t):n.width/n.ticks.length;var r=e*n.options.categoryPercentage,l=(e-e*n.options.categoryPercentage)/2,s=r/o;if(n.ticks.length!==a.chart.data.labels.length){var d=n.ticks.length/a.chart.data.labels.length;s*=d}var u=s*n.options.barPercentage,c=s-s*n.options.barPercentage;return{datasetCount:o,tickWidth:e,categoryWidth:r,categorySpacing:l,fullBarWidth:s,barWidth:u,barSpacing:c}},calculateBarWidth:function(t){var e=this.getScaleForId(this.getMeta().xAxisID),a=this.getRuler(t);return e.options.stacked?a.categoryWidth:a.barWidth},getBarIndex:function(t){var e,a,i=0;for(a=0;t>a;++a)e=this.chart.getDatasetMeta(a),e.bar&&this.chart.isDatasetVisible(a)&&++i;return i},calculateBarX:function(t,e){var a=this,i=a.getMeta(),n=a.getScaleForId(i.xAxisID),o=a.getBarIndex(e),r=a.getRuler(t),l=n.getPixelForValue(null,t,e,a.chart.isCombo);return l-=a.chart.isCombo?r.tickWidth/2:0,n.options.stacked?l+r.categoryWidth/2+r.categorySpacing:l+r.barWidth/2+r.categorySpacing+r.barWidth*o+r.barSpacing/2+r.barSpacing*o},calculateBarY:function(t,e){var a=this,i=a.getMeta(),n=a.getScaleForId(i.yAxisID),o=a.getDataset().data[t];if(n.options.stacked){for(var r=0,l=0,s=0;e>s;s++){var d=a.chart.data.datasets[s],u=a.chart.getDatasetMeta(s);u.bar&&u.yAxisID===n.id&&a.chart.isDatasetVisible(s)&&(d.data[t]<0?l+=d.data[t]||0:r+=d.data[t]||0)}return 0>o?n.getPixelForValue(l+o):n.getPixelForValue(r+o)}return n.getPixelForValue(o)},draw:function(t){var a=this,i=t||1;e.each(a.getMeta().data,function(t,e){var n=a.getDataset().data[e];null===n||void 0===n||isNaN(n)||t.transition(i).draw()},a)},setHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},o=t._model;o.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:e.getValueAtIndexOrDefault(a.hoverBackgroundColor,i,e.getHoverColor(o.backgroundColor)),o.borderColor=n.hoverBorderColor?n.hoverBorderColor:e.getValueAtIndexOrDefault(a.hoverBorderColor,i,e.getHoverColor(o.borderColor)),o.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:e.getValueAtIndexOrDefault(a.hoverBorderWidth,i,o.borderWidth)},removeHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},o=t._model,r=this.chart.options.elements.rectangle;o.backgroundColor=n.backgroundColor?n.backgroundColor:e.getValueAtIndexOrDefault(a.backgroundColor,i,r.backgroundColor),o.borderColor=n.borderColor?n.borderColor:e.getValueAtIndexOrDefault(a.borderColor,i,r.borderColor),o.borderWidth=n.borderWidth?n.borderWidth:e.getValueAtIndexOrDefault(a.borderWidth,i,r.borderWidth)}}),t.defaults.horizontalBar={hover:{mode:"label"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{position:"left",type:"category",categoryPercentage:.8,barPercentage:.9,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{callbacks:{title:function(t,e){var a="";return t.length>0&&(t[0].yLabel?a=t[0].yLabel:e.labels.length>0&&t[0].index<e.labels.length&&(a=e.labels[t[0].index])),a},label:function(t,e){var a=e.datasets[t.datasetIndex].label||"";return a+": "+t.xLabel}}}},t.controllers.horizontalBar=t.controllers.bar.extend({updateElement:function(t,a,i,n){var o=this,r=o.getMeta(),l=o.getScaleForId(r.xAxisID),s=o.getScaleForId(r.yAxisID),d=l.getBasePixel(),u=t.custom||{},c=o.getDataset(),h=o.chart.options.elements.rectangle;e.extend(t,{_xScale:l,_yScale:s,_datasetIndex:o.index,_index:a,_model:{x:i?d:o.calculateBarX(a,o.index),y:o.calculateBarY(a,o.index),label:o.chart.data.labels[a],datasetLabel:c.label,base:i?d:o.calculateBarBase(o.index,a),height:o.calculateBarHeight(a),backgroundColor:u.backgroundColor?u.backgroundColor:e.getValueAtIndexOrDefault(c.backgroundColor,a,h.backgroundColor),borderSkipped:u.borderSkipped?u.borderSkipped:h.borderSkipped,borderColor:u.borderColor?u.borderColor:e.getValueAtIndexOrDefault(c.borderColor,a,h.borderColor),borderWidth:u.borderWidth?u.borderWidth:e.getValueAtIndexOrDefault(c.borderWidth,a,h.borderWidth)},draw:function(){function t(t){return s[(u+t)%4]}var e=this._chart.ctx,a=this._view,i=a.height/2,n=a.y-i,o=a.y+i,r=a.base-(a.base-a.x),l=a.borderWidth/2;a.borderWidth&&(n+=l,o-=l,r+=l),e.beginPath(),e.fillStyle=a.backgroundColor,e.strokeStyle=a.borderColor,e.lineWidth=a.borderWidth;var s=[[a.base,o],[a.base,n],[r,n],[r,o]],d=["bottom","left","top","right"],u=d.indexOf(a.borderSkipped,0);-1===u&&(u=0),e.moveTo.apply(e,t(0));for(var c=1;4>c;c++)e.lineTo.apply(e,t(c));e.fill(),a.borderWidth&&e.stroke()},inRange:function(t,e){var a=this._view,i=!1;return a&&(i=a.x<a.base?e>=a.y-a.height/2&&e<=a.y+a.height/2&&t>=a.x&&t<=a.base:e>=a.y-a.height/2&&e<=a.y+a.height/2&&t>=a.base&&t<=a.x),i}}),t.pivot()},calculateBarBase:function(t,e){
+var a=this,i=a.getMeta(),n=a.getScaleForId(i.xAxisID),o=0;if(n.options.stacked){var r=a.chart.data.datasets[t].data[e];if(0>r)for(var l=0;t>l;l++){var s=a.chart.data.datasets[l],d=a.chart.getDatasetMeta(l);d.bar&&d.xAxisID===n.id&&a.chart.isDatasetVisible(l)&&(o+=s.data[e]<0?s.data[e]:0)}else for(var u=0;t>u;u++){var c=a.chart.data.datasets[u],h=a.chart.getDatasetMeta(u);h.bar&&h.xAxisID===n.id&&a.chart.isDatasetVisible(u)&&(o+=c.data[e]>0?c.data[e]:0)}return n.getPixelForValue(o)}return n.getBasePixel()},getRuler:function(t){var e,a=this,i=a.getMeta(),n=a.getScaleForId(i.yAxisID),o=a.getBarCount();e="category"===n.options.type?n.getPixelForTick(t+1)-n.getPixelForTick(t):n.width/n.ticks.length;var r=e*n.options.categoryPercentage,l=(e-e*n.options.categoryPercentage)/2,s=r/o;if(n.ticks.length!==a.chart.data.labels.length){var d=n.ticks.length/a.chart.data.labels.length;s*=d}var u=s*n.options.barPercentage,c=s-s*n.options.barPercentage;return{datasetCount:o,tickHeight:e,categoryHeight:r,categorySpacing:l,fullBarHeight:s,barHeight:u,barSpacing:c}},calculateBarHeight:function(t){var e=this,a=e.getScaleForId(e.getMeta().yAxisID),i=e.getRuler(t);return a.options.stacked?i.categoryHeight:i.barHeight},calculateBarX:function(t,e){var a=this,i=a.getMeta(),n=a.getScaleForId(i.xAxisID),o=a.getDataset().data[t];if(n.options.stacked){for(var r=0,l=0,s=0;e>s;s++){var d=a.chart.data.datasets[s],u=a.chart.getDatasetMeta(s);u.bar&&u.xAxisID===n.id&&a.chart.isDatasetVisible(s)&&(d.data[t]<0?l+=d.data[t]||0:r+=d.data[t]||0)}return 0>o?n.getPixelForValue(l+o):n.getPixelForValue(r+o)}return n.getPixelForValue(o)},calculateBarY:function(t,e){var a=this,i=a.getMeta(),n=a.getScaleForId(i.yAxisID),o=a.getBarIndex(e),r=a.getRuler(t),l=n.getPixelForValue(null,t,e,a.chart.isCombo);return l-=a.chart.isCombo?r.tickHeight/2:0,n.options.stacked?l+r.categoryHeight/2+r.categorySpacing:l+r.barHeight/2+r.categorySpacing+r.barHeight*o+r.barSpacing/2+r.barSpacing*o}})}},{}],16:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.bubble={hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(t,e){return""},label:function(t,e){var a=e.datasets[t.datasetIndex].label||"",i=e.datasets[t.datasetIndex].data[t.index];return a+": ("+i.x+", "+i.y+", "+i.r+")"}}}},t.controllers.bubble=t.DatasetController.extend({dataElementType:t.elements.Point,update:function(t){var a=this,i=a.getMeta(),n=i.data;e.each(n,function(e,i){a.updateElement(e,i,t)})},updateElement:function(a,i,n){var o=this,r=o.getMeta(),l=o.getScaleForId(r.xAxisID),s=o.getScaleForId(r.yAxisID),d=a.custom||{},u=o.getDataset(),c=u.data[i],h=o.chart.options.elements.point,f=o.index;e.extend(a,{_xScale:l,_yScale:s,_datasetIndex:f,_index:i,_model:{x:n?l.getPixelForDecimal(.5):l.getPixelForValue(c,i,f,o.chart.isCombo),y:n?s.getBasePixel():s.getPixelForValue(c,i,f),radius:n?0:d.radius?d.radius:o.getRadius(c),hitRadius:d.hitRadius?d.hitRadius:e.getValueAtIndexOrDefault(u.hitRadius,i,h.hitRadius)}}),t.DatasetController.prototype.removeHoverStyle.call(o,a,h);var g=a._model;g.skip=d.skip?d.skip:isNaN(g.x)||isNaN(g.y),a.pivot()},getRadius:function(t){return t.r||this.chart.options.elements.point.radius},setHoverStyle:function(a){var i=this;t.DatasetController.prototype.setHoverStyle.call(i,a);var n=i.chart.data.datasets[a._datasetIndex],o=a._index,r=a.custom||{},l=a._model;l.radius=r.hoverRadius?r.hoverRadius:e.getValueAtIndexOrDefault(n.hoverRadius,o,i.chart.options.elements.point.hoverRadius)+i.getRadius(n.data[o])},removeHoverStyle:function(e){var a=this;t.DatasetController.prototype.removeHoverStyle.call(a,e,a.chart.options.elements.point);var i=a.chart.data.datasets[e._datasetIndex].data[e._index],n=e.custom||{},o=e._model;o.radius=n.radius?n.radius:a.getRadius(i)}})}},{}],17:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=t.defaults;a.doughnut={animation:{animateRotate:!0,animateScale:!1},aspectRatio:1,hover:{mode:"single"},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var a=t.data,i=a.datasets,n=a.labels;if(i.length)for(var o=0;o<i[0].data.length;++o)e.push('<li><span style="background-color:'+i[0].backgroundColor[o]+'"></span>'),n[o]&&e.push(n[o]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var a=t.data;return a.labels.length&&a.datasets.length?a.labels.map(function(i,n){var o=t.getDatasetMeta(0),r=a.datasets[0],l=o.data[n],s=l.custom||{},d=e.getValueAtIndexOrDefault,u=t.options.elements.arc,c=s.backgroundColor?s.backgroundColor:d(r.backgroundColor,n,u.backgroundColor),h=s.borderColor?s.borderColor:d(r.borderColor,n,u.borderColor),f=s.borderWidth?s.borderWidth:d(r.borderWidth,n,u.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[n])||o.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var a,i,n,o=e.index,r=this.chart;for(a=0,i=(r.data.datasets||[]).length;i>a;++a)n=r.getDatasetMeta(a),n.data[o].hidden=!n.data[o].hidden;r.update()}},cutoutPercentage:50,rotation:Math.PI*-.5,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+e.datasets[t.datasetIndex].data[t.index]}}}},a.pie=e.clone(a.doughnut),e.extend(a.pie,{cutoutPercentage:0}),t.controllers.doughnut=t.controllers.pie=t.DatasetController.extend({dataElementType:t.elements.Arc,linkScales:e.noop,getRingIndex:function(t){for(var e=0,a=0;t>a;++a)this.chart.isDatasetVisible(a)&&++e;return e},update:function(t){var a=this,i=a.chart,n=i.chartArea,o=i.options,r=o.elements.arc,l=n.right-n.left-r.borderWidth,s=n.bottom-n.top-r.borderWidth,d=Math.min(l,s),u={x:0,y:0},c=a.getMeta(),h=o.cutoutPercentage,f=o.circumference;if(f<2*Math.PI){var g=o.rotation%(2*Math.PI);g+=2*Math.PI*(g>=Math.PI?-1:g<-Math.PI?1:0);var p=g+f,m={x:Math.cos(g),y:Math.sin(g)},b={x:Math.cos(p),y:Math.sin(p)},v=0>=g&&p>=0||g<=2*Math.PI&&2*Math.PI<=p,x=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,y=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,S=h/100,w={x:y?-1:Math.min(m.x*(m.x<0?1:S),b.x*(b.x<0?1:S)),y:k?-1:Math.min(m.y*(m.y<0?1:S),b.y*(b.y<0?1:S))},C={x:v?1:Math.max(m.x*(m.x>0?1:S),b.x*(b.x>0?1:S)),y:x?1:Math.max(m.y*(m.y>0?1:S),b.y*(b.y>0?1:S))},M={width:.5*(C.x-w.x),height:.5*(C.y-w.y)};d=Math.min(l/M.width,s/M.height),u={x:(C.x+w.x)*-.5,y:(C.y+w.y)*-.5}}i.outerRadius=Math.max(d/2,0),i.innerRadius=Math.max(h?i.outerRadius/100*h:1,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),i.offsetX=u.x*i.outerRadius,i.offsetY=u.y*i.outerRadius,c.total=a.calculateTotal(),a.outerRadius=i.outerRadius-i.radiusLength*a.getRingIndex(a.index),a.innerRadius=a.outerRadius-i.radiusLength,e.each(c.data,function(e,i){a.updateElement(e,i,t)})},updateElement:function(t,a,i){var n=this,o=n.chart,r=o.chartArea,l=o.options,s=l.animation,d=(l.elements.arc,(r.left+r.right)/2),u=(r.top+r.bottom)/2,c=l.rotation,h=l.rotation,f=n.getDataset(),g=i&&s.animateRotate?0:t.hidden?0:n.calculateCircumference(f.data[a])*(l.circumference/(2*Math.PI)),p=i&&s.animateScale?0:n.innerRadius,m=i&&s.animateScale?0:n.outerRadius,b=(t.custom||{},e.getValueAtIndexOrDefault);e.extend(t,{_datasetIndex:n.index,_index:a,_model:{x:d+o.offsetX,y:u+o.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:m,innerRadius:p,label:b(f.label,a,o.data.labels[a])}});var v=t._model;this.removeHoverStyle(t),i&&s.animateRotate||(0===a?v.startAngle=l.rotation:v.startAngle=n.getMeta().data[a-1]._model.endAngle,v.endAngle=v.startAngle+v.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,a=this.getDataset(),i=this.getMeta(),n=0;return e.each(i.data,function(e,i){t=a.data[i],isNaN(t)||e.hidden||(n+=Math.abs(t))}),n},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0}})}},{}],18:[function(t,e,a){"use strict";e.exports=function(t){function e(t,e){return a.getValueOrDefault(t.showLine,e.showLines)}var a=t.helpers;t.defaults.line={showLines:!0,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}},t.controllers.line=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,addElementAndReset:function(a){var i=this,n=i.chart.options,o=i.getMeta();t.DatasetController.prototype.addElementAndReset.call(i,a),e(i.getDataset(),n)&&0!==o.dataset._model.tension&&i.updateBezierControlPoints()},update:function(t){var i,n,o,r=this,l=r.getMeta(),s=l.dataset,d=l.data||[],u=r.chart.options,c=u.elements.line,h=r.getScaleForId(l.yAxisID),f=r.getDataset(),g=e(f,u);for(g&&(o=s.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),s._scale=h,s._datasetIndex=r.index,s._children=d,s._model={spanGaps:f.spanGaps?f.spanGaps:!1,tension:o.tension?o.tension:a.getValueOrDefault(f.lineTension,c.tension),backgroundColor:o.backgroundColor?o.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:f.borderWidth||c.borderWidth,borderColor:o.borderColor?o.borderColor:f.borderColor||c.borderColor,borderCapStyle:o.borderCapStyle?o.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:o.borderDash?o.borderDash:f.borderDash||c.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:o.fill?o.fill:void 0!==f.fill?f.fill:c.fill,scaleTop:h.top,scaleBottom:h.bottom,scaleZero:h.getBasePixel()},s.pivot()),i=0,n=d.length;n>i;++i)r.updateElement(d[i],i,t);for(g&&0!==s._model.tension&&r.updateBezierControlPoints(),i=0,n=d.length;n>i;++i)d[i].pivot()},getPointBackgroundColor:function(t,e){var i=this.chart.options.elements.point.backgroundColor,n=this.getDataset(),o=t.custom||{};return o.backgroundColor?i=o.backgroundColor:n.pointBackgroundColor?i=a.getValueAtIndexOrDefault(n.pointBackgroundColor,e,i):n.backgroundColor&&(i=n.backgroundColor),i},getPointBorderColor:function(t,e){var i=this.chart.options.elements.point.borderColor,n=this.getDataset(),o=t.custom||{};return o.borderColor?i=o.borderColor:n.pointBorderColor?i=a.getValueAtIndexOrDefault(n.pointBorderColor,e,i):n.borderColor&&(i=n.borderColor),i},getPointBorderWidth:function(t,e){var i=this.chart.options.elements.point.borderWidth,n=this.getDataset(),o=t.custom||{};return o.borderWidth?i=o.borderWidth:n.pointBorderWidth?i=a.getValueAtIndexOrDefault(n.pointBorderWidth,e,i):n.borderWidth&&(i=n.borderWidth),i},updateElement:function(t,e,i){var n,o,r=this,l=r.getMeta(),s=t.custom||{},d=r.getDataset(),u=r.index,c=d.data[e],h=r.getScaleForId(l.yAxisID),f=r.getScaleForId(l.xAxisID),g=r.chart.options.elements.point;void 0!==d.radius&&void 0===d.pointRadius&&(d.pointRadius=d.radius),void 0!==d.hitRadius&&void 0===d.pointHitRadius&&(d.pointHitRadius=d.hitRadius),n=f.getPixelForValue(c,e,u,r.chart.isCombo),o=i?h.getBasePixel():r.calculatePointY(c,e,u,r.chart.isCombo),t._xScale=f,t._yScale=h,t._datasetIndex=u,t._index=e,t._model={x:n,y:o,skip:s.skip||isNaN(n)||isNaN(o),radius:s.radius||a.getValueAtIndexOrDefault(d.pointRadius,e,g.radius),pointStyle:s.pointStyle||a.getValueAtIndexOrDefault(d.pointStyle,e,g.pointStyle),backgroundColor:r.getPointBackgroundColor(t,e),borderColor:r.getPointBorderColor(t,e),borderWidth:r.getPointBorderWidth(t,e),tension:l.dataset._model?l.dataset._model.tension:0,hitRadius:s.hitRadius||a.getValueAtIndexOrDefault(d.pointHitRadius,e,g.hitRadius)}},calculatePointY:function(t,e,a,i){var n,o,r,l=this,s=l.chart,d=l.getMeta(),u=l.getScaleForId(d.yAxisID),c=0,h=0;if(u.options.stacked){for(n=0;a>n;n++)o=s.data.datasets[n],r=s.getDatasetMeta(n),"line"===r.type&&s.isDatasetVisible(n)&&(o.data[e]<0?h+=o.data[e]||0:c+=o.data[e]||0);return 0>t?u.getPixelForValue(h+t):u.getPixelForValue(c+t)}return u.getPixelForValue(t)},updateBezierControlPoints:function(){var t,e,i,n,o,r=this.getMeta(),l=(this.chart.chartArea,r.data||[]);for(t=0,e=l.length;e>t;++t)i=l[t],n=i._model,o=a.splineCurve(a.previousItem(l,t)._model,n,a.nextItem(l,t)._model,r.dataset._model.tension),n.controlPointPreviousX=o.previous.x,n.controlPointPreviousY=o.previous.y,n.controlPointNextX=o.next.x,n.controlPointNextY=o.next.y},draw:function(t){var a,i,n=this,o=n.getMeta(),r=o.data||[],l=t||1;for(a=0,i=r.length;i>a;++a)r[a].transition(l);for(e(n.getDataset(),n.chart.options)&&o.dataset.transition(l).draw(),a=0,i=r.length;i>a;++a)r[a].draw()},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},o=t._model;o.radius=n.hoverRadius||a.getValueAtIndexOrDefault(e.pointHoverRadius,i,this.chart.options.elements.point.hoverRadius),o.backgroundColor=n.hoverBackgroundColor||a.getValueAtIndexOrDefault(e.pointHoverBackgroundColor,i,a.getHoverColor(o.backgroundColor)),o.borderColor=n.hoverBorderColor||a.getValueAtIndexOrDefault(e.pointHoverBorderColor,i,a.getHoverColor(o.borderColor)),o.borderWidth=n.hoverBorderWidth||a.getValueAtIndexOrDefault(e.pointHoverBorderWidth,i,o.borderWidth)},removeHoverStyle:function(t){var e=this,i=e.chart.data.datasets[t._datasetIndex],n=t._index,o=t.custom||{},r=t._model;void 0!==i.radius&&void 0===i.pointRadius&&(i.pointRadius=i.radius),r.radius=o.radius||a.getValueAtIndexOrDefault(i.pointRadius,n,e.chart.options.elements.point.radius),r.backgroundColor=e.getPointBackgroundColor(t,n),r.borderColor=e.getPointBorderColor(t,n),r.borderWidth=e.getPointBorderWidth(t,n)}})}},{}],19:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.polarArea={scale:{type:"radialLinear",lineArc:!0},animation:{animateRotate:!0,animateScale:!0},aspectRatio:1,legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var a=t.data,i=a.datasets,n=a.labels;if(i.length)for(var o=0;o<i[0].data.length;++o)e.push('<li><span style="background-color:'+i[0].backgroundColor[o]+'">'),n[o]&&e.push(n[o]),e.push("</span></li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var a=t.data;return a.labels.length&&a.datasets.length?a.labels.map(function(i,n){var o=t.getDatasetMeta(0),r=a.datasets[0],l=o.data[n],s=l.custom||{},d=e.getValueAtIndexOrDefault,u=t.options.elements.arc,c=s.backgroundColor?s.backgroundColor:d(r.backgroundColor,n,u.backgroundColor),h=s.borderColor?s.borderColor:d(r.borderColor,n,u.borderColor),f=s.borderWidth?s.borderWidth:d(r.borderWidth,n,u.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[n])||o.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var a,i,n,o=e.index,r=this.chart;for(a=0,i=(r.data.datasets||[]).length;i>a;++a)n=r.getDatasetMeta(a),n.data[o].hidden=!n.data[o].hidden;r.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}},t.controllers.polarArea=t.DatasetController.extend({dataElementType:t.elements.Arc,linkScales:e.noop,update:function(t){var a=this,i=a.chart,n=i.chartArea,o=a.getMeta(),r=i.options,l=r.elements.arc,s=Math.min(n.right-n.left,n.bottom-n.top);i.outerRadius=Math.max((s-l.borderWidth/2)/2,0),i.innerRadius=Math.max(r.cutoutPercentage?i.outerRadius/100*r.cutoutPercentage:1,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),a.outerRadius=i.outerRadius-i.radiusLength*a.index,a.innerRadius=a.outerRadius-i.radiusLength,o.count=a.countVisibleElements(),e.each(o.data,function(e,i){a.updateElement(e,i,t)})},updateElement:function(t,a,i){for(var n=this,o=n.chart,r=o.chartArea,l=n.getDataset(),s=o.options,d=s.animation,u=(s.elements.arc,t.custom||{},o.scale),c=e.getValueAtIndexOrDefault,h=o.data.labels,f=n.calculateCircumference(l.data[a]),g=(r.left+r.right)/2,p=(r.top+r.bottom)/2,m=0,b=n.getMeta(),v=0;a>v;++v)isNaN(l.data[v])||b.data[v].hidden||++m;var x=-.5*Math.PI,y=t.hidden?0:u.getDistanceFromCenterForValue(l.data[a]),k=x+f*m,S=k+(t.hidden?0:f),w=d.animateScale?0:u.getDistanceFromCenterForValue(l.data[a]);e.extend(t,{_datasetIndex:n.index,_index:a,_scale:u,_model:{x:g,y:p,innerRadius:0,outerRadius:i?w:y,startAngle:i&&d.animateRotate?x:k,endAngle:i&&d.animateRotate?x:S,label:c(h,a,h[a])}}),n.removeHoverStyle(t),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},countVisibleElements:function(){var t=this.getDataset(),a=this.getMeta(),i=0;return e.each(a.data,function(e,a){isNaN(t.data[a])||e.hidden||i++}),i},calculateCircumference:function(t){var e=this.getMeta().count;return e>0&&!isNaN(t)?2*Math.PI/e:0}})}},{}],20:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.radar={scale:{type:"radialLinear"},elements:{line:{tension:0}}},t.controllers.radar=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,linkScales:e.noop,addElementAndReset:function(e){t.DatasetController.prototype.addElementAndReset.call(this,e),this.updateBezierControlPoints()},update:function(t){var a=this,i=a.getMeta(),n=i.dataset,o=i.data,r=n.custom||{},l=a.getDataset(),s=a.chart.options.elements.line,d=a.chart.scale;void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),e.extend(i.dataset,{_datasetIndex:a.index,_children:o,_loop:!0,_model:{tension:r.tension?r.tension:e.getValueOrDefault(l.lineTension,s.tension),backgroundColor:r.backgroundColor?r.backgroundColor:l.backgroundColor||s.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:l.borderWidth||s.borderWidth,borderColor:r.borderColor?r.borderColor:l.borderColor||s.borderColor,fill:r.fill?r.fill:void 0!==l.fill?l.fill:s.fill,borderCapStyle:r.borderCapStyle?r.borderCapStyle:l.borderCapStyle||s.borderCapStyle,borderDash:r.borderDash?r.borderDash:l.borderDash||s.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:l.borderDashOffset||s.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:l.borderJoinStyle||s.borderJoinStyle,scaleTop:d.top,scaleBottom:d.bottom,scaleZero:d.getBasePosition()}}),i.dataset.pivot(),e.each(o,function(e,i){a.updateElement(e,i,t)},a),a.updateBezierControlPoints()},updateElement:function(t,a,i){var n=this,o=t.custom||{},r=n.getDataset(),l=n.chart.scale,s=n.chart.options.elements.point,d=l.getPointPositionForValue(a,r.data[a]);e.extend(t,{_datasetIndex:n.index,_index:a,_scale:l,_model:{x:i?l.xCenter:d.x,y:i?l.yCenter:d.y,tension:o.tension?o.tension:e.getValueOrDefault(r.tension,n.chart.options.elements.line.tension),radius:o.radius?o.radius:e.getValueAtIndexOrDefault(r.pointRadius,a,s.radius),backgroundColor:o.backgroundColor?o.backgroundColor:e.getValueAtIndexOrDefault(r.pointBackgroundColor,a,s.backgroundColor),borderColor:o.borderColor?o.borderColor:e.getValueAtIndexOrDefault(r.pointBorderColor,a,s.borderColor),borderWidth:o.borderWidth?o.borderWidth:e.getValueAtIndexOrDefault(r.pointBorderWidth,a,s.borderWidth),pointStyle:o.pointStyle?o.pointStyle:e.getValueAtIndexOrDefault(r.pointStyle,a,s.pointStyle),hitRadius:o.hitRadius?o.hitRadius:e.getValueAtIndexOrDefault(r.hitRadius,a,s.hitRadius)}}),t._model.skip=o.skip?o.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,a=this.getMeta();e.each(a.data,function(i,n){var o=i._model,r=e.splineCurve(e.previousItem(a.data,n,!0)._model,o,e.nextItem(a.data,n,!0)._model,o.tension);o.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),o.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),o.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),o.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),i.pivot()})},draw:function(t){var a=this.getMeta(),i=t||1;e.each(a.data,function(t,e){t.transition(i)}),a.dataset.transition(i).draw(),e.each(a.data,function(t){t.draw()})},setHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},n=t._index,o=t._model;o.radius=i.hoverRadius?i.hoverRadius:e.getValueAtIndexOrDefault(a.pointHoverRadius,n,this.chart.options.elements.point.hoverRadius),o.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:e.getValueAtIndexOrDefault(a.pointHoverBackgroundColor,n,e.getHoverColor(o.backgroundColor)),o.borderColor=i.hoverBorderColor?i.hoverBorderColor:e.getValueAtIndexOrDefault(a.pointHoverBorderColor,n,e.getHoverColor(o.borderColor)),o.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:e.getValueAtIndexOrDefault(a.pointHoverBorderWidth,n,o.borderWidth)},removeHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},n=t._index,o=t._model,r=this.chart.options.elements.point;o.radius=i.radius?i.radius:e.getValueAtIndexOrDefault(a.radius,n,r.radius),o.backgroundColor=i.backgroundColor?i.backgroundColor:e.getValueAtIndexOrDefault(a.pointBackgroundColor,n,r.backgroundColor),o.borderColor=i.borderColor?i.borderColor:e.getValueAtIndexOrDefault(a.pointBorderColor,n,r.borderColor),o.borderWidth=i.borderWidth?i.borderWidth:e.getValueAtIndexOrDefault(a.pointBorderWidth,n,r.borderWidth)}})}},{}],21:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.animation={duration:1e3,easing:"easeOutQuart",onProgress:e.noop,onComplete:e.noop},t.Animation=t.Element.extend({currentStep:null,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,a,i){var n=this;i||(t.animating=!0);for(var o=0;o<n.animations.length;++o)if(n.animations[o].chartInstance===t)return void(n.animations[o].animationObject=e);n.animations.push({chartInstance:t,animationObject:e}),1===n.animations.length&&n.requestAnimationFrame()},cancelAnimation:function(t){var a=e.findIndex(this.animations,function(e){return e.chartInstance===t});-1!==a&&(this.animations.splice(a,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=e.requestAnimFrame.call(window,function(){t.request=null,t.startDigest()}))},startDigest:function(){var t=this,e=Date.now(),a=0;t.dropFrames>1&&(a=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1);for(var i=0;i<t.animations.length;)null===t.animations[i].animationObject.currentStep&&(t.animations[i].animationObject.currentStep=0),t.animations[i].animationObject.currentStep+=1+a,t.animations[i].animationObject.currentStep>t.animations[i].animationObject.numSteps&&(t.animations[i].animationObject.currentStep=t.animations[i].animationObject.numSteps),t.animations[i].animationObject.render(t.animations[i].chartInstance,t.animations[i].animationObject),t.animations[i].animationObject.onAnimationProgress&&t.animations[i].animationObject.onAnimationProgress.call&&t.animations[i].animationObject.onAnimationProgress.call(t.animations[i].chartInstance,t.animations[i]),t.animations[i].animationObject.currentStep===t.animations[i].animationObject.numSteps?(t.animations[i].animationObject.onAnimationComplete&&t.animations[i].animationObject.onAnimationComplete.call&&t.animations[i].animationObject.onAnimationComplete.call(t.animations[i].chartInstance,t.animations[i]),t.animations[i].chartInstance.animating=!1,t.animations.splice(i,1)):++i;var n=Date.now(),o=(n-e)/t.frameDuration;t.dropFrames+=o,t.animations.length>0&&t.requestAnimationFrame()}}}},{}],22:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.types={},t.instances={},t.controllers={},t.Controller=function(a){return this.chart=a,this.config=a.config,this.options=this.config.options=e.configMerge(t.defaults.global,t.defaults[this.config.type],this.config.options||{}),this.id=e.uid(),Object.defineProperty(this,"data",{get:function(){return this.config.data}}),t.instances[this.id]=this,this.options.responsive&&this.resize(!0),this.initialize(),this},e.extend(t.Controller.prototype,{initialize:function(){var e=this;return t.plugins.notify("beforeInit",[e]),e.bindEvents(),e.ensureScalesHaveIDs(),e.buildOrUpdateControllers(),e.buildScales(),e.updateLayout(),e.resetElements(),e.initToolTip(),e.update(),t.plugins.notify("afterInit",[e]),e},clear:function(){return e.clear(this.chart),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(a){var i=this,n=i.chart,o=n.canvas,r=e.getMaximumWidth(o),l=n.aspectRatio,s=i.options.maintainAspectRatio&&isNaN(l)===!1&&isFinite(l)&&0!==l?r/l:e.getMaximumHeight(o),d=n.width!==r||n.height!==s;if(!d)return i;o.width=n.width=r,o.height=n.height=s,e.retinaScale(n);var u={width:r,height:s};return t.plugins.notify("resize",[i,u]),i.options.onResize&&i.options.onResize(i,u),a||(i.stop(),i.update(i.options.responsiveAnimationDuration)),i},ensureScalesHaveIDs:function(){var t=this.options,a=t.scales||{},i=t.scale;e.each(a.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),e.each(a.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),i&&(i.id=i.id||"scale")},buildScales:function(){var a=this,i=a.options,n=a.scales={},o=[];i.scales&&(o=o.concat((i.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category"}}),(i.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear"}}))),i.scale&&o.push({options:i.scale,dtype:"radialLinear",isDefault:!0}),e.each(o,function(i,o){var r=i.options,l=e.getValueOrDefault(r.type,i.dtype),s=t.scaleService.getScaleConstructor(l);if(s){var d=new s({id:r.id,options:r,ctx:a.chart.ctx,chart:a});n[d.id]=d,i.isDefault&&(a.scale=d)}}),t.scaleService.addScalesToLayout(this)},updateLayout:function(){t.layoutService.update(this,this.chart.width,this.chart.height)},buildOrUpdateControllers:function(){var a=this,i=[],n=[];if(e.each(a.data.datasets,function(e,o){var r=a.getDatasetMeta(o);r.type||(r.type=e.type||a.config.type),i.push(r.type),r.controller?r.controller.updateIndex(o):(r.controller=new t.controllers[r.type](a,o),n.push(r.controller))},a),i.length>1)for(var o=1;o<i.length;o++)if(i[o]!==i[o-1]){a.isCombo=!0;break}return n},resetElements:function(){var t=this;e.each(t.data.datasets,function(e,a){t.getDatasetMeta(a).controller.reset()},t)},update:function(a,i){var n=this;t.plugins.notify("beforeUpdate",[n]),n.tooltip._data=n.data;var o=n.buildOrUpdateControllers();e.each(n.data.datasets,function(t,e){n.getDatasetMeta(e).controller.buildOrUpdateElements()},n),t.layoutService.update(n,n.chart.width,n.chart.height),t.plugins.notify("afterScaleUpdate",[n]),e.each(o,function(t){t.reset()}),n.updateDatasets(),t.plugins.notify("afterUpdate",[n]),n.render(a,i)},updateDatasets:function(){var e,a,i=this;if(t.plugins.notify("beforeDatasetsUpdate",[i])){for(e=0,a=i.data.datasets.length;a>e;++e)i.getDatasetMeta(e).controller.update();t.plugins.notify("afterDatasetsUpdate",[i])}},render:function(a,i){var n=this;t.plugins.notify("beforeRender",[n]);var o=n.options.animation;if(o&&("undefined"!=typeof a&&0!==a||"undefined"==typeof a&&0!==o.duration)){var r=new t.Animation;r.numSteps=(a||o.duration)/16.66,r.easing=o.easing,r.render=function(t,a){var i=e.easingEffects[a.easing],n=a.currentStep/a.numSteps,o=i(n);t.draw(o,n,a.currentStep)},r.onAnimationProgress=o.onProgress,r.onAnimationComplete=o.onComplete,t.animationService.addAnimation(n,r,a,i)}else n.draw(),o&&o.onComplete&&o.onComplete.call&&o.onComplete.call(n);return n},draw:function(a){var i=this,n=a||1;i.clear(),t.plugins.notify("beforeDraw",[i,n]),e.each(i.boxes,function(t){t.draw(i.chartArea)},i),i.scale&&i.scale.draw(),t.plugins.notify("beforeDatasetsDraw",[i,n]),e.each(i.data.datasets,function(t,e){i.isDatasetVisible(e)&&i.getDatasetMeta(e).controller.draw(a)},i,!0),t.plugins.notify("afterDatasetsDraw",[i,n]),i.tooltip.transition(n).draw(),t.plugins.notify("afterDraw",[i,n])},getElementAtEvent:function(t){var a=this,i=e.getRelativePosition(t,a.chart),n=[];return e.each(a.data.datasets,function(t,o){if(a.isDatasetVisible(o)){var r=a.getDatasetMeta(o);e.each(r.data,function(t,e){return t.inRange(i.x,i.y)?(n.push(t),n):void 0})}}),n},getElementsAtEvent:function(t){var a=this,i=e.getRelativePosition(t,a.chart),n=[],o=function(){if(a.data.datasets)for(var t=0;t<a.data.datasets.length;t++){var e=a.getDatasetMeta(t);if(a.isDatasetVisible(t))for(var n=0;n<e.data.length;n++)if(e.data[n].inRange(i.x,i.y))return e.data[n]}}.call(a);return o?(e.each(a.data.datasets,function(t,e){if(a.isDatasetVisible(e)){var i=a.getDatasetMeta(e);n.push(i.data[o._index])}},a),n):n},getElementsAtEventForMode:function(t,e){var a=this;switch(e){case"single":return a.getElementAtEvent(t);case"label":return a.getElementsAtEvent(t);case"dataset":return a.getDatasetAtEvent(t);default:return t}},getDatasetAtEvent:function(t){var e=this.getElementAtEvent(t);return e.length>0&&(e=this.getDatasetMeta(e[0]._datasetIndex).data),e},getDatasetMeta:function(t){var e=this,a=e.data.datasets[t];a._meta||(a._meta={});var i=a._meta[e.id];return i||(i=a._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,a=this.data.datasets.length;a>e;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroy:function(){var a=this;a.stop(),a.clear(),e.unbindEvents(a,a.events),e.removeResizeListener(a.chart.canvas.parentNode);var i=a.chart.canvas;i.width=a.chart.width,i.height=a.chart.height,void 0!==a.chart.originalDevicePixelRatio&&a.chart.ctx.scale(1/a.chart.originalDevicePixelRatio,1/a.chart.originalDevicePixelRatio),i.style.width=a.chart.originalCanvasStyleWidth,i.style.height=a.chart.originalCanvasStyleHeight,t.plugins.notify("destroy",[a]),delete t.instances[a.id]},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)},initToolTip:function(){var e=this;e.tooltip=new t.Tooltip({_chart:e.chart,_chartInstance:e,_data:e.data,_options:e.options.tooltips},e)},bindEvents:function(){var t=this;e.bindEvents(t,t.options.events,function(e){t.eventHandler(e)})},updateHoverStyle:function(t,e,a){var i,n,o,r=a?"setHoverStyle":"removeHoverStyle";switch(e){case"single":t=[t[0]];break;case"label":case"dataset":break;default:return}for(n=0,o=t.length;o>n;++n)i=t[n],i&&this.getDatasetMeta(i._datasetIndex).controller[r](i)},eventHandler:function(t){var a=this,i=a.tooltip,n=a.options||{},o=n.hover,r=n.tooltips;return a.lastActive=a.lastActive||[],a.lastTooltipActive=a.lastTooltipActive||[],"mouseout"===t.type?(a.active=[],a.tooltipActive=[]):(a.active=a.getElementsAtEventForMode(t,o.mode),a.tooltipActive=a.getElementsAtEventForMode(t,r.mode)),o.onHover&&o.onHover.call(a,a.active),("mouseup"===t.type||"click"===t.type)&&(n.onClick&&n.onClick.call(a,t,a.active),a.legend&&a.legend.handleEvent&&a.legend.handleEvent(t)),a.lastActive.length&&a.updateHoverStyle(a.lastActive,o.mode,!1),a.active.length&&o.mode&&a.updateHoverStyle(a.active,o.mode,!0),(r.enabled||r.custom)&&(i.initialize(),i._active=a.tooltipActive,i.update(!0)),i.pivot(),a.animating||e.arrayEquals(a.active,a.lastActive)&&e.arrayEquals(a.tooltipActive,a.lastTooltipActive)||(a.stop(),(r.enabled||r.custom)&&i.update(!0),a.render(o.animationDuration,!0)),a.lastActive=a.active,a.lastTooltipActive=a.tooltipActive,a}})}},{}],23:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=e.noop;t.DatasetController=function(t,e){this.initialize.call(this,t,e)},e.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var a=this;a.chart=t,a.index=e,a.linkScales(),a.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),a=t.getDataset();null===e.xAxisID&&(e.xAxisID=a.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=a.yAxisID||t.chart.options.scales.yAxes[0].id);
+},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,a=e.dataElementType;return a&&new a({_chart:e.chart.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,a=this,i=a.getMeta(),n=a.getDataset().data||[],o=i.data;for(t=0,e=n.length;e>t;++t)o[t]=o[t]||a.createMetaData(i,t);i.dataset=i.dataset||a.createMetaDataset()},addElementAndReset:function(t){var e=this,a=e.createMetaData(t);e.getMeta().data.splice(t,0,a),e.updateElement(a,t,!0)},buildOrUpdateElements:function(){var t=this.getMeta(),e=t.data,a=this.getDataset().data.length,i=e.length;if(i>a)e.splice(a,i-a);else if(a>i)for(var n=i;a>n;++n)this.addElementAndReset(n)},update:a,draw:function(t){var a=t||1;e.each(this.getMeta().data,function(t,e){t.transition(a).draw()})},removeHoverStyle:function(t,a){var i=this.chart.data.datasets[t._datasetIndex],n=t._index,o=t.custom||{},r=e.getValueAtIndexOrDefault,l=(e.color,t._model);l.backgroundColor=o.backgroundColor?o.backgroundColor:r(i.backgroundColor,n,a.backgroundColor),l.borderColor=o.borderColor?o.borderColor:r(i.borderColor,n,a.borderColor),l.borderWidth=o.borderWidth?o.borderWidth:r(i.borderWidth,n,a.borderWidth)},setHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},o=e.getValueAtIndexOrDefault,r=(e.color,e.getHoverColor),l=t._model;l.backgroundColor=n.hoverBackgroundColor?n.hoverBackgroundColor:o(a.hoverBackgroundColor,i,r(l.backgroundColor)),l.borderColor=n.hoverBorderColor?n.hoverBorderColor:o(a.hoverBorderColor,i,r(l.borderColor)),l.borderWidth=n.hoverBorderWidth?n.hoverBorderWidth:o(a.hoverBorderWidth,i,l.borderWidth)}}),t.DatasetController.extend=e.inherits}},{}],24:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.elements={},t.Element=function(t){e.extend(this,t),this.initialize.apply(this,arguments)},e.extend(t.Element.prototype,{initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=e.clone(t._model)),t._start=e.clone(t._view),t},transition:function(t){var a=this;return a._view||(a._view=e.clone(a._model)),1===t?(a._view=a._model,a._start=null,a):(a._start||a.pivot(),e.each(a._model,function(i,n){if("_"===n[0]);else if(a._view.hasOwnProperty(n))if(i===a._view[n]);else if("string"==typeof i)try{var o=e.color(a._model[n]).mix(e.color(a._start[n]),t);a._view[n]=o.rgbString()}catch(r){a._view[n]=i}else if("number"==typeof i){var l=void 0!==a._start[n]&&isNaN(a._start[n])===!1?a._start[n]:0;a._view[n]=(a._model[n]-l)*t+l}else a._view[n]=i;else"number"!=typeof i||isNaN(a._view[n])?a._view[n]=i:a._view[n]=i*t},a),a)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return e.isNumber(this._model.x)&&e.isNumber(this._model.y)}}),t.Element.extend=e.inherits}},{}],25:[function(t,e,a){"use strict";var i=t(3);e.exports=function(t){function e(t,e,a){var i;return"string"==typeof t?(i=parseInt(t,10),-1!=t.indexOf("%")&&(i=i/100*e.parentNode[a])):i=t,i}function a(t){return void 0!==t&&null!==t&&"none"!==t}function n(t,i,n){var o=document.defaultView,r=t.parentNode,l=o.getComputedStyle(t)[i],s=o.getComputedStyle(r)[i],d=a(l),u=a(s),c=Number.POSITIVE_INFINITY;return d||u?Math.min(d?e(l,t,n):c,u?e(s,r,n):c):"none"}var o=t.helpers={};o.each=function(t,e,a,i){var n,r;if(o.isArray(t))if(r=t.length,i)for(n=r-1;n>=0;n--)e.call(a,t[n],n);else for(n=0;r>n;n++)e.call(a,t[n],n);else if("object"==typeof t){var l=Object.keys(t);for(r=l.length,n=0;r>n;n++)e.call(a,t[l[n]],l[n])}},o.clone=function(t){var e={};return o.each(t,function(t,a){o.isArray(t)?e[a]=t.slice(0):"object"==typeof t&&null!==t?e[a]=o.clone(t):e[a]=t}),e},o.extend=function(t){for(var e=function(e,a){t[a]=e},a=1,i=arguments.length;i>a;a++)o.each(arguments[a],e);return t},o.configMerge=function(e){var a=o.clone(e);return o.each(Array.prototype.slice.call(arguments,1),function(e){o.each(e,function(e,i){if("scales"===i)a[i]=o.scaleMerge(a.hasOwnProperty(i)?a[i]:{},e);else if("scale"===i)a[i]=o.configMerge(a.hasOwnProperty(i)?a[i]:{},t.scaleService.getScaleDefaults(e.type),e);else if(a.hasOwnProperty(i)&&o.isArray(a[i])&&o.isArray(e)){var n=a[i];o.each(e,function(t,e){e<n.length?"object"==typeof n[e]&&null!==n[e]&&"object"==typeof t&&null!==t?n[e]=o.configMerge(n[e],t):n[e]=t:n.push(t)})}else a.hasOwnProperty(i)&&"object"==typeof a[i]&&null!==a[i]&&"object"==typeof e?a[i]=o.configMerge(a[i],e):a[i]=e})}),a},o.scaleMerge=function(e,a){var i=o.clone(e);return o.each(a,function(e,a){"xAxes"===a||"yAxes"===a?i.hasOwnProperty(a)?o.each(e,function(e,n){var r=o.getValueOrDefault(e.type,"xAxes"===a?"category":"linear"),l=t.scaleService.getScaleDefaults(r);n>=i[a].length||!i[a][n].type?i[a].push(o.configMerge(l,e)):e.type&&e.type!==i[a][n].type?i[a][n]=o.configMerge(i[a][n],l,e):i[a][n]=o.configMerge(i[a][n],e)}):(i[a]=[],o.each(e,function(e){var n=o.getValueOrDefault(e.type,"xAxes"===a?"category":"linear");i[a].push(o.configMerge(t.scaleService.getScaleDefaults(n),e))})):i.hasOwnProperty(a)&&"object"==typeof i[a]&&null!==i[a]&&"object"==typeof e?i[a]=o.configMerge(i[a],e):i[a]=e}),i},o.getValueAtIndexOrDefault=function(t,e,a){return void 0===t||null===t?a:o.isArray(t)?e<t.length?t[e]:a:t},o.getValueOrDefault=function(t,e){return void 0===t?e:t},o.indexOf=Array.prototype.indexOf?function(t,e){return t.indexOf(e)}:function(t,e){for(var a=0,i=t.length;i>a;++a)if(t[a]===e)return a;return-1},o.where=function(t,e){if(o.isArray(t)&&Array.prototype.filter)return t.filter(e);var a=[];return o.each(t,function(t){e(t)&&a.push(t)}),a},o.findIndex=Array.prototype.findIndex?function(t,e,a){return t.findIndex(e,a)}:function(t,e,a){a=void 0===a?t:a;for(var i=0,n=t.length;n>i;++i)if(e.call(a,t[i],i,t))return i;return-1},o.findNextWhere=function(t,e,a){(void 0===a||null===a)&&(a=-1);for(var i=a+1;i<t.length;i++){var n=t[i];if(e(n))return n}},o.findPreviousWhere=function(t,e,a){(void 0===a||null===a)&&(a=t.length);for(var i=a-1;i>=0;i--){var n=t[i];if(e(n))return n}},o.inherits=function(t){var e=this,a=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=a};return i.prototype=e.prototype,a.prototype=new i,a.extend=o.inherits,t&&o.extend(a.prototype,t),a.__super__=e.prototype,a},o.noop=function(){},o.uid=function(){var t=0;return function(){return t++}}(),o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,a){return Math.abs(t-e)<a},o.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},o.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},o.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return t=+t,0===t||isNaN(t)?t:t>0?1:-1},o.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var a=e.x-t.x,i=e.y-t.y,n=Math.sqrt(a*a+i*i),o=Math.atan2(i,a);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:n}},o.aliasPixel=function(t){return t%2===0?0:.5},o.splineCurve=function(t,e,a,i){var n=t.skip?e:t,o=e,r=a.skip?e:a,l=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),s=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),d=l/(l+s),u=s/(l+s);d=isNaN(d)?0:d,u=isNaN(u)?0:u;var c=i*d,h=i*u;return{previous:{x:o.x-c*(r.x-n.x),y:o.y-c*(r.y-n.y)},next:{x:o.x+h*(r.x-n.x),y:o.y+h*(r.y-n.y)}}},o.nextItem=function(t,e,a){return a?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,a){return a?0>=e?t[t.length-1]:t[e-1]:0>=e?t[0]:t[e-1]},o.niceNum=function(t,e){var a,i=Math.floor(o.log10(t)),n=t/Math.pow(10,i);return a=e?1.5>n?1:3>n?2:7>n?5:10:1>=n?1:2>=n?2:5>=n?5:10,a*Math.pow(10,i)};var r=o.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,a=0,i=1;return 0===t?0:1===(t/=1)?1:(a||(a=.3),i<Math.abs(1)?(i=1,e=a/4):e=a/(2*Math.PI)*Math.asin(1/i),-(i*Math.pow(2,10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/a)))},easeOutElastic:function(t){var e=1.70158,a=0,i=1;return 0===t?0:1===(t/=1)?1:(a||(a=.3),i<Math.abs(1)?(i=1,e=a/4):e=a/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((1*t-e)*(2*Math.PI)/a)+1)},easeInOutElastic:function(t){var e=1.70158,a=0,i=1;return 0===t?0:2===(t/=.5)?1:(a||(a=1*(.3*1.5)),i<Math.abs(1)?(i=1,e=a/4):e=a/(2*Math.PI)*Math.asin(1/i),1>t?-.5*(i*Math.pow(2,10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/a)):i*Math.pow(2,-10*(t-=1))*Math.sin((1*t-e)*(2*Math.PI)/a)*.5+1)},easeInBack:function(t){var e=1.70158;return 1*(t/=1)*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return 1*((t=t/1-1)*t*((e+1)*t+e)+1)},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?.5*(t*t*(((e*=1.525)+1)*t-e)):.5*((t-=2)*t*(((e*=1.525)+1)*t+e)+2)},easeInBounce:function(t){return 1-r.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?1*(7.5625*t*t):2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*r.easeInBounce(2*t):.5*r.easeOutBounce(2*t-1)+.5}};o.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),o.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),o.getRelativePosition=function(t,e){var a,i,n=t.originalEvent||t,r=t.currentTarget||t.srcElement,l=r.getBoundingClientRect(),s=n.touches;s&&s.length>0?(a=s[0].clientX,i=s[0].clientY):(a=n.clientX,i=n.clientY);var d=parseFloat(o.getStyle(r,"padding-left")),u=parseFloat(o.getStyle(r,"padding-top")),c=parseFloat(o.getStyle(r,"padding-right")),h=parseFloat(o.getStyle(r,"padding-bottom")),f=l.right-l.left-d-c,g=l.bottom-l.top-u-h;return a=Math.round((a-l.left-d)/f*r.width/e.currentDevicePixelRatio),i=Math.round((i-l.top-u)/g*r.height/e.currentDevicePixelRatio),{x:a,y:i}},o.addEvent=function(t,e,a){t.addEventListener?t.addEventListener(e,a):t.attachEvent?t.attachEvent("on"+e,a):t["on"+e]=a},o.removeEvent=function(t,e,a){t.removeEventListener?t.removeEventListener(e,a,!1):t.detachEvent?t.detachEvent("on"+e,a):t["on"+e]=o.noop},o.bindEvents=function(t,e,a){var i=t.events=t.events||{};o.each(e,function(e){i[e]=function(){a.apply(t,arguments)},o.addEvent(t.chart.canvas,e,i[e])})},o.unbindEvents=function(t,e){var a=t.chart.canvas;o.each(e,function(t,e){o.removeEvent(a,e,t)})},o.getConstraintWidth=function(t){return n(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return n(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode,a=parseInt(o.getStyle(e,"padding-left"))+parseInt(o.getStyle(e,"padding-right")),i=e.clientWidth-a,n=o.getConstraintWidth(t);return isNaN(n)?i:Math.min(i,n)},o.getMaximumHeight=function(t){var e=t.parentNode,a=parseInt(o.getStyle(e,"padding-top"))+parseInt(o.getStyle(e,"padding-bottom")),i=e.clientHeight-a,n=o.getConstraintHeight(t);return isNaN(n)?i:Math.min(i,n)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},o.retinaScale=function(t){var e=t.ctx,a=t.canvas,i=a.width,n=a.height,o=t.currentDevicePixelRatio=window.devicePixelRatio||1;1!==o&&(a.height=n*o,a.width=i*o,e.scale(o,o),t.originalDevicePixelRatio=t.originalDevicePixelRatio||o),a.style.width=i+"px",a.style.height=n+"px"},o.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},o.fontString=function(t,e,a){return e+" "+t+"px "+a},o.longestText=function(t,e,a,i){i=i||{};var n=i.data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(n=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var l=0;o.each(a,function(e){void 0!==e&&null!==e&&o.isArray(e)!==!0?l=o.measureText(t,n,r,l,e):o.isArray(e)&&o.each(e,function(e){void 0===e||null===e||o.isArray(e)||(l=o.measureText(t,n,r,l,e))})});var s=r.length/2;if(s>a.length){for(var d=0;s>d;d++)delete n[r[d]];r.splice(0,s)}return l},o.measureText=function(t,e,a,i,n){var o=e[n];return o||(o=e[n]=t.measureText(n).width,a.push(n)),o>i&&(i=o),i},o.numberOfLabelLines=function(t){var e=1;return o.each(t,function(t){o.isArray(t)&&t.length>e&&(e=t.length)}),e},o.drawRoundedRectangle=function(t,e,a,i,n,o){t.beginPath(),t.moveTo(e+o,a),t.lineTo(e+i-o,a),t.quadraticCurveTo(e+i,a,e+i,a+o),t.lineTo(e+i,a+n-o),t.quadraticCurveTo(e+i,a+n,e+i-o,a+n),t.lineTo(e+o,a+n),t.quadraticCurveTo(e,a+n,e,a+n-o),t.lineTo(e,a+o),t.quadraticCurveTo(e,a,e+o,a),t.closePath()},o.color=function(e){return i?i(e instanceof CanvasGradient?t.defaults.global.defaultColor:e):(console.log("Color.js not found!"),e)},o.addResizeListener=function(t,e){var a=document.createElement("iframe"),i="chartjs-hidden-iframe";a.classlist?a.classlist.add(i):a.setAttribute("class",i);var n=a.style;n.width="100%",n.display="block",n.border=0,n.height=0,n.margin=0,n.position="absolute",n.left=0,n.right=0,n.top=0,n.bottom=0,t.insertBefore(a,t.firstChild),(a.contentWindow||a).onresize=function(){e&&e()}},o.removeResizeListener=function(t){var e=t.querySelector(".chartjs-hidden-iframe");e&&e.parentNode.removeChild(e)},o.isArray=Array.isArray?function(t){return Array.isArray(t)}:function(t){return"[object Array]"===Object.prototype.toString.call(t)},o.arrayEquals=function(t,e){var a,i,n,r;if(!t||!e||t.length!=e.length)return!1;for(a=0,i=t.length;i>a;++a)if(n=t[a],r=e[a],n instanceof Array&&r instanceof Array){if(!o.arrayEquals(n,r))return!1}else if(n!=r)return!1;return!0},o.callCallback=function(t,e,a){t&&"function"==typeof t.call&&t.apply(a,e)},o.getHoverColor=function(t){return t instanceof CanvasPattern?t:o.color(t).saturate(.5).darken(.1).rgbString()}}},{3:3}],26:[function(t,e,a){"use strict";e.exports=function(){var t=function(e,a){var i=this,n=t.helpers;return i.config=a,e.length&&e[0].getContext&&(e=e[0]),e.getContext&&(e=e.getContext("2d")),i.ctx=e,i.canvas=e.canvas,e.canvas.style.display=e.canvas.style.display||"block",i.width=e.canvas.width||parseInt(n.getStyle(e.canvas,"width"),10)||n.getMaximumWidth(e.canvas),i.height=e.canvas.height||parseInt(n.getStyle(e.canvas,"height"),10)||n.getMaximumHeight(e.canvas),i.aspectRatio=i.width/i.height,(isNaN(i.aspectRatio)||isFinite(i.aspectRatio)===!1)&&(i.aspectRatio=void 0!==a.aspectRatio?a.aspectRatio:2),i.originalCanvasStyleWidth=e.canvas.style.width,i.originalCanvasStyleHeight=e.canvas.style.height,n.retinaScale(i),a&&(i.controller=new t.Controller(i)),n.addResizeListener(e.canvas.parentNode,function(){i.controller&&i.controller.config.options.responsive&&i.controller.resize()}),i.controller?i.controller:i};return t.defaults={global:{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"single",animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');for(var a=0;a<t.data.datasets.length;a++)e.push('<li><span style="background-color:'+t.data.datasets[a].backgroundColor+'"></span>'),t.data.datasets[a].label&&e.push(t.data.datasets[a].label),e.push("</li>");return e.push("</ul>"),e.join("")}}},t.Chart=t,t}},{}],27:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),t.boxes.push(e)},removeBox:function(t,e){t.boxes&&t.boxes.splice(t.boxes.indexOf(e),1)},update:function(t,a,i){function n(t){var e,a=t.isHorizontal();a?(e=t.update(t.options.fullWidth?p:k,y),S-=e.height):(e=t.update(x,v),k-=e.width),w.push({horizontal:a,minSize:e,box:t})}function o(t){var a=e.findNextWhere(w,function(e){return e.box===t});if(a)if(t.isHorizontal()){var i={left:C,right:M,top:0,bottom:0};t.update(t.options.fullWidth?p:k,m/2,i)}else t.update(a.minSize.width,S)}function r(t){var a=e.findNextWhere(w,function(e){return e.box===t}),i={left:0,right:0,top:D,bottom:A};a&&t.update(a.minSize.width,S,i)}function l(t){t.isHorizontal()?(t.left=t.options.fullWidth?s:C,t.right=t.options.fullWidth?a-s:C+k,t.top=P,t.bottom=P+t.height,P=t.bottom):(t.left=T,t.right=T+t.width,t.top=D,t.bottom=D+S,T=t.right)}if(t){var s=0,d=0,u=e.where(t.boxes,function(t){return"left"===t.options.position}),c=e.where(t.boxes,function(t){return"right"===t.options.position}),h=e.where(t.boxes,function(t){return"top"===t.options.position}),f=e.where(t.boxes,function(t){return"bottom"===t.options.position}),g=e.where(t.boxes,function(t){return"chartArea"===t.options.position});h.sort(function(t,e){return(e.options.fullWidth?1:0)-(t.options.fullWidth?1:0)}),f.sort(function(t,e){return(t.options.fullWidth?1:0)-(e.options.fullWidth?1:0)});var p=a-2*s,m=i-2*d,b=p/2,v=m/2,x=(a-b)/(u.length+c.length),y=(i-v)/(h.length+f.length),k=p,S=m,w=[];e.each(u.concat(c,h,f),n);var C=s,M=s,D=d,A=d;e.each(u.concat(c),o),e.each(u,function(t){C+=t.width}),e.each(c,function(t){M+=t.width}),e.each(h.concat(f),o),e.each(h,function(t){D+=t.height}),e.each(f,function(t){A+=t.height}),e.each(u.concat(c),r),C=s,M=s,D=d,A=d,e.each(u,function(t){C+=t.width}),e.each(c,function(t){M+=t.width}),e.each(h,function(t){D+=t.height}),e.each(f,function(t){A+=t.height});var I=i-D-A,F=a-C-M;(F!==k||I!==S)&&(e.each(u,function(t){t.height=I}),e.each(c,function(t){t.height=I}),e.each(h,function(t){t.options.fullWidth||(t.width=F)}),e.each(f,function(t){t.options.fullWidth||(t.width=F)}),S=I,k=F);var T=s,P=d;e.each(u.concat(h),l),T+=k,P+=S,e.each(c,l),e.each(f,l),t.chartArea={left:C,top:D,right:C+k,bottom:D+S},e.each(g,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(k,S)})}}}}},{}],28:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=e.noop;t.defaults.global.legend={display:!0,position:"top",fullWidth:!0,reverse:!1,onClick:function(t,e){var a=e.datasetIndex,i=this.chart,n=i.getDatasetMeta(a);n.hidden=null===n.hidden?!i.data.datasets[a].hidden:null,i.update()},labels:{boxWidth:40,padding:10,generateLabels:function(t){var a=t.data;return e.isArray(a.datasets)?a.datasets.map(function(a,i){return{text:a.label,fillStyle:e.isArray(a.backgroundColor)?a.backgroundColor[0]:a.backgroundColor,hidden:!t.isDatasetVisible(i),lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:a.borderWidth,strokeStyle:a.borderColor,datasetIndex:i}},this):[]}}},t.Legend=t.Element.extend({initialize:function(t){e.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:a,update:function(t,e,a){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=a,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:a,beforeSetDimensions:a,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:a,beforeBuildLabels:a,buildLabels:function(){var t=this;t.legendItems=t.options.labels.generateLabels.call(t,t.chart),t.options.reverse&&t.legendItems.reverse()},afterBuildLabels:a,beforeFit:a,fit:function(){var a=this,i=a.options,n=i.labels,o=i.display,r=a.ctx,l=t.defaults.global,s=e.getValueOrDefault,d=s(n.fontSize,l.defaultFontSize),u=s(n.fontStyle,l.defaultFontStyle),c=s(n.fontFamily,l.defaultFontFamily),h=e.fontString(d,u,c),f=a.legendHitBoxes=[],g=a.minSize,p=a.isHorizontal();if(p?(g.width=a.maxWidth,g.height=o?10:0):(g.width=o?10:0,g.height=a.maxHeight),o)if(r.font=h,p){var m=a.lineWidths=[0],b=a.legendItems.length?d+n.padding:0;r.textAlign="left",r.textBaseline="top",e.each(a.legendItems,function(t,e){var i=n.boxWidth+d/2+r.measureText(t.text).width;m[m.length-1]+i+n.padding>=a.width&&(b+=d+n.padding,m[m.length]=a.left),f[e]={left:0,top:0,width:i,height:d},m[m.length-1]+=i+n.padding}),g.height+=b}else{var v=n.padding,x=a.columnWidths=[],y=n.padding,k=0,S=0,w=d+v;e.each(a.legendItems,function(t,e){var a=n.boxWidth+d/2+r.measureText(t.text).width;S+w>g.height&&(y+=k+n.padding,x.push(k),k=0,S=0),k=Math.max(k,a),S+=w,f[e]={left:0,top:0,width:a,height:d}}),y+=k,x.push(k),g.width+=y}a.width=g.width,a.height=g.height},afterFit:a,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var a=this,i=a.options,n=i.labels,o=t.defaults.global,r=o.elements.line,l=a.width,s=(a.height,a.lineWidths);if(i.display){var d,u=a.ctx,c=e.getValueOrDefault,h=c(n.fontColor,o.defaultFontColor),f=c(n.fontSize,o.defaultFontSize),g=c(n.fontStyle,o.defaultFontStyle),p=c(n.fontFamily,o.defaultFontFamily),m=e.fontString(f,g,p);u.textAlign="left",u.textBaseline="top",u.lineWidth=.5,u.strokeStyle=h,u.fillStyle=h,u.font=m;var b=n.boxWidth,v=a.legendHitBoxes,x=function(t,e,a){u.save(),u.fillStyle=c(a.fillStyle,o.defaultColor),u.lineCap=c(a.lineCap,r.borderCapStyle),u.lineDashOffset=c(a.lineDashOffset,r.borderDashOffset),u.lineJoin=c(a.lineJoin,r.borderJoinStyle),u.lineWidth=c(a.lineWidth,r.borderWidth),u.strokeStyle=c(a.strokeStyle,o.defaultColor),u.setLineDash&&u.setLineDash(c(a.lineDash,r.borderDash)),u.strokeRect(t,e,b,f),u.fillRect(t,e,b,f),u.restore()},y=function(t,e,a,i){u.fillText(a.text,b+f/2+t,e),a.hidden&&(u.beginPath(),u.lineWidth=2,u.moveTo(b+f/2+t,e+f/2),u.lineTo(b+f/2+t+i,e+f/2),u.stroke())},k=a.isHorizontal();d=k?{x:a.left+(l-s[0])/2,y:a.top+n.padding,line:0}:{x:a.left+n.padding,y:a.top,line:0};var S=f+n.padding;e.each(a.legendItems,function(t,e){var i=u.measureText(t.text).width,o=b+f/2+i,r=d.x,c=d.y;k?r+o>=l&&(c=d.y+=f+n.padding,d.line++,r=d.x=a.left+(l-s[d.line])/2):c+S>a.bottom&&(r=d.x=r+a.columnWidths[d.line]+n.padding,c=d.y=a.top,d.line++),x(r,c,t),v[e].left=r,v[e].top=c,y(r,c,t,i),k?d.x+=o+n.padding:d.y+=S})}},handleEvent:function(t){var a=this,i=e.getRelativePosition(t,a.chart.chart),n=i.x,o=i.y,r=a.options;if(n>=a.left&&n<=a.right&&o>=a.top&&o<=a.bottom)for(var l=a.legendHitBoxes,s=0;s<l.length;++s){var d=l[s];if(n>=d.left&&n<=d.left+d.width&&o>=d.top&&o<=d.top+d.height){r.onClick&&r.onClick.call(a,t,a.legendItems[s]);break}}}}),t.plugins.register({beforeInit:function(e){var a=e.options,i=a.legend;i&&(e.legend=new t.Legend({ctx:e.chart.ctx,options:i,chart:e}),t.layoutService.addBox(e,e.legend))}})}},{}],29:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers.noop;t.plugins={_plugins:[],register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){-1===e.indexOf(t)&&e.push(t)})},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var a=e.indexOf(t);-1!==a&&e.splice(a,1)})},clear:function(){this._plugins=[]},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e){var a,i,n=this._plugins,o=n.length;for(a=0;o>a;++a)if(i=n[a],"function"==typeof i[t]&&i[t].apply(i,e||[])===!1)return!1;return!0}},t.PluginBase=t.Element.extend({beforeInit:e,afterInit:e,beforeUpdate:e,afterUpdate:e,beforeDraw:e,afterDraw:e,destroy:e}),t.pluginService=t.plugins}},{}],30:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.scale={display:!0,position:"left",gridLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",offsetGridLines:!1},scaleLabel:{labelString:"",display:!1},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:10,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:function(t){return e.isArray(t)?t:""+t}}},t.Scale=t.Element.extend({beforeUpdate:function(){e.callCallback(this.options.beforeUpdate,[this])},update:function(t,a,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=a,n.margins=e.extend({left:0,right:0,top:0,bottom:0},i),n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeDataLimits(),n.determineDataLimits(),n.afterDataLimits(),n.beforeBuildTicks(),n.buildTicks(),n.afterBuildTicks(),n.beforeTickToLabelConversion(),n.convertTicksToLabels(),n.afterTickToLabelConversion(),n.beforeCalculateTickRotation(),n.calculateTickRotation(),n.afterCalculateTickRotation(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:function(){e.callCallback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){e.callCallback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){e.callCallback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){e.callCallback(this.options.beforeDataLimits,[this])},determineDataLimits:e.noop,afterDataLimits:function(){e.callCallback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){e.callCallback(this.options.beforeBuildTicks,[this])},buildTicks:e.noop,afterBuildTicks:function(){e.callCallback(this.options.afterBuildTicks,[this])},beforeTickToLabelConversion:function(){e.callCallback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this;t.ticks=t.ticks.map(function(e,a,i){return t.options.ticks.userCallback?t.options.ticks.userCallback(e,a,i):t.options.ticks.callback(e,a,i)},t)},afterTickToLabelConversion:function(){e.callCallback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){e.callCallback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var a=this,i=a.ctx,n=t.defaults.global,o=a.options.ticks,r=e.getValueOrDefault(o.fontSize,n.defaultFontSize),l=e.getValueOrDefault(o.fontStyle,n.defaultFontStyle),s=e.getValueOrDefault(o.fontFamily,n.defaultFontFamily),d=e.fontString(r,l,s);i.font=d;var u,c=i.measureText(a.ticks[0]).width,h=i.measureText(a.ticks[a.ticks.length-1]).width;if(a.labelRotation=o.minRotation||0,a.paddingRight=0,a.paddingLeft=0,a.options.display&&a.isHorizontal()){a.paddingRight=h/2+3,a.paddingLeft=c/2+3,a.longestTextCache||(a.longestTextCache={});for(var f,g,p=e.longestText(i,d,a.ticks,a.longestTextCache),m=p,b=a.getPixelForTick(1)-a.getPixelForTick(0)-6;m>b&&a.labelRotation<o.maxRotation;){if(f=Math.cos(e.toRadians(a.labelRotation)),g=Math.sin(e.toRadians(a.labelRotation)),u=f*c,u+r/2>a.yLabelWidth&&(a.paddingLeft=u+r/2),a.paddingRight=r/2,g*p>a.maxHeight){a.labelRotation--;break}a.labelRotation++,m=f*p}}a.margins&&(a.paddingLeft=Math.max(a.paddingLeft-a.margins.left,0),a.paddingRight=Math.max(a.paddingRight-a.margins.right,0))},afterCalculateTickRotation:function(){e.callCallback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){e.callCallback(this.options.beforeFit,[this])},fit:function(){var a=this,i=a.minSize={width:0,height:0},n=a.options,o=t.defaults.global,r=n.ticks,l=n.scaleLabel,s=n.display,d=a.isHorizontal(),u=e.getValueOrDefault(r.fontSize,o.defaultFontSize),c=e.getValueOrDefault(r.fontStyle,o.defaultFontStyle),h=e.getValueOrDefault(r.fontFamily,o.defaultFontFamily),f=e.fontString(u,c,h),g=e.getValueOrDefault(l.fontSize,o.defaultFontSize),p=e.getValueOrDefault(l.fontStyle,o.defaultFontStyle),m=e.getValueOrDefault(l.fontFamily,o.defaultFontFamily),b=(e.fontString(g,p,m),n.gridLines.tickMarkLength);if(d?i.width=a.isFullWidth()?a.maxWidth-a.margins.left-a.margins.right:a.maxWidth:i.width=s?b:0,d?i.height=s?b:0:i.height=a.maxHeight,l.display&&s&&(d?i.height+=1.5*g:i.width+=1.5*g),r.display&&s){a.longestTextCache||(a.longestTextCache={});var v=e.longestText(a.ctx,f,a.ticks,a.longestTextCache),x=e.numberOfLabelLines(a.ticks),y=.5*u;if(d){a.longestLabelWidth=v;var k=Math.sin(e.toRadians(a.labelRotation))*a.longestLabelWidth+u*x+y*x;i.height=Math.min(a.maxHeight,i.height+k),a.ctx.font=f;var S=a.ctx.measureText(a.ticks[0]).width,w=a.ctx.measureText(a.ticks[a.ticks.length-1]).width,C=Math.cos(e.toRadians(a.labelRotation)),M=Math.sin(e.toRadians(a.labelRotation));a.paddingLeft=0!==a.labelRotation?C*S+3:S/2+3,a.paddingRight=0!==a.labelRotation?M*(u/2)+3:w/2+3}else{var D=a.maxWidth-i.width,A=r.mirror;A?v=0:v+=a.options.ticks.padding,D>v?i.width+=v:i.width=a.maxWidth,a.paddingTop=u/2,a.paddingBottom=u/2}}a.margins&&(a.paddingLeft=Math.max(a.paddingLeft-a.margins.left,0),a.paddingTop=Math.max(a.paddingTop-a.margins.top,0),a.paddingRight=Math.max(a.paddingRight-a.margins.right,0),a.paddingBottom=Math.max(a.paddingBottom-a.margins.bottom,0)),a.width=i.width,a.height=i.height},afterFit:function(){e.callCallback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function a(t){return null===t||"undefined"==typeof t?NaN:"number"==typeof t&&isNaN(t)?NaN:"object"==typeof t?t instanceof Date||t.isValid?t:a(this.isHorizontal()?t.x:t.y):t},getLabelForIndex:e.noop,getPixelForValue:e.noop,getValueForPixel:e.noop,getPixelForTick:function(t,e){var a=this;if(a.isHorizontal()){var i=a.width-(a.paddingLeft+a.paddingRight),n=i/Math.max(a.ticks.length-(a.options.gridLines.offsetGridLines?0:1),1),o=n*t+a.paddingLeft;e&&(o+=n/2);var r=a.left+Math.round(o);return r+=a.isFullWidth()?a.margins.left:0}var l=a.height-(a.paddingTop+a.paddingBottom);return a.top+t*(l/(a.ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var a=e.width-(e.paddingLeft+e.paddingRight),i=a*t+e.paddingLeft,n=e.left+Math.round(i);return n+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){var t=this,e=t.min,a=t.max;return t.getPixelForValue(t.beginAtZero?0:0>e&&0>a?a:e>0&&a>0?e:0)},draw:function(a){var i=this,n=i.options;if(n.display){
+var o,r,l=i.ctx,s=t.defaults.global,d=n.ticks,u=n.gridLines,c=n.scaleLabel,h=0!==i.labelRotation,f=d.autoSkip,g=i.isHorizontal();d.maxTicksLimit&&(r=d.maxTicksLimit);var p=e.getValueOrDefault(d.fontColor,s.defaultFontColor),m=e.getValueOrDefault(d.fontSize,s.defaultFontSize),b=e.getValueOrDefault(d.fontStyle,s.defaultFontStyle),v=e.getValueOrDefault(d.fontFamily,s.defaultFontFamily),x=e.fontString(m,b,v),y=u.tickMarkLength,k=e.getValueOrDefault(c.fontColor,s.defaultFontColor),S=e.getValueOrDefault(c.fontSize,s.defaultFontSize),w=e.getValueOrDefault(c.fontStyle,s.defaultFontStyle),C=e.getValueOrDefault(c.fontFamily,s.defaultFontFamily),M=e.fontString(S,w,C),D=e.toRadians(i.labelRotation),A=Math.cos(D),I=(Math.sin(D),i.longestLabelWidth*A);l.fillStyle=p;var F=[];if(g){if(o=!1,h&&(I/=2),(I+d.autoSkipPadding)*i.ticks.length>i.width-(i.paddingLeft+i.paddingRight)&&(o=1+Math.floor((I+d.autoSkipPadding)*i.ticks.length/(i.width-(i.paddingLeft+i.paddingRight)))),r&&i.ticks.length>r)for(;!o||i.ticks.length/(o||1)>r;)o||(o=1),o+=1;f||(o=!1)}var T="right"===n.position?i.left:i.right-y,P="right"===n.position?i.left+y:i.right,_="bottom"===n.position?i.top:i.bottom-y,R="bottom"===n.position?i.top+y:i.bottom;if(e.each(i.ticks,function(t,r){if(void 0!==t&&null!==t){var l=i.ticks.length===r+1,s=o>1&&r%o>0||r%o===0&&r+o>=i.ticks.length;if((!s||l)&&void 0!==t&&null!==t){var c,f;r===("undefined"!=typeof i.zeroLineIndex?i.zeroLineIndex:0)?(c=u.zeroLineWidth,f=u.zeroLineColor):(c=e.getValueAtIndexOrDefault(u.lineWidth,r),f=e.getValueAtIndexOrDefault(u.color,r));var p,m,b,v,x,k,S,w,C,M,A,I="middle";if(g){h||(I="top"===n.position?"bottom":"top"),A=h?"right":"center";var V=i.getPixelForTick(r)+e.aliasPixel(c);C=i.getPixelForTick(r,u.offsetGridLines)+d.labelOffset,M=h?i.top+12:"top"===n.position?i.bottom-y:i.top+y,p=b=x=S=V,m=_,v=R,k=a.top,w=a.bottom}else{"left"===n.position?d.mirror?(C=i.right+d.padding,A="left"):(C=i.right-d.padding,A="right"):d.mirror?(C=i.left-d.padding,A="right"):(C=i.left+d.padding,A="left");var O=i.getPixelForTick(r);O+=e.aliasPixel(c),M=i.getPixelForTick(r,u.offsetGridLines),p=T,b=P,x=a.left,S=a.right,m=v=k=w=O}F.push({tx1:p,ty1:m,tx2:b,ty2:v,x1:x,y1:k,x2:S,y2:w,labelX:C,labelY:M,glWidth:c,glColor:f,rotation:-1*D,label:t,textBaseline:I,textAlign:A})}}}),e.each(F,function(t){if(u.display&&(l.lineWidth=t.glWidth,l.strokeStyle=t.glColor,l.beginPath(),u.drawTicks&&(l.moveTo(t.tx1,t.ty1),l.lineTo(t.tx2,t.ty2)),u.drawOnChartArea&&(l.moveTo(t.x1,t.y1),l.lineTo(t.x2,t.y2)),l.stroke()),d.display){l.save(),l.translate(t.labelX,t.labelY),l.rotate(t.rotation),l.font=x,l.textBaseline=t.textBaseline,l.textAlign=t.textAlign;var a=t.label;if(e.isArray(a))for(var i=0,n=0;i<a.length;++i)l.fillText(""+a[i],0,n),n+=1.5*m;else l.fillText(a,0,0);l.restore()}}),c.display){var V,O,L=0;if(g)V=i.left+(i.right-i.left)/2,O="bottom"===n.position?i.bottom-S/2:i.top+S/2;else{var B="left"===n.position;V=B?i.left+S/2:i.right-S/2,O=i.top+(i.bottom-i.top)/2,L=B?-.5*Math.PI:.5*Math.PI}l.save(),l.translate(V,O),l.rotate(L),l.textAlign="center",l.textBaseline="middle",l.fillStyle=k,l.font=M,l.fillText(c.labelString,0,0),l.restore()}if(u.drawBorder){l.lineWidth=e.getValueAtIndexOrDefault(u.lineWidth,0),l.strokeStyle=e.getValueAtIndexOrDefault(u.color,0);var W=i.left,z=i.right,H=i.top,N=i.bottom,E=e.aliasPixel(l.lineWidth);g?(H=N="top"===n.position?i.bottom:i.top,H+=E,N+=E):(W=z="left"===n.position?i.right:i.left,W+=E,z+=E),l.beginPath(),l.moveTo(W,H),l.lineTo(z,N),l.stroke()}}}})}},{}],31:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.scaleService={constructors:{},defaults:{},registerScaleType:function(t,a,i){this.constructors[t]=a,this.defaults[t]=e.clone(i)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(a){return this.defaults.hasOwnProperty(a)?e.scaleMerge(t.defaults.scale,this.defaults[a]):{}},updateScaleDefaults:function(t,a){var i=this.defaults;i.hasOwnProperty(t)&&(i[t]=e.extend(i[t],a))},addScalesToLayout:function(a){e.each(a.scales,function(e){t.layoutService.addBox(a,e)})}}}},{}],32:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.title={display:!1,position:"top",fullWidth:!0,fontStyle:"bold",padding:10,text:""};var a=e.noop;t.Title=t.Element.extend({initialize:function(a){var i=this;e.extend(i,a),i.options=e.configMerge(t.defaults.global.title,a.options),i.legendHitBoxes=[]},beforeUpdate:function(){var a=this.chart.options;a&&a.title&&(this.options=e.configMerge(t.defaults.global.title,a.title))},update:function(t,e,a){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=a,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:a,beforeSetDimensions:a,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:a,beforeBuildLabels:a,buildLabels:a,afterBuildLabels:a,beforeFit:a,fit:function(){var a=this,i=(a.ctx,e.getValueOrDefault),n=a.options,o=t.defaults.global,r=n.display,l=i(n.fontSize,o.defaultFontSize),s=a.minSize;a.isHorizontal()?(s.width=a.maxWidth,s.height=r?l+2*n.padding:0):(s.width=r?l+2*n.padding:0,s.height=a.maxHeight),a.width=s.width,a.height=s.height},afterFit:a,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var a=this,i=a.ctx,n=e.getValueOrDefault,o=a.options,r=t.defaults.global;if(o.display){var l,s,d=n(o.fontSize,r.defaultFontSize),u=n(o.fontStyle,r.defaultFontStyle),c=n(o.fontFamily,r.defaultFontFamily),h=e.fontString(d,u,c),f=0,g=a.top,p=a.left,m=a.bottom,b=a.right;i.fillStyle=n(o.fontColor,r.defaultFontColor),i.font=h,a.isHorizontal()?(l=p+(b-p)/2,s=g+(m-g)/2):(l="left"===o.position?p+d/2:b-d/2,s=g+(m-g)/2,f=Math.PI*("left"===o.position?-.5:.5)),i.save(),i.translate(l,s),i.rotate(f),i.textAlign="center",i.textBaseline="middle",i.fillText(o.text,0,0),i.restore()}}}),t.plugins.register({beforeInit:function(e){var a=e.options,i=a.title;i&&(e.titleBlock=new t.Title({ctx:e.chart.ctx,options:i,chart:e}),t.layoutService.addBox(e,e.titleBlock))}})}},{}],33:[function(t,e,a){"use strict";e.exports=function(t){function e(t,e){return e&&(n.isArray(e)?t=t.concat(e):t.push(e)),t}function a(t){if(!t.length)return!1;var e,a,i=[],n=[];for(e=0,a=t.length;a>e;++e){var o=t[e];if(o&&o.hasValue()){var r=o.tooltipPosition();i.push(r.x),n.push(r.y)}}var l=0,s=0;for(e=0,a-i.length;a>e;++e)l+=i[e],s+=n[e];return{x:Math.round(l/i.length),y:Math.round(s/i.length)}}function i(t){var e=t._xScale,a=t._yScale||t._scale,i=t._index,n=t._datasetIndex;return{xLabel:e?e.getLabelForIndex(i,n):"",yLabel:a?a.getLabelForIndex(i,n):"",index:i,datasetIndex:n}}var n=t.helpers;t.defaults.global.tooltips={enabled:!0,custom:null,mode:"single",backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,yAlign:"center",xAlign:"center",caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",callbacks:{beforeTitle:n.noop,title:function(t,e){var a="",i=e.labels,n=i?i.length:0;if(t.length>0){var o=t[0];o.xLabel?a=o.xLabel:n>0&&o.index<n&&(a=i[o.index])}return a},afterTitle:n.noop,beforeBody:n.noop,beforeLabel:n.noop,label:function(t,e){var a=e.datasets[t.datasetIndex].label||"";return a+": "+t.yLabel},labelColor:function(t,e){var a=e.getDatasetMeta(t.datasetIndex),i=a.data[t.index],n=i._view;return{borderColor:n.borderColor,backgroundColor:n.backgroundColor}},afterLabel:n.noop,afterBody:n.noop,beforeFooter:n.noop,footer:n.noop,afterFooter:n.noop}},t.Tooltip=t.Element.extend({initialize:function(){var e=this,a=t.defaults.global,i=e._options,o=n.getValueOrDefault;n.extend(e,{_model:{xPadding:i.xPadding,yPadding:i.yPadding,xAlign:i.yAlign,yAlign:i.xAlign,bodyFontColor:i.bodyFontColor,_bodyFontFamily:o(i.bodyFontFamily,a.defaultFontFamily),_bodyFontStyle:o(i.bodyFontStyle,a.defaultFontStyle),_bodyAlign:i.bodyAlign,bodyFontSize:o(i.bodyFontSize,a.defaultFontSize),bodySpacing:i.bodySpacing,titleFontColor:i.titleFontColor,_titleFontFamily:o(i.titleFontFamily,a.defaultFontFamily),_titleFontStyle:o(i.titleFontStyle,a.defaultFontStyle),titleFontSize:o(i.titleFontSize,a.defaultFontSize),_titleAlign:i.titleAlign,titleSpacing:i.titleSpacing,titleMarginBottom:i.titleMarginBottom,footerFontColor:i.footerFontColor,_footerFontFamily:o(i.footerFontFamily,a.defaultFontFamily),_footerFontStyle:o(i.footerFontStyle,a.defaultFontStyle),footerFontSize:o(i.footerFontSize,a.defaultFontSize),_footerAlign:i.footerAlign,footerSpacing:i.footerSpacing,footerMarginTop:i.footerMarginTop,caretSize:i.caretSize,cornerRadius:i.cornerRadius,backgroundColor:i.backgroundColor,opacity:0,legendColorBackground:i.multiKeyBackground}})},getTitle:function(){var t=this,a=t._options,i=a.callbacks,n=i.beforeTitle.apply(t,arguments),o=i.title.apply(t,arguments),r=i.afterTitle.apply(t,arguments),l=[];return l=e(l,n),l=e(l,o),l=e(l,r)},getBeforeBody:function(){var t=this._options.callbacks.beforeBody.apply(this,arguments);return n.isArray(t)?t:void 0!==t?[t]:[]},getBody:function(t,a){var i=this,o=i._options.callbacks,r=[];return n.each(t,function(t){var n={before:[],lines:[],after:[]};e(n.before,o.beforeLabel.call(i,t,a)),e(n.lines,o.label.call(i,t,a)),e(n.after,o.afterLabel.call(i,t,a)),r.push(n)}),r},getAfterBody:function(){var t=this._options.callbacks.afterBody.apply(this,arguments);return n.isArray(t)?t:void 0!==t?[t]:[]},getFooter:function(){var t=this,a=t._options.callbacks,i=a.beforeFooter.apply(t,arguments),n=a.footer.apply(t,arguments),o=a.afterFooter.apply(t,arguments),r=[];return r=e(r,i),r=e(r,n),r=e(r,o)},update:function(t){var e,o,r=this,l=r._options,s=r._model,d=r._active,u=r._data,c=r._chartInstance;if(d.length){s.opacity=1;var h=[],f=a(d),g=[];for(e=0,o=d.length;o>e;++e)g.push(i(d[e]));l.itemSort&&(g=g.sort(l.itemSort)),d.length>1&&n.each(g,function(t){h.push(l.callbacks.labelColor.call(r,t,c))}),n.extend(s,{title:r.getTitle(g,u),beforeBody:r.getBeforeBody(g,u),body:r.getBody(g,u),afterBody:r.getAfterBody(g,u),footer:r.getFooter(g,u),x:Math.round(f.x),y:Math.round(f.y),caretPadding:n.getValueOrDefault(f.padding,2),labelColors:h});var p=r.getTooltipSize(s);r.determineAlignment(p),n.extend(s,r.getBackgroundPoint(s,p))}else r._model.opacity=0;return t&&l.custom&&l.custom.call(r,s),r},getTooltipSize:function(t){var e=this._chart.ctx,a={height:2*t.yPadding,width:0},i=t.body,o=i.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);o+=t.beforeBody.length+t.afterBody.length;var r=t.title.length,l=t.footer.length,s=t.titleFontSize,d=t.bodyFontSize,u=t.footerFontSize;a.height+=r*s,a.height+=(r-1)*t.titleSpacing,a.height+=r?t.titleMarginBottom:0,a.height+=o*d,a.height+=o?(o-1)*t.bodySpacing:0,a.height+=l?t.footerMarginTop:0,a.height+=l*u,a.height+=l?(l-1)*t.footerSpacing:0;var c=0,h=function(t){a.width=Math.max(a.width,e.measureText(t).width+c)};return e.font=n.fontString(s,t._titleFontStyle,t._titleFontFamily),n.each(t.title,h),e.font=n.fontString(d,t._bodyFontStyle,t._bodyFontFamily),n.each(t.beforeBody.concat(t.afterBody),h),c=i.length>1?d+2:0,n.each(i,function(t){n.each(t.before,h),n.each(t.lines,h),n.each(t.after,h)}),c=0,e.font=n.fontString(u,t._footerFontStyle,t._footerFontFamily),n.each(t.footer,h),a.width+=2*t.xPadding,a},determineAlignment:function(t){var e=this,a=e._model,i=e._chart,n=e._chartInstance.chartArea;a.y<t.height?a.yAlign="top":a.y>i.height-t.height&&(a.yAlign="bottom");var o,r,l,s,d,u=(n.left+n.right)/2,c=(n.top+n.bottom)/2;"center"===a.yAlign?(o=function(t){return u>=t},r=function(t){return t>u}):(o=function(e){return e<=t.width/2},r=function(e){return e>=i.width-t.width/2}),l=function(e){return e+t.width>i.width},s=function(e){return e-t.width<0},d=function(t){return c>=t?"top":"bottom"},o(a.x)?(a.xAlign="left",l(a.x)&&(a.xAlign="center",a.yAlign=d(a.y))):r(a.x)&&(a.xAlign="right",s(a.x)&&(a.xAlign="center",a.yAlign=d(a.y)))},getBackgroundPoint:function(t,e){var a={x:t.x,y:t.y},i=t.caretSize,n=t.caretPadding,o=t.cornerRadius,r=t.xAlign,l=t.yAlign,s=i+n,d=o+n;return"right"===r?a.x-=e.width:"center"===r&&(a.x-=e.width/2),"top"===l?a.y+=s:"bottom"===l?a.y-=e.height+s:a.y-=e.height/2,"center"===l?"left"===r?a.x+=s:"right"===r&&(a.x-=s):"left"===r?a.x-=d:"right"===r&&(a.x+=d),a},drawCaret:function(t,e,a,i){var o,r,l,s,d,u,c=this._view,h=this._chart.ctx,f=c.caretSize,g=c.cornerRadius,p=c.xAlign,m=c.yAlign,b=t.x,v=t.y,x=e.width,y=e.height;"center"===m?("left"===p?(o=b,r=o-f,l=o):(o=b+x,r=o+f,l=o),d=v+y/2,s=d-f,u=d+f):("left"===p?(o=b+g,r=o+f,l=r+f):"right"===p?(o=b+x-g,r=o-f,l=r-f):(r=b+x/2,o=r-f,l=r+f),"top"===m?(s=v,d=s-f,u=s):(s=v+y,d=s+f,u=s));var k=n.color(c.backgroundColor);h.fillStyle=k.alpha(a*k.alpha()).rgbString(),h.beginPath(),h.moveTo(o,s),h.lineTo(r,d),h.lineTo(l,u),h.closePath(),h.fill()},drawTitle:function(t,e,a,i){var o=e.title;if(o.length){a.textAlign=e._titleAlign,a.textBaseline="top";var r=e.titleFontSize,l=e.titleSpacing,s=n.color(e.titleFontColor);a.fillStyle=s.alpha(i*s.alpha()).rgbString(),a.font=n.fontString(r,e._titleFontStyle,e._titleFontFamily);var d,u;for(d=0,u=o.length;u>d;++d)a.fillText(o[d],t.x,t.y),t.y+=r+l,d+1===o.length&&(t.y+=e.titleMarginBottom-l)}},drawBody:function(t,e,a,i){var o=e.bodyFontSize,r=e.bodySpacing,l=e.body;a.textAlign=e._bodyAlign,a.textBaseline="top";var s=n.color(e.bodyFontColor),d=s.alpha(i*s.alpha()).rgbString();a.fillStyle=d,a.font=n.fontString(o,e._bodyFontStyle,e._bodyFontFamily);var u=0,c=function(e){a.fillText(e,t.x+u,t.y),t.y+=o+r};n.each(e.beforeBody,c);var h=l.length>1;u=h?o+2:0,n.each(l,function(r,l){n.each(r.before,c),n.each(r.lines,function(r){h&&(a.fillStyle=n.color(e.legendColorBackground).alpha(i).rgbaString(),a.fillRect(t.x,t.y,o,o),a.strokeStyle=n.color(e.labelColors[l].borderColor).alpha(i).rgbaString(),a.strokeRect(t.x,t.y,o,o),a.fillStyle=n.color(e.labelColors[l].backgroundColor).alpha(i).rgbaString(),a.fillRect(t.x+1,t.y+1,o-2,o-2),a.fillStyle=d),c(r)}),n.each(r.after,c)}),u=0,n.each(e.afterBody,c),t.y-=r},drawFooter:function(t,e,a,i){var o=e.footer;if(o.length){t.y+=e.footerMarginTop,a.textAlign=e._footerAlign,a.textBaseline="top";var r=n.color(e.footerFontColor);a.fillStyle=r.alpha(i*r.alpha()).rgbString(),a.font=n.fontString(e.footerFontSize,e._footerFontStyle,e._footerFontFamily),n.each(o,function(i){a.fillText(i,t.x,t.y),t.y+=e.footerFontSize+e.footerSpacing})}},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var a=this.getTooltipSize(e),i={x:e.x,y:e.y},o=Math.abs(e.opacity<.001)?0:e.opacity;if(this._options.enabled){var r=n.color(e.backgroundColor);t.fillStyle=r.alpha(o*r.alpha()).rgbString(),n.drawRoundedRectangle(t,i.x,i.y,a.width,a.height,e.cornerRadius),t.fill(),this.drawCaret(i,a,o,e.caretPadding),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,o),this.drawBody(i,e,t,o),this.drawFooter(i,e,t,o)}}}})}},{}],34:[function(t,e,a){"use strict";e.exports=function(t,e){var a=t.helpers,i=t.defaults.global;i.elements.arc={backgroundColor:i.defaultColor,borderColor:"#fff",borderWidth:2},t.elements.Arc=t.Element.extend({inLabelRange:function(t){var e=this._view;return e?Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2):!1},inRange:function(t,e){var i=this._view;if(i){for(var n=a.getAngleFromPoint(i,{x:t,y:e}),o=n.angle,r=n.distance,l=i.startAngle,s=i.endAngle;l>s;)s+=2*Math.PI;for(;o>s;)o-=2*Math.PI;for(;l>o;)o+=2*Math.PI;var d=o>=l&&s>=o,u=r>=i.innerRadius&&r<=i.outerRadius;return d&&u}return!1},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,a=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*a,y:t.y+Math.sin(e)*a}},draw:function(){var t=this._chart.ctx,e=this._view,a=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,a,i),t.arc(e.x,e.y,e.innerRadius,i,a,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})}},{}],35:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=t.defaults.global;t.defaults.global.elements.line={tension:.4,backgroundColor:a.defaultColor,borderWidth:3,borderColor:a.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",fill:!0},t.elements.Line=t.Element.extend({lineToNextPoint:function(t,e,a,i,n){var o=this,r=o._chart.ctx,l=o._view?o._view.spanGaps:!1;e._view.skip&&!l?i.call(o,t,e,a):t._view.skip&&!l?n.call(o,t,e,a):0===e._view.tension?r.lineTo(e._view.x,e._view.y):r.bezierCurveTo(t._view.controlPointNextX,t._view.controlPointNextY,e._view.controlPointPreviousX,e._view.controlPointPreviousY,e._view.x,e._view.y)},draw:function(){function t(t){r._view.skip||l._view.skip?t&&o.lineTo(i._view.scaleZero.x,i._view.scaleZero.y):o.bezierCurveTo(l._view.controlPointNextX,l._view.controlPointNextY,r._view.controlPointPreviousX,r._view.controlPointPreviousY,r._view.x,r._view.y)}var i=this,n=i._view,o=i._chart.ctx,r=i._children[0],l=i._children[i._children.length-1];o.save(),i._children.length>0&&n.fill&&(o.beginPath(),e.each(i._children,function(t,a){var r=e.previousItem(i._children,a),l=e.nextItem(i._children,a);0===a?(i._loop?o.moveTo(n.scaleZero.x,n.scaleZero.y):o.moveTo(t._view.x,n.scaleZero),t._view.skip?i._loop||o.moveTo(l._view.x,i._view.scaleZero):o.lineTo(t._view.x,t._view.y)):i.lineToNextPoint(r,t,l,function(t,e,a){i._loop?o.lineTo(i._view.scaleZero.x,i._view.scaleZero.y):(o.lineTo(t._view.x,i._view.scaleZero),o.moveTo(a._view.x,i._view.scaleZero))},function(t,e){o.lineTo(e._view.x,e._view.y)})},i),i._loop?t(!0):(o.lineTo(i._children[i._children.length-1]._view.x,n.scaleZero),o.lineTo(i._children[0]._view.x,n.scaleZero)),o.fillStyle=n.backgroundColor||a.defaultColor,o.closePath(),o.fill());var s=a.elements.line;o.lineCap=n.borderCapStyle||s.borderCapStyle,o.setLineDash&&o.setLineDash(n.borderDash||s.borderDash),o.lineDashOffset=n.borderDashOffset||s.borderDashOffset,o.lineJoin=n.borderJoinStyle||s.borderJoinStyle,o.lineWidth=n.borderWidth||s.borderWidth,o.strokeStyle=n.borderColor||a.defaultColor,o.beginPath(),e.each(i._children,function(t,a){var n=e.previousItem(i._children,a),r=e.nextItem(i._children,a);0===a?o.moveTo(t._view.x,t._view.y):i.lineToNextPoint(n,t,r,function(t,e,a){o.moveTo(a._view.x,a._view.y)},function(t,e){o.moveTo(e._view.x,e._view.y)})},i),i._loop&&i._children.length>0&&t(),o.stroke(),o.restore()}})}},{}],36:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=t.defaults.global,i=a.defaultColor;a.elements.point={radius:3,pointStyle:"circle",backgroundColor:i,borderWidth:1,borderColor:i,hitRadius:1,hoverRadius:4,hoverBorderWidth:1},t.elements.Point=t.Element.extend({inRange:function(t,e){var a=this._view;return a?Math.pow(t-a.x,2)+Math.pow(e-a.y,2)<Math.pow(a.hitRadius+a.radius,2):!1},inLabelRange:function(t){var e=this._view;return e?Math.pow(t-e.x,2)<Math.pow(e.radius+e.hitRadius,2):!1},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(){var t,n,o,r,l,s,d=this._view,u=this._chart.ctx,c=d.pointStyle,h=d.radius,f=d.x,g=d.y;if(!d.skip){if("object"==typeof c&&(t=c.toString(),"[object HTMLImageElement]"===t||"[object HTMLCanvasElement]"===t))return void u.drawImage(c,f-c.width/2,g-c.height/2);if(!(isNaN(h)||0>=h)){switch(u.strokeStyle=d.borderColor||i,u.lineWidth=e.getValueOrDefault(d.borderWidth,a.elements.point.borderWidth),u.fillStyle=d.backgroundColor||i,c){default:u.beginPath(),u.arc(f,g,h,0,2*Math.PI),u.closePath(),u.fill();break;case"triangle":u.beginPath(),n=3*h/Math.sqrt(3),l=n*Math.sqrt(3)/2,u.moveTo(f-n/2,g+l/3),u.lineTo(f+n/2,g+l/3),u.lineTo(f,g-2*l/3),u.closePath(),u.fill();break;case"rect":s=1/Math.SQRT2*h,u.fillRect(f-s,g-s,2*s,2*s),u.strokeRect(f-s,g-s,2*s,2*s);break;case"rectRot":s=1/Math.SQRT2*h,u.beginPath(),u.moveTo(f-s,g),u.lineTo(f,g+s),u.lineTo(f+s,g),u.lineTo(f,g-s),u.closePath(),u.fill();break;case"cross":u.beginPath(),u.moveTo(f,g+h),u.lineTo(f,g-h),u.moveTo(f-h,g),u.lineTo(f+h,g),u.closePath();break;case"crossRot":u.beginPath(),o=Math.cos(Math.PI/4)*h,r=Math.sin(Math.PI/4)*h,u.moveTo(f-o,g-r),u.lineTo(f+o,g+r),u.moveTo(f-o,g+r),u.lineTo(f+o,g-r),u.closePath();break;case"star":u.beginPath(),u.moveTo(f,g+h),u.lineTo(f,g-h),u.moveTo(f-h,g),u.lineTo(f+h,g),o=Math.cos(Math.PI/4)*h,r=Math.sin(Math.PI/4)*h,u.moveTo(f-o,g-r),u.lineTo(f+o,g+r),u.moveTo(f-o,g+r),u.lineTo(f+o,g-r),u.closePath();break;case"line":u.beginPath(),u.moveTo(f-h,g),u.lineTo(f+h,g),u.closePath();break;case"dash":u.beginPath(),u.moveTo(f,g),u.lineTo(f+h,g),u.closePath()}u.stroke()}}}})}},{}],37:[function(t,e,a){"use strict";e.exports=function(t){var e=(t.helpers,t.defaults.global);e.elements.rectangle={backgroundColor:e.defaultColor,borderWidth:0,borderColor:e.defaultColor,borderSkipped:"bottom"},t.elements.Rectangle=t.Element.extend({draw:function(){function t(t){return s[(u+t)%4]}var e=this._chart.ctx,a=this._view,i=a.width/2,n=a.x-i,o=a.x+i,r=a.base-(a.base-a.y),l=a.borderWidth/2;a.borderWidth&&(n+=l,o-=l,r+=l),e.beginPath(),e.fillStyle=a.backgroundColor,e.strokeStyle=a.borderColor,e.lineWidth=a.borderWidth;var s=[[n,a.base],[n,r],[o,r],[o,a.base]],d=["bottom","left","top","right"],u=d.indexOf(a.borderSkipped,0);-1===u&&(u=0),e.moveTo.apply(e,t(0));for(var c=1;4>c;c++)e.lineTo.apply(e,t(c));e.fill(),a.borderWidth&&e.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var a=this._view;return a?a.y<a.base?t>=a.x-a.width/2&&t<=a.x+a.width/2&&e>=a.y&&e<=a.base:t>=a.x-a.width/2&&t<=a.x+a.width/2&&e>=a.base&&e<=a.y:!1},inLabelRange:function(t){var e=this._view;return e?t>=e.x-e.width/2&&t<=e.x+e.width/2:!1},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})}},{}],38:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"bottom"},i=t.Scale.extend({determineDataLimits:function(){var t=this;t.minIndex=0,t.maxIndex=t.chart.data.labels.length-1;var a;void 0!==t.options.ticks.min&&(a=e.indexOf(t.chart.data.labels,t.options.ticks.min),t.minIndex=-1!==a?a:t.minIndex),void 0!==t.options.ticks.max&&(a=e.indexOf(t.chart.data.labels,t.options.ticks.max),t.maxIndex=-1!==a?a:t.maxIndex),t.min=t.chart.data.labels[t.minIndex],t.max=t.chart.data.labels[t.maxIndex]},buildTicks:function(t){var e=this;e.ticks=0===e.minIndex&&e.maxIndex===e.chart.data.labels.length-1?e.chart.data.labels:e.chart.data.labels.slice(e.minIndex,e.maxIndex+1)},getLabelForIndex:function(t,e){return this.ticks[t]},getPixelForValue:function(t,e,a,i){var n=this,o=Math.max(n.maxIndex+1-n.minIndex-(n.options.gridLines.offsetGridLines?0:1),1);if(n.isHorizontal()){var r=n.width-(n.paddingLeft+n.paddingRight),l=r/o,s=l*(e-n.minIndex)+n.paddingLeft;return n.options.gridLines.offsetGridLines&&i&&(s+=l/2),n.left+Math.round(s)}var d=n.height-(n.paddingTop+n.paddingBottom),u=d/o,c=u*(e-n.minIndex)+n.paddingTop;return n.options.gridLines.offsetGridLines&&i&&(c+=u/2),n.top+Math.round(c)},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null,e)},getValueForPixel:function(t){var e,a=this,i=Math.max(a.ticks.length-(a.options.gridLines.offsetGridLines?0:1),1),n=a.isHorizontal(),o=n?a.width-(a.paddingLeft+a.paddingRight):a.height-(a.paddingTop+a.paddingBottom),r=o/i;return a.options.gridLines.offsetGridLines&&(t-=r/2),t-=n?a.paddingLeft:a.paddingTop,e=0>=t?0:Math.round(t/r)}});t.scaleService.registerScaleType("category",i,a)}},{}],39:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"left",ticks:{callback:function(t,a,i){var n=i.length>3?i[2]-i[1]:i[1]-i[0];Math.abs(n)>1&&t!==Math.floor(t)&&(n=t-Math.floor(t));var o=e.log10(Math.abs(n)),r="";if(0!==t){var l=-1*Math.floor(o);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r}}},i=t.LinearScaleBase.extend({determineDataLimits:function(){function t(t){return l?t.xAxisID===a.id:t.yAxisID===a.id}var a=this,i=a.options,n=(i.ticks,a.chart),o=n.data,r=o.datasets,l=a.isHorizontal();if(a.min=null,a.max=null,i.stacked){var s={},d=!1,u=!1;e.each(r,function(o,r){var l=n.getDatasetMeta(r);void 0===s[l.type]&&(s[l.type]={positiveValues:[],negativeValues:[]});var c=s[l.type].positiveValues,h=s[l.type].negativeValues;n.isDatasetVisible(r)&&t(l)&&e.each(o.data,function(t,e){var n=+a.getRightValue(t);isNaN(n)||l.data[e].hidden||(c[e]=c[e]||0,h[e]=h[e]||0,i.relativePoints?c[e]=100:0>n?(u=!0,h[e]+=n):(d=!0,c[e]+=n))})}),e.each(s,function(t){var i=t.positiveValues.concat(t.negativeValues),n=e.min(i),o=e.max(i);a.min=null===a.min?n:Math.min(a.min,n),a.max=null===a.max?o:Math.max(a.max,o)})}else e.each(r,function(i,o){var r=n.getDatasetMeta(o);n.isDatasetVisible(o)&&t(r)&&e.each(i.data,function(t,e){var i=+a.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===a.min?a.min=i:i<a.min&&(a.min=i),null===a.max?a.max=i:i>a.max&&(a.max=i))})});this.handleTickRangeOptions()},getTickLimit:function(){var a,i=this,n=i.options.ticks;if(i.isHorizontal())a=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(i.width/50));else{var o=e.getValueOrDefault(n.fontSize,t.defaults.global.defaultFontSize);a=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(i.height/(2*o)))}return a},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t,e,a,i){var n,o,r=this,l=r.paddingLeft,s=r.paddingBottom,d=r.start,u=+r.getRightValue(t),c=r.end-d;return r.isHorizontal()?(o=r.width-(l+r.paddingRight),n=r.left+o/c*(u-d),Math.round(n+l)):(o=r.height-(r.paddingTop+s),n=r.bottom-s-o/c*(u-d),Math.round(n))},getValueForPixel:function(t){var e=this,a=e.isHorizontal(),i=e.paddingLeft,n=e.paddingBottom,o=a?e.width-(i+e.paddingRight):e.height-(e.paddingTop+n),r=(a?t-e.left-i:e.bottom-n-t)/o;return e.start+(e.end-e.start)*r},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticksAsNumbers[t],null,null,e)}});t.scaleService.registerScaleType("linear",i,a)}},{}],40:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=e.noop;t.LinearScaleBase=t.Scale.extend({handleTickRangeOptions:function(){var t=this,a=t.options,i=a.ticks;if(i.beginAtZero){var n=e.sign(t.min),o=e.sign(t.max);0>n&&0>o?t.max=0:n>0&&o>0&&(t.min=0)}void 0!==i.min?t.min=i.min:void 0!==i.suggestedMin&&(t.min=Math.min(t.min,i.suggestedMin)),void 0!==i.max?t.max=i.max:void 0!==i.suggestedMax&&(t.max=Math.max(t.max,i.suggestedMax)),t.min===t.max&&(t.max++,i.beginAtZero||t.min--)},getTickLimit:a,handleDirectionalChanges:a,buildTicks:function(){var t=this,a=t.options,i=a.ticks,n=e.getValueOrDefault,o=(t.isHorizontal(),t.ticks=[]),r=t.getTickLimit();r=Math.max(2,r);var l,s=i.fixedStepSize&&i.fixedStepSize>0||i.stepSize&&i.stepSize>0;if(s)l=n(i.fixedStepSize,i.stepSize);else{var d=e.niceNum(t.max-t.min,!1);l=e.niceNum(d/(r-1),!0)}var u=Math.floor(t.min/l)*l,c=Math.ceil(t.max/l)*l,h=(c-u)/l;h=e.almostEquals(h,Math.round(h),l/1e3)?Math.round(h):Math.ceil(h),o.push(void 0!==i.min?i.min:u);for(var f=1;h>f;++f)o.push(u+f*l);o.push(void 0!==i.max?i.max:c),t.handleDirectionalChanges(),t.max=e.max(o),t.min=e.min(o),i.reverse?(o.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{}],41:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"left",ticks:{callback:function(t,a,i){var n=t/Math.pow(10,Math.floor(e.log10(t)));return 1===n||2===n||5===n||0===a||a===i.length-1?t.toExponential():""}}},i=t.Scale.extend({determineDataLimits:function(){function t(t){return d?t.xAxisID===a.id:t.yAxisID===a.id}var a=this,i=a.options,n=i.ticks,o=a.chart,r=o.data,l=r.datasets,s=e.getValueOrDefault,d=a.isHorizontal();if(a.min=null,a.max=null,i.stacked){var u={};e.each(l,function(n,r){var l=o.getDatasetMeta(r);o.isDatasetVisible(r)&&t(l)&&(void 0===u[l.type]&&(u[l.type]=[]),e.each(n.data,function(t,e){var n=u[l.type],o=+a.getRightValue(t);isNaN(o)||l.data[e].hidden||(n[e]=n[e]||0,i.relativePoints?n[e]=100:n[e]+=o)}))}),e.each(u,function(t){var i=e.min(t),n=e.max(t);a.min=null===a.min?i:Math.min(a.min,i),a.max=null===a.max?n:Math.max(a.max,n)})}else e.each(l,function(i,n){var r=o.getDatasetMeta(n);o.isDatasetVisible(n)&&t(r)&&e.each(i.data,function(t,e){var i=+a.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===a.min?a.min=i:i<a.min&&(a.min=i),null===a.max?a.max=i:i>a.max&&(a.max=i))})});a.min=s(n.min,a.min),a.max=s(n.max,a.max),a.min===a.max&&(0!==a.min&&null!==a.min?(a.min=Math.pow(10,Math.floor(e.log10(a.min))-1),a.max=Math.pow(10,Math.floor(e.log10(a.max))+1)):(a.min=1,a.max=10))},buildTicks:function(){for(var t=this,a=t.options,i=a.ticks,n=e.getValueOrDefault,o=t.ticks=[],r=n(i.min,Math.pow(10,Math.floor(e.log10(t.min))));r<t.max;){o.push(r);var l=Math.floor(e.log10(r)),s=Math.floor(r/Math.pow(10,l))+1;10===s&&(s=1,++l),r=s*Math.pow(10,l)}var d=n(i.max,r);o.push(d),t.isHorizontal()||o.reverse(),t.max=e.max(o),t.min=e.min(o),i.reverse?(o.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),t.Scale.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t,e){return this.getPixelForValue(this.tickValues[t],null,null,e)},getPixelForValue:function(t,a,i,n){var o,r,l=this,s=l.start,d=+l.getRightValue(t),u=e.log10(l.end)-e.log10(s),c=l.paddingTop,h=l.paddingBottom,f=l.paddingLeft;return l.isHorizontal()?0===d?r=l.left+f:(o=l.width-(f+l.paddingRight),r=l.left+o/u*(e.log10(d)-e.log10(s)),r+=f):0===d?r=l.top+c:(o=l.height-(c+h),r=l.bottom-h-o/u*(e.log10(d)-e.log10(s))),r},getValueForPixel:function(t){var a,i,n=this,o=e.log10(n.end)-e.log10(n.start);return n.isHorizontal()?(i=n.width-(n.paddingLeft+n.paddingRight),a=n.start*Math.pow(10,(t-n.left-n.paddingLeft)*o/i)):(i=n.height-(n.paddingTop+n.paddingBottom),a=Math.pow(10,(n.bottom-n.paddingBottom-t)*o/i)/n.start),a}});t.scaleService.registerScaleType("logarithmic",i,a)}},{}],42:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=t.defaults.global,i={display:!0,animate:!0,lineArc:!1,position:"chartArea",angleLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2},pointLabels:{fontSize:10,callback:function(t){return t}}},n=t.LinearScaleBase.extend({getValueCount:function(){return this.chart.data.labels.length},setDimensions:function(){var t=this,i=t.options,n=i.ticks;t.width=t.maxWidth,t.height=t.maxHeight,t.xCenter=Math.round(t.width/2),t.yCenter=Math.round(t.height/2);var o=e.min([t.height,t.width]),r=e.getValueOrDefault(n.fontSize,a.defaultFontSize);t.drawingArea=i.display?o/2-(r/2+n.backdropPaddingY):o/2},determineDataLimits:function(){var t=this,a=t.chart;t.min=null,t.max=null,e.each(a.data.datasets,function(i,n){if(a.isDatasetVisible(n)){var o=a.getDatasetMeta(n);e.each(i.data,function(e,a){var i=+t.getRightValue(e);isNaN(i)||o.data[a].hidden||(null===t.min?t.min=i:i<t.min&&(t.min=i),null===t.max?t.max=i:i>t.max&&(t.max=i))})}}),t.handleTickRangeOptions()},getTickLimit:function(){var t=this.options.ticks,i=e.getValueOrDefault(t.fontSize,a.defaultFontSize);return Math.min(t.maxTicksLimit?t.maxTicksLimit:11,Math.ceil(this.drawingArea/(1.5*i)))},convertTicksToLabels:function(){var e=this;t.LinearScaleBase.prototype.convertTicksToLabels.call(e),
+e.pointLabels=e.chart.data.labels.map(e.options.pointLabels.callback,e)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t,i,n,o,r,l,s,d,u,c,h,f,g=this.options.pointLabels,p=e.getValueOrDefault(g.fontSize,a.defaultFontSize),m=e.getValueOrDefault(g.fontStyle,a.defaultFontStyle),b=e.getValueOrDefault(g.fontFamily,a.defaultFontFamily),v=e.fontString(p,m,b),x=e.min([this.height/2-p-5,this.width/2]),y=this.width,k=0;for(this.ctx.font=v,i=0;i<this.getValueCount();i++)t=this.getPointPosition(i,x),n=this.ctx.measureText(this.pointLabels[i]?this.pointLabels[i]:"").width+5,0===i||i===this.getValueCount()/2?(o=n/2,t.x+o>y&&(y=t.x+o,r=i),t.x-o<k&&(k=t.x-o,s=i)):i<this.getValueCount()/2?t.x+n>y&&(y=t.x+n,r=i):i>this.getValueCount()/2&&t.x-n<k&&(k=t.x-n,s=i);u=k,c=Math.ceil(y-this.width),l=this.getIndexAngle(r),d=this.getIndexAngle(s),h=c/Math.sin(l+Math.PI/2),f=u/Math.sin(d+Math.PI/2),h=e.isNumber(h)?h:0,f=e.isNumber(f)?f:0,this.drawingArea=Math.round(x-(f+h)/2),this.setCenterPoint(f,h)},setCenterPoint:function(t,e){var a=this,i=a.width-e-a.drawingArea,n=t+a.drawingArea;a.xCenter=Math.round((n+i)/2+a.left),a.yCenter=Math.round(a.height/2+a.top)},getIndexAngle:function(t){var e=2*Math.PI/this.getValueCount();return t*e-Math.PI/2},getDistanceFromCenterForValue:function(t){var e=this;if(null===t)return 0;var a=e.drawingArea/(e.max-e.min);return e.options.reverse?(e.max-t)*a:(t-e.min)*a},getPointPosition:function(t,e){var a=this,i=a.getIndexAngle(t);return{x:Math.round(Math.cos(i)*e)+a.xCenter,y:Math.round(Math.sin(i)*e)+a.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this,e=t.min,a=t.max;return t.getPointPositionForValue(0,t.beginAtZero?0:0>e&&0>a?a:e>0&&a>0?e:0)},draw:function(){var t=this,i=t.options,n=i.gridLines,o=i.ticks,r=i.angleLines,l=i.pointLabels,s=e.getValueOrDefault;if(i.display){var d=t.ctx,u=s(o.fontSize,a.defaultFontSize),c=s(o.fontStyle,a.defaultFontStyle),h=s(o.fontFamily,a.defaultFontFamily),f=e.fontString(u,c,h);if(e.each(t.ticks,function(r,l){if(l>0||i.reverse){var c=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),h=t.yCenter-c;if(n.display&&0!==l)if(d.strokeStyle=e.getValueAtIndexOrDefault(n.color,l-1),d.lineWidth=e.getValueAtIndexOrDefault(n.lineWidth,l-1),i.lineArc)d.beginPath(),d.arc(t.xCenter,t.yCenter,c,0,2*Math.PI),d.closePath(),d.stroke();else{d.beginPath();for(var g=0;g<t.getValueCount();g++){var p=t.getPointPosition(g,c);0===g?d.moveTo(p.x,p.y):d.lineTo(p.x,p.y)}d.closePath(),d.stroke()}if(o.display){var m=s(o.fontColor,a.defaultFontColor);if(d.font=f,o.showLabelBackdrop){var b=d.measureText(r).width;d.fillStyle=o.backdropColor,d.fillRect(t.xCenter-b/2-o.backdropPaddingX,h-u/2-o.backdropPaddingY,b+2*o.backdropPaddingX,u+2*o.backdropPaddingY)}d.textAlign="center",d.textBaseline="middle",d.fillStyle=m,d.fillText(r,t.xCenter,h)}}}),!i.lineArc){d.lineWidth=r.lineWidth,d.strokeStyle=r.color;for(var g=t.getDistanceFromCenterForValue(i.reverse?t.min:t.max),p=s(l.fontSize,a.defaultFontSize),m=s(l.fontStyle,a.defaultFontStyle),b=s(l.fontFamily,a.defaultFontFamily),v=e.fontString(p,m,b),x=t.getValueCount()-1;x>=0;x--){if(r.display){var y=t.getPointPosition(x,g);d.beginPath(),d.moveTo(t.xCenter,t.yCenter),d.lineTo(y.x,y.y),d.stroke(),d.closePath()}var k=t.getPointPosition(x,g+5),S=s(l.fontColor,a.defaultFontColor);d.font=v,d.fillStyle=S;var w=t.pointLabels,C=w.length,M=w.length/2,D=M/2,A=D>x||x>C-D,I=x===D||x===C-D;0===x?d.textAlign="center":x===M?d.textAlign="center":M>x?d.textAlign="left":d.textAlign="right",I?d.textBaseline="middle":A?d.textBaseline="bottom":d.textBaseline="top",d.fillText(w[x]?w[x]:"",k.x,k.y)}}}}});t.scaleService.registerScaleType("radialLinear",n,i)}},{}],43:[function(t,e,a){"use strict";var i=t(1);i="function"==typeof i?i:window.moment,e.exports=function(t){var e=t.helpers,a={units:[{name:"millisecond",steps:[1,2,5,10,20,50,100,250,500]},{name:"second",steps:[1,2,5,10,30]},{name:"minute",steps:[1,2,5,10,30]},{name:"hour",steps:[1,2,3,6,12]},{name:"day",steps:[1,2,5]},{name:"week",maxStep:4},{name:"month",maxStep:3},{name:"quarter",maxStep:4},{name:"year",maxStep:!1}]},n={position:"bottom",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,displayFormats:{millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm:ss a",hour:"MMM D, hA",day:"ll",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"}},ticks:{autoSkip:!1}},o=t.Scale.extend({initialize:function(){if(!i)throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com");t.Scale.prototype.initialize.call(this)},getLabelMoment:function(t,e){return this.labelMoments[t][e]},getMomentStartOf:function(t){var e=this;return"week"===e.options.time.unit&&e.options.time.isoWeekday!==!1?t.clone().startOf("isoWeek").isoWeekday(e.options.time.isoWeekday):t.clone().startOf(e.tickUnit)},determineDataLimits:function(){var t=this;t.labelMoments=[];var a=[];t.chart.data.labels&&t.chart.data.labels.length>0?(e.each(t.chart.data.labels,function(e,i){var n=t.parseTime(e);n.isValid()&&(t.options.time.round&&n.startOf(t.options.time.round),a.push(n))},t),t.firstTick=i.min.call(t,a),t.lastTick=i.max.call(t,a)):(t.firstTick=null,t.lastTick=null),e.each(t.chart.data.datasets,function(n,o){var r=[],l=t.chart.isDatasetVisible(o);"object"==typeof n.data[0]&&null!==n.data[0]?e.each(n.data,function(e,a){var n=t.parseTime(t.getRightValue(e));n.isValid()&&(t.options.time.round&&n.startOf(t.options.time.round),r.push(n),l&&(t.firstTick=null!==t.firstTick?i.min(t.firstTick,n):n,t.lastTick=null!==t.lastTick?i.max(t.lastTick,n):n))},t):r=a,t.labelMoments.push(r)},t),t.options.time.min&&(t.firstTick=t.parseTime(t.options.time.min)),t.options.time.max&&(t.lastTick=t.parseTime(t.options.time.max)),t.firstTick=(t.firstTick||i()).clone(),t.lastTick=(t.lastTick||i()).clone()},buildTicks:function(i){var n=this;n.ctx.save();var o=e.getValueOrDefault(n.options.ticks.fontSize,t.defaults.global.defaultFontSize),r=e.getValueOrDefault(n.options.ticks.fontStyle,t.defaults.global.defaultFontStyle),l=e.getValueOrDefault(n.options.ticks.fontFamily,t.defaults.global.defaultFontFamily),s=e.fontString(o,r,l);if(n.ctx.font=s,n.ticks=[],n.unitScale=1,n.scaleSizeInUnits=0,n.options.time.unit)n.tickUnit=n.options.time.unit||"day",n.displayFormat=n.options.time.displayFormats[n.tickUnit],n.scaleSizeInUnits=n.lastTick.diff(n.firstTick,n.tickUnit,!0),n.unitScale=e.getValueOrDefault(n.options.time.unitStepSize,1);else{var d=n.isHorizontal()?n.width-(n.paddingLeft+n.paddingRight):n.height-(n.paddingTop+n.paddingBottom),u=n.tickFormatFunction(n.firstTick,0,[]),c=n.ctx.measureText(u).width,h=Math.cos(e.toRadians(n.options.ticks.maxRotation)),f=Math.sin(e.toRadians(n.options.ticks.maxRotation));c=c*h+o*f;var g=d/c;n.tickUnit="millisecond",n.scaleSizeInUnits=n.lastTick.diff(n.firstTick,n.tickUnit,!0),n.displayFormat=n.options.time.displayFormats[n.tickUnit];for(var p=0,m=a.units[p];p<a.units.length;){if(n.unitScale=1,e.isArray(m.steps)&&Math.ceil(n.scaleSizeInUnits/g)<e.max(m.steps)){for(var b=0;b<m.steps.length;++b)if(m.steps[b]>=Math.ceil(n.scaleSizeInUnits/g)){n.unitScale=e.getValueOrDefault(n.options.time.unitStepSize,m.steps[b]);break}break}if(m.maxStep===!1||Math.ceil(n.scaleSizeInUnits/g)<m.maxStep){n.unitScale=e.getValueOrDefault(n.options.time.unitStepSize,Math.ceil(n.scaleSizeInUnits/g));break}++p,m=a.units[p],n.tickUnit=m.name;var v=n.firstTick.diff(n.getMomentStartOf(n.firstTick),n.tickUnit,!0),x=n.getMomentStartOf(n.lastTick.clone().add(1,n.tickUnit)).diff(n.lastTick,n.tickUnit,!0);n.scaleSizeInUnits=n.lastTick.diff(n.firstTick,n.tickUnit,!0)+v+x,n.displayFormat=n.options.time.displayFormats[m.name]}}var y;if(n.options.time.min?y=n.getMomentStartOf(n.firstTick):(n.firstTick=n.getMomentStartOf(n.firstTick),y=n.firstTick),!n.options.time.max){var k=n.getMomentStartOf(n.lastTick);0!==k.diff(n.lastTick,n.tickUnit,!0)&&(n.lastTick=n.getMomentStartOf(n.lastTick.add(1,n.tickUnit)))}n.smallestLabelSeparation=n.width,e.each(n.chart.data.datasets,function(t,e){for(var a=1;a<n.labelMoments[e].length;a++)n.smallestLabelSeparation=Math.min(n.smallestLabelSeparation,n.labelMoments[e][a].diff(n.labelMoments[e][a-1],n.tickUnit,!0))},n),n.options.time.displayFormat&&(n.displayFormat=n.options.time.displayFormat),n.ticks.push(n.firstTick.clone());for(var S=1;S<=n.scaleSizeInUnits;++S){var w=y.clone().add(S,n.tickUnit);if(n.options.time.max&&w.diff(n.lastTick,n.tickUnit,!0)>=0)break;S%n.unitScale===0&&n.ticks.push(w)}var C=n.ticks[n.ticks.length-1].diff(n.lastTick,n.tickUnit);(0!==C||0===n.scaleSizeInUnits)&&(n.options.time.max?(n.ticks.push(n.lastTick.clone()),n.scaleSizeInUnits=n.lastTick.diff(n.ticks[0],n.tickUnit,!0)):(n.ticks.push(n.lastTick.clone()),n.scaleSizeInUnits=n.lastTick.diff(n.firstTick,n.tickUnit,!0))),n.ctx.restore()},getLabelForIndex:function(t,e){var a=this,i=a.chart.data.labels&&t<a.chart.data.labels.length?a.chart.data.labels[t]:"";return"object"==typeof a.chart.data.datasets[e].data[0]&&(i=a.getRightValue(a.chart.data.datasets[e].data[t])),a.options.time.tooltipFormat&&(i=a.parseTime(i).format(a.options.time.tooltipFormat)),i},tickFormatFunction:function(t,a,i){var n=t.format(this.displayFormat),o=this.options.ticks,r=e.getValueOrDefault(o.callback,o.userCallback);return r?r(n,a,i):n},convertTicksToLabels:function(){var t=this;t.tickMoments=t.ticks,t.ticks=t.ticks.map(t.tickFormatFunction,t)},getPixelForValue:function(t,e,a,i){var n=this,o=t&&t.isValid&&t.isValid()?t:n.getLabelMoment(a,e);if(o){var r=o.diff(n.firstTick,n.tickUnit,!0),l=r/n.scaleSizeInUnits;if(n.isHorizontal()){var s=n.width-(n.paddingLeft+n.paddingRight),d=(s/Math.max(n.ticks.length-1,1),s*l+n.paddingLeft);return n.left+Math.round(d)}var u=n.height-(n.paddingTop+n.paddingBottom),c=(u/Math.max(n.ticks.length-1,1),u*l+n.paddingTop);return n.top+Math.round(c)}},getPixelForTick:function(t,e){return this.getPixelForValue(this.tickMoments[t],null,null,e)},getValueForPixel:function(t){var e=this,a=e.isHorizontal()?e.width-(e.paddingLeft+e.paddingRight):e.height-(e.paddingTop+e.paddingBottom),n=(t-(e.isHorizontal()?e.left+e.paddingLeft:e.top+e.paddingTop))/a;return n*=e.scaleSizeInUnits,e.firstTick.clone().add(i.duration(n,e.tickUnit).asSeconds(),"seconds")},parseTime:function(t){var e=this;return"string"==typeof e.options.time.parser?i(t,e.options.time.parser):"function"==typeof e.options.time.parser?e.options.time.parser(t):"function"==typeof t.getMonth||"number"==typeof t?i(t):t.isValid&&t.isValid()?t:"string"!=typeof e.options.time.format&&e.options.time.format.call?(console.warn("options.time.format is deprecated and replaced by options.time.parser. See http://nnnick.github.io/Chart.js/docs-v2/#scales-time-scale"),e.options.time.format(t)):i(t,e.options.time.format)}});t.scaleService.registerScaleType("time",o,n)}},{1:1}]},{},[7])(7)});
\ No newline at end of file
index 092f73e0572f8d56f8e90a8c0a2996715bdd213a..af264c0619652b8be4f5240991c95056f1570b54 100644 (file)
@@ -2,7 +2,7 @@
   "name": "chart.js",
   "homepage": "http://www.chartjs.org",
   "description": "Simple HTML5 charts using the canvas element.",
-  "version": "2.1.4",
+  "version": "2.1.5",
   "license": "MIT",
   "main": "src/chart.js",
   "repository": {
@@ -51,4 +51,4 @@
     "chartjs-color": "^2.0.0",
     "moment": "^2.10.6"
   }
-}
+}
\ No newline at end of file