{"version":3,"sources":["webpack:///./node_modules/@progress/kendo-ui/js/dataviz/chart/kendo-chart.js"],"names":["module","exports","modules","installedModules","__webpack_require__","moduleId","id","loaded","call","m","c","p","0","3","Error","890","892","894","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","f","define","apply","undefined","$","window","kendo","dataviz","Class","isNumber","datavizConstants","constants","MAX_VALUE","MIN_VALUE","VALUE","CENTER","TOP","BOTTOM","LEFT","WHITE","CIRCLE","X","Y","RIGHT","BLACK","DATE","DEFAULT_PRECISION","ARC","defined","getter","isArray","ChartElement","Point","Box","alignPathToPixel","setDefaultOptions","inArray","isFunction","valueOrDefault","isObject","deepExtend","last","eventElement","getTemplate","TextBox","ShapeElement","getSpacing","CurveProcessor","append","isString","parseDate","styleValue","CategoryAxis","BoxElement","round","limitValue","grep","elementStyles","hasClasses","bindEvents","services","unbindEvents","support","drawing","Path","Animation","AnimationFactory","Group","Color","geometry","GeometryPoint","transform","ChartAxis","extend","init","axis","this","_axis","options","value","point","getCategory","getValue","slot","from","to","limit","range","valueRange","findAxisByName","name","axes","idx","length","prepareUserOptions","ChartPane","pane","visual","chartsVisual","chartContainer","_pane","ChartPlotArea","plotArea","_plotArea","backgroundVisual","_bgVisual","countNumbers","values","count","i","num","Aggregates","min","Math","max","sum","sumOrNull","result","avg","first","getField","field","row","get","SeriesBinder","_valueFields","_otherFields","_nullValue","_undefinedValue","register","seriesTypes","valueFields","otherFields","this$1","type","_makeValue","canonicalFields","series","concat","bindPoint","pointIx","item","fields","data","pointData","Array","fieldData","slice","_bindFromArray","srcValueFields","sourceFields","srcPointFields","_bindFromObject","initialValue","fieldName","array","object","srcFields","srcFieldName","sourceFieldName","push","current","STD_ERR","STD_DEV","percentRegex","standardDeviationRegex","RegExp","ErrorRangeCalculator","errorValue","initGlobalRanges","deviationMatch","exec","valueGetter","createValueGetter","average","getAverage","deviation","getStandardDeviation","multiple","parseFloat","errorRange","low","high","globalRange","indexOf","standardError","getStandardError","binder","index","OBJECT","getErrorRange","pointValue","percentValue","abs","sqrt","isSample","total","squareDifferenceSum","pow","browser","INITIAL_ANIMATION_DURATION","FADEIN","GLASS","BORDER_BRIGHTNESS","TOOLTIP_OFFSET","START_SCALE","msie","ERROR_LOW_FIELD","ERROR_HIGH_FIELD","X_ERROR_LOW_FIELD","X_ERROR_HIGH_FIELD","Y_ERROR_LOW_FIELD","Y_ERROR_HIGH_FIELD","LINE_MARKER_SIZE","ZERO","INTERPOLATE","GAP","ABOVE","BELOW","SMOOTH","STEP","AREA","BAR","BOX_PLOT","BUBBLE","BULLET","CANDLESTICK","COLUMN","DONUT","FUNNEL","HEATMAP","HORIZONTAL_WATERFALL","LINE","OHLC","PIE","POLAR_AREA","POLAR_LINE","POLAR_SCATTER","RADAR_AREA","RADAR_COLUMN","RADAR_LINE","RANGE_AREA","RANGE_BAR","RANGE_COLUMN","SCATTER","SCATTER_LINE","VERTICAL_AREA","VERTICAL_BOX_PLOT","VERTICAL_BULLET","VERTICAL_LINE","VERTICAL_RANGE_AREA","WATERFALL","EQUALLY_SPACED_SERIES","LEGEND_ITEM_CLICK","LEGEND_ITEM_HOVER","LEGEND_ITEM_LEAVE","SERIES_CLICK","SERIES_HOVER","SERIES_OVER","SERIES_LEAVE","PLOT_AREA_CLICK","PLOT_AREA_HOVER","PLOT_AREA_LEAVE","DRAG","DRAG_END","DRAG_START","ZOOM_START","ZOOM","ZOOM_END","SELECT_START","SELECT","SELECT_END","RENDER","SHOW_TOOLTIP","HIDE_TOOLTIP","PANE_RENDER","LOGARITHMIC","CATEGORY","INSIDE_END","INSIDE_BASE","OUTSIDE_END","MOUSEWHEEL","MOUSEWHEEL_DELAY","MOUSEWHEEL_ZOOM_RATE","DEFAULT_ERROR_BAR_WIDTH","ErrorBarBase","isVertical","chart","fn","reflow","targetBox","linePoints","endCaps","getAxis","valueBox","getSlot","centerBox","center","capsWidth","getCapsWidth","capValue","x","y","capStart","capEnd","y1","y2","box","x1","x2","boxSize","width","height","floor","createVisual","rect","toRect","sender","getSender","color","line","createDefaultVisual","defaultVisual","ref","lineOptions","stroke","dashType","moveTo","lineTo","animation","delay","zIndex","CategoricalErrorBar","seriesValueAxis","MAX_EXPAND_DEPTH","evalOptions","context","state","dryRun","defaults","depth","needsEval","excluded","property","hasOwnProperty","propValue","categoriesCount","seriesCount","categories","CategoricalChart","chartService","categoryAxis","seriesCategoryAxis","valueAxisRanges","points","categoryPoints","seriesPoints","seriesOptions","_evalSeries","render","traverseDataPoints","addValue","bind","pointOptions","seriesIx","pointType","prototype","vertical","invertAxes","plotValue","isStacked100","categoryIx","otherValues","categorySum","other","stack","otherStack","group","plotRange","startValue","isStacked","positive","prevValue","isStackedBar","STRING","otherValue","valueAxis","axisCrossingValue","categoryAxisCrossingValue","convertableToNumber","stackLimits","axisName","stackName","pIx","isFinite","updateStackRange","chartSeries","limitsCache","key","limits","errorTotals","negative","sparseArrayLimits","addErrorBar","errorBars","lowValue","highValue","seriesErrorRanges","addPointErrorBar","stackedErrorRange","updateRange","errorBar","createPoint","owner","noteText","dataItem","evalPointOptions","category","_defaults","doEval","axisRange","namedValueAxes","categorySlots","chartPoints","currentSeries","categorySlot","valueSlot","pointSlot","aboveAxis","stackValue","percentage","reflowPoint","visible","reflowCategories","clip","limitPoints","limitPoint","limittedSlot","limitSlot","equals","reverse","crossingValues","axisCrossingValues","axisIndex","slotX","slotY","callback","_outOfRangeCallback","seriesIx$1","currentCategory","categoryAt","_bindPoint","seriesIx$2","outOfRangePoint","_bindCache","bindCache","formatPointValue","format","auto","PointEventsMixin","click","e","trigger","eventArgs","hover","over","out","runningTotal","element","originalEvent","NoteMixin","createNote","notes","text","label","note","Note","LinePoint","tooltipTracking","markers","labels","_rendered","size","marker","createMarker","labelTemplate","labelText","formatValue","align","vAlign","margin","left","right","markerBorder","background","border","brightness","toHex","rotation","opacity","markerBox","_childBox","childBox","clone","reflowLabel","noteTargetBox","anchor","position","alignTo","createHighlight","highlight","defaultColor","shadow","getElement","highlightVisual","highlightVisualArgs","paddingBox","halfSize","Rect","tooltipAnchor","clipBox","showTooltip","overlaps","verticalAlign","horizontalAlign","horizontal","overlapsBox","unclipElements","noclip","padding","HIGHLIGHT_ZINDEX","LineSegment","toGeometryPoints","customVisual","segmentVisual","fromPoints","closed","close","aliasFor","coords","parent","getNearestPoint","StepLineMixin","calculateStepPoints","justified","stepAxis","stepDir","dir","previousPoint","toGeometryPoint","stepPoint","lintPoint","StepLineSegment","SplineSegment","curveProcessor","segments","process","curve","LineChartMixin","renderSegments","lastSegment","_segments","sortedPoints","sortPoints","pointCount","seriesMissingValues","createSegment","_addSegment","children","unshift","segment","missingValues","assumeZero","nearestPoint","target","allPoints","nearestPointDistance","pointBox","pointDistance","distanceTo","ClipAnimation","setup","_setEnd","step","pos","interpolateValue","topRight","bottomRight","suspend","setX","resume","anyHasZIndex","elements","duration","ClipAnimationMixin","createAnimation","root","getRoot","transitions","clipPath","fromRect","_setChildrenAnimation","animationPoints","LineChart","style","supportsPointInactiveOpacity","AreaSegment","prevSegment","stackPoints","createFill","fill","createStroke","lineCap","strokeSegments","_strokeSegments","createStrokeSegments","segmentsFromPoints","stackSegments","createStackSegments","map","Segment","hasStackSegment","fillSegments","hasStackSegments","fillToAxes","fillPath","crossingValue","endSlot","firstPoint","lastPoint","end","StepAreaSegment","SplineAreaSegment","controlOut","controlIn","AreaChart","previousSegment","_gapStackPoints","_stackPoints","stackPoint","startIdx","endIdx","pointOffset","_outOfRangeMinPoint","currentSeriesIx","_previousSegmentPoint","gapStackPoint","_createGapStackPoint","segmentIx","seriesIdx","AxisGroupRangeTracker","axisRanges","update","chartAxisRanges","chartRange","reset","query","BarLabel","content","textBox","textOptions","labelBox","contentBox","top","bottom","alignToClipBox","start","parentBox","hasGradientOverlay","overlay","gradient","BAR_ALIGN_MIN_WIDTH","Bar","createLabel","rectVisual","createRect","strokeOpacity","path","getBorderColor","lineJoin","createGradientOverlay","baseColor","_brightness","borderColor","forEach","forEachReverse","ClusterLayout","rtl","gap","spacing","slots","slotSize","child","StackWrap","positionAxis","childrenCount","currentChild","snapTo","wrap","BarChart","clusterType","stackType","labelOptions","negativeColor","cluster","stackWrap","getStackWrap","stackGroup","wraps","_stackGroup","zeroSlot","stackAxis","childrenLength","_setAnimationOptions","pointVisual","origin","Candlestick","ocSlot","open","lhSlot","realBody","mid","lines","reflowNote","_mainVisual","mainVisual","createOverlay","createBody","createLines","container","body","set","drawLines","lineStyle","normalColor","areNumbers","tooltip","CandlestickChart","valueParts","splitValue","hasValue","downColor","parts","BoxPlot","whiskerSlot","boxSlot","q1","q3","reflowBoxSlot","lower","upper","reflowWhiskerSlot","medianSlot","median","mean","meanSlot","meanPoints","calcMeanPoints","whiskerPoints","calcWhiskerPoints","medianPoints","calcMedianPoints","renderOutliers","outliers","outerFence","outlierValue","extremes","markersBorder","shape","reflowOutliers","move","whiskers","CROSS","VerticalBoxPlot","BoxPlotChart","filterOutliers","items","ScatterErrorBar","seriesAxes","ScatterChart","_initFields","xAxisRanges","yAxisRanges","valueErrorField","lowField","highField","createMissingValue","intlService","intl","xAxisName","xAxis","yAxisName","yAxis","xAxisRange","yAxisRange","namedXAxes","axisX","namedYAxes","axisY","currentSeriesPoints","ref$1","Bubble","radius","highlightGroup","Circle","createGradient","stops","offset","BubbleChart","_maxSize","negativeValues","updateBubblesSize","pointsCount","animationOptions","minSize","maxSize","minR","maxR","minArea","PI","maxArea","areaRange","areaRatio","area","baseZIndex","Target","Bullet","targetValueSlot","targetSlotX","targetSlotY","targetSlot","bodyVisual","create","BulletChart","wrapData","bulletOptions","bullet","isNaN","seriesItem","BaseTooltip","getStyle","pointColor","backgroundColor","font","borderWidth","paddingTop","paddingBottom","paddingLeft","paddingRight","show","tooltipOptions","isDark","className","notify","hide","destroy","CrosshairTooltip","crosshair","formatService","initAxisName","showAt","stickyMode","formattedValue","dateFormats","baseUnit","getAnchor","ref_options","lineBox","bbox","bottomLeft","translate","topLeft","Crosshair","moveLine","lineEnd","getBox","dim","lineStart","pointCategoryIndex","axisLineBox","currentAxis","ChartContainer","shouldClip","_clipBox","chartsBox","clipRect","unclipLabels","stackRoot","charts","j","isStackRoot","Pane","paneID","createTitle","titleOptions","title","Title","buildTitle","appendAxis","appendAxisAt","splice","appendChart","empty","removeAxis","i$1","removeChart","pop","visualStyle","renderComplete","createGridLines","clipRoot","allAxes","vGridLines","hGridLines","gridLines","altAxis","refresh","clear","renderVisual","notifyRender","axisValueField","length$1","idx$1","axis$1","lineBox$1","service","getService","paneIndex","ID","appendIfNotNull","segmentVisible","pointVisibility","bindSegments","equalsIgnoreCase","a","b","toLowerCase","filterSeriesByType","types","getDateField","isDateAxis","axisOptions","sampleCategory","dateCategory","Date","singleItemOrArray","shrinkToFit","AREA_REGEX","test","hasValue$1","findNext","pointHasValue","outPoint","getter$$1","hasItem","createOutOfRangePoints","hasMinPoint","hasMaxPoint","minPoint","maxPoint","_outOfRangeMaxPoint","PlotAreaBase","initFields","initSeries","legend","crosshairs","originalOptions","createPanes","createCrosshairs","paneDefaults","paneOptions","panes","panesLength","currentPane","crosshairOptions","currentCrosshair","removeCrosshairs","hideCrosshairs","findPane","matchingPane","findPointPane","containsPoint","axisToRemove","filteredAxes","chartToRemove","filteredCharts","addToLegend","inactiveItems","inactiveItemsLabels","seriesVisible","visibleInLegend","itemLabelOptions","markerColor","active","groupAxes","xAxes","yAxes","paneIx","paneAxes","axisIx","any","groupSeriesByPane","seriesByPane","seriesPaneName","filterVisibleSeries","unpad","reflowPanes","detachLabels","reflowAxes","reflowCharts","redraw","panesArray","cleanGradients","crossingAxes","valuesToAdd","defaultValue","alignAxisTo","targetAxis","targetCrossingValue","slotEdge","targetEdge","axisBox","alignAxes","xAnchor","yAnchor","xAnchorCrossings","yAnchorCrossings","leftAnchors","rightAnchors","topAnchors","bottomAnchors","paneId","paneAnchor","anchorCrossings","_overlap","_mirrored","mirror","pane$1","paneId$1","visible$1","anchor$1","anchorCrossings$1","COORD_PRECISION","shrinkAxisWidth","axisGroupBox","overflowX","shrink","shrinkAxisHeight","shrinked","overflowY","fitAxes","offsetX","paneBox","offsetY","currentAxis$1","reflowPaneAxes","autoRotateAxisLabels","groupedAxes","rotated","allPaneAxes","autoRotateLabels","chartPane","remainingHeight","autoHeightPanes","percents","parseInt","currentPane$1","i$2","currentPane$2","backgroundBox","axesCount","axisA","axisB","chartsBoxes","boxes","addBackgroundPaths","multipath","paths","backgroundContainsPoint","isTransparent","bg","MultiPath","appendVisual","pointsByCategoryIndex","categoryIndex","pointsBySeriesIndex","seriesIndex","filterPoints","pointsBySeriesName","findPoint","paneByPoint","detachAxisGroupLabels","labelAxisCount","labelAxis","createLabelAxis","onAxis","END","START","edge","plotBands","isSingleAxis","some","reduce","acc","PlotAreaEventsMixin","_dispatchEvent","SeriesAggregator","defaultAggregates","seriesFields","_seriesFields","rootAggregate","aggregate","_series","_binder","fieldAggregate","canonicalName","aggregatePoints","srcPoints","_bindPoints","firstDataItem","dataItems","srcValues","_bindField","setValue","parentObj","split","shift","DefaultAggregates","aggregates","seriesType","RangeBar","fromOptions","toOptions","labelFrom","_createLabel","labelTo","RangeBarChart","plotLimits","RangeLinePoint","AUTO","DEFAULT_FROM_FORMAT","DEFAULT_TO_FORMAT","RangeAreaPoint","initLabelsFormat","fromPoint","toPoint","copyFields","fromBox","toBox","positionLabels","fromLabelPosition","toLabelPosition","RangeAreaSegment","toPoints","fromSegments","toPath","fromPath","SplineRangeAreaSegment","createCurveSegments","StepRangeAreaSegment","RangeAreaChart","segmentType","fromSlot","toSlot","OHLCPoint","oPoints","cPoints","lhPoints","oSlot","cSlot","OHLCChart","WaterfallSegment","WaterfallChart","createSegments","totalCategories","summary","prevPoint","AREA_SERIES","OUT_OF_RANGE_SERIES","CategoricalPlotArea","namedCategoryAxes","valueAxisRangeTracker","stack100","createCategoryAxes","aggregateCategories","createCategoryAxesLabels","createCharts","createValueAxes","paneSeries","visibleSeries","groups","groupSeriesByCategoryAxis","groupIx","createChartGroup","createAreaChart","createRangeAreaChart","createBarChart","createRangeBarChart","createBulletChart","createCandlestickChart","createBoxPlotChart","createOHLCChart","createWaterfallChart","createLineChart","srcSeries","processedSeries","_currentPointsCache","_seriesPointsCache","axisPane","dateAxis","categoryField","aggregateSeries","filterSeries","dataLength","_seriesMax","currentRangeIndices","outOfRangePoints","clearSeriesPointsCache","seriesSourcePoints","categoriesHash","srcCategories","srcData","getFn","mapCategories","totalIndex","aggregator","categoryItem","categoryIdx","totalCount","categoriesToAdd","defaultPaneName","paneName","stackableChartOptions","firstSeries","categoryAxes","unique","axisSeries","groupSeries","barChart","rangeColumnChart","bulletChart","lineChart","areaChart","rangeAreaChart","waterfallChart","axisRequiresRounding","categoryAxisName","categoryAxisIndex","centeredSeries","seriesAxis","aggregatedAxis","createLabels","definitions","isJustified","DateCategoryAxis","primaryAxis","tracker","defaultRange","baseOptions","roundToMajorUnit","defaultAxisRange","axisType","LogarithmicAxis","NumericAxis","eventType","_eventCoordinates","pointPane","updateAxisOptions","targetOptions","axesOptions","s","Highlight","_points","arrayPoints","toggleHighlight","hasHighlight","togglePointHighlight","toggleHandler","toggle","preventDefault","_defaultPrevented","isHighlighted","acceptKey","mouseKey","event","accept","ctrlKey","shiftKey","altKey","toChartAxisRanges","ranges","Pannable","_active","_panAxes","pan","delta","lock","updatedAxes","limitRange","ZoomSelection","createElement","marquee","_marquee","document","marqueeColor","appendChild","removeElement","parentNode","removeChild","setStyles","styles","zoomPane","_zoomPane","_elementOffset","_zoomPaneClipBox","pageX","pageY","chartElement","elementOffset","_selectionPosition","elementOffset$$1","selectionPosition","_updateAxisRanges","zoom","pointsRange","startLocation","location","MousewheelZoom","rate","updateRanges","zoomRange","LegendLayout","Layout","lineSpacing","orientation","alignItems","legendItem","clippedBBox","rectToBox","addVisual","LegendItem","createContainer","FloatElement","markerOptions","cursor","eventSink","_itemOverlay","widget","args","_legendItemHover","pointIndex","_unsetActivePoint","renderChildren","HORIZONTAL","POINTER","CUSTOM","Legend","createContainers","createLegendTitle","createItems","userAlign","hasTitle","itemsContainer","innerElement","hasItems","legendBox","containerCustomReflow","containerReflow","alignTarget","containerBox","createTitleLayout","appendTitleLayoutContent","layout","Boolean","PlotAreaFactory","_registry","registry","match","entry","ZOOM_ACCELERATION","SELECTOR_HEIGHT_ADJUST","createDiv","closestHandle","Selection","observer","_dateAxis","initOptions","offsetHeight","createElements","_index","onPane","wrapper","direction","selection","leftMask","rightMask","leftHandle","rightHandle","selectionStyles","leftHandleHeight","rightHandleHeight","borderLeftWidth","borderRightWidth","cssText","obj","mousewheel","_mousewheelHandler","_mousewheel","_domEvents","DomEventsBuilder","stopPropagation","_start","_move","_end","tap","_tap","press","_press","gesturestart","_gesturestart","gesturechange","_gesturechange","gestureend","_gestureend","clearTimeout","_mwTimeout","_state","_rangeEventArgs","_value","moveTarget","handle","addClass","oldRange","span","scale","removeClass","rightClick","which","mousewheelDelta","expand","setTimeout","p0","_toModelCoordinates","touches","p1","_slot","leftMaskWidth","rightMaskWidth","distance","fromValue","toValue","zDir","relative","minDelta","maxDelta","Tooltip","_current","SharedTooltip","tooltipPoints","_slotAnchor","_defaultAnchor","shared","categoryText","categoryFormat","centerPoint","slotCenter","BarChartAnimation","fromScale","abort","scaleX","scaleY","BubbleAnimation","easing","FadeInAnimation","fadeTo","PieAnimation","ScatterLineChart","missingValue","XYPlotArea","xAxisRangeTracker","yAxisRangeTracker","filteredSeries","createScatterChart","createScatterLineChart","createBubbleChart","createAxes","xAxisOptions","yAxisOptions","createXYAxis","inferredDate","namedAxes","isLog","typeSamples","seriesAxisName","firstPointValue","DateValueAxis","xAxesOptions","yAxesOptions","axisPane$1","xValues","yValues","currentValue","updateAxisOptions$1","PieSegment","sector","autoTextColor","themeLabels","theme","seriesDefaults","animationDelay","labelsOptions","labelsDistance","angle","middle","lp","labelHeight","labelWidth","startAngle","innerRadius","endAngle","createSegmentVisual","borderOptions","fallbackFill","userSpace","singleSegment","ShapeBuilder","createRing","midAndle","midPoint","tooltipAlignment","RAD_30","rad","RAD_60","radians","sine","sin","cosine","cos","DEFAULT_FONT","PieChartMixin","createLegendItem","legendOptions","pointVisible","legendItems","PIE_SECTOR_ANIM_DELAY","PieChart","seriesColors","colorsCount","anglePerValue","constantAngle","currentAngle","explode","Ring","evalSegmentOptions","segmentOptions","seriesConfigs","space","minWidth","halfMinWidth","defaultPadding","newBox","newBoxCenter","boxCenter","leftSideLabels","rightSideLabels","seriesConfig","setRadius","sort","labelComparator","leftLabelsReflow","rightLabelsReflow","distances","distanceBetweenLabels","distributeLabels","lr","firstBox","secondBox","remaining","_takeDistance","reflowLabels","amount","available","boxX","labelsCount","labelDistance","boxY","hAlignLabel","connectors","_connectorLines","connectorsColor","connectorLine","sr","crossing","intersection","pointInCircle","find","autoFit","pieCenter","bboxBottom","reverseValue","second","originalX","sector_center","cx","cy","t","a1","a2","b1","b2","uat","ub","ua","PiePlotArea","createPieChart","pieChart","DonutSegment","DONUT_SECTOR_ANIM_DELAY","DonutChart","holeSize","totalSize","seriesWithoutSize","currentSize","currentSeries$1","DonutPlotArea","createDonutChart","donutChart","DEFAULT_PADDING","PolarPlotAreaBase","createPolarAxis","createValueAxis","polarAxis","axisDefaultRange","valueAxisOptions","RadarLogarithmicAxis","RadarNumericAxis","valueAxisBox","heightDiff","PolarScatterChart","valueRadius","onCircle","PolarLineChart","SplinePolarAreaSegment","_polarAxisCenter","PolarAreaSegment","centerSegment","PolarAreaChart","_hasMissingValuesGap","xComparer","PolarPlotArea","PolarAxis","majorGridLines","minorGridLines","scatterChart","xValue","yValue","groupBySeriesIx","seriesSegments","RadarLineChart","isFirstDataPoint","isLastDataPoint","SplineRadarAreaSegment","RadarAreaSegment","RadarAreaChart","RadarSegment","RadarClusterLayout","slotAngle","slotSector","RadarStackLayout","childSector","RadarBarChart","RadarPlotArea","RadarCategoryAxis","_hasBarCharts","_isStacked100","chartOptions","FunnelSegment","chartBox","createPath","FunnelChart","labelPadding","dynamicSlopeReflow","totalHeight","firstSegment","maxSegment","lastUpperSide","previousOffset","previousHeight","nextSegment","nextPercentage","segmentSpacing","constantSlopeReflow","decreasingWidth","neckRatio","topMostWidth","finalNarrow","dynamicSlope","dynamicHeight","FunnelPlotArea","createFunnelChart","funnelChart","colorScale","minLightnessOffset","parseColor","hsl","toHSL","l","toCss","HeatmapPoint","labelColor","isRoundRect","ROUNDED_RECT","halfBorderWidth","borderRadius","HeatmapChart","setRange","indexX","indexY","xRange","yRange","ref$2","xIndex","yIndex","xIn","yIn","HeatmapPlotArea","bindCategories","createAxisLabels","xCategories","createHashSet","yCategories","has","add","createHeatmapChart","firstCategory","updateAxisOptions$2","COLOR","FIRST","FROM","MAX","MIN","NOTE_TEXT","SUMMARY_FIELD","TO","errorLow","errorHigh","AXIS_NAMES","MOUSEMOVE","CONTEXTMENU","MOUSELEAVE","MOUSEMOVE_DELAY","Chart","userOptions","themeOptions","observers","addObserver","ChartService","_initElement","_originalOptions","_theme","_initTheme","_initHandlers","_initSurface","FontLoader","preloadFonts","fontLoaded","_destroyed","_redraw","_attachEvents","_setElementClass","firstChild","seriesCopies","resolveAxisAliases","applyDefaults","applySeriesColors","getSize","chartArea","offsetWidth","resize","force","_size","hasSize","_resize","_selections","_destroySelections","_setupSelection","_noTransitionsRedraw","_model","findPaneByName","findPaneByIndex","filter","seriesName","categoryName","pointByCategoryName","togglePointsHighlight","_highlight","_sharedTooltip","_tooltip","hideTooltip","surface","_surfaceWrap","elementSize","renderAs","_destroySurface","Surface","_surfaceMouseenterHandler","_surfaceMouseleaveHandler","model","_getModel","_destroyView","traverse","draw","play","_createTooltip","_createPannable","_createZoomSelection","_createMousewheelZoom","triggerPaneRender","_navState","_cancelDomEvents","exportVisual","exportOptions","currentOptions","clearMissingValues","pannable","_pannable","zoomable","_zoomSelection","_mousewheelZoom","_toggleDragZoomEvents","allowDrag","requiresHandlers","allowZoom","_dragZoomEnabled","touchAction","_touchAction","_toggleDomEvents","drag","domEvents","toggleDrag","toggleZoom","_createSharedTooltip","applyAxisDefaults","applySeriesDefaults","colors","seriesColor","_createPlotArea","RootElement","_modelOptions","DEFAULT_WIDTH","DEFAULT_HEIGHT","skipSeries","selections","select","_selectStart","_select","_selectEnd","_clickHandler","_click","_mouseleaveHandler","_mouseleave","_mouseover","_mouseout","_mousemove","throttle","removeObserver","eventNames","_toDocumentCoordinates","isDefaultPrevented","obj$1","_shouldAttachMouseMove","_hoveredPoint","hovered","cancel","_stopChartHandlers","_gestureDistance","suspendTracking","_zooming","resumeTracking","mousewheelZoom","previousGestureDistance","scaleDelta","_drawingChartElement","leave","_startNavigation","_suppressHover","panning","ranges$1","translateRange","_endNavigation","_mousewheelZoomRate","prevented","totalDelta","scaleRange","chartEvent","_getChartElement","eventTarget","closest","coordinates","eventCoordinates","_elementPadding","_padding","clientX","clientY","inverseTransform","elementScale","invert","drawingElement","sharedTooltip","_startHover","_trackSharedTooltip","_propagateClick","handlingTap","activePoint","_activePoint","multipleSeries","hasInactiveOpacity","_hasInactiveOpacity","_updateHoveredPoint","_displayTooltip","_displayInactiveOpacity","_activeChartInstance","_updateSeriesOpacity","_applySeriesOpacity","highlightPoints","chartInstance","_chartInstanceFromPoint","inactivePoints","_getInactivePoints","_getInactiveOpacityForSeries","_getAllPointsOfType","constructor","hoveredPoint","resetOpacity","currSeries","defaultOpacity","_getDefaultOpacityForSeries","inactiveOpacity","activeSeries","hasDefaultInactiveOpacity","defaultInactiveOpacity","seriesInactiveOpacity","DEFAULT_SERIES_OPACITY","_mouseMoveTrackHandler","_mouseMoveTracking","seriesPoint","_trackCrosshairs","overPlotArea","_tooltipCategoryIx","_sharedHighlight","pointArgs","hoverArgs","hideElements","keepTooltipOpen","_deferRedraw","_clearRedrawTimeout","_redrawTimeout","clearInterval","autoBind","bindCategoryAxisFromSeries","seriesLength","uniqueCategories","HashMap","bindable","dataIx","dataRow","uniqueDates","dateComparer","transpose","_isBindable","transitionsState","updateMouseMoveHandler","applyOptions","setOptions","setDirection","setIntlService","noTransitionsRedraw","unbind","aliases","alias","axisDefaults","themeAxisDefaults","mapAxisOptions","axisColor","commonDefaults","themeSeriesDefaults","commonThemeDefaults","cleanupNestedSeriesDefaults","bar","column","rangeColumn","verticalLine","pie","donut","verticalArea","scatter","scatterLine","bubble","candlestick","ohlc","boxPlot","verticalBullet","polarArea","polarLine","radarArea","radarLine","waterfall","sortDates","dates","comparer","srcDates","rows","rowCount","rowIx","colCount","colIx","DATA_FIELDS","fieldValue","originalValue","nullValue","jQuery","895","896"],"mappings":"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","file":"js/chunk-vendors~5900dc55.6a499f8d.js","sourcesContent":["module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(894);\n\n\n/***/ }),\n\n/***/ 3:\n/***/ (function(module, exports) {\n\n\tmodule.exports = function() { throw new Error(\"define cannot be used indirect\"); };\r\n\n\n/***/ }),\n\n/***/ 890:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.dataviz.core\");\n\n/***/ }),\n\n/***/ 892:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.drawing\");\n\n/***/ }),\n\n/***/ 894:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/***********************************************************************\n\t * WARNING: this file is auto-generated. If you change it directly,\n\t * your modifications will eventually be lost. The source code is in\n\t * `kendo-charts` repository, you should make your changes there and\n\t * run `src-modules/sync.sh` in this repository.\n\t */\n\t(function(f, define){\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(895),\n\t __webpack_require__(896),\n\t __webpack_require__(892),\n\t __webpack_require__(890)\n\t ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t})(function(){\n\n\t(function ($) {\n\t/* jshint expr: true */\n\n\twindow.kendo.dataviz = window.kendo.dataviz || {};\n\tvar dataviz = kendo.dataviz;\n\tvar Class = dataviz.Class;\n\tvar isNumber = dataviz.isNumber;\n\tvar datavizConstants = dataviz.constants;\n\tvar MAX_VALUE = datavizConstants.MAX_VALUE;\n\tvar MIN_VALUE = datavizConstants.MIN_VALUE;\n\tvar VALUE = datavizConstants.VALUE;\n\tvar CENTER = datavizConstants.CENTER;\n\tvar TOP = datavizConstants.TOP;\n\tvar BOTTOM = datavizConstants.BOTTOM;\n\tvar LEFT = datavizConstants.LEFT;\n\tvar WHITE = datavizConstants.WHITE;\n\tvar CIRCLE = datavizConstants.CIRCLE;\n\tvar X = datavizConstants.X;\n\tvar Y = datavizConstants.Y;\n\tvar RIGHT = datavizConstants.RIGHT;\n\tvar BLACK = datavizConstants.BLACK;\n\tvar DATE = datavizConstants.DATE;\n\tvar DEFAULT_PRECISION = datavizConstants.DEFAULT_PRECISION;\n\tvar ARC = datavizConstants.ARC;\n\tvar defined = dataviz.defined;\n\tvar getter = dataviz.getter;\n\tvar isArray = dataviz.isArray;\n\tvar ChartElement = dataviz.ChartElement;\n\tvar Point = dataviz.Point;\n\tvar Box = dataviz.Box;\n\tvar alignPathToPixel = dataviz.alignPathToPixel;\n\tvar setDefaultOptions = dataviz.setDefaultOptions;\n\tvar inArray = dataviz.inArray;\n\tvar isFunction = dataviz.isFunction;\n\tvar valueOrDefault = dataviz.valueOrDefault;\n\tvar isObject = dataviz.isObject;\n\tvar deepExtend = dataviz.deepExtend;\n\tvar last = dataviz.last;\n\tvar eventElement = dataviz.eventElement;\n\tvar getTemplate = dataviz.getTemplate;\n\tvar TextBox = dataviz.TextBox;\n\tvar ShapeElement = dataviz.ShapeElement;\n\tvar getSpacing = dataviz.getSpacing;\n\tvar CurveProcessor = dataviz.CurveProcessor;\n\tvar append = dataviz.append;\n\tvar isString = dataviz.isString;\n\tvar parseDate = dataviz.parseDate;\n\tvar styleValue = dataviz.styleValue;\n\tvar CategoryAxis = dataviz.CategoryAxis;\n\tvar BoxElement = dataviz.BoxElement;\n\tvar round = dataviz.round;\n\tvar limitValue = dataviz.limitValue;\n\tvar grep = dataviz.grep;\n\tvar elementStyles = dataviz.elementStyles;\n\tvar hasClasses = dataviz.hasClasses;\n\tvar bindEvents = dataviz.bindEvents;\n\tvar services = dataviz.services;\n\tvar unbindEvents = dataviz.unbindEvents;\n\tvar support = kendo.support;\n\tvar drawing = kendo.drawing;\n\tvar Path = drawing.Path;\n\tvar Animation = drawing.Animation;\n\tvar AnimationFactory = drawing.AnimationFactory;\n\tvar Group = drawing.Group;\n\tvar Color = kendo.Color;\n\tvar geometry = kendo.geometry;\n\tvar GeometryPoint = geometry.Point;\n\tvar transform = geometry.transform;\n\n\tvar ChartAxis = Class.extend({\n\t init: function(axis) {\n\n\t this._axis = axis;\n\t this.options = axis.options;\n\t },\n\n\t value: function(point) {\n\t var axis = this._axis;\n\t var value = axis.getCategory ? axis.getCategory(point) : axis.getValue(point);\n\n\t return value;\n\t },\n\n\t slot: function(from, to, limit) {\n\t if (limit === void 0) { limit = true; }\n\n\t return this._axis.slot(from, to, limit);\n\t },\n\n\t range: function() {\n\t return this._axis.range();\n\t },\n\n\t valueRange: function() {\n\t return this._axis.valueRange();\n\t }\n\t});\n\n\tfunction findAxisByName(name, axes) {\n\t for (var idx = 0; idx < axes.length; idx++) {\n\t if (axes[idx].options.name === name) {\n\t axes[idx].prepareUserOptions();\n\t return new ChartAxis(axes[idx]);\n\t }\n\t }\n\t}\n\n\tvar ChartPane = kendo.Class.extend({\n\t init: function(pane) {\n\t this.visual = pane.visual;\n\t this.chartsVisual = pane.chartContainer.visual;\n\t this._pane = pane;\n\t },\n\n\t findAxisByName: function(name) {\n\t return findAxisByName(name, this._pane.axes);\n\t }\n\t});\n\n\tvar ChartPlotArea = Class.extend({\n\t init: function(plotArea) {\n\n\t this._plotArea = plotArea;\n\t this.visual = plotArea.visual;\n\t this.backgroundVisual = plotArea._bgVisual;\n\t }\n\t});\n\n\tfunction countNumbers(values) {\n\t var length = values.length;\n\t var count = 0;\n\n\t for (var i = 0; i < length; i++) {\n\t var num = values[i];\n\t if (isNumber(num)) {\n\t count++;\n\t }\n\t }\n\n\t return count;\n\t}\n\n\tvar Aggregates = {\n\t min: function(values) {\n\t var length = values.length;\n\t var min = MAX_VALUE;\n\n\t for (var i = 0; i < length; i++) {\n\t var value = values[i];\n\t if (isNumber(value)) {\n\t min = Math.min(min, value);\n\t }\n\t }\n\n\t return min === MAX_VALUE ? values[0] : min;\n\t },\n\n\t max: function(values) {\n\t var length = values.length;\n\t var max = MIN_VALUE;\n\n\t for (var i = 0; i < length; i++) {\n\t var value = values[i];\n\t if (isNumber(value)) {\n\t max = Math.max(max, value);\n\t }\n\t }\n\n\t return max === MIN_VALUE ? values[0] : max;\n\t },\n\n\t sum: function(values) {\n\t var length = values.length;\n\t var sum = 0;\n\n\t for (var i = 0; i < length; i++) {\n\t var value = values[i];\n\t if (isNumber(value)) {\n\t sum += value;\n\t }\n\t }\n\n\t return sum;\n\t },\n\n\t sumOrNull: function(values) {\n\t var result = null;\n\n\t if (countNumbers(values)) {\n\t result = Aggregates.sum(values);\n\t }\n\n\t return result;\n\t },\n\n\t count: function(values) {\n\t var length = values.length;\n\t var count = 0;\n\n\t for (var i = 0; i < length; i++) {\n\t var value = values[i];\n\t if (value !== null && defined(value)) {\n\t count++;\n\t }\n\t }\n\n\t return count;\n\t },\n\n\t avg: function(values) {\n\t var count = countNumbers(values);\n\t var result = values[0];\n\n\t if (count > 0) {\n\t result = Aggregates.sum(values) / count;\n\t }\n\n\t return result;\n\t },\n\n\t first: function(values) {\n\t var length = values.length;\n\n\t for (var i = 0; i < length; i++) {\n\t var value = values[i];\n\t if (value !== null && defined(value)) {\n\t return value;\n\t }\n\t }\n\n\t return values[0];\n\t }\n\t};\n\n\tfunction getField(field, row) {\n\t if (row === null) {\n\t return row;\n\t }\n\n\t var get = getter(field, true);\n\t return get(row);\n\t}\n\n\tvar SeriesBinder = Class.extend({\n\t init: function() {\n\n\t this._valueFields = {};\n\t this._otherFields = {};\n\t this._nullValue = {};\n\t this._undefinedValue = {};\n\t },\n\n\t register: function(seriesTypes, valueFields, otherFields) {\n\t var this$1 = this;\n\t if (valueFields === void 0) { valueFields = [ VALUE ]; }\n\t if (otherFields === void 0) { otherFields = {}; }\n\n\t for (var i = 0; i < seriesTypes.length; i++) {\n\t var type = seriesTypes[i];\n\n\t this$1._valueFields[type] = valueFields;\n\t this$1._otherFields[type] = otherFields;\n\t this$1._nullValue[type] = this$1._makeValue(valueFields, null);\n\t this$1._undefinedValue[type] = this$1._makeValue(valueFields, undefined);\n\t }\n\t },\n\n\t canonicalFields: function(series) {\n\t return this.valueFields(series).concat(this.otherFields(series));\n\t },\n\n\t valueFields: function(series) {\n\t return this._valueFields[series.type] || [ VALUE ];\n\t },\n\n\t otherFields: function(series) {\n\t return this._otherFields[series.type] || [ VALUE ];\n\t },\n\n\t bindPoint: function(series, pointIx, item) {\n\t var data = series.data;\n\t var pointData = defined(item) ? item : data[pointIx];\n\t var result = { valueFields: { value: pointData } };\n\t var valueFields = this.valueFields(series);\n\t var otherFields = this._otherFields[series.type];\n\t var fields, value;\n\n\t if (pointData === null) {\n\t value = this._nullValue[series.type];\n\t } else if (!defined(pointData)) {\n\t value = this._undefinedValue[series.type];\n\t } else if (Array.isArray(pointData)) {\n\t var fieldData = pointData.slice(valueFields.length);\n\t value = this._bindFromArray(pointData, valueFields);\n\t fields = this._bindFromArray(fieldData, otherFields);\n\t } else if (typeof pointData === \"object\") {\n\t var srcValueFields = this.sourceFields(series, valueFields);\n\t var srcPointFields = this.sourceFields(series, otherFields);\n\n\t value = this._bindFromObject(pointData, valueFields, srcValueFields);\n\t fields = this._bindFromObject(pointData, otherFields, srcPointFields);\n\t }\n\n\t if (defined(value)) {\n\t if (valueFields.length === 1) {\n\t result.valueFields.value = value[valueFields[0]];\n\t } else {\n\t result.valueFields = value;\n\t }\n\t }\n\n\t result.fields = fields || {};\n\n\t return result;\n\t },\n\n\t _makeValue: function(fields, initialValue) {\n\t var value = {};\n\t var length = fields.length;\n\n\t for (var i = 0; i < length; i++) {\n\t var fieldName = fields[i];\n\t value[fieldName] = initialValue;\n\t }\n\n\t return value;\n\t },\n\n\t _bindFromArray: function(array, fields) {\n\t var value = {};\n\n\t if (fields) {\n\t var length = Math.min(fields.length, array.length);\n\n\t for (var i = 0; i < length; i++) {\n\t value[fields[i]] = array[i];\n\t }\n\t }\n\n\t return value;\n\t },\n\n\t _bindFromObject: function(object, fields, srcFields) {\n\t if (srcFields === void 0) { srcFields = fields; }\n\n\t var value = {};\n\n\t if (fields) {\n\t var length = fields.length;\n\n\t for (var i = 0; i < length; i++) {\n\t var fieldName = fields[i];\n\t var srcFieldName = srcFields[i];\n\t if (srcFieldName !== null) {\n\t value[fieldName] = getField(srcFieldName, object);\n\t }\n\t }\n\t }\n\n\t return value;\n\t },\n\n\t sourceFields: function(series, canonicalFields) {\n\t var sourceFields = [];\n\n\t if (canonicalFields) {\n\t var length = canonicalFields.length;\n\n\t for (var i = 0; i < length; i++) {\n\t var fieldName = canonicalFields[i];\n\t var sourceFieldName = fieldName === VALUE ? \"field\" : fieldName + \"Field\";\n\n\t sourceFields.push(series[sourceFieldName] !== null ? (series[sourceFieldName] || fieldName) : null);\n\t }\n\t }\n\n\t return sourceFields;\n\t }\n\t});\n\n\tSeriesBinder.current = new SeriesBinder();\n\n\tvar STD_ERR = \"stderr\";\n\tvar STD_DEV = \"stddev\";\n\tvar percentRegex = /percent(?:\\w*)\\((\\d+)\\)/;\n\tvar standardDeviationRegex = new RegExp(\"^\" + STD_DEV + \"(?:\\\\((\\\\d+(?:\\\\.\\\\d+)?)\\\\))?$\");\n\n\tvar ErrorRangeCalculator = Class.extend({\n\t init: function(errorValue, series, field) {\n\n\t this.initGlobalRanges(errorValue, series, field);\n\t },\n\n\t initGlobalRanges: function(errorValue, series, field) {\n\t var data = series.data;\n\t var deviationMatch = standardDeviationRegex.exec(errorValue);\n\n\t if (deviationMatch) {\n\t this.valueGetter = this.createValueGetter(series, field);\n\n\t var average = this.getAverage(data);\n\t var deviation = this.getStandardDeviation(data, average, false);\n\t var multiple = deviationMatch[1] ? parseFloat(deviationMatch[1]) : 1;\n\t var errorRange = { low: average.value - deviation * multiple, high: average.value + deviation * multiple };\n\n\t this.globalRange = function() {\n\t return errorRange;\n\t };\n\t } else if (errorValue.indexOf && errorValue.indexOf(STD_ERR) >= 0) {\n\t this.valueGetter = this.createValueGetter(series, field);\n\t var standardError = this.getStandardError(data, this.getAverage(data));\n\n\t this.globalRange = function(value) {\n\t return { low: value - standardError, high: value + standardError };\n\t };\n\t }\n\t },\n\n\t createValueGetter: function(series, field) {\n\t var data = series.data;\n\t var binder = SeriesBinder.current;\n\t var valueFields = binder.valueFields(series);\n\t var item = defined(data[0]) ? data[0] : {};\n\t var valueGetter;\n\n\t if (isArray(item)) {\n\t var index = field ? valueFields.indexOf(field) : 0;\n\t valueGetter = getter(\"[\" + index + \"]\");\n\t } else if (isNumber(item)) {\n\t valueGetter = getter();\n\t } else if (typeof item === datavizConstants.OBJECT) {\n\t var srcValueFields = binder.sourceFields(series, valueFields);\n\t valueGetter = getter(srcValueFields[valueFields.indexOf(field)]);\n\t }\n\n\t return valueGetter;\n\t },\n\n\t getErrorRange: function(pointValue, errorValue) {\n\t var low, high, value;\n\n\t if (!defined(errorValue)) {\n\t return null;\n\t }\n\n\t if (this.globalRange) {\n\t return this.globalRange(pointValue);\n\t }\n\n\t if (isArray(errorValue)) {\n\t low = pointValue - errorValue[0];\n\t high = pointValue + errorValue[1];\n\t } else if (isNumber(value = parseFloat(errorValue))) {\n\t low = pointValue - value;\n\t high = pointValue + value;\n\t } else if ((value = percentRegex.exec(errorValue))) {\n\t var percentValue = pointValue * (parseFloat(value[1]) / 100);\n\t low = pointValue - Math.abs(percentValue);\n\t high = pointValue + Math.abs(percentValue);\n\t } else {\n\t throw new Error(\"Invalid ErrorBar value: \" + errorValue);\n\t }\n\n\t return { low: low, high: high };\n\t },\n\n\t getStandardError: function(data, average) {\n\t return this.getStandardDeviation(data, average, true) / Math.sqrt(average.count);\n\t },\n\n\t getStandardDeviation: function(data, average, isSample) {\n\t var this$1 = this;\n\n\t var length = data.length;\n\t var total = isSample ? average.count - 1 : average.count;\n\t var squareDifferenceSum = 0;\n\n\t for (var idx = 0; idx < length; idx++) {\n\t var value = this$1.valueGetter(data[idx]);\n\t if (isNumber(value)) {\n\t squareDifferenceSum += Math.pow(value - average.value, 2);\n\t }\n\t }\n\n\t return Math.sqrt(squareDifferenceSum / total);\n\t },\n\n\t getAverage: function(data) {\n\t var this$1 = this;\n\n\t var length = data.length;\n\t var sum = 0;\n\t var count = 0;\n\n\t for (var idx = 0; idx < length; idx++) {\n\t var value = this$1.valueGetter(data[idx]);\n\t if (isNumber(value)) {\n\t sum += value;\n\t count++;\n\t }\n\t }\n\n\t return {\n\t value: sum / count,\n\t count: count\n\t };\n\t }\n\t});\n\n\tvar browser = support.browser || {};\n\n\tvar INITIAL_ANIMATION_DURATION = 600;\n\tvar FADEIN = \"fadeIn\";\n\n\tvar GLASS = \"glass\";\n\tvar BORDER_BRIGHTNESS = 0.8;\n\tvar TOOLTIP_OFFSET = 5;\n\tvar START_SCALE = browser.msie ? 0.001 : 0;\n\tvar ERROR_LOW_FIELD = \"errorLow\";\n\tvar ERROR_HIGH_FIELD = \"errorHigh\";\n\tvar X_ERROR_LOW_FIELD = \"xErrorLow\";\n\tvar X_ERROR_HIGH_FIELD = \"xErrorHigh\";\n\tvar Y_ERROR_LOW_FIELD = \"yErrorLow\";\n\tvar Y_ERROR_HIGH_FIELD = \"yErrorHigh\";\n\tvar LINE_MARKER_SIZE = 8;\n\tvar ZERO = \"zero\";\n\tvar INTERPOLATE = \"interpolate\";\n\tvar GAP = \"gap\";\n\tvar ABOVE = \"above\";\n\tvar BELOW = \"below\";\n\n\tvar SMOOTH = \"smooth\";\n\tvar STEP = \"step\";\n\n\tvar AREA = \"area\";\n\tvar BAR = \"bar\";\n\tvar BOX_PLOT = \"boxPlot\";\n\tvar BUBBLE = \"bubble\";\n\tvar BULLET = \"bullet\";\n\tvar CANDLESTICK = \"candlestick\";\n\tvar COLUMN = \"column\";\n\tvar DONUT = \"donut\";\n\tvar FUNNEL = \"funnel\";\n\tvar HEATMAP = \"heatmap\";\n\tvar HORIZONTAL_WATERFALL = \"horizontalWaterfall\";\n\tvar LINE = \"line\";\n\tvar OHLC = \"ohlc\";\n\tvar PIE = \"pie\";\n\tvar POLAR_AREA = \"polarArea\";\n\tvar POLAR_LINE = \"polarLine\";\n\tvar POLAR_SCATTER = \"polarScatter\";\n\tvar RADAR_AREA = \"radarArea\";\n\tvar RADAR_COLUMN = \"radarColumn\";\n\tvar RADAR_LINE = \"radarLine\";\n\tvar RANGE_AREA = \"rangeArea\";\n\tvar RANGE_BAR = \"rangeBar\";\n\tvar RANGE_COLUMN = \"rangeColumn\";\n\tvar SCATTER = \"scatter\";\n\tvar SCATTER_LINE = \"scatterLine\";\n\tvar VERTICAL_AREA = \"verticalArea\";\n\tvar VERTICAL_BOX_PLOT = \"verticalBoxPlot\";\n\tvar VERTICAL_BULLET = \"verticalBullet\";\n\tvar VERTICAL_LINE = \"verticalLine\";\n\tvar VERTICAL_RANGE_AREA = \"verticalRangeArea\";\n\tvar WATERFALL = \"waterfall\";\n\tvar EQUALLY_SPACED_SERIES = [\n\t BAR, COLUMN, OHLC, CANDLESTICK, BOX_PLOT, VERTICAL_BOX_PLOT,\n\t BULLET, RANGE_COLUMN, RANGE_BAR, WATERFALL, HORIZONTAL_WATERFALL\n\t];\n\n\tvar LEGEND_ITEM_CLICK = \"legendItemClick\";\n\tvar LEGEND_ITEM_HOVER = \"legendItemHover\";\n\tvar LEGEND_ITEM_LEAVE = \"legendItemLeave\";\n\tvar SERIES_CLICK = \"seriesClick\";\n\tvar SERIES_HOVER = \"seriesHover\";\n\tvar SERIES_OVER = \"seriesOver\";\n\tvar SERIES_LEAVE = \"seriesLeave\";\n\tvar PLOT_AREA_CLICK = \"plotAreaClick\";\n\tvar PLOT_AREA_HOVER = \"plotAreaHover\";\n\tvar PLOT_AREA_LEAVE = \"plotAreaLeave\";\n\tvar DRAG = \"drag\";\n\tvar DRAG_END = \"dragEnd\";\n\tvar DRAG_START = \"dragStart\";\n\tvar ZOOM_START = \"zoomStart\";\n\tvar ZOOM = \"zoom\";\n\tvar ZOOM_END = \"zoomEnd\";\n\tvar SELECT_START = \"selectStart\";\n\tvar SELECT = \"select\";\n\tvar SELECT_END = \"selectEnd\";\n\tvar RENDER = \"render\";\n\tvar SHOW_TOOLTIP = \"showTooltip\";\n\tvar HIDE_TOOLTIP = \"hideTooltip\";\n\tvar PANE_RENDER = \"paneRender\";\n\n\tvar LOGARITHMIC = \"log\";\n\tvar CATEGORY = \"category\";\n\n\tvar INSIDE_END = \"insideEnd\";\n\tvar INSIDE_BASE = \"insideBase\";\n\tvar OUTSIDE_END = \"outsideEnd\";\n\n\tvar MOUSEWHEEL = \"DOMMouseScroll mousewheel\";\n\tvar MOUSEWHEEL_DELAY = 150;\n\tvar MOUSEWHEEL_ZOOM_RATE = 0.3;\n\n\tvar constants = {\n\t\tINITIAL_ANIMATION_DURATION: INITIAL_ANIMATION_DURATION,\n\t\tFADEIN: FADEIN,\n\t\tLEGEND_ITEM_CLICK: LEGEND_ITEM_CLICK,\n\t\tLEGEND_ITEM_HOVER: LEGEND_ITEM_HOVER,\n\t\tLEGEND_ITEM_LEAVE: LEGEND_ITEM_LEAVE,\n\t\tSERIES_CLICK: SERIES_CLICK,\n\t\tSERIES_HOVER: SERIES_HOVER,\n\t\tSERIES_OVER: SERIES_OVER,\n\t\tSERIES_LEAVE: SERIES_LEAVE,\n\t\tGLASS: GLASS,\n\t\tBORDER_BRIGHTNESS: BORDER_BRIGHTNESS,\n\t\tTOOLTIP_OFFSET: TOOLTIP_OFFSET,\n\t\tSTART_SCALE: START_SCALE,\n\t\tERROR_LOW_FIELD: ERROR_LOW_FIELD,\n\t\tERROR_HIGH_FIELD: ERROR_HIGH_FIELD,\n\t\tX_ERROR_LOW_FIELD: X_ERROR_LOW_FIELD,\n\t\tX_ERROR_HIGH_FIELD: X_ERROR_HIGH_FIELD,\n\t\tY_ERROR_LOW_FIELD: Y_ERROR_LOW_FIELD,\n\t\tY_ERROR_HIGH_FIELD: Y_ERROR_HIGH_FIELD,\n\t\tLINE_MARKER_SIZE: LINE_MARKER_SIZE,\n\t\tINTERPOLATE: INTERPOLATE,\n\t\tZERO: ZERO,\n\t\tSMOOTH: SMOOTH,\n\t\tSTEP: STEP,\n\t\tCATEGORY: CATEGORY,\n\t\tFUNNEL: FUNNEL,\n\t\tBAR: BAR,\n\t\tCANDLESTICK: CANDLESTICK,\n\t\tPIE: PIE,\n\t\tCOLUMN: COLUMN,\n\t\tAREA: AREA,\n\t\tVERTICAL_BULLET: VERTICAL_BULLET,\n\t\tBOX_PLOT: BOX_PLOT,\n\t\tOHLC: OHLC,\n\t\tWATERFALL: WATERFALL,\n\t\tLINE: LINE,\n\t\tBULLET: BULLET,\n\t\tVERTICAL_LINE: VERTICAL_LINE,\n\t\tVERTICAL_AREA: VERTICAL_AREA,\n\t\tRANGE_AREA: RANGE_AREA,\n\t\tVERTICAL_RANGE_AREA: VERTICAL_RANGE_AREA,\n\t\tRANGE_COLUMN: RANGE_COLUMN,\n\t\tVERTICAL_BOX_PLOT: VERTICAL_BOX_PLOT,\n\t\tRANGE_BAR: RANGE_BAR,\n\t\tHORIZONTAL_WATERFALL: HORIZONTAL_WATERFALL,\n\t\tSCATTER: SCATTER,\n\t\tSCATTER_LINE: SCATTER_LINE,\n\t\tBUBBLE: BUBBLE,\n\t\tRADAR_AREA: RADAR_AREA,\n\t\tRADAR_LINE: RADAR_LINE,\n\t\tRADAR_COLUMN: RADAR_COLUMN,\n\t\tPOLAR_LINE: POLAR_LINE,\n\t\tPOLAR_AREA: POLAR_AREA,\n\t\tPOLAR_SCATTER: POLAR_SCATTER,\n\t\tRENDER: RENDER,\n\t\tPLOT_AREA_CLICK: PLOT_AREA_CLICK,\n\t\tPLOT_AREA_HOVER: PLOT_AREA_HOVER,\n\t\tPLOT_AREA_LEAVE: PLOT_AREA_LEAVE,\n\t\tLOGARITHMIC: LOGARITHMIC,\n\t\tDRAG: DRAG,\n\t\tDRAG_START: DRAG_START,\n\t\tDRAG_END: DRAG_END,\n\t\tZOOM_START: ZOOM_START,\n\t\tZOOM: ZOOM,\n\t\tZOOM_END: ZOOM_END,\n\t\tSELECT_START: SELECT_START,\n\t\tSELECT: SELECT,\n\t\tSELECT_END: SELECT_END,\n\t\tPANE_RENDER: PANE_RENDER,\n\t\tGAP: GAP,\n\t\tDONUT: DONUT,\n\t\tINSIDE_END: INSIDE_END,\n\t\tINSIDE_BASE: INSIDE_BASE,\n\t\tOUTSIDE_END: OUTSIDE_END,\n\t\tMOUSEWHEEL: MOUSEWHEEL,\n\t\tMOUSEWHEEL_DELAY: MOUSEWHEEL_DELAY,\n\t\tMOUSEWHEEL_ZOOM_RATE: MOUSEWHEEL_ZOOM_RATE,\n\t\tSHOW_TOOLTIP: SHOW_TOOLTIP,\n\t\tHIDE_TOOLTIP: HIDE_TOOLTIP,\n\t\tEQUALLY_SPACED_SERIES: EQUALLY_SPACED_SERIES,\n\t\tABOVE: ABOVE,\n\t\tBELOW: BELOW,\n\t\tHEATMAP: HEATMAP\n\t};\n\n\tvar DEFAULT_ERROR_BAR_WIDTH = 4;\n\n\tvar ErrorBarBase = ChartElement.extend({\n\t init: function(low, high, isVertical, chart, series, options) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.low = low;\n\t this.high = high;\n\t this.isVertical = isVertical;\n\t this.chart = chart;\n\t this.series = series;\n\t },\n\n\t reflow: function(targetBox) {\n\t var endCaps = this.options.endCaps;\n\t var isVertical = this.isVertical;\n\t var axis = this.getAxis();\n\t var valueBox = axis.getSlot(this.low, this.high);\n\t var centerBox = targetBox.center();\n\t var capsWidth = this.getCapsWidth(targetBox, isVertical);\n\t var capValue = isVertical ? centerBox.x : centerBox.y;\n\t var capStart = capValue - capsWidth;\n\t var capEnd = capValue + capsWidth;\n\t var linePoints;\n\n\t if (isVertical) {\n\t linePoints = [\n\t new Point(centerBox.x, valueBox.y1),\n\t new Point(centerBox.x, valueBox.y2)\n\t ];\n\t if (endCaps) {\n\t linePoints.push(new Point(capStart, valueBox.y1),\n\t new Point(capEnd, valueBox.y1),\n\t new Point(capStart, valueBox.y2),\n\t new Point(capEnd, valueBox.y2));\n\t }\n\t this.box = new Box(capStart, valueBox.y1, capEnd, valueBox.y2);\n\t } else {\n\t linePoints = [\n\t new Point(valueBox.x1, centerBox.y),\n\t new Point(valueBox.x2, centerBox.y)\n\t ];\n\t if (endCaps) {\n\t linePoints.push(new Point(valueBox.x1, capStart),\n\t new Point(valueBox.x1, capEnd),\n\t new Point(valueBox.x2, capStart),\n\t new Point(valueBox.x2, capEnd));\n\t }\n\t this.box = new Box(valueBox.x1, capStart, valueBox.x2, capEnd);\n\t }\n\n\t this.linePoints = linePoints;\n\t },\n\n\t getCapsWidth: function(box, isVertical) {\n\t var boxSize = isVertical ? box.width() : box.height();\n\t var capsWidth = Math.min(Math.floor(boxSize / 2), DEFAULT_ERROR_BAR_WIDTH) || DEFAULT_ERROR_BAR_WIDTH;\n\n\t return capsWidth;\n\t },\n\n\t createVisual: function() {\n\t var this$1 = this;\n\n\t var options = this.options;\n\t var visual = options.visual;\n\n\t if (visual) {\n\t this.visual = visual({\n\t low: this.low,\n\t high: this.high,\n\t rect: this.box.toRect(),\n\t sender: this.getSender(),\n\t options: {\n\t endCaps: options.endCaps,\n\t color: options.color,\n\t line: options.line\n\t },\n\t createVisual: function () {\n\t this$1.createDefaultVisual();\n\t var defaultVisual = this$1.visual;\n\t delete this$1.visual;\n\t return defaultVisual;\n\t }\n\t });\n\t } else {\n\t this.createDefaultVisual();\n\t }\n\t },\n\n\t createDefaultVisual: function() {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var options = ref.options;\n\t var linePoints = ref.linePoints;\n\t var lineOptions = {\n\t stroke: {\n\t color: options.color,\n\t width: options.line.width,\n\t dashType: options.line.dashType\n\t }\n\t };\n\n\t ChartElement.fn.createVisual.call(this);\n\n\t for (var idx = 0; idx < linePoints.length; idx += 2) {\n\t var line = new Path(lineOptions)\n\t .moveTo(linePoints[idx].x, linePoints[idx].y)\n\t .lineTo(linePoints[idx + 1].x, linePoints[idx + 1].y);\n\n\t alignPathToPixel(line);\n\t this$1.visual.append(line);\n\t }\n\t }\n\t});\n\n\tsetDefaultOptions(ErrorBarBase, {\n\t animation: {\n\t type: FADEIN,\n\t delay: INITIAL_ANIMATION_DURATION\n\t },\n\t endCaps: true,\n\t line: {\n\t width: 2\n\t },\n\t zIndex: 1\n\t});\n\n\tvar CategoricalErrorBar = ErrorBarBase.extend({\n\t getAxis: function() {\n\t var axis = this.chart.seriesValueAxis(this.series);\n\n\t return axis;\n\t }\n\t});\n\n\tvar MAX_EXPAND_DEPTH = 5;\n\n\tfunction evalOptions(options, context, state, dryRun) {\n\t if (state === void 0) { state = {}; }\n\t if (dryRun === void 0) { dryRun = false; }\n\n\t var defaults = state.defaults = state.defaults || {};\n\t var depth = state.depth = state.depth || 0;\n\t var needsEval = false;\n\n\t state.excluded = state.excluded || [];\n\n\t if (depth > MAX_EXPAND_DEPTH) {\n\t return null;\n\t }\n\n\t for (var property in options) {\n\t if (!inArray(property, state.excluded) && options.hasOwnProperty(property)) {\n\t var propValue = options[property];\n\t if (isFunction(propValue)) {\n\t needsEval = true;\n\t if (!dryRun) {\n\t options[property] = valueOrDefault(propValue(context), defaults[property]);\n\t }\n\t } else if (isObject(propValue)) {\n\t if (!dryRun) {\n\t state.defaults = defaults[property];\n\t }\n\t state.depth++;\n\t needsEval = evalOptions(propValue, context, state, dryRun) || needsEval;\n\t state.depth--;\n\t }\n\t }\n\t }\n\n\t return needsEval;\n\t}\n\n\tfunction categoriesCount(series) {\n\t var seriesCount = series.length;\n\t var categories = 0;\n\n\t for (var i = 0; i < seriesCount; i++) {\n\t categories = Math.max(categories, series[i].data.length);\n\t }\n\n\t return categories;\n\t}\n\n\tvar CategoricalChart = ChartElement.extend({\n\t init: function(plotArea, options) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.plotArea = plotArea;\n\t this.chartService = plotArea.chartService;\n\t this.categoryAxis = plotArea.seriesCategoryAxis(options.series[0]);\n\n\t // Value axis ranges grouped by axis name, e.g.:\n\t // primary: { min: 0, max: 1 }\n\t this.valueAxisRanges = {};\n\n\t this.points = [];\n\t this.categoryPoints = [];\n\t this.seriesPoints = [];\n\t this.seriesOptions = [];\n\t this._evalSeries = [];\n\n\t this.render();\n\t },\n\n\t render: function() {\n\t this.traverseDataPoints(this.addValue.bind(this));\n\t },\n\n\t pointOptions: function(series, seriesIx) {\n\t var options = this.seriesOptions[seriesIx];\n\t if (!options) {\n\t var defaults = this.pointType().prototype.defaults;\n\t this.seriesOptions[seriesIx] = options = deepExtend({ }, defaults, {\n\t vertical: !this.options.invertAxes\n\t }, series);\n\t }\n\n\t return options;\n\t },\n\n\t plotValue: function(point) {\n\t if (!point) {\n\t return 0;\n\t }\n\n\t if (this.options.isStacked100 && isNumber(point.value)) {\n\t var categoryIx = point.categoryIx;\n\t var categoryPoints = this.categoryPoints[categoryIx];\n\t var otherValues = [];\n\t var categorySum = 0;\n\n\t for (var i = 0; i < categoryPoints.length; i++) {\n\t var other = categoryPoints[i];\n\t if (other) {\n\t var stack = point.series.stack;\n\t var otherStack = other.series.stack;\n\n\t if ((stack && otherStack) && stack.group !== otherStack.group) {\n\t continue;\n\t }\n\n\t if (isNumber(other.value)) {\n\t categorySum += Math.abs(other.value);\n\t otherValues.push(Math.abs(other.value));\n\t }\n\t }\n\t }\n\n\t if (categorySum > 0) {\n\t return point.value / categorySum;\n\t }\n\t }\n\n\t return point.value;\n\t },\n\n\t plotRange: function(point, startValue) {\n\t var this$1 = this;\n\t if (startValue === void 0) { startValue = 0; }\n\n\t var categoryPoints = this.categoryPoints[point.categoryIx];\n\n\t if (this.options.isStacked) {\n\t var plotValue = this.plotValue(point);\n\t var positive = plotValue >= 0;\n\t var prevValue = startValue;\n\t var isStackedBar = false;\n\n\t for (var i = 0; i < categoryPoints.length; i++) {\n\t var other = categoryPoints[i];\n\n\t if (point === other) {\n\t break;\n\t }\n\n\t var stack = point.series.stack;\n\t var otherStack = other.series.stack;\n\t if (stack && otherStack) {\n\t if (typeof stack === datavizConstants.STRING && stack !== otherStack) {\n\t continue;\n\t }\n\n\t if (stack.group && stack.group !== otherStack.group) {\n\t continue;\n\t }\n\t }\n\n\t var otherValue = this$1.plotValue(other);\n\t if ((otherValue >= 0 && positive) ||\n\t (otherValue < 0 && !positive)) {\n\t prevValue += otherValue;\n\t plotValue += otherValue;\n\t isStackedBar = true;\n\n\t if (this$1.options.isStacked100) {\n\t plotValue = Math.min(plotValue, 1);\n\t }\n\t }\n\t }\n\n\t if (isStackedBar) {\n\t prevValue -= startValue;\n\t }\n\n\t return [ prevValue, plotValue ];\n\t }\n\n\t var series = point.series;\n\t var valueAxis = this.seriesValueAxis(series);\n\t var axisCrossingValue = this.categoryAxisCrossingValue(valueAxis);\n\n\t return [ axisCrossingValue, dataviz.convertableToNumber(point.value) ? point.value : axisCrossingValue ];\n\t },\n\n\t stackLimits: function(axisName, stackName) {\n\t var this$1 = this;\n\n\t var min = MAX_VALUE;\n\t var max = MIN_VALUE;\n\n\t for (var i = 0; i < this.categoryPoints.length; i++) {\n\t var categoryPoints = this$1.categoryPoints[i];\n\t if (!categoryPoints) {\n\t continue;\n\t }\n\n\t for (var pIx = 0; pIx < categoryPoints.length; pIx++) {\n\t var point = categoryPoints[pIx];\n\t if (point) {\n\t if (point.series.stack === stackName || point.series.axis === axisName) {\n\t var to = this$1.plotRange(point, 0)[1];\n\t if (defined(to) && isFinite(to)) {\n\t max = Math.max(max, to);\n\t min = Math.min(min, to);\n\t }\n\t }\n\t }\n\t }\n\t }\n\n\t return { min: min, max: max };\n\t },\n\n\t updateStackRange: function() {\n\t var this$1 = this;\n\n\t var ref = this.options;\n\t var isStacked = ref.isStacked;\n\t var chartSeries = ref.series;\n\t var limitsCache = {};\n\n\t if (isStacked) {\n\t for (var i = 0; i < chartSeries.length; i++) {\n\t var series = chartSeries[i];\n\t var axisName = series.axis;\n\t var key = axisName + series.stack;\n\n\t var limits = limitsCache[key];\n\t if (!limits) {\n\t limits = this$1.stackLimits(axisName, series.stack);\n\n\t var errorTotals = this$1.errorTotals;\n\t if (errorTotals) {\n\t if (errorTotals.negative.length) {\n\t limits.min = Math.min(limits.min, dataviz.sparseArrayLimits(errorTotals.negative).min);\n\t }\n\t if (errorTotals.positive.length) {\n\t limits.max = Math.max(limits.max, dataviz.sparseArrayLimits(errorTotals.positive).max);\n\t }\n\t }\n\n\t if (limits.min !== MAX_VALUE || limits.max !== MIN_VALUE) {\n\t limitsCache[key] = limits;\n\t } else {\n\t limits = null;\n\t }\n\t }\n\n\t if (limits) {\n\t this$1.valueAxisRanges[axisName] = limits;\n\t }\n\t }\n\t }\n\t },\n\n\t addErrorBar: function(point, data, categoryIx) {\n\t var value = point.value;\n\t var series = point.series;\n\t var seriesIx = point.seriesIx;\n\t var errorBars = point.options.errorBars;\n\t var lowValue = data.fields[ERROR_LOW_FIELD];\n\t var highValue = data.fields[ERROR_HIGH_FIELD];\n\t var errorRange;\n\n\t if (isNumber(lowValue) && isNumber(highValue)) {\n\t errorRange = { low: lowValue, high: highValue };\n\t } else if (errorBars && defined(errorBars.value)) {\n\t this.seriesErrorRanges = this.seriesErrorRanges || [];\n\t this.seriesErrorRanges[seriesIx] = this.seriesErrorRanges[seriesIx] ||\n\t new ErrorRangeCalculator(errorBars.value, series, VALUE);\n\n\t errorRange = this.seriesErrorRanges[seriesIx].getErrorRange(value, errorBars.value);\n\t }\n\n\t if (errorRange) {\n\t point.low = errorRange.low;\n\t point.high = errorRange.high;\n\t this.addPointErrorBar(point, categoryIx);\n\t }\n\t },\n\n\t addPointErrorBar: function(point, categoryIx) {\n\t var isVertical = !this.options.invertAxes;\n\t var options = point.options.errorBars;\n\t var series = point.series;\n\t var low = point.low;\n\t var high = point.high;\n\n\t if (this.options.isStacked) {\n\t var stackedErrorRange = this.stackedErrorRange(point, categoryIx);\n\t low = stackedErrorRange.low;\n\t high = stackedErrorRange.high;\n\t } else {\n\t var fields = { categoryIx: categoryIx, series: series };\n\t this.updateRange({ value: low }, fields);\n\t this.updateRange({ value: high }, fields);\n\t }\n\n\t var errorBar = new CategoricalErrorBar(low, high, isVertical, this, series, options);\n\t point.errorBars = [ errorBar ];\n\t point.append(errorBar);\n\t },\n\n\t stackedErrorRange: function(point, categoryIx) {\n\t var plotValue = this.plotRange(point, 0)[1] - point.value;\n\t var low = point.low + plotValue;\n\t var high = point.high + plotValue;\n\n\t this.errorTotals = this.errorTotals || { positive: [], negative: [] };\n\n\t if (low < 0) {\n\t this.errorTotals.negative[categoryIx] = Math.min(this.errorTotals.negative[categoryIx] || 0, low);\n\t }\n\n\t if (high > 0) {\n\t this.errorTotals.positive[categoryIx] = Math.max(this.errorTotals.positive[categoryIx] || 0, high);\n\t }\n\n\t return { low: low, high: high };\n\t },\n\n\t addValue: function(data, fields) {\n\t var categoryIx = fields.categoryIx;\n\t var series = fields.series;\n\t var seriesIx = fields.seriesIx;\n\n\t var categoryPoints = this.categoryPoints[categoryIx];\n\t if (!categoryPoints) {\n\t this.categoryPoints[categoryIx] = categoryPoints = [];\n\t }\n\n\t var seriesPoints = this.seriesPoints[seriesIx];\n\t if (!seriesPoints) {\n\t this.seriesPoints[seriesIx] = seriesPoints = [];\n\t }\n\n\t var point = this.createPoint(data, fields);\n\t if (point) {\n\t $.extend(point, fields);\n\n\t point.owner = this;\n\t point.noteText = data.fields.noteText;\n\t if (!defined(point.dataItem)) {\n\t point.dataItem = series.data[categoryIx];\n\t }\n\t this.addErrorBar(point, data, categoryIx);\n\t }\n\n\t this.points.push(point);\n\t seriesPoints.push(point);\n\t categoryPoints.push(point);\n\n\t this.updateRange(data.valueFields, fields);\n\t },\n\n\t evalPointOptions: function(options, value, category, categoryIx, series, seriesIx) {\n\t var state = { defaults: series._defaults, excluded: [ \"data\", \"aggregate\", \"_events\", \"tooltip\", \"content\", \"template\", \"visual\", \"toggle\", \"_outOfRangeMinPoint\", \"_outOfRangeMaxPoint\" ] };\n\n\t var doEval = this._evalSeries[seriesIx];\n\t if (!defined(doEval)) {\n\t this._evalSeries[seriesIx] = doEval = evalOptions(options, {}, state, true);\n\t }\n\n\t var pointOptions = options;\n\t if (doEval) {\n\t pointOptions = deepExtend({}, pointOptions);\n\t evalOptions(pointOptions, {\n\t value: value,\n\t category: category,\n\t index: categoryIx,\n\t series: series,\n\t dataItem: series.data[categoryIx]\n\t }, state);\n\t }\n\n\t return pointOptions;\n\t },\n\n\t updateRange: function(data, fields) {\n\t var axisName = fields.series.axis;\n\t var value = data.value;\n\t var axisRange = this.valueAxisRanges[axisName];\n\n\t if (isFinite(value) && value !== null) {\n\t axisRange = this.valueAxisRanges[axisName] =\n\t axisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n\t axisRange.min = Math.min(axisRange.min, value);\n\t axisRange.max = Math.max(axisRange.max, value);\n\t }\n\t },\n\n\t seriesValueAxis: function(series) {\n\t var plotArea = this.plotArea;\n\t var axisName = series.axis;\n\t var axis = axisName ? plotArea.namedValueAxes[axisName] : plotArea.valueAxis;\n\n\t if (!axis) {\n\t throw new Error(\"Unable to locate value axis with name \" + axisName);\n\t }\n\n\t return axis;\n\t },\n\n\t reflow: function(targetBox) {\n\t var this$1 = this;\n\n\t var categorySlots = this.categorySlots = [];\n\t var chartPoints = this.points;\n\t var categoryAxis = this.categoryAxis;\n\t var pointIx = 0;\n\n\t this.traverseDataPoints(function (data, fields) {\n\t var categoryIx = fields.categoryIx;\n\t var currentSeries = fields.series;\n\n\t var valueAxis = this$1.seriesValueAxis(currentSeries);\n\t var point = chartPoints[pointIx++];\n\n\t var categorySlot = categorySlots[categoryIx];\n\t if (!categorySlot) {\n\t categorySlots[categoryIx] = categorySlot =\n\t this$1.categorySlot(categoryAxis, categoryIx, valueAxis);\n\t }\n\n\t if (point) {\n\t var plotRange = this$1.plotRange(point, valueAxis.startValue());\n\t var valueSlot = this$1.valueSlot(valueAxis, plotRange);\n\t if (valueSlot) {\n\t var pointSlot = this$1.pointSlot(categorySlot, valueSlot);\n\n\t point.aboveAxis = this$1.aboveAxis(point, valueAxis);\n\t point.stackValue = plotRange[1];\n\n\t if (this$1.options.isStacked100) {\n\t point.percentage = this$1.plotValue(point);\n\t }\n\n\t this$1.reflowPoint(point, pointSlot);\n\t } else {\n\t point.visible = false;\n\t }\n\t }\n\t });\n\n\t this.reflowCategories(categorySlots);\n\t if (!this.options.clip && this.options.limitPoints && this.points.length) {\n\t this.limitPoints();\n\t }\n\n\t this.box = targetBox;\n\t },\n\n\t valueSlot: function(valueAxis, plotRange) {\n\t return valueAxis.getSlot(plotRange[0], plotRange[1], !this.options.clip);\n\t },\n\n\t limitPoints: function() {\n\t var this$1 = this;\n\n\t var categoryPoints = this.categoryPoints;\n\t var points = categoryPoints[0].concat(last(categoryPoints));\n\t for (var idx = 0; idx < points.length; idx++) {\n\t if (points[idx]) {\n\t this$1.limitPoint(points[idx]);\n\t }\n\t }\n\t },\n\n\t limitPoint: function(point) {\n\t var limittedSlot = this.categoryAxis.limitSlot(point.box);\n\t if (!limittedSlot.equals(point.box)) {\n\t point.reflow(limittedSlot);\n\t }\n\t },\n\n\t aboveAxis: function(point, valueAxis) {\n\t var axisCrossingValue = this.categoryAxisCrossingValue(valueAxis);\n\t var value = point.value;\n\n\t return valueAxis.options.reverse ?\n\t value < axisCrossingValue : value >= axisCrossingValue;\n\t },\n\n\t categoryAxisCrossingValue: function(valueAxis) {\n\t var categoryAxis = this.categoryAxis;\n\t var options = valueAxis.options;\n\t var crossingValues = [].concat(\n\t options.axisCrossingValues || options.axisCrossingValue\n\t );\n\n\t return crossingValues[categoryAxis.axisIndex || 0] || 0;\n\t },\n\n\t reflowPoint: function(point, pointSlot) {\n\t point.reflow(pointSlot);\n\t },\n\n\t reflowCategories: function() { },\n\n\t pointSlot: function(categorySlot, valueSlot) {\n\t var options = this.options;\n\t var invertAxes = options.invertAxes;\n\t var slotX = invertAxes ? valueSlot : categorySlot;\n\t var slotY = invertAxes ? categorySlot : valueSlot;\n\n\t return new Box(slotX.x1, slotY.y1, slotX.x2, slotY.y2);\n\t },\n\n\t categorySlot: function(categoryAxis, categoryIx) {\n\t return categoryAxis.getSlot(categoryIx);\n\t },\n\n\t traverseDataPoints: function(callback) {\n\t var this$1 = this;\n\n\t var series = this.options.series;\n\t var count = categoriesCount(series);\n\t var seriesCount = series.length;\n\n\t for (var seriesIx = 0; seriesIx < seriesCount; seriesIx++) {\n\t this$1._outOfRangeCallback(series[seriesIx], \"_outOfRangeMinPoint\", seriesIx, callback);\n\t }\n\n\t for (var categoryIx = 0; categoryIx < count; categoryIx++) {\n\t for (var seriesIx$1 = 0; seriesIx$1 < seriesCount; seriesIx$1++) {\n\t var currentSeries = series[seriesIx$1];\n\t var currentCategory = this$1.categoryAxis.categoryAt(categoryIx);\n\t var pointData = this$1._bindPoint(currentSeries, seriesIx$1, categoryIx);\n\n\t callback(pointData, {\n\t category: currentCategory,\n\t categoryIx: categoryIx,\n\t categoriesCount: count,\n\t series: currentSeries,\n\t seriesIx: seriesIx$1\n\t });\n\t }\n\t }\n\n\t for (var seriesIx$2 = 0; seriesIx$2 < seriesCount; seriesIx$2++) {\n\t this$1._outOfRangeCallback(series[seriesIx$2], \"_outOfRangeMaxPoint\", seriesIx$2, callback);\n\t }\n\t },\n\n\t _outOfRangeCallback: function(series, field, seriesIx, callback) {\n\t var outOfRangePoint = series[field];\n\t if (outOfRangePoint) {\n\t var categoryIx = outOfRangePoint.categoryIx;\n\t var pointData = this._bindPoint(series, seriesIx, categoryIx, outOfRangePoint.item);\n\n\t callback(pointData, {\n\t category: outOfRangePoint.category,\n\t categoryIx: categoryIx,\n\t series: series,\n\t seriesIx: seriesIx,\n\t dataItem: outOfRangePoint.item\n\t });\n\t }\n\t },\n\n\t _bindPoint: function(series, seriesIx, categoryIx, item) {\n\t if (!this._bindCache) {\n\t this._bindCache = [];\n\t }\n\n\t var bindCache = this._bindCache[seriesIx];\n\t if (!bindCache) {\n\t bindCache = this._bindCache[seriesIx] = [];\n\t }\n\n\t var data = bindCache[categoryIx];\n\t if (!data) {\n\t data = bindCache[categoryIx] = SeriesBinder.current.bindPoint(series, categoryIx, item);\n\t }\n\n\t return data;\n\t },\n\n\t formatPointValue: function(point, format) {\n\t if (point.value === null) {\n\t return \"\";\n\t }\n\n\t return this.chartService.format.auto(format, point.value);\n\t },\n\n\t pointValue: function(data) {\n\t return data.valueFields.value;\n\t }\n\t});\n\n\tsetDefaultOptions(CategoricalChart, {\n\t series: [],\n\t invertAxes: false,\n\t isStacked: false,\n\t clip: true,\n\t limitPoints: true\n\t});\n\n\tvar PointEventsMixin = {\n\t click: function(chart, e) {\n\t return chart.trigger(\n\t SERIES_CLICK,\n\t this.eventArgs(e)\n\t );\n\t },\n\n\t hover: function(chart, e) {\n\t return chart.trigger(\n\t SERIES_HOVER,\n\t this.eventArgs(e)\n\t );\n\t },\n\n\t over: function(chart, e) {\n\t return chart.trigger(\n\t SERIES_OVER,\n\t this.eventArgs(e)\n\t );\n\t },\n\n\t out: function(chart, e) {\n\t return chart.trigger(\n\t SERIES_LEAVE,\n\t this.eventArgs(e)\n\t );\n\t },\n\n\t eventArgs: function(e) {\n\t return {\n\t value: this.value,\n\t percentage: this.percentage,\n\t stackValue: this.stackValue,\n\t category: this.category,\n\t series: this.series,\n\t dataItem: this.dataItem,\n\t runningTotal: this.runningTotal,\n\t total: this.total,\n\t element: eventElement(e),\n\t originalEvent: e,\n\t point: this\n\t };\n\t }\n\t};\n\n\tvar NoteMixin = {\n\t createNote: function() {\n\t var options = this.options.notes;\n\t var text = this.noteText || options.label.text;\n\n\t if (options.visible !== false && defined(text) && text !== null) {\n\t this.note = new dataviz.Note({\n\t value: this.value,\n\t text: text,\n\t dataItem: this.dataItem,\n\t category: this.category,\n\t series: this.series\n\t }, this.options.notes, this.owner.chartService);\n\n\t this.append(this.note);\n\t }\n\t }\n\t};\n\n\tvar LinePoint = ChartElement.extend({\n\t init: function(value, options) {\n\t ChartElement.fn.init.call(this);\n\n\t this.value = value;\n\t this.options = options;\n\t this.aboveAxis = valueOrDefault(this.options.aboveAxis, true);\n\t this.tooltipTracking = true;\n\t },\n\n\t render: function() {\n\t var ref = this.options;\n\t var markers = ref.markers;\n\t var labels = ref.labels;\n\n\t if (this._rendered) {\n\t return;\n\t }\n\n\t this._rendered = true;\n\n\t if (markers.visible && markers.size) {\n\t this.marker = this.createMarker();\n\t this.append(this.marker);\n\t }\n\n\t if (labels.visible) {\n\t var labelTemplate = getTemplate(labels);\n\t var pointData = this.pointData();\n\t var labelText = this.value;\n\t if (labelTemplate) {\n\t labelText = labelTemplate(pointData);\n\t } else if (labels.format) {\n\t labelText = this.formatValue(labels.format);\n\t }\n\t this.label = new TextBox(labelText,\n\t deepExtend({\n\t align: CENTER,\n\t vAlign: CENTER,\n\t margin: {\n\t left: 5,\n\t right: 5\n\t },\n\t zIndex: valueOrDefault(labels.zIndex, this.series.zIndex)\n\t }, labels),\n\t pointData\n\t );\n\t this.append(this.label);\n\t }\n\n\t this.createNote();\n\n\t if (this.errorBar) {\n\t this.append(this.errorBar);\n\t }\n\t },\n\n\t markerBorder: function() {\n\t var options = this.options.markers;\n\t var background = options.background;\n\t var border = deepExtend({ color: this.color }, options.border);\n\n\t if (!defined(border.color)) {\n\t border.color = new Color(background).brightness(BORDER_BRIGHTNESS).toHex();\n\t }\n\n\t return border;\n\t },\n\n\t createVisual: function() {},\n\n\t createMarker: function() {\n\t var options = this.options.markers;\n\t var marker = new ShapeElement({\n\t type: options.type,\n\t width: options.size,\n\t height: options.size,\n\t rotation: options.rotation,\n\t background: options.background,\n\t border: this.markerBorder(),\n\t opacity: this.series.opacity || options.opacity,\n\t zIndex: valueOrDefault(options.zIndex, this.series.zIndex),\n\t animation: options.animation,\n\t visual: options.visual\n\t }, {\n\t dataItem: this.dataItem,\n\t value: this.value,\n\t series: this.series,\n\t category: this.category\n\t });\n\n\t return marker;\n\t },\n\n\t markerBox: function() {\n\t if (!this.marker) {\n\t this.marker = this.createMarker();\n\t this.marker.reflow(this._childBox);\n\t }\n\n\t return this.marker.box;\n\t },\n\n\t reflow: function(targetBox) {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var options = ref.options;\n\t var aboveAxis = ref.aboveAxis;\n\t var vertical = options.vertical;\n\n\t this.render();\n\n\t this.box = targetBox;\n\t var childBox = targetBox.clone();\n\n\t if (vertical) {\n\t if (aboveAxis) {\n\t childBox.y1 -= childBox.height();\n\t } else {\n\t childBox.y2 += childBox.height();\n\t }\n\t } else {\n\t if (aboveAxis) {\n\t childBox.x1 += childBox.width();\n\t } else {\n\t childBox.x2 -= childBox.width();\n\t }\n\t }\n\n\t this._childBox = childBox;\n\t if (this.marker) {\n\t this.marker.reflow(childBox);\n\t }\n\n\t this.reflowLabel(childBox);\n\n\t if (this.errorBars) {\n\t for (var i = 0; i < this.errorBars.length; i++) {\n\t this$1.errorBars[i].reflow(childBox);\n\t }\n\t }\n\n\t if (this.note) {\n\t var noteTargetBox = this.markerBox();\n\n\t if (!(options.markers.visible && options.markers.size)) {\n\t var center = noteTargetBox.center();\n\t noteTargetBox = new Box(center.x, center.y, center.x, center.y);\n\t }\n\n\t this.note.reflow(noteTargetBox);\n\t }\n\t },\n\n\t reflowLabel: function(box) {\n\t var ref = this;\n\t var options = ref.options;\n\t var label = ref.label;\n\t var anchor = options.labels.position;\n\n\t if (label) {\n\t anchor = anchor === ABOVE ? TOP : anchor;\n\t anchor = anchor === BELOW ? BOTTOM : anchor;\n\n\t label.reflow(box);\n\t label.box.alignTo(this.markerBox(), anchor);\n\t label.reflow(label.box);\n\t }\n\t },\n\n\t createHighlight: function() {\n\t var markers = this.options.highlight.markers;\n\t var defaultColor = this.markerBorder().color;\n\t var options = this.options.markers;\n\t var size = options.size + (options.border.width || 0) + (markers.border.width || 0);\n\n\t var shadow = new ShapeElement({\n\t type: options.type,\n\t width: size,\n\t height: size,\n\t rotation: options.rotation,\n\t background: markers.color || defaultColor,\n\t border: {\n\t color: markers.border.color,\n\t width: markers.border.width,\n\t opacity: valueOrDefault(markers.border.opacity, 1)\n\t },\n\t opacity: valueOrDefault(markers.opacity, 1)\n\t });\n\t shadow.reflow(this._childBox);\n\n\t return shadow.getElement();\n\t },\n\n\t highlightVisual: function() {\n\t return (this.marker || {}).visual;\n\t },\n\n\t highlightVisualArgs: function() {\n\t var marker = this.marker;\n\t var visual, rect;\n\n\t if (marker) {\n\t rect = marker.paddingBox.toRect();\n\t visual = marker.visual;\n\t } else {\n\t var size = this.options.markers.size;\n\t var halfSize = size / 2;\n\t var center = this.box.center();\n\t rect = new geometry.Rect([ center.x - halfSize, center.y - halfSize ], [ size, size ]);\n\t }\n\n\t return {\n\t options: this.options,\n\t rect: rect,\n\t visual: visual\n\t };\n\t },\n\n\t tooltipAnchor: function() {\n\t var markerBox = this.markerBox();\n\t var clipBox = this.owner.pane.clipBox();\n\t var showTooltip = !clipBox || clipBox.overlaps(markerBox);\n\n\t if (showTooltip) {\n\t var x = markerBox.x2 + TOOLTIP_OFFSET;\n\t var horizontalAlign = LEFT;\n\t var y, verticalAlign;\n\n\t if (this.aboveAxis) {\n\t y = markerBox.y1;\n\t verticalAlign = BOTTOM;\n\t } else {\n\t y = markerBox.y2;\n\t verticalAlign = TOP;\n\t }\n\n\t return {\n\t point: new Point(x, y),\n\t align: {\n\t horizontal: horizontalAlign,\n\t vertical: verticalAlign\n\t }\n\t };\n\t }\n\t },\n\n\t formatValue: function(format) {\n\t return this.owner.formatPointValue(this, format);\n\t },\n\n\t overlapsBox: function(box) {\n\t var markerBox = this.markerBox();\n\t return markerBox.overlaps(box);\n\t },\n\n\t unclipElements: function() {\n\t if (this.label) {\n\t this.label.options.noclip = true;\n\t }\n\n\t if (this.note) {\n\t this.note.options.noclip = true;\n\t }\n\t },\n\n\t pointData: function() {\n\t return {\n\t dataItem: this.dataItem,\n\t category: this.category,\n\t value: this.value,\n\t percentage: this.percentage,\n\t stackValue: this.stackValue,\n\t series: this.series\n\t };\n\t }\n\t});\n\n\tLinePoint.prototype.defaults = {\n\t vertical: true,\n\t markers: {\n\t visible: true,\n\t background: WHITE,\n\t size: LINE_MARKER_SIZE,\n\t type: CIRCLE,\n\t border: {\n\t width: 2\n\t },\n\t opacity: 1\n\t },\n\t labels: {\n\t visible: false,\n\t position: ABOVE,\n\t margin: getSpacing(3),\n\t padding: getSpacing(4),\n\t animation: {\n\t type: FADEIN,\n\t delay: INITIAL_ANIMATION_DURATION\n\t }\n\t },\n\t notes: {\n\t label: {}\n\t },\n\t highlight: {\n\t markers: {\n\t border: {\n\t color: \"#fff\",\n\t width: 2\n\t }\n\t },\n\t zIndex: datavizConstants.HIGHLIGHT_ZINDEX\n\t },\n\t errorBars: {\n\t line: {\n\t width: 1\n\t }\n\t }\n\t};\n\n\tdeepExtend(LinePoint.prototype, PointEventsMixin);\n\tdeepExtend(LinePoint.prototype, NoteMixin);\n\n\tvar LineSegment = ChartElement.extend({\n\t init: function(linePoints, series, seriesIx) {\n\t ChartElement.fn.init.call(this);\n\n\t this.linePoints = linePoints;\n\t this.series = series;\n\t this.seriesIx = seriesIx;\n\t },\n\n\t points: function() {\n\t return this.toGeometryPoints(this.linePoints);\n\t },\n\n\t toGeometryPoints: function(points) {\n\t var result = [];\n\t for (var i = 0, length = points.length; i < length; i++) {\n\t if (points[i] && points[i].visible !== false) {\n\t result.push(points[i]._childBox.toRect().center());\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t createVisual: function() {\n\t var this$1 = this;\n\n\t var customVisual = this.series.visual;\n\t if (customVisual) {\n\t this.visual = customVisual({\n\t points: this.toGeometryPoints(this.linePoints),\n\t series: this.series,\n\t sender: this.getSender(),\n\t createVisual: function () {\n\t this$1.segmentVisual();\n\n\t return this$1.visual;\n\t }\n\t });\n\t if (this.visual && !defined(this.visual.options.zIndex)) {\n\t this.visual.options.zIndex = this.series.zIndex;\n\t }\n\t } else {\n\t this.segmentVisual();\n\t }\n\t },\n\n\t segmentVisual: function() {\n\t var ref = this;\n\t var options = ref.options;\n\t var series = ref.series;\n\t var color = series.color;\n\t var defaults = series._defaults;\n\n\t if (isFunction(color) && defaults) {\n\t color = defaults.color;\n\t }\n\n\t var line = Path.fromPoints(this.points(), {\n\t stroke: {\n\t color: color,\n\t width: series.width,\n\t opacity: series.opacity,\n\t dashType: series.dashType\n\t },\n\t zIndex: series.zIndex\n\t });\n\n\t if (options.closed) {\n\t line.close();\n\t }\n\n\t this.visual = line;\n\t },\n\n\t aliasFor: function(e, coords) {\n\t return this.parent.getNearestPoint(coords.x, coords.y, this.seriesIx);\n\t }\n\t});\n\n\tsetDefaultOptions(LineSegment, {\n\t closed: false\n\t});\n\n\tvar StepLineMixin = {\n\t calculateStepPoints: function(points) {\n\t var categoryAxis = this.parent.plotArea.seriesCategoryAxis(this.series);\n\t var ref = categoryAxis.options;\n\t var justified = ref.justified;\n\t var vertical = ref.vertical;\n\t var reverse = ref.reverse;\n\n\t var stepAxis = vertical ? X : Y;\n\t var axis = vertical ? Y : X;\n\t var stepDir = reverse ? 2 : 1;\n\t var dir = stepDir;\n\n\t var previousPoint = toGeometryPoint(points[0], stepAxis, stepDir, axis, dir);\n\t var result = [ previousPoint ];\n\n\t for (var idx = 1; idx < points.length; idx++) {\n\t var point = toGeometryPoint(points[idx], stepAxis, stepDir, axis, dir);\n\n\t if (previousPoint[stepAxis] !== point[stepAxis]) {\n\t var stepPoint = new GeometryPoint();\n\t stepPoint[stepAxis] = previousPoint[stepAxis];\n\t stepPoint[axis] = point[axis];\n\n\t result.push(stepPoint, point);\n\t }\n\n\t previousPoint = point;\n\t }\n\n\t if (!justified) {\n\t result.push(toGeometryPoint(last(points), stepAxis, stepDir, axis, reverse ? 1 : 2));\n\t } else if (previousPoint !== last(result)) {\n\t result.push(previousPoint);\n\t }\n\n\t return result;\n\n\t }\n\t};\n\n\tfunction toGeometryPoint(lintPoint, stepAxis, stepDir, axis, dir) {\n\t var box = lintPoint.box;\n\t var result = new GeometryPoint();\n\n\t result[stepAxis] = box[stepAxis + stepDir];\n\t result[axis] = box[axis + dir];\n\n\t return result;\n\t}\n\n\tvar StepLineSegment = LineSegment.extend({\n\t points: function() {\n\t return this.calculateStepPoints(this.linePoints);\n\t }\n\t});\n\n\tdeepExtend(StepLineSegment.prototype, StepLineMixin);\n\n\tvar SplineSegment = LineSegment.extend({\n\t segmentVisual: function() {\n\t var series = this.series;\n\t var defaults = series._defaults;\n\t var color = series.color;\n\n\t if (isFunction(color) && defaults) {\n\t color = defaults.color;\n\t }\n\n\t var curveProcessor = new CurveProcessor(this.options.closed);\n\t var segments = curveProcessor.process(this.points());\n\t var curve = new Path({\n\t stroke: {\n\t color: color,\n\t width: series.width,\n\t opacity: series.opacity,\n\t dashType: series.dashType\n\t },\n\t zIndex: series.zIndex\n\t });\n\n\t curve.segments.push.apply(curve.segments, segments);\n\n\t this.visual = curve;\n\t }\n\t});\n\n\tvar LineChartMixin = {\n\t renderSegments: function() {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var options = ref.options;\n\t var seriesPoints = ref.seriesPoints;\n\t var series = options.series;\n\t var seriesCount = seriesPoints.length;\n\t var lastSegment;\n\n\t this._segments = [];\n\n\t for (var seriesIx = 0; seriesIx < seriesCount; seriesIx++) {\n\t var currentSeries = series[seriesIx];\n\t var sortedPoints = this$1.sortPoints(seriesPoints[seriesIx]);\n\t var pointCount = sortedPoints.length;\n\t var linePoints = [];\n\n\t for (var pointIx = 0; pointIx < pointCount; pointIx++) {\n\t var point = sortedPoints[pointIx];\n\t if (point) {\n\t linePoints.push(point);\n\t } else if (this$1.seriesMissingValues(currentSeries) !== INTERPOLATE) {\n\t if (linePoints.length > 1) {\n\t lastSegment = this$1.createSegment(\n\t linePoints, currentSeries, seriesIx, lastSegment\n\t );\n\t this$1._addSegment(lastSegment);\n\t }\n\t linePoints = [];\n\t }\n\t }\n\n\t if (linePoints.length > 1) {\n\t lastSegment = this$1.createSegment(\n\t linePoints, currentSeries, seriesIx, lastSegment\n\t );\n\t this$1._addSegment(lastSegment);\n\t }\n\t }\n\n\t this.children.unshift.apply(this.children, this._segments);\n\t },\n\n\t _addSegment: function(segment) {\n\t this._segments.push(segment);\n\t segment.parent = this;\n\t },\n\n\t sortPoints: function(points) {\n\t return points;\n\t },\n\n\t seriesMissingValues: function(series) {\n\t var missingValues = series.missingValues;\n\t var assumeZero = !missingValues && this.options.isStacked;\n\n\t return assumeZero ? ZERO : missingValues || INTERPOLATE;\n\t },\n\n\t getNearestPoint: function(x, y, seriesIx) {\n\t var target = new Point(x, y);\n\t var allPoints = this.seriesPoints[seriesIx];\n\t var nearestPointDistance = MAX_VALUE;\n\t var nearestPoint;\n\n\t for (var i = 0; i < allPoints.length; i++) {\n\t var point = allPoints[i];\n\n\t if (point && defined(point.value) && point.value !== null && point.visible !== false) {\n\t var pointBox = point.box;\n\t var pointDistance = pointBox.center().distanceTo(target);\n\n\t if (pointDistance < nearestPointDistance) {\n\t nearestPoint = point;\n\t nearestPointDistance = pointDistance;\n\t }\n\t }\n\t }\n\n\t return nearestPoint;\n\t }\n\t};\n\n\tvar ClipAnimation = Animation.extend({\n\t setup: function() {\n\t this._setEnd(this.options.box.x1);\n\t },\n\n\t step: function(pos) {\n\t var box = this.options.box;\n\t this._setEnd(dataviz.interpolateValue(box.x1, box.x2, pos));\n\t },\n\n\t _setEnd: function(x) {\n\t var element = this.element;\n\t var segments = element.segments;\n\t var topRight = segments[1].anchor();\n\t var bottomRight = segments[2].anchor();\n\n\t element.suspend();\n\t topRight.setX(x);\n\t element.resume();\n\t bottomRight.setX(x);\n\t }\n\t});\n\n\tsetDefaultOptions(ClipAnimation, {\n\t duration: INITIAL_ANIMATION_DURATION\n\t});\n\n\tAnimationFactory.current.register(\"clip\", ClipAnimation);\n\n\tfunction anyHasZIndex(elements) {\n\t for (var idx = 0; idx < elements.length; idx++) {\n\t if (defined(elements[idx].zIndex)) {\n\t return true;\n\t }\n\t }\n\t}\n\n\tvar ClipAnimationMixin = {\n\t createAnimation: function() {\n\t var root = this.getRoot();\n\t if (root && (root.options || {}).transitions !== false) {\n\t var box = root.size();\n\t var clipPath = Path.fromRect(box.toRect());\n\t this.visual.clip(clipPath);\n\t this.animation = new ClipAnimation(clipPath, {\n\t box: box\n\t });\n\t if (anyHasZIndex(this.options.series)) {\n\t this._setChildrenAnimation(clipPath);\n\t }\n\t }\n\t },\n\n\t _setChildrenAnimation: function(clipPath) {\n\t var points = this.animationPoints();\n\n\t for (var idx = 0; idx < points.length; idx++) {\n\t var point = points[idx];\n\t if (point && point.visual && defined(point.visual.options.zIndex)) {\n\t point.visual.clip(clipPath);\n\t }\n\t }\n\t }\n\t};\n\n\tvar LineChart = CategoricalChart.extend({\n\t render: function() {\n\n\t CategoricalChart.fn.render.call(this);\n\n\t this.updateStackRange();\n\t this.renderSegments();\n\t },\n\n\t pointType: function() {\n\t return LinePoint;\n\t },\n\n\t createPoint: function(data, fields) {\n\t var categoryIx = fields.categoryIx;\n\t var category = fields.category;\n\t var series = fields.series;\n\t var seriesIx = fields.seriesIx;\n\t var missingValues = this.seriesMissingValues(series);\n\t var value = data.valueFields.value;\n\n\t if (!defined(value) || value === null) {\n\t if (missingValues === ZERO) {\n\t value = 0;\n\t } else {\n\t return null;\n\t }\n\t }\n\n\t var pointOptions = this.pointOptions(series, seriesIx);\n\t pointOptions = this.evalPointOptions(\n\t pointOptions, value, category, categoryIx, series, seriesIx\n\t );\n\n\t var color = data.fields.color || series.color;\n\t if (isFunction(series.color)) {\n\t color = pointOptions.color;\n\t }\n\n\t var point = new LinePoint(value, pointOptions);\n\t point.color = color;\n\n\t this.append(point);\n\n\t return point;\n\t },\n\n\t plotRange: function(point) {\n\t var this$1 = this;\n\n\t var plotValue = this.plotValue(point);\n\n\t if (this.options.isStacked) {\n\t var categoryIx = point.categoryIx;\n\t var categoryPoints = this.categoryPoints[categoryIx];\n\n\t for (var i = 0; i < categoryPoints.length; i++) {\n\t var other = categoryPoints[i];\n\n\t if (point === other) {\n\t break;\n\t }\n\n\t plotValue += this$1.plotValue(other);\n\n\t if (this$1.options.isStacked100) {\n\t plotValue = Math.min(plotValue, 1);\n\t }\n\t }\n\n\t }\n\n\t return [ plotValue, plotValue ];\n\t },\n\n\t createSegment: function(linePoints, currentSeries, seriesIx) {\n\t var style = currentSeries.style;\n\t var pointType;\n\n\t if (style === STEP) {\n\t pointType = StepLineSegment;\n\t } else if (style === SMOOTH) {\n\t pointType = SplineSegment;\n\t } else {\n\t pointType = LineSegment;\n\t }\n\n\t return new pointType(linePoints, currentSeries, seriesIx);\n\t },\n\n\t animationPoints: function() {\n\t var points = this.points;\n\t var result = [];\n\t for (var idx = 0; idx < points.length; idx++) {\n\t result.push((points[idx] || {}).marker);\n\t }\n\t return result.concat(this._segments);\n\t },\n\n\t supportsPointInactiveOpacity: function() {\n\t return false;\n\t }\n\t});\n\n\tdeepExtend(LineChart.prototype, LineChartMixin, ClipAnimationMixin);\n\n\tvar AreaSegment = LineSegment.extend({\n\t init: function(linePoints, currentSeries, seriesIx, prevSegment, stackPoints) {\n\t LineSegment.fn.init.call(this, linePoints, currentSeries, seriesIx);\n\n\t this.prevSegment = prevSegment;\n\t this.stackPoints = stackPoints;\n\t },\n\n\t createVisual: function() {\n\t var series = this.series;\n\t var defaults = series._defaults;\n\t var lineOptions = series.line || {};\n\t var color = series.color;\n\n\t if (isFunction(color) && defaults) {\n\t color = defaults.color;\n\t }\n\n\t this.visual = new Group({\n\t zIndex: series.zIndex\n\t });\n\n\t this.createFill({\n\t fill: {\n\t color: color,\n\t opacity: series.opacity\n\t },\n\t stroke: null\n\t });\n\n\t if (lineOptions.width > 0 && lineOptions.visible !== false) {\n\t this.createStroke({\n\t stroke: deepExtend({\n\t color: color,\n\t opacity: series.opacity,\n\t lineCap: \"butt\"\n\t }, lineOptions)\n\t });\n\t }\n\t },\n\n\t strokeSegments: function() {\n\t var segments = this._strokeSegments;\n\n\t if (!segments) {\n\t segments = this._strokeSegments = this.createStrokeSegments();\n\t }\n\n\t return segments;\n\t },\n\n\t createStrokeSegments: function() {\n\t return this.segmentsFromPoints(this.points());\n\t },\n\n\t stackSegments: function() {\n\t if (this.prevSegment) {\n\t return this.prevSegment.createStackSegments(this.stackPoints);\n\t }\n\n\t return this.createStackSegments(this.stackPoints);\n\t },\n\n\t createStackSegments: function(stackPoints) {\n\t return this.segmentsFromPoints(this.toGeometryPoints(stackPoints)).reverse();\n\t },\n\n\t segmentsFromPoints: function(points) {\n\t return points.map(function (point) { return new geometry.Segment(point); });\n\t },\n\n\t createStroke: function(style) {\n\t var stroke = new Path(style);\n\t stroke.segments.push.apply(stroke.segments, this.strokeSegments());\n\n\t this.visual.append(stroke);\n\t },\n\n\t hasStackSegment: function() {\n\t return this.prevSegment || (this.stackPoints && this.stackPoints.length);\n\t },\n\n\t createFill: function(style) {\n\t var strokeSegments = this.strokeSegments();\n\t var fillSegments = strokeSegments.slice(0);\n\t var hasStackSegments = this.hasStackSegment();\n\n\t if (hasStackSegments) {\n\t var stackSegments = this.stackSegments();\n\n\t append(fillSegments, stackSegments);\n\t }\n\n\t var fill = new Path(style);\n\t fill.segments.push.apply(fill.segments, fillSegments);\n\n\t if (!hasStackSegments && strokeSegments.length > 1) {\n\t this.fillToAxes(fill);\n\t }\n\n\t this.visual.append(fill);\n\t },\n\n\t fillToAxes: function(fillPath) {\n\t var chart = this.parent;\n\t var invertAxes = chart.options.invertAxes;\n\t var valueAxis = chart.seriesValueAxis(this.series);\n\t var crossingValue = chart.categoryAxisCrossingValue(valueAxis);\n\t var endSlot = valueAxis.getSlot(crossingValue, crossingValue, true);\n\t var segments = this.strokeSegments();\n\t var firstPoint = segments[0].anchor();\n\t var lastPoint = last(segments).anchor();\n\t var end = invertAxes ? endSlot.x1 : endSlot.y1;\n\n\t if (invertAxes) {\n\t fillPath.lineTo(end, lastPoint.y)\n\t .lineTo(end, firstPoint.y);\n\t } else {\n\t fillPath.lineTo(lastPoint.x, end)\n\t .lineTo(firstPoint.x, end);\n\t }\n\t }\n\t});\n\n\tvar StepAreaSegment = AreaSegment.extend({\n\t createStrokeSegments: function() {\n\t return this.segmentsFromPoints(this.calculateStepPoints(this.linePoints));\n\t },\n\n\t createStackSegments: function(stackPoints) {\n\t return this.segmentsFromPoints(this.calculateStepPoints(stackPoints)).reverse();\n\t }\n\t});\n\n\tdeepExtend(StepAreaSegment.prototype, StepLineMixin);\n\n\tvar SplineAreaSegment = AreaSegment.extend({\n\t createStrokeSegments: function() {\n\t var curveProcessor = new CurveProcessor(this.options.closed);\n\t var linePoints = this.points();\n\n\t return curveProcessor.process(linePoints);\n\t },\n\n\t createStackSegments: function() {\n\t var strokeSegments = this.strokeSegments();\n\t var stackSegments = [];\n\t for (var idx = strokeSegments.length - 1; idx >= 0; idx--) {\n\t var segment = strokeSegments[idx];\n\t stackSegments.push(new geometry.Segment(\n\t segment.anchor(),\n\t segment.controlOut(),\n\t segment.controlIn()\n\t ));\n\t }\n\n\t return stackSegments;\n\t }\n\t});\n\n\tvar AreaChart = LineChart.extend({\n\t createSegment: function(linePoints, currentSeries, seriesIx, prevSegment) {\n\t var isStacked = this.options.isStacked;\n\t var style = (currentSeries.line || {}).style;\n\t var previousSegment;\n\n\t var stackPoints;\n\t if (isStacked && seriesIx > 0 && prevSegment) {\n\t var missingValues = this.seriesMissingValues(currentSeries);\n\t if (missingValues !== \"gap\") {\n\t stackPoints = prevSegment.linePoints;\n\t previousSegment = prevSegment;\n\t } else {\n\t stackPoints = this._gapStackPoints(linePoints, seriesIx, style);\n\t }\n\t }\n\n\t var pointType;\n\t if (style === STEP) {\n\t pointType = StepAreaSegment;\n\t } else if (style === SMOOTH) {\n\t pointType = SplineAreaSegment;\n\t } else {\n\t pointType = AreaSegment;\n\t }\n\n\t return new pointType(linePoints, currentSeries, seriesIx, previousSegment, stackPoints);\n\t },\n\n\t reflow: function(targetBox) {\n\t var this$1 = this;\n\n\t LineChart.fn.reflow.call(this, targetBox);\n\n\t var stackPoints = this._stackPoints;\n\t if (stackPoints) {\n\t for (var idx = 0; idx < stackPoints.length; idx++) {\n\t var stackPoint = stackPoints[idx];\n\t var pointSlot = this$1.categoryAxis.getSlot(stackPoint.categoryIx);\n\t stackPoint.reflow(pointSlot);\n\t }\n\t }\n\t },\n\n\t _gapStackPoints: function(linePoints, seriesIx, style) {\n\t var this$1 = this;\n\n\t var seriesPoints = this.seriesPoints;\n\t var startIdx = linePoints[0].categoryIx;\n\t var length = linePoints.length;\n\t if (startIdx < 0) {\n\t startIdx = 0;\n\t length--;\n\t }\n\n\t var endIdx = startIdx + length;\n\t var pointOffset = this.seriesOptions[0]._outOfRangeMinPoint ? 1 : 0;\n\t var stackPoints = [];\n\n\t this._stackPoints = this._stackPoints || [];\n\t for (var categoryIx = startIdx; categoryIx < endIdx; categoryIx++) {\n\t var pointIx = categoryIx + pointOffset;\n\t var currentSeriesIx = seriesIx;\n\t var point = (void 0);\n\n\t do {\n\t currentSeriesIx--;\n\t point = seriesPoints[currentSeriesIx][pointIx];\n\t } while (currentSeriesIx > 0 && !point);\n\n\t if (point) {\n\t if (style !== STEP && categoryIx > startIdx && !seriesPoints[currentSeriesIx][pointIx - 1]) {\n\t stackPoints.push(this$1._previousSegmentPoint(categoryIx, pointIx, pointIx - 1, currentSeriesIx));\n\t }\n\n\t stackPoints.push(point);\n\n\t if (style !== STEP && categoryIx + 1 < endIdx && !seriesPoints[currentSeriesIx][pointIx + 1]) {\n\t stackPoints.push(this$1._previousSegmentPoint(categoryIx, pointIx, pointIx + 1, currentSeriesIx));\n\t }\n\t } else {\n\t var gapStackPoint = this$1._createGapStackPoint(categoryIx);\n\t this$1._stackPoints.push(gapStackPoint);\n\t stackPoints.push(gapStackPoint);\n\t }\n\t }\n\n\t return stackPoints;\n\t },\n\n\t _previousSegmentPoint: function(categoryIx, pointIx, segmentIx, seriesIdx) {\n\t var seriesPoints = this.seriesPoints;\n\t var index = seriesIdx;\n\t var point;\n\n\t while (index > 0 && !point) {\n\t index--;\n\t point = seriesPoints[index][segmentIx];\n\t }\n\n\t if (!point) {\n\t point = this._createGapStackPoint(categoryIx);\n\t this._stackPoints.push(point);\n\t } else {\n\t point = seriesPoints[index][pointIx];\n\t }\n\n\t return point;\n\t },\n\n\t _createGapStackPoint: function(categoryIx) {\n\t var options = this.pointOptions({}, 0);\n\t var point = new LinePoint(0, options);\n\t point.categoryIx = categoryIx;\n\t point.series = {};\n\n\t return point;\n\t },\n\n\t seriesMissingValues: function(series) {\n\t return series.missingValues || ZERO;\n\t },\n\n\t supportsPointInactiveOpacity: function() {\n\t return false;\n\t }\n\t});\n\n\tvar AxisGroupRangeTracker = Class.extend({\n\t init: function() {\n\n\t this.axisRanges = {};\n\t },\n\n\t update: function(chartAxisRanges) {\n\t var axisRanges = this.axisRanges;\n\n\t for (var axisName in chartAxisRanges) {\n\t var chartRange = chartAxisRanges[axisName];\n\t var range = axisRanges[axisName];\n\t axisRanges[axisName] = range = range || { min: MAX_VALUE, max: MIN_VALUE };\n\n\t range.min = Math.min(range.min, chartRange.min);\n\t range.max = Math.max(range.max, chartRange.max);\n\t }\n\t },\n\n\t reset: function(axisName) {\n\t this.axisRanges[axisName] = undefined;\n\t },\n\n\t query: function(axisName) {\n\t return this.axisRanges[axisName];\n\t }\n\t});\n\n\tvar BarLabel = ChartElement.extend({\n\t init: function(content, options, pointData) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.textBox = new TextBox(content, this.options, pointData);\n\t this.append(this.textBox);\n\t },\n\n\t createVisual: function() {\n\t this.textBox.options.noclip = this.options.noclip;\n\t },\n\n\t reflow: function(targetBox) {\n\t var options = this.options;\n\t var vertical = options.vertical;\n\t var aboveAxis = options.aboveAxis;\n\t var text = this.children[0];\n\t var textOptions = text.options;\n\t var box = text.box;\n\t var padding = text.options.padding;\n\t var labelBox = targetBox;\n\n\t textOptions.align = vertical ? CENTER : LEFT;\n\t textOptions.vAlign = vertical ? TOP : CENTER;\n\n\t if (options.position === INSIDE_END) {\n\t if (vertical) {\n\t textOptions.vAlign = TOP;\n\n\t if (!aboveAxis && box.height() < targetBox.height()) {\n\t textOptions.vAlign = BOTTOM;\n\t }\n\t } else {\n\t textOptions.align = aboveAxis ? RIGHT : LEFT;\n\t }\n\t } else if (options.position === CENTER) {\n\t textOptions.vAlign = CENTER;\n\t textOptions.align = CENTER;\n\t } else if (options.position === INSIDE_BASE) {\n\t if (vertical) {\n\t textOptions.vAlign = aboveAxis ? BOTTOM : TOP;\n\t } else {\n\t textOptions.align = aboveAxis ? LEFT : RIGHT;\n\t }\n\t } else if (options.position === OUTSIDE_END) {\n\t if (vertical) {\n\t if (aboveAxis) {\n\t labelBox = new Box(\n\t targetBox.x1, targetBox.y1 - box.height(),\n\t targetBox.x2, targetBox.y1\n\t );\n\t } else {\n\t labelBox = new Box(\n\t targetBox.x1, targetBox.y2,\n\t targetBox.x2, targetBox.y2 + box.height()\n\t );\n\t }\n\t } else {\n\t textOptions.align = CENTER;\n\t if (aboveAxis) {\n\t labelBox = new Box(\n\t targetBox.x2, targetBox.y1,\n\t targetBox.x2 + box.width(), targetBox.y2\n\t );\n\t } else {\n\t labelBox = new Box(\n\t targetBox.x1 - box.width(), targetBox.y1,\n\t targetBox.x1, targetBox.y2\n\t );\n\t }\n\t }\n\t }\n\n\t if (!options.rotation) {\n\t if (vertical) {\n\t padding.left = padding.right =\n\t (labelBox.width() - text.contentBox.width()) / 2;\n\t } else {\n\t padding.top = padding.bottom =\n\t (labelBox.height() - text.contentBox.height()) / 2;\n\t }\n\t }\n\n\t text.reflow(labelBox);\n\t },\n\n\t alignToClipBox: function(clipBox) {\n\t var vertical = this.options.vertical;\n\t var field = vertical ? Y : X;\n\t var start = field + \"1\";\n\t var end = field + \"2\";\n\t var text = this.children[0];\n\t var parentBox = this.parent.box;\n\n\t if (parentBox[start] < clipBox[start] || clipBox[end] < parentBox[end]) {\n\t var targetBox = text.paddingBox.clone();\n\t targetBox[start] = Math.max(parentBox[start], clipBox[start]);\n\t targetBox[end] = Math.min(parentBox[end], clipBox[end]);\n\n\t this.reflow(targetBox);\n\t }\n\t }\n\t});\n\n\tsetDefaultOptions(BarLabel, {\n\t position: OUTSIDE_END,\n\t margin: getSpacing(3),\n\t padding: getSpacing(4),\n\t color: BLACK,\n\t background: \"\",\n\t border: {\n\t width: 1,\n\t color: \"\"\n\t },\n\t aboveAxis: true,\n\t vertical: false,\n\t animation: {\n\t type: FADEIN,\n\t delay: INITIAL_ANIMATION_DURATION\n\t },\n\t zIndex: 2\n\t});\n\n\tfunction hasGradientOverlay(options) {\n\t var overlay = options.overlay;\n\n\t return overlay && overlay.gradient && overlay.gradient !== \"none\";\n\t}\n\n\tvar BAR_ALIGN_MIN_WIDTH = 6;\n\n\tvar Bar = ChartElement.extend({\n\t init: function(value, options) {\n\t ChartElement.fn.init.call(this);\n\n\t this.options = options;\n\t this.color = options.color || WHITE;\n\t this.aboveAxis = valueOrDefault(this.options.aboveAxis, true);\n\t this.value = value;\n\t },\n\n\t render: function() {\n\t if (this._rendered) {\n\t return;\n\t }\n\n\t this._rendered = true;\n\n\t this.createLabel();\n\t this.createNote();\n\n\t if (this.errorBar) {\n\t this.append(this.errorBar);\n\t }\n\t },\n\n\t createLabel: function() {\n\t var options = this.options;\n\t var labels = options.labels;\n\n\t if (labels.visible) {\n\t var pointData = this.pointData();\n\t var labelTemplate = getTemplate(labels);\n\t var labelText;\n\n\t if (labelTemplate) {\n\t labelText = labelTemplate(pointData);\n\t } else {\n\t labelText = this.formatValue(labels.format);\n\t }\n\n\t this.label = new BarLabel(labelText,\n\t deepExtend({\n\t vertical: options.vertical\n\t },\n\t labels\n\t ), pointData);\n\t this.append(this.label);\n\t }\n\t },\n\n\t formatValue: function(format) {\n\t return this.owner.formatPointValue(this, format);\n\t },\n\n\t reflow: function(targetBox) {\n\t var this$1 = this;\n\n\t this.render();\n\n\t var label = this.label;\n\n\t this.box = targetBox;\n\n\t if (label) {\n\t label.options.aboveAxis = this.aboveAxis;\n\t label.reflow(targetBox);\n\t }\n\n\t if (this.note) {\n\t this.note.reflow(targetBox);\n\t }\n\n\t if (this.errorBars) {\n\t for (var i = 0; i < this.errorBars.length; i++) {\n\t this$1.errorBars[i].reflow(targetBox);\n\t }\n\t }\n\t },\n\n\t createVisual: function() {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var box = ref.box;\n\t var options = ref.options;\n\t var customVisual = options.visual;\n\n\t if (this.visible !== false) {\n\t ChartElement.fn.createVisual.call(this);\n\n\t if (customVisual) {\n\t var visual = this.rectVisual = customVisual({\n\t category: this.category,\n\t dataItem: this.dataItem,\n\t value: this.value,\n\t sender: this.getSender(),\n\t series: this.series,\n\t percentage: this.percentage,\n\t stackValue: this.stackValue,\n\t runningTotal: this.runningTotal,\n\t total: this.total,\n\t rect: box.toRect(),\n\t createVisual: function () {\n\t var group = new Group();\n\t this$1.createRect(group);\n\t return group;\n\t },\n\t options: options\n\t });\n\n\t if (visual) {\n\t this.visual.append(visual);\n\t }\n\t } else if (box.width() > 0 && box.height() > 0) {\n\t this.createRect(this.visual);\n\t }\n\t }\n\t },\n\n\t createRect: function(visual) {\n\t var options = this.options;\n\t var border = options.border;\n\t var strokeOpacity = defined(border.opacity) ? border.opacity : options.opacity;\n\t var rect = this.box.toRect();\n\n\t rect.size.width = Math.round(rect.size.width);\n\n\t var path = this.rectVisual = Path.fromRect(rect, {\n\t fill: {\n\t color: this.color,\n\t opacity: options.opacity\n\t },\n\t stroke: {\n\t color: this.getBorderColor(),\n\t width: border.width,\n\t opacity: strokeOpacity,\n\t dashType: border.dashType\n\t }\n\t });\n\n\t var width = this.box.width();\n\t var height = this.box.height();\n\n\t var size = options.vertical ? width : height;\n\n\t if (size > BAR_ALIGN_MIN_WIDTH) {\n\t alignPathToPixel(path);\n\n\t // Fixes lineJoin issue in firefox when the joined lines are parallel\n\t if (width < 1 || height < 1) {\n\t path.options.stroke.lineJoin = \"round\";\n\t }\n\t }\n\n\t visual.append(path);\n\n\t if (hasGradientOverlay(options)) {\n\t var overlay = this.createGradientOverlay(path, { baseColor: this.color }, deepExtend({\n\t end: !options.vertical ? [ 0, 1 ] : undefined\n\t }, options.overlay));\n\n\t visual.append(overlay);\n\t }\n\t },\n\n\t createHighlight: function(style) {\n\t var highlight = Path.fromRect(this.box.toRect(), style);\n\n\t return alignPathToPixel(highlight);\n\t },\n\n\t highlightVisual: function() {\n\t return this.rectVisual;\n\t },\n\n\t highlightVisualArgs: function() {\n\t return {\n\t options: this.options,\n\t rect: this.box.toRect(),\n\t visual: this.rectVisual\n\t };\n\t },\n\n\t getBorderColor: function() {\n\t var color = this.color;\n\t var border = this.options.border;\n\t var brightness = border._brightness || BORDER_BRIGHTNESS;\n\t var borderColor = border.color;\n\n\t if (!defined(borderColor)) {\n\t borderColor = new Color(color).brightness(brightness).toHex();\n\t }\n\n\t return borderColor;\n\t },\n\n\t tooltipAnchor: function() {\n\t var ref = this;\n\t var options = ref.options;\n\t var box = ref.box;\n\t var aboveAxis = ref.aboveAxis;\n\t var clipBox = this.owner.pane.clipBox() || box;\n\t var horizontalAlign = LEFT;\n\t var verticalAlign = TOP;\n\t var x, y;\n\n\t if (options.vertical) {\n\t x = Math.min(box.x2, clipBox.x2) + TOOLTIP_OFFSET;\n\t if (aboveAxis) {\n\t y = Math.max(box.y1, clipBox.y1);\n\t } else {\n\t y = Math.min(box.y2, clipBox.y2);\n\t verticalAlign = BOTTOM;\n\t }\n\t } else {\n\t var x1 = Math.max(box.x1, clipBox.x1);\n\t var x2 = Math.min(box.x2, clipBox.x2);\n\n\t if (options.isStacked) {\n\t verticalAlign = BOTTOM;\n\t if (aboveAxis) {\n\t horizontalAlign = RIGHT;\n\t x = x2;\n\t } else {\n\t x = x1;\n\t }\n\t y = Math.max(box.y1, clipBox.y1) - TOOLTIP_OFFSET;\n\t } else {\n\t if (aboveAxis) {\n\t x = x2 + TOOLTIP_OFFSET;\n\t } else {\n\t x = x1 - TOOLTIP_OFFSET;\n\t horizontalAlign = RIGHT;\n\t }\n\t y = Math.max(box.y1, clipBox.y1);\n\t }\n\t }\n\n\t return {\n\t point: new Point(x, y),\n\t align: {\n\t horizontal: horizontalAlign,\n\t vertical: verticalAlign\n\t }\n\t };\n\t },\n\n\t overlapsBox: function(box) {\n\t return this.box.overlaps(box);\n\t },\n\n\t pointData: function() {\n\t return {\n\t dataItem: this.dataItem,\n\t category: this.category,\n\t value: this.value,\n\t percentage: this.percentage,\n\t stackValue: this.stackValue,\n\t runningTotal: this.runningTotal,\n\t total: this.total,\n\t series: this.series\n\t };\n\t }\n\t});\n\n\tdeepExtend(Bar.prototype, PointEventsMixin);\n\tdeepExtend(Bar.prototype, NoteMixin);\n\n\tBar.prototype.defaults = {\n\t border: {\n\t width: 1\n\t },\n\t vertical: true,\n\t overlay: {\n\t gradient: \"glass\"\n\t },\n\t labels: {\n\t visible: false,\n\t format: \"{0}\"\n\t },\n\t opacity: 1,\n\t notes: {\n\t label: {}\n\t }\n\t};\n\n\tfunction forEach(elements, callback) {\n\t elements.forEach(callback);\n\t}\n\n\tfunction forEachReverse(elements, callback) {\n\t var length = elements.length;\n\n\t for (var idx = length - 1; idx >= 0; idx--) {\n\t callback(elements[idx], idx - length - 1);\n\t }\n\t}\n\n\tvar ClusterLayout = ChartElement.extend({\n\t init: function(options) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.forEach = options.rtl ? forEachReverse : forEach;\n\t },\n\n\t reflow: function(box) {\n\t var ref = this.options;\n\t var vertical = ref.vertical;\n\t var gap = ref.gap;\n\t var spacing = ref.spacing;\n\t var children = this.children;\n\t var count = children.length;\n\t var axis = vertical ? Y : X;\n\t var slots = count + gap + (spacing * (count - 1));\n\t var slotSize = (vertical ? box.height() : box.width()) / slots;\n\t var position = box[axis + 1] + slotSize * (gap / 2);\n\n\t this.forEach(children, function (child, idx) {\n\t var childBox = (child.box || box).clone();\n\n\t childBox[axis + 1] = position;\n\t childBox[axis + 2] = position + slotSize;\n\n\t child.reflow(childBox);\n\t if (idx < count - 1) {\n\t position += (slotSize * spacing);\n\t }\n\n\t position += slotSize;\n\t });\n\t }\n\t});\n\n\tsetDefaultOptions(ClusterLayout, {\n\t vertical: false,\n\t gap: 0,\n\t spacing: 0\n\t});\n\n\tvar StackWrap = ChartElement.extend({\n\t reflow: function(targetBox) {\n\t var this$1 = this;\n\n\t var positionAxis = this.options.vertical ? X : Y;\n\t var children = this.children;\n\t var childrenCount = children.length;\n\t var box = this.box = new Box();\n\n\t for (var i = 0; i < childrenCount; i++) {\n\t var currentChild = children[i];\n\n\t if (currentChild.visible !== false) {\n\t var childBox = currentChild.box.clone();\n\t childBox.snapTo(targetBox, positionAxis);\n\n\t if (i === 0) {\n\t box = this$1.box = childBox.clone();\n\t }\n\n\t currentChild.reflow(childBox);\n\t box.wrap(childBox);\n\t }\n\t }\n\t }\n\t});\n\n\tsetDefaultOptions(StackWrap, {\n\t vertical: true\n\t});\n\n\tvar BarChart = CategoricalChart.extend({\n\t render: function() {\n\t CategoricalChart.fn.render.call(this);\n\t this.updateStackRange();\n\t },\n\n\t pointType: function() {\n\t return Bar;\n\t },\n\n\t clusterType: function() {\n\t return ClusterLayout;\n\t },\n\n\t stackType: function() {\n\t return StackWrap;\n\t },\n\n\t stackLimits: function(axisName, stackName) {\n\t var limits = CategoricalChart.fn.stackLimits.call(this, axisName, stackName);\n\n\t return limits;\n\t },\n\n\t createPoint: function(data, fields) {\n\t var categoryIx = fields.categoryIx;\n\t var category = fields.category;\n\t var series = fields.series;\n\t var seriesIx = fields.seriesIx;\n\t var ref = this;\n\t var options = ref.options;\n\t var children = ref.children;\n\t var isStacked = options.isStacked;\n\t var value = this.pointValue(data);\n\t var pointOptions = this.pointOptions(series, seriesIx);\n\n\t var labelOptions = pointOptions.labels;\n\t if (isStacked) {\n\t if (labelOptions.position === OUTSIDE_END) {\n\t labelOptions.position = INSIDE_END;\n\t }\n\t }\n\n\t pointOptions.isStacked = isStacked;\n\n\t var color = data.fields.color || series.color;\n\t if (value < 0 && pointOptions.negativeColor) {\n\t color = pointOptions.negativeColor;\n\t }\n\n\t pointOptions = this.evalPointOptions(\n\t pointOptions, value, category, categoryIx, series, seriesIx\n\t );\n\n\t if (isFunction(series.color)) {\n\t color = pointOptions.color;\n\t }\n\n\t var pointType = this.pointType();\n\t var point = new pointType(value, pointOptions);\n\t point.color = color;\n\n\t var cluster = children[categoryIx];\n\t if (!cluster) {\n\t var clusterType = this.clusterType();\n\t cluster = new clusterType({\n\t vertical: options.invertAxes,\n\t gap: options.gap,\n\t spacing: options.spacing,\n\t rtl: !options.invertAxes && (this.chartService || {}).rtl\n\t });\n\t this.append(cluster);\n\t }\n\n\t if (isStacked) {\n\t var stackWrap = this.getStackWrap(series, cluster);\n\t stackWrap.append(point);\n\t } else {\n\t cluster.append(point);\n\t }\n\n\t return point;\n\t },\n\n\t getStackWrap: function(series, cluster) {\n\t var stack = series.stack;\n\t var stackGroup = stack ? stack.group || stack : stack;\n\t var wraps = cluster.children;\n\t var stackWrap;\n\n\t if (typeof stackGroup === datavizConstants.STRING) {\n\t for (var i = 0; i < wraps.length; i++) {\n\t if (wraps[i]._stackGroup === stackGroup) {\n\t stackWrap = wraps[i];\n\t break;\n\t }\n\t }\n\t } else {\n\t stackWrap = wraps[0];\n\t }\n\n\t if (!stackWrap) {\n\t var stackType = this.stackType();\n\t stackWrap = new stackType({\n\t vertical: !this.options.invertAxes\n\t });\n\t stackWrap._stackGroup = stackGroup;\n\t cluster.append(stackWrap);\n\t }\n\n\t return stackWrap;\n\t },\n\n\t categorySlot: function(categoryAxis, categoryIx, valueAxis) {\n\t var options = this.options;\n\t var categorySlot = categoryAxis.getSlot(categoryIx);\n\t var startValue = valueAxis.startValue();\n\n\t if (options.isStacked) {\n\t var zeroSlot = valueAxis.getSlot(startValue, startValue, true);\n\t var stackAxis = options.invertAxes ? X : Y;\n\t categorySlot[stackAxis + 1] = categorySlot[stackAxis + 2] = zeroSlot[stackAxis + 1];\n\t }\n\n\t return categorySlot;\n\t },\n\n\t reflowCategories: function(categorySlots) {\n\t var children = this.children;\n\t var childrenLength = children.length;\n\n\t for (var i = 0; i < childrenLength; i++) {\n\t children[i].reflow(categorySlots[i]);\n\t }\n\t },\n\n\t createAnimation: function() {\n\t this._setAnimationOptions();\n\t CategoricalChart.fn.createAnimation.call(this);\n\n\t if (anyHasZIndex(this.options.series)) {\n\t this._setChildrenAnimation();\n\t }\n\t },\n\n\t _setChildrenAnimation: function() {\n\t var this$1 = this;\n\n\t var points = this.points;\n\n\t for (var idx = 0; idx < points.length; idx++) {\n\t var point = points[idx];\n\t var pointVisual = point.visual;\n\t if (pointVisual && defined(pointVisual.options.zIndex)) {\n\t point.options.animation = this$1.options.animation;\n\t point.createAnimation();\n\t }\n\t }\n\t },\n\n\t _setAnimationOptions: function() {\n\t var options = this.options;\n\t var animation = options.animation || {};\n\t var origin;\n\n\t if (options.isStacked) {\n\t var valueAxis = this.seriesValueAxis(options.series[0]);\n\t origin = valueAxis.getSlot(valueAxis.startValue());\n\t } else {\n\t origin = this.categoryAxis.getSlot(0);\n\t }\n\n\t animation.origin = new GeometryPoint(origin.x1, origin.y1);\n\t animation.vertical = !options.invertAxes;\n\t }\n\t});\n\n\tsetDefaultOptions(BarChart, {\n\t animation: {\n\t type: BAR\n\t }\n\t});\n\n\tvar Candlestick = ChartElement.extend({\n\t init: function(value, options) {\n\t ChartElement.fn.init.call(this, options);\n\t this.value = value;\n\t },\n\n\t reflow: function(box) {\n\t var ref = this;\n\t var options = ref.options;\n\t var value = ref.value;\n\t var chart = ref.owner;\n\t var valueAxis = chart.seriesValueAxis(options);\n\t var ocSlot = valueAxis.getSlot(value.open, value.close);\n\t var lhSlot = valueAxis.getSlot(value.low, value.high);\n\n\t ocSlot.x1 = lhSlot.x1 = box.x1;\n\t ocSlot.x2 = lhSlot.x2 = box.x2;\n\n\t this.realBody = ocSlot;\n\n\t var mid = lhSlot.center().x;\n\t var points = [];\n\n\t points.push([ [ mid, lhSlot.y1 ], [ mid, ocSlot.y1 ] ]);\n\t points.push([ [ mid, ocSlot.y2 ], [ mid, lhSlot.y2 ] ]);\n\n\t this.lines = points;\n\n\t this.box = lhSlot.clone().wrap(ocSlot);\n\n\t if (!this._rendered) {\n\t this._rendered = true;\n\t this.createNote();\n\t }\n\n\t this.reflowNote();\n\t },\n\n\t reflowNote: function() {\n\t if (this.note) {\n\t this.note.reflow(this.box);\n\t }\n\t },\n\n\t createVisual: function() {\n\t ChartElement.fn.createVisual.call(this);\n\t this._mainVisual = this.mainVisual(this.options);\n\t this.visual.append(\n\t this._mainVisual\n\t );\n\n\t this.createOverlay();\n\t },\n\n\t mainVisual: function(options) {\n\t var group = new Group();\n\n\t this.createBody(group, options);\n\t this.createLines(group, options);\n\n\t return group;\n\t },\n\n\t createBody: function(container, options) {\n\t var body = Path.fromRect(this.realBody.toRect(), {\n\t fill: {\n\t color: this.color,\n\t opacity: options.opacity\n\t },\n\t stroke: null\n\t });\n\n\t if (options.border.width > 0) {\n\t body.options.set(\"stroke\", {\n\t color: this.getBorderColor(),\n\t width: options.border.width,\n\t dashType: options.border.dashType,\n\t opacity: valueOrDefault(options.border.opacity, options.opacity)\n\t });\n\t }\n\n\t alignPathToPixel(body);\n\t container.append(body);\n\n\t if (hasGradientOverlay(options)) {\n\t container.append(this.createGradientOverlay(body, { baseColor: this.color }, deepExtend({\n\t end: !options.vertical ? [ 0, 1 ] : undefined\n\t }, options.overlay)));\n\t }\n\t },\n\n\t createLines: function(container, options) {\n\t this.drawLines(container, options, this.lines, options.line);\n\t },\n\n\t drawLines: function(container, options, lines, lineOptions) {\n\t if (!lines) {\n\t return;\n\t }\n\n\t var lineStyle = {\n\t stroke: {\n\t color: lineOptions.color || this.color,\n\t opacity: valueOrDefault(lineOptions.opacity, options.opacity),\n\t width: lineOptions.width,\n\t dashType: lineOptions.dashType,\n\t lineCap: \"butt\"\n\t }\n\t };\n\n\t for (var i = 0; i < lines.length; i++) {\n\t var line = Path.fromPoints(lines[i], lineStyle);\n\t alignPathToPixel(line);\n\t container.append(line);\n\t }\n\t },\n\n\t getBorderColor: function() {\n\t var border = this.options.border;\n\t var borderColor = border.color;\n\n\t if (!defined(borderColor)) {\n\t borderColor = new Color(this.color).brightness(border._brightness).toHex();\n\t }\n\n\t return borderColor;\n\t },\n\n\t createOverlay: function() {\n\t var overlay = Path.fromRect(this.box.toRect(), {\n\t fill: {\n\t color: WHITE,\n\t opacity: 0\n\t },\n\t stroke: null\n\t });\n\n\t this.visual.append(overlay);\n\t },\n\n\t createHighlight: function() {\n\t var highlight = this.options.highlight;\n\t var normalColor = this.color;\n\n\t this.color = highlight.color || this.color;\n\t var overlay = this.mainVisual(\n\t deepExtend({}, this.options, {\n\t line: {\n\t color: this.getBorderColor()\n\t }\n\t }, highlight)\n\t );\n\t this.color = normalColor;\n\n\t return overlay;\n\t },\n\n\t highlightVisual: function() {\n\t return this._mainVisual;\n\t },\n\n\t highlightVisualArgs: function() {\n\t return {\n\t options: this.options,\n\t rect: this.box.toRect(),\n\t visual: this._mainVisual\n\t };\n\t },\n\n\t tooltipAnchor: function() {\n\t var box = this.box;\n\t var clipBox = this.owner.pane.clipBox() || box;\n\n\t return {\n\t point: new Point(box.x2 + TOOLTIP_OFFSET, Math.max(box.y1, clipBox.y1) + TOOLTIP_OFFSET),\n\t align: {\n\t horizontal: LEFT,\n\t vertical: TOP\n\t }\n\t };\n\t },\n\n\t formatValue: function(format) {\n\t return this.owner.formatPointValue(this, format);\n\t },\n\n\t overlapsBox: function(box) {\n\t return this.box.overlaps(box);\n\t }\n\t});\n\n\tsetDefaultOptions(Candlestick, {\n\t vertical: true,\n\t border: {\n\t _brightness: 0.8\n\t },\n\t line: {\n\t width: 2\n\t },\n\t overlay: {\n\t gradient: \"glass\"\n\t },\n\t tooltip: {\n\t format: \"
\" +\n\t \"{4:d} |
\" +\n\t \"Open: | {0:C} |
\" +\n\t \"High: | {1:C} |
\" +\n\t \"Low: | {2:C} |
\" +\n\t \"Close: | {3:C} |
\" +\n\t \"
\"\n\t },\n\t highlight: {\n\t opacity: 1,\n\t border: {\n\t width: 1,\n\t opacity: 1\n\t },\n\t line: {\n\t width: 1,\n\t opacity: 1\n\t }\n\t },\n\t notes: {\n\t visible: true,\n\t label: {}\n\t }\n\t});\n\n\tdeepExtend(Candlestick.prototype, PointEventsMixin);\n\tdeepExtend(Candlestick.prototype, NoteMixin);\n\n\tfunction areNumbers(values) {\n\t return countNumbers(values) === values.length;\n\t}\n\n\tvar CandlestickChart = CategoricalChart.extend({\n\t reflowCategories: function(categorySlots) {\n\t var children = this.children;\n\t var childrenLength = children.length;\n\n\t for (var i = 0; i < childrenLength; i++) {\n\t children[i].reflow(categorySlots[i]);\n\t }\n\t },\n\n\t addValue: function(data, fields) {\n\t var categoryIx = fields.categoryIx;\n\t var category = fields.category;\n\t var series = fields.series;\n\t var seriesIx = fields.seriesIx;\n\t var ref = this;\n\t var children = ref.children;\n\t var options = ref.options;\n\t var value = data.valueFields;\n\t var valueParts = this.splitValue(value);\n\t var hasValue = areNumbers(valueParts);\n\t var dataItem = series.data[categoryIx];\n\t var categoryPoints = this.categoryPoints[categoryIx];\n\t var point;\n\n\t if (!categoryPoints) {\n\t this.categoryPoints[categoryIx] = categoryPoints = [];\n\t }\n\n\t if (hasValue) {\n\t point = this.createPoint(data, fields);\n\t }\n\n\t var cluster = children[categoryIx];\n\t if (!cluster) {\n\t cluster = new ClusterLayout({\n\t vertical: options.invertAxes,\n\t gap: options.gap,\n\t spacing: options.spacing,\n\t rtl: !options.invertAxes && (this.chartService || {}).rtl\n\t });\n\t this.append(cluster);\n\t }\n\n\t if (point) {\n\t this.updateRange(value, fields);\n\n\t cluster.append(point);\n\n\t point.categoryIx = categoryIx;\n\t point.category = category;\n\t point.series = series;\n\t point.seriesIx = seriesIx;\n\t point.owner = this;\n\t point.dataItem = dataItem;\n\t point.noteText = data.fields.noteText;\n\t }\n\n\t this.points.push(point);\n\t categoryPoints.push(point);\n\t },\n\n\t pointType: function() {\n\t return Candlestick;\n\t },\n\n\t createPoint: function(data, fields) {\n\t var categoryIx = fields.categoryIx;\n\t var category = fields.category;\n\t var series = fields.series;\n\t var seriesIx = fields.seriesIx;\n\t var pointType = this.pointType();\n\t var value = data.valueFields;\n\t var pointOptions = deepExtend({}, series);\n\t var color = data.fields.color || series.color;\n\n\t pointOptions = this.evalPointOptions(\n\t pointOptions, value, category, categoryIx, series, seriesIx\n\t );\n\n\t if (series.type === CANDLESTICK) {\n\t if (value.open > value.close) {\n\t color = data.fields.downColor || series.downColor || series.color;\n\t }\n\t }\n\n\t if (isFunction(series.color)) {\n\t color = pointOptions.color;\n\t }\n\n\t pointOptions.vertical = !this.options.invertAxes;\n\n\t var point = new pointType(value, pointOptions);\n\t point.color = color;\n\n\t return point;\n\t },\n\n\t splitValue: function(value) {\n\t return [ value.low, value.open, value.close, value.high ];\n\t },\n\n\t updateRange: function(value, fields) {\n\t var axisName = fields.series.axis;\n\t var parts = this.splitValue(value);\n\t var axisRange = this.valueAxisRanges[axisName];\n\n\t axisRange = this.valueAxisRanges[axisName] =\n\t axisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n\t axisRange = this.valueAxisRanges[axisName] = {\n\t min: Math.min.apply(Math, parts.concat([ axisRange.min ])),\n\t max: Math.max.apply(Math, parts.concat([ axisRange.max ]))\n\t };\n\t },\n\n\t formatPointValue: function(point, format) {\n\t var value = point.value;\n\n\t return this.chartService.format.auto(format,\n\t value.open, value.high,\n\t value.low, value.close, point.category\n\t );\n\t },\n\n\t animationPoints: function() {\n\t return this.points;\n\t }\n\t});\n\n\tdeepExtend(CandlestickChart.prototype, ClipAnimationMixin);\n\n\tvar BoxPlot = Candlestick.extend({\n\t init: function(value, options) {\n\t Candlestick.fn.init.call(this, value, options);\n\n\t this.createNote();\n\t },\n\n\t reflow: function(box) {\n\t var ref = this;\n\t var options = ref.options;\n\t var value = ref.value;\n\t var chart = ref.owner;\n\t var valueAxis = chart.seriesValueAxis(options);\n\t var whiskerSlot, boxSlot;\n\n\t this.boxSlot = boxSlot = valueAxis.getSlot(value.q1, value.q3);\n\t this.realBody = boxSlot;\n\t this.reflowBoxSlot(box);\n\n\t this.whiskerSlot = whiskerSlot = valueAxis.getSlot(value.lower, value.upper);\n\t this.reflowWhiskerSlot(box);\n\n\t var medianSlot = valueAxis.getSlot(value.median);\n\n\t if (value.mean) {\n\t var meanSlot = valueAxis.getSlot(value.mean);\n\t this.meanPoints = this.calcMeanPoints(box, meanSlot);\n\t }\n\n\t this.whiskerPoints = this.calcWhiskerPoints(boxSlot, whiskerSlot);\n\t this.medianPoints = this.calcMedianPoints(box, medianSlot);\n\n\t this.box = whiskerSlot.clone().wrap(boxSlot);\n\t this.reflowNote();\n\t },\n\n\t reflowBoxSlot: function(box) {\n\t this.boxSlot.x1 = box.x1;\n\t this.boxSlot.x2 = box.x2;\n\t },\n\n\t reflowWhiskerSlot: function(box) {\n\t this.whiskerSlot.x1 = box.x1;\n\t this.whiskerSlot.x2 = box.x2;\n\t },\n\n\t calcMeanPoints: function(box, meanSlot) {\n\t return [\n\t [ [ box.x1, meanSlot.y1 ], [ box.x2, meanSlot.y1 ] ]\n\t ];\n\t },\n\n\t calcWhiskerPoints: function(boxSlot, whiskerSlot) {\n\t var mid = whiskerSlot.center().x;\n\t return [ [\n\t [ mid - 5, whiskerSlot.y1 ], [ mid + 5, whiskerSlot.y1 ],\n\t [ mid, whiskerSlot.y1 ], [ mid, boxSlot.y1 ]\n\t ], [\n\t [ mid - 5, whiskerSlot.y2 ], [ mid + 5, whiskerSlot.y2 ],\n\t [ mid, whiskerSlot.y2 ], [ mid, boxSlot.y2 ]\n\t ] ];\n\t },\n\n\t calcMedianPoints: function(box, medianSlot) {\n\t return [\n\t [ [ box.x1, medianSlot.y1 ], [ box.x2, medianSlot.y1 ] ]\n\t ];\n\t },\n\n\t renderOutliers: function(options) {\n\t var this$1 = this;\n\n\t var value = this.value;\n\t var outliers = value.outliers || [];\n\t var outerFence = Math.abs(value.q3 - value.q1) * 3;\n\t var elements = [];\n\t var markers = options.markers || {};\n\n\t for (var i = 0; i < outliers.length; i++) {\n\t var outlierValue = outliers[i];\n\t if (outlierValue < value.q3 + outerFence && outlierValue > value.q1 - outerFence) {\n\t markers = options.outliers;\n\t } else {\n\t markers = options.extremes;\n\t }\n\t var markersBorder = deepExtend({}, markers.border);\n\n\t if (!defined(markersBorder.color)) {\n\t if (defined(this$1.color)) {\n\t markersBorder.color = this$1.color;\n\t } else {\n\t markersBorder.color =\n\t new Color(markers.background).brightness(BORDER_BRIGHTNESS).toHex();\n\t }\n\t }\n\n\t var shape = new ShapeElement({\n\t type: markers.type,\n\t width: markers.size,\n\t height: markers.size,\n\t rotation: markers.rotation,\n\t background: markers.background,\n\t border: markersBorder,\n\t opacity: markers.opacity\n\t });\n\n\t shape.value = outlierValue;\n\n\t elements.push(shape);\n\t }\n\n\t this.reflowOutliers(elements);\n\t return elements;\n\t },\n\n\t reflowOutliers: function(outliers) {\n\t var this$1 = this;\n\n\t var valueAxis = this.owner.seriesValueAxis(this.options);\n\t var center = this.box.center();\n\n\t for (var i = 0; i < outliers.length; i++) {\n\t var outlierValue = outliers[i].value;\n\t var markerBox = valueAxis.getSlot(outlierValue);\n\n\t if (this$1.options.vertical) {\n\t markerBox.move(center.x);\n\t } else {\n\t markerBox.move(undefined, center.y);\n\t }\n\n\t this$1.box = this$1.box.wrap(markerBox);\n\t outliers[i].reflow(markerBox);\n\t }\n\t },\n\n\t mainVisual: function(options) {\n\t var group = Candlestick.fn.mainVisual.call(this, options);\n\t var outliers = this.renderOutliers(options);\n\n\t for (var i = 0; i < outliers.length; i++) {\n\t var element = outliers[i].getElement();\n\t if (element) {\n\t group.append(element);\n\t }\n\t }\n\n\t return group;\n\t },\n\n\t createLines: function(container, options) {\n\t this.drawLines(container, options, this.whiskerPoints, options.whiskers);\n\t this.drawLines(container, options, this.medianPoints, options.median);\n\t this.drawLines(container, options, this.meanPoints, options.mean);\n\t },\n\n\t getBorderColor: function() {\n\t if ((this.options.border || {}).color) {\n\t return this.options.border.color;\n\t }\n\n\t if (this.color) {\n\t return this.color;\n\t }\n\n\t return Candlestick.fn.getBorderColor.call(this);\n\t }\n\t});\n\n\tsetDefaultOptions(BoxPlot, {\n\t border: {\n\t _brightness: 0.8\n\t },\n\t line: {\n\t width: 2\n\t },\n\t median: {\n\t color: \"#f6f6f6\"\n\t },\n\t mean: {\n\t width: 2,\n\t dashType: \"dash\",\n\t color: \"#f6f6f6\"\n\t },\n\t overlay: {\n\t gradient: \"glass\"\n\t },\n\t tooltip: {\n\t format: \"\" +\n\t \"{6:d} |
\" +\n\t \"Lower: | {0:C} |
\" +\n\t \"Q1: | {1:C} |
\" +\n\t \"Median: | {2:C} |
\" +\n\t \"Mean: | {5:C} |
\" +\n\t \"Q3: | {3:C} |
\" +\n\t \"Upper: | {4:C} |
\" +\n\t \"
\"\n\t },\n\t highlight: {\n\t opacity: 1,\n\t border: {\n\t width: 1,\n\t opacity: 1\n\t },\n\t line: {\n\t width: 1,\n\t opacity: 1\n\t }\n\t },\n\t notes: {\n\t visible: true,\n\t label: {}\n\t },\n\t outliers: {\n\t visible: true,\n\t size: LINE_MARKER_SIZE,\n\t type: datavizConstants.CROSS,\n\t background: WHITE,\n\t border: {\n\t width: 2,\n\t opacity: 1\n\t },\n\t opacity: 0\n\t },\n\t extremes: {\n\t visible: true,\n\t size: LINE_MARKER_SIZE,\n\t type: CIRCLE,\n\t background: WHITE,\n\t border: {\n\t width: 2,\n\t opacity: 1\n\t },\n\t opacity: 0\n\t }\n\t});\n\n\tdeepExtend(BoxPlot.prototype, PointEventsMixin);\n\n\tvar VerticalBoxPlot = BoxPlot.extend({\n\t reflowBoxSlot: function(box) {\n\t this.boxSlot.y1 = box.y1;\n\t this.boxSlot.y2 = box.y2;\n\t },\n\n\t reflowWhiskerSlot: function(box) {\n\t this.whiskerSlot.y1 = box.y1;\n\t this.whiskerSlot.y2 = box.y2;\n\t },\n\n\t calcMeanPoints: function(box, meanSlot) {\n\t return [\n\t [ [ meanSlot.x1, box.y1 ], [ meanSlot.x1, box.y2 ] ]\n\t ];\n\t },\n\n\t calcWhiskerPoints: function(boxSlot, whiskerSlot) {\n\t var mid = whiskerSlot.center().y;\n\t return [ [\n\t [ whiskerSlot.x1, mid - 5 ], [ whiskerSlot.x1, mid + 5 ],\n\t [ whiskerSlot.x1, mid ], [ boxSlot.x1, mid ]\n\t ], [\n\t [ whiskerSlot.x2, mid - 5 ], [ whiskerSlot.x2, mid + 5 ],\n\t [ whiskerSlot.x2, mid ], [ boxSlot.x2, mid ]\n\t ] ];\n\t },\n\n\t calcMedianPoints: function(box, medianSlot) {\n\t return [\n\t [ [ medianSlot.x1, box.y1 ], [ medianSlot.x1, box.y2 ] ]\n\t ];\n\t }\n\t});\n\n\tvar BoxPlotChart = CandlestickChart.extend({\n\t addValue: function(data, fields) {\n\t var categoryIx = fields.categoryIx;\n\t var category = fields.category;\n\t var series = fields.series;\n\t var seriesIx = fields.seriesIx;\n\t var ref = this;\n\t var children = ref.children;\n\t var options = ref.options;\n\t var value = data.valueFields;\n\t var valueParts = this.splitValue(value);\n\t var hasValue = areNumbers(valueParts);\n\t var dataItem = series.data[categoryIx];\n\t var categoryPoints = this.categoryPoints[categoryIx];\n\t var point;\n\n\t if (!categoryPoints) {\n\t this.categoryPoints[categoryIx] = categoryPoints = [];\n\t }\n\n\t if (hasValue) {\n\t point = this.createPoint(data, fields);\n\t }\n\n\t var cluster = children[categoryIx];\n\t if (!cluster) {\n\t cluster = new ClusterLayout({\n\t vertical: options.invertAxes,\n\t gap: options.gap,\n\t spacing: options.spacing,\n\t rtl: !options.invertAxes && (this.chartService || {}).rtl\n\t });\n\t this.append(cluster);\n\t }\n\n\t if (point) {\n\t this.updateRange(value, fields);\n\n\t cluster.append(point);\n\n\t point.categoryIx = categoryIx;\n\t point.category = category;\n\t point.series = series;\n\t point.seriesIx = seriesIx;\n\t point.owner = this;\n\t point.dataItem = dataItem;\n\t }\n\n\t this.points.push(point);\n\t categoryPoints.push(point);\n\t },\n\n\t pointType: function() {\n\t if (this.options.invertAxes) {\n\t return VerticalBoxPlot;\n\t }\n\n\t return BoxPlot;\n\t },\n\n\t splitValue: function(value) {\n\t return [\n\t value.lower, value.q1, value.median,\n\t value.q3, value.upper\n\t ];\n\t },\n\n\t updateRange: function(value, fields) {\n\t var axisName = fields.series.axis;\n\t var axisRange = this.valueAxisRanges[axisName];\n\t var parts = this.splitValue(value).concat(this.filterOutliers(value.outliers));\n\n\t if (defined(value.mean)) {\n\t parts = parts.concat(value.mean);\n\t }\n\n\t axisRange = this.valueAxisRanges[axisName] =\n\t axisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n\t axisRange = this.valueAxisRanges[axisName] = {\n\t min: Math.min.apply(Math, parts.concat([ axisRange.min ])),\n\t max: Math.max.apply(Math, parts.concat([ axisRange.max ]))\n\t };\n\t },\n\n\t formatPointValue: function(point, format) {\n\t var value = point.value;\n\n\t return this.chartService.format.auto(format,\n\t value.lower, value.q1, value.median,\n\t value.q3, value.upper, value.mean, point.category\n\t );\n\t },\n\n\t filterOutliers: function(items) {\n\t var length = (items || []).length;\n\t var result = [];\n\n\t for (var i = 0; i < length; i++) {\n\t var item = items[i];\n\t if (defined(item) && item !== null) {\n\t result.push(item);\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t supportsPointInactiveOpacity: function() {\n\t return false;\n\t }\n\t});\n\n\tvar ScatterErrorBar = ErrorBarBase.extend({\n\t getAxis: function() {\n\t var axes = this.chart.seriesAxes(this.series);\n\t var axis = this.isVertical ? axes.y : axes.x;\n\n\t return axis;\n\t }\n\t});\n\n\tfunction hasValue(value) {\n\t return defined(value) && value !== null;\n\t}\n\n\tvar ScatterChart = ChartElement.extend({\n\t init: function(plotArea, options) {\n\n\t ChartElement.fn.init.call(this, options);\n\n\t this.plotArea = plotArea;\n\t this.chartService = plotArea.chartService;\n\t this._initFields();\n\n\t this.render();\n\t },\n\n\t _initFields: function() {\n\t // X and Y axis ranges grouped by name, e.g.:\n\t // primary: { min: 0, max: 1 }\n\t this.xAxisRanges = {};\n\t this.yAxisRanges = {};\n\n\t this.points = [];\n\t this.seriesPoints = [];\n\t this.seriesOptions = [];\n\t this._evalSeries = [];\n\t },\n\n\t render: function() {\n\t this.traverseDataPoints(this.addValue.bind(this));\n\t },\n\n\t addErrorBar: function(point, field, fields) {\n\t var value = point.value[field];\n\t var valueErrorField = field + \"Value\";\n\t var lowField = field + \"ErrorLow\";\n\t var highField = field + \"ErrorHigh\";\n\t var seriesIx = fields.seriesIx;\n\t var series = fields.series;\n\t var errorBars = point.options.errorBars;\n\t var lowValue = fields[lowField];\n\t var highValue = fields[highField];\n\n\t if (isNumber(value)) {\n\t var errorRange;\n\t if (isNumber(lowValue) && isNumber(highValue)) {\n\t errorRange = { low: lowValue, high: highValue };\n\t }\n\n\t if (errorBars && defined(errorBars[valueErrorField])) {\n\t this.seriesErrorRanges = this.seriesErrorRanges || { x: [], y: [] };\n\t this.seriesErrorRanges[field][seriesIx] = this.seriesErrorRanges[field][seriesIx] ||\n\t new ErrorRangeCalculator(errorBars[valueErrorField], series, field);\n\n\t errorRange = this.seriesErrorRanges[field][seriesIx].getErrorRange(value, errorBars[valueErrorField]);\n\t }\n\n\t if (errorRange) {\n\t this.addPointErrorBar(errorRange, point, field);\n\t }\n\t }\n\t },\n\n\t addPointErrorBar: function(errorRange, point, field) {\n\t var low = errorRange.low;\n\t var high = errorRange.high;\n\t var series = point.series;\n\t var options = point.options.errorBars;\n\t var isVertical = field === Y;\n\t var item = {};\n\n\t point[field + \"Low\"] = low;\n\t point[field + \"High\"] = high;\n\n\t point.errorBars = point.errorBars || [];\n\t var errorBar = new ScatterErrorBar(low, high, isVertical, this, series, options);\n\t point.errorBars.push(errorBar);\n\t point.append(errorBar);\n\n\t item[field] = low;\n\t this.updateRange(item, series);\n\t item[field] = high;\n\t this.updateRange(item, series);\n\t },\n\n\t addValue: function(value, fields) {\n\t var x = value.x;\n\t var y = value.y;\n\t var seriesIx = fields.seriesIx;\n\t var series = this.options.series[seriesIx];\n\t var missingValues = this.seriesMissingValues(series);\n\t var seriesPoints = this.seriesPoints[seriesIx];\n\n\t var pointValue = value;\n\t if (!(hasValue(x) && hasValue(y))) {\n\t pointValue = this.createMissingValue(pointValue, missingValues);\n\t }\n\n\t var point;\n\t if (pointValue) {\n\t point = this.createPoint(pointValue, fields);\n\t if (point) {\n\t $.extend(point, fields);\n\t this.addErrorBar(point, X, fields);\n\t this.addErrorBar(point, Y, fields);\n\t }\n\t this.updateRange(pointValue, fields.series);\n\t }\n\n\t this.points.push(point);\n\t seriesPoints.push(point);\n\t },\n\n\t seriesMissingValues: function(series) {\n\t return series.missingValues;\n\t },\n\n\t createMissingValue: function() {},\n\n\t updateRange: function(value, series) {\n\t var intlService = this.chartService.intl;\n\t var xAxisName = series.xAxis;\n\t var yAxisName = series.yAxis;\n\t var x = value.x;\n\t var y = value.y;\n\t var xAxisRange = this.xAxisRanges[xAxisName];\n\t var yAxisRange = this.yAxisRanges[yAxisName];\n\n\t if (hasValue(x)) {\n\t xAxisRange = this.xAxisRanges[xAxisName] =\n\t xAxisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n\t if (isString(x)) {\n\t x = parseDate(intlService, x);\n\t }\n\n\t xAxisRange.min = Math.min(xAxisRange.min, x);\n\t xAxisRange.max = Math.max(xAxisRange.max, x);\n\t }\n\n\t if (hasValue(y)) {\n\t yAxisRange = this.yAxisRanges[yAxisName] =\n\t yAxisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n\t if (isString(y)) {\n\t y = parseDate(intlService, y);\n\t }\n\n\t yAxisRange.min = Math.min(yAxisRange.min, y);\n\t yAxisRange.max = Math.max(yAxisRange.max, y);\n\t }\n\t },\n\n\t evalPointOptions: function(options, value, fields) {\n\t var series = fields.series;\n\t var seriesIx = fields.seriesIx;\n\t var state = { defaults: series._defaults, excluded: [ \"data\", \"tooltip\", \"content\", \"template\", \"visual\", \"toggle\", \"_outOfRangeMinPoint\", \"_outOfRangeMaxPoint\" ] };\n\n\t var doEval = this._evalSeries[seriesIx];\n\t if (!defined(doEval)) {\n\t this._evalSeries[seriesIx] = doEval = evalOptions(options, {}, state, true);\n\t }\n\n\t var pointOptions = options;\n\t if (doEval) {\n\t pointOptions = deepExtend({}, options);\n\t evalOptions(pointOptions, {\n\t value: value,\n\t series: series,\n\t dataItem: fields.dataItem\n\t }, state);\n\t }\n\n\t return pointOptions;\n\t },\n\n\t pointType: function() {\n\t return LinePoint;\n\t },\n\n\t pointOptions: function(series, seriesIx) {\n\t var options = this.seriesOptions[seriesIx];\n\t if (!options) {\n\t var defaults = this.pointType().prototype.defaults;\n\t this.seriesOptions[seriesIx] = options = deepExtend({}, defaults, {\n\t markers: {\n\t opacity: series.opacity\n\t },\n\t tooltip: {\n\t format: this.options.tooltip.format\n\t },\n\t labels: {\n\t format: this.options.labels.format\n\t }\n\t }, series);\n\t }\n\n\t return options;\n\t },\n\n\t createPoint: function(value, fields) {\n\t var series = fields.series;\n\t var pointOptions = this.pointOptions(series, fields.seriesIx);\n\t var color = fields.color || series.color;\n\n\t pointOptions = this.evalPointOptions(pointOptions, value, fields);\n\n\t if (isFunction(series.color)) {\n\t color = pointOptions.color;\n\t }\n\n\t var point = new LinePoint(value, pointOptions);\n\t point.color = color;\n\n\t this.append(point);\n\n\t return point;\n\t },\n\n\t seriesAxes: function(series) {\n\t var xAxisName = series.xAxis;\n\t var yAxisName = series.yAxis;\n\t var plotArea = this.plotArea;\n\t var xAxis = xAxisName ? plotArea.namedXAxes[xAxisName] : plotArea.axisX;\n\t var yAxis = yAxisName ? plotArea.namedYAxes[yAxisName] : plotArea.axisY;\n\n\t if (!xAxis) {\n\t throw new Error(\"Unable to locate X axis with name \" + xAxisName);\n\t }\n\n\t if (!yAxis) {\n\t throw new Error(\"Unable to locate Y axis with name \" + yAxisName);\n\t }\n\n\t return {\n\t x: xAxis,\n\t y: yAxis\n\t };\n\t },\n\n\t reflow: function(targetBox) {\n\t var this$1 = this;\n\n\t var chartPoints = this.points;\n\t var limit = !this.options.clip;\n\t var pointIx = 0;\n\n\t this.traverseDataPoints(function (value, fields) {\n\t var point = chartPoints[pointIx++];\n\t var seriesAxes = this$1.seriesAxes(fields.series);\n\t var slotX = seriesAxes.x.getSlot(value.x, value.x, limit);\n\t var slotY = seriesAxes.y.getSlot(value.y, value.y, limit);\n\n\t if (point) {\n\t if (slotX && slotY) {\n\t var pointSlot = this$1.pointSlot(slotX, slotY);\n\t point.reflow(pointSlot);\n\t } else {\n\t point.visible = false;\n\t }\n\t }\n\t });\n\n\t this.box = targetBox;\n\t },\n\n\t pointSlot: function(slotX, slotY) {\n\t return new Box(slotX.x1, slotY.y1, slotX.x2, slotY.y2);\n\t },\n\n\t traverseDataPoints: function(callback) {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var series = ref.options.series;\n\t var seriesPoints = ref.seriesPoints;\n\n\t for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n\t var currentSeries = series[seriesIx];\n\t var currentSeriesPoints = seriesPoints[seriesIx];\n\t if (!currentSeriesPoints) {\n\t seriesPoints[seriesIx] = [];\n\t }\n\n\t for (var pointIx = 0; pointIx < currentSeries.data.length; pointIx++) {\n\t var ref$1 = this$1._bindPoint(currentSeries, seriesIx, pointIx);\n\t var value = ref$1.valueFields;\n\t var fields = ref$1.fields;\n\n\t callback(value, deepExtend({\n\t pointIx: pointIx,\n\t series: currentSeries,\n\t seriesIx: seriesIx,\n\t dataItem: currentSeries.data[pointIx],\n\t owner: this$1\n\t }, fields));\n\t }\n\t }\n\t },\n\n\t formatPointValue: function(point, format) {\n\t var value = point.value;\n\t return this.chartService.format.auto(format, value.x, value.y);\n\t },\n\n\t animationPoints: function() {\n\t var points = this.points;\n\t var result = [];\n\t for (var idx = 0; idx < points.length; idx++) {\n\t result.push((points[idx] || {}).marker);\n\t }\n\t return result;\n\t }\n\t});\n\tsetDefaultOptions(ScatterChart, {\n\t series: [],\n\t tooltip: {\n\t format: \"{0}, {1}\"\n\t },\n\t labels: {\n\t format: \"{0}, {1}\"\n\t },\n\t clip: true\n\t});\n\tdeepExtend(ScatterChart.prototype, ClipAnimationMixin, {\n\t _bindPoint: CategoricalChart.prototype._bindPoint\n\t});\n\n\tvar Bubble = LinePoint.extend({\n\t init: function(value, options) {\n\t LinePoint.fn.init.call(this, value, options);\n\n\t this.category = value.category;\n\t },\n\n\t createHighlight: function() {\n\t var highlight = this.options.highlight;\n\t var border = highlight.border;\n\t var markers = this.options.markers;\n\t var center = this.box.center();\n\t var radius = (markers.size + markers.border.width + border.width) / 2;\n\t var highlightGroup = new Group();\n\t var shadow = new drawing.Circle(new geometry.Circle([ center.x, center.y + radius / 5 + border.width / 2 ], radius + border.width / 2), {\n\t stroke: {\n\t color: 'none'\n\t },\n\t fill: this.createGradient({\n\t gradient: 'bubbleShadow',\n\t color: markers.background,\n\t stops: [ {\n\t offset: 0,\n\t color: markers.background,\n\t opacity: 0.3\n\t }, {\n\t offset: 1,\n\t color: markers.background,\n\t opacity: 0\n\t } ]\n\t })\n\t });\n\t var overlay = new drawing.Circle(new geometry.Circle([ center.x, center.y ], radius), {\n\t stroke: {\n\t color: border.color ||\n\t new Color(markers.background).brightness(BORDER_BRIGHTNESS).toHex(),\n\t width: border.width,\n\t opacity: border.opacity\n\t },\n\t fill: {\n\t color: markers.background,\n\t opacity: highlight.opacity\n\t }\n\t });\n\n\t highlightGroup.append(shadow, overlay);\n\n\t return highlightGroup;\n\t }\n\t});\n\n\tBubble.prototype.defaults = deepExtend({}, Bubble.prototype.defaults, {\n\t labels: {\n\t position: CENTER\n\t },\n\t highlight: {\n\t opacity: 1,\n\t border: {\n\t color: \"#fff\",\n\t width: 2,\n\t opacity: 1\n\t }\n\t }\n\t});\n\n\tBubble.prototype.defaults.highlight.zIndex = undefined;\n\n\tvar BubbleChart = ScatterChart.extend({\n\t _initFields: function() {\n\t this._maxSize = MIN_VALUE;\n\t ScatterChart.fn._initFields.call(this);\n\t },\n\n\t addValue: function(value, fields) {\n\t if (value.size !== null && (value.size > 0 || (value.size < 0 && fields.series.negativeValues.visible))) {\n\t this._maxSize = Math.max(this._maxSize, Math.abs(value.size));\n\t ScatterChart.fn.addValue.call(this, value, fields);\n\t } else {\n\t this.points.push(null);\n\t this.seriesPoints[fields.seriesIx].push(null);\n\t }\n\t },\n\n\t reflow: function(box) {\n\t this.updateBubblesSize(box);\n\t ScatterChart.fn.reflow.call(this, box);\n\t },\n\n\t pointType: function() {\n\t return Bubble;\n\t },\n\n\t createPoint: function(value, fields) {\n\t var series = fields.series;\n\t var pointsCount = series.data.length;\n\t var delay = fields.pointIx * (INITIAL_ANIMATION_DURATION / pointsCount);\n\t var animationOptions = {\n\t delay: delay,\n\t duration: INITIAL_ANIMATION_DURATION - delay,\n\t type: BUBBLE\n\t };\n\n\t var color = fields.color || series.color;\n\t if (value.size < 0 && series.negativeValues.visible) {\n\t color = valueOrDefault(\n\t series.negativeValues.color, color\n\t );\n\t }\n\n\t var pointOptions = deepExtend({\n\t labels: {\n\t animation: {\n\t delay: delay,\n\t duration: INITIAL_ANIMATION_DURATION - delay\n\t }\n\t }\n\t }, this.pointOptions(series, fields.seriesIx), {\n\t markers: {\n\t type: CIRCLE,\n\t border: series.border,\n\t opacity: series.opacity,\n\t animation: animationOptions\n\t }\n\t });\n\n\t pointOptions = this.evalPointOptions(pointOptions, value, fields);\n\t if (isFunction(series.color)) {\n\t color = pointOptions.color;\n\t }\n\n\t pointOptions.markers.background = color;\n\n\t var point = new Bubble(value, pointOptions);\n\t point.color = color;\n\n\t this.append(point);\n\n\t return point;\n\t },\n\n\t updateBubblesSize: function(box) {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var series = ref.options.series;\n\t var boxSize = Math.min(box.width(), box.height());\n\n\t for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n\t var currentSeries = series[seriesIx];\n\t var seriesPoints = this$1.seriesPoints[seriesIx];\n\t var minSize = currentSeries.minSize || Math.max(boxSize * 0.02, 10);\n\t var maxSize = currentSeries.maxSize || boxSize * 0.2;\n\t var minR = minSize / 2;\n\t var maxR = maxSize / 2;\n\t var minArea = Math.PI * minR * minR;\n\t var maxArea = Math.PI * maxR * maxR;\n\t var areaRange = maxArea - minArea;\n\t var areaRatio = areaRange / this$1._maxSize;\n\n\t for (var pointIx = 0; pointIx < seriesPoints.length; pointIx++) {\n\t var point = seriesPoints[pointIx];\n\t if (point) {\n\t var area = Math.abs(point.value.size) * areaRatio;\n\t var radius = Math.sqrt((minArea + area) / Math.PI);\n\t var baseZIndex = valueOrDefault(point.options.zIndex, 0);\n\t var zIndex = baseZIndex + (1 - radius / maxR);\n\n\t deepExtend(point.options, {\n\t zIndex: zIndex,\n\t markers: {\n\t size: radius * 2,\n\t zIndex: zIndex\n\t },\n\t labels: {\n\t zIndex: zIndex + 1\n\t }\n\t });\n\t }\n\t }\n\t }\n\t },\n\n\t formatPointValue: function(point, format) {\n\t var value = point.value;\n\t return this.chartService.format.auto(format, value.x, value.y, value.size, point.category);\n\t },\n\n\t createAnimation: function() {},\n\n\t createVisual: function() {}\n\t});\n\n\tsetDefaultOptions(BubbleChart, {\n\t tooltip: {\n\t format: \"{3}\"\n\t },\n\t labels: {\n\t format: \"{3}\"\n\t }\n\t});\n\n\tvar Target = ShapeElement.extend({\n\n\t});\n\n\tdeepExtend(Target.prototype, PointEventsMixin);\n\n\tvar Bullet = ChartElement.extend({\n\t init: function(value, options) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.aboveAxis = this.options.aboveAxis;\n\t this.color = options.color || WHITE;\n\t this.value = value;\n\t },\n\n\t render: function() {\n\t var options = this.options;\n\n\t if (!this._rendered) {\n\t this._rendered = true;\n\n\t if (defined(this.value.target)) {\n\t this.target = new Target({\n\t type: options.target.shape,\n\t background: options.target.color || this.color,\n\t opacity: options.opacity,\n\t zIndex: options.zIndex,\n\t border: options.target.border,\n\t vAlign: TOP,\n\t align: RIGHT\n\t });\n\n\t this.target.value = this.value;\n\t this.target.dataItem = this.dataItem;\n\t this.target.series = this.series;\n\n\t this.append(this.target);\n\t }\n\n\t this.createNote();\n\t }\n\t },\n\n\t reflow: function(box) {\n\t this.render();\n\n\t var ref = this;\n\t var options = ref.options;\n\t var target = ref.target;\n\t var chart = ref.owner;\n\t var invertAxes = options.invertAxes;\n\t var valueAxis = chart.seriesValueAxis(this.options);\n\t var categorySlot = chart.categorySlot(chart.categoryAxis, options.categoryIx, valueAxis);\n\t var targetValueSlot = valueAxis.getSlot(this.value.target);\n\t var targetSlotX = invertAxes ? targetValueSlot : categorySlot;\n\t var targetSlotY = invertAxes ? categorySlot : targetValueSlot;\n\n\t if (target) {\n\t var targetSlot = new Box(\n\t targetSlotX.x1, targetSlotY.y1,\n\t targetSlotX.x2, targetSlotY.y2\n\t );\n\t target.options.height = invertAxes ? targetSlot.height() : options.target.line.width;\n\t target.options.width = invertAxes ? options.target.line.width : targetSlot.width();\n\t target.reflow(targetSlot);\n\t }\n\n\t if (this.note) {\n\t this.note.reflow(box);\n\t }\n\n\t this.box = box;\n\t },\n\n\t createVisual: function() {\n\t ChartElement.fn.createVisual.call(this);\n\n\t var options = this.options;\n\t var body = Path.fromRect(this.box.toRect(), {\n\t fill: {\n\t color: this.color,\n\t opacity: options.opacity\n\t },\n\t stroke: null\n\t });\n\n\t if (options.border.width > 0) {\n\t body.options.set(\"stroke\", {\n\t color: options.border.color || this.color,\n\t width: options.border.width,\n\t dashType: options.border.dashType,\n\t opacity: valueOrDefault(options.border.opacity, options.opacity)\n\t });\n\t }\n\n\t this.bodyVisual = body;\n\n\t alignPathToPixel(body);\n\t this.visual.append(body);\n\t },\n\n\t createAnimation: function() {\n\t if (this.bodyVisual) {\n\t this.animation = Animation.create(\n\t this.bodyVisual, this.options.animation\n\t );\n\t }\n\t },\n\n\t createHighlight: function(style) {\n\t return Path.fromRect(this.box.toRect(), style);\n\t },\n\n\t highlightVisual: function() {\n\t return this.bodyVisual;\n\t },\n\n\t highlightVisualArgs: function() {\n\t return {\n\t rect: this.box.toRect(),\n\t visual: this.bodyVisual,\n\t options: this.options\n\t };\n\t },\n\n\t formatValue: function(format) {\n\t return this.owner.formatPointValue(this, format);\n\t }\n\t});\n\n\tBullet.prototype.tooltipAnchor = Bar.prototype.tooltipAnchor;\n\n\tsetDefaultOptions(Bullet, {\n\t border: {\n\t width: 1\n\t },\n\t vertical: false,\n\t opacity: 1,\n\t target: {\n\t shape: \"\",\n\t border: {\n\t width: 0,\n\t color: \"green\"\n\t },\n\t line: {\n\t width: 2\n\t }\n\t },\n\t tooltip: {\n\t format: \"Current: {0}
Target: {1}\"\n\t }\n\t});\n\n\tdeepExtend(Bullet.prototype, PointEventsMixin);\n\tdeepExtend(Bullet.prototype, NoteMixin);\n\n\tvar BulletChart = CategoricalChart.extend({\n\t init: function(plotArea, options) {\n\n\t wrapData(options);\n\n\t CategoricalChart.fn.init.call(this, plotArea, options);\n\t },\n\n\t reflowCategories: function(categorySlots) {\n\t var children = this.children;\n\t var childrenLength = children.length;\n\n\t for (var i = 0; i < childrenLength; i++) {\n\t children[i].reflow(categorySlots[i]);\n\t }\n\t },\n\n\t plotRange: function(point) {\n\t var series = point.series;\n\t var valueAxis = this.seriesValueAxis(series);\n\t var axisCrossingValue = this.categoryAxisCrossingValue(valueAxis);\n\n\t return [ axisCrossingValue, point.value.current || axisCrossingValue ];\n\t },\n\n\t createPoint: function(data, fields) {\n\t var categoryIx = fields.categoryIx;\n\t var category = fields.category;\n\t var series = fields.series;\n\t var seriesIx = fields.seriesIx;\n\t var ref = this;\n\t var options = ref.options;\n\t var children = ref.children;\n\t var value = data.valueFields;\n\n\t var bulletOptions = deepExtend({\n\t vertical: !options.invertAxes,\n\t overlay: series.overlay,\n\t categoryIx: categoryIx,\n\t invertAxes: options.invertAxes\n\t }, series);\n\n\t var color = data.fields.color || series.color;\n\t bulletOptions = this.evalPointOptions(\n\t bulletOptions, value, category, categoryIx, series, seriesIx\n\t );\n\n\t if (isFunction(series.color)) {\n\t color = bulletOptions.color;\n\t }\n\n\t var bullet = new Bullet(value, bulletOptions);\n\t bullet.color = color;\n\n\t var cluster = children[categoryIx];\n\t if (!cluster) {\n\t cluster = new ClusterLayout({\n\t vertical: options.invertAxes,\n\t gap: options.gap,\n\t spacing: options.spacing,\n\t rtl: !options.invertAxes && (this.chartService || {}).rtl\n\t });\n\t this.append(cluster);\n\t }\n\n\t cluster.append(bullet);\n\n\t return bullet;\n\t },\n\n\t updateRange: function(value, fields) {\n\t var current = value.current;\n\t var target = value.target;\n\t var axisName = fields.series.axis;\n\t var axisRange = this.valueAxisRanges[axisName];\n\n\t if (defined(current) && !isNaN(current) && defined(target && !isNaN(target))) {\n\t axisRange = this.valueAxisRanges[axisName] =\n\t axisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n\t axisRange.min = Math.min(axisRange.min, current, target);\n\t axisRange.max = Math.max(axisRange.max, current, target);\n\t }\n\t },\n\n\t formatPointValue: function(point, format) {\n\t return this.chartService.format.auto(format, point.value.current, point.value.target);\n\t },\n\n\t pointValue: function(data) {\n\t return data.valueFields.current;\n\t },\n\n\t aboveAxis: function(point) {\n\t var value = point.value.current;\n\n\t return value > 0;\n\t },\n\n\t createAnimation: function() {\n\t var this$1 = this;\n\n\t var points = this.points;\n\n\t this._setAnimationOptions();\n\n\t for (var idx = 0; idx < points.length; idx++) {\n\t var point = points[idx];\n\t point.options.animation = this$1.options.animation;\n\t point.createAnimation();\n\t }\n\t }\n\t});\n\n\tBulletChart.prototype._setAnimationOptions = BarChart.prototype._setAnimationOptions;\n\n\tsetDefaultOptions(BulletChart, {\n\t animation: {\n\t type: BAR\n\t }\n\t});\n\n\tfunction wrapData(options) {\n\t var series = options.series;\n\n\t for (var i = 0; i < series.length; i++) {\n\t var seriesItem = series[i];\n\t var data = seriesItem.data;\n\t if (data && !isArray(data[0]) && !isObject(data[0])) {\n\t seriesItem.data = [ data ];\n\t }\n\t }\n\t}\n\n\tvar BaseTooltip = Class.extend({\n\t init: function(chartService, options) {\n\n\t this.chartService = chartService;\n\t this.options = deepExtend({}, this.options, options);\n\t },\n\n\t getStyle: function(options, point) {\n\t var background = options.background;\n\t var border = options.border.color;\n\n\t if (point) {\n\t var pointColor = point.color || point.options.color;\n\t background = valueOrDefault(background, pointColor);\n\t border = valueOrDefault(border, pointColor);\n\t }\n\n\t var padding = getSpacing(options.padding || {}, \"auto\");\n\n\t return {\n\t backgroundColor: background,\n\t borderColor: border,\n\t font: options.font,\n\t color: options.color,\n\t opacity: options.opacity,\n\t borderWidth: styleValue(options.border.width),\n\t paddingTop: styleValue(padding.top),\n\t paddingBottom: styleValue(padding.bottom),\n\t paddingLeft: styleValue(padding.left),\n\t paddingRight: styleValue(padding.right)\n\t };\n\t },\n\n\t show: function(options, tooltipOptions, point) {\n\t options.format = tooltipOptions.format;\n\n\t var style = this.getStyle(tooltipOptions, point);\n\t options.style = style;\n\n\t var background = new Color(style.backgroundColor);\n\t if (!defined(tooltipOptions.color) && !background.isDark()) {\n\t options.className = \"k-chart-tooltip-inverse\";\n\t }\n\n\t this.chartService.notify(SHOW_TOOLTIP, options);\n\n\t this.visible = true;\n\t },\n\n\t hide: function() {\n\t if (this.chartService) {\n\t this.chartService.notify(HIDE_TOOLTIP);\n\t }\n\n\t this.visible = false;\n\t },\n\n\t destroy: function() {\n\t delete this.chartService;\n\t }\n\t});\n\n\tsetDefaultOptions(BaseTooltip, {\n\t border: {\n\t width: 1\n\t },\n\t opacity: 1\n\t});\n\n\tvar CrosshairTooltip = BaseTooltip.extend({\n\t init: function(chartService, crosshair, options) {\n\t BaseTooltip.fn.init.call(this, chartService, options);\n\n\t this.crosshair = crosshair;\n\t this.formatService = chartService.format;\n\t this.initAxisName();\n\t },\n\n\t initAxisName: function() {\n\t var axis = this.crosshair.axis;\n\t var plotArea = axis.plotArea;\n\t var name;\n\t if (plotArea.categoryAxis) {\n\t name = axis.getCategory ? \"categoryAxis\" : \"valueAxis\";\n\t } else {\n\t name = axis.options.vertical ? \"yAxis\" : \"xAxis\";\n\t }\n\t this.axisName = name;\n\t },\n\n\t showAt: function(point) {\n\t var ref = this;\n\t var axis = ref.crosshair.axis;\n\t var options = ref.options;\n\t var value = axis[options.stickyMode ? \"getCategory\" : \"getValue\"](point);\n\t var formattedValue = value;\n\n\t if (options.format) {\n\t formattedValue = this.formatService.auto(options.format, value);\n\t } else if (axis.options.type === DATE) {\n\t formattedValue = this.formatService.auto(axis.options.labels.dateFormats[axis.options.baseUnit], value);\n\t }\n\n\t this.show({\n\t point: point,\n\t anchor: this.getAnchor(),\n\t crosshair: this.crosshair,\n\t value: formattedValue,\n\t axisName: this.axisName,\n\t axisIndex: this.crosshair.axis.axisIndex\n\t }, this.options);\n\t },\n\n\t hide: function() {\n\t this.chartService.notify(HIDE_TOOLTIP, {\n\t crosshair: this.crosshair,\n\t axisName: this.axisName,\n\t axisIndex: this.crosshair.axis.axisIndex\n\t });\n\t },\n\n\t getAnchor: function() {\n\t var ref = this;\n\t var crosshair = ref.crosshair;\n\t var ref_options = ref.options;\n\t var position = ref_options.position;\n\t var padding = ref_options.padding;\n\t var vertical = !crosshair.axis.options.vertical;\n\t var lineBox = crosshair.line.bbox();\n\t var horizontalAlign, verticalAlign, point;\n\n\t if (vertical) {\n\t horizontalAlign = CENTER;\n\t if (position === BOTTOM) {\n\t verticalAlign = TOP;\n\t point = lineBox.bottomLeft().translate(0, padding);\n\t } else {\n\t verticalAlign = BOTTOM;\n\t point = lineBox.topLeft().translate(0, -padding);\n\t }\n\t } else {\n\t verticalAlign = CENTER;\n\t if (position === LEFT) {\n\t horizontalAlign = RIGHT;\n\t point = lineBox.topLeft().translate(-padding, 0);\n\t } else {\n\t horizontalAlign = LEFT;\n\t point = lineBox.topRight().translate(padding, 0);\n\t }\n\t }\n\n\t return {\n\t point: point,\n\t align: {\n\t horizontal: horizontalAlign,\n\t vertical: verticalAlign\n\t }\n\t };\n\t }\n\t});\n\n\tsetDefaultOptions(CrosshairTooltip, {\n\t padding: 10\n\t});\n\n\tvar Crosshair = ChartElement.extend({\n\t init: function(chartService, axis, options) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.axis = axis;\n\t this.stickyMode = axis instanceof CategoryAxis;\n\n\t var tooltipOptions = this.options.tooltip;\n\n\t if (tooltipOptions.visible) {\n\t this.tooltip = new CrosshairTooltip(chartService, this,\n\t deepExtend({}, tooltipOptions, { stickyMode: this.stickyMode })\n\t );\n\t }\n\t },\n\n\t showAt: function(point) {\n\t this.point = point;\n\t this.moveLine();\n\t this.line.visible(true);\n\n\t if (this.tooltip) {\n\t this.tooltip.showAt(point);\n\t }\n\t },\n\n\t hide: function() {\n\t this.line.visible(false);\n\n\t if (this.tooltip) {\n\t this.tooltip.hide();\n\t }\n\t },\n\n\t moveLine: function() {\n\t var ref = this;\n\t var axis = ref.axis;\n\t var point = ref.point;\n\t var vertical = axis.options.vertical;\n\t var box = this.getBox();\n\t var dim = vertical ? Y : X;\n\t var lineStart = new GeometryPoint(box.x1, box.y1);\n\t var lineEnd;\n\n\t if (vertical) {\n\t lineEnd = new GeometryPoint(box.x2, box.y1);\n\t } else {\n\t lineEnd = new GeometryPoint(box.x1, box.y2);\n\t }\n\n\t if (point) {\n\t if (this.stickyMode) {\n\t var slot = axis.getSlot(axis.pointCategoryIndex(point));\n\t lineStart[dim] = lineEnd[dim] = slot.center()[dim];\n\t } else {\n\t lineStart[dim] = lineEnd[dim] = point[dim];\n\t }\n\t }\n\n\t this.box = box;\n\n\t this.line.moveTo(lineStart).lineTo(lineEnd);\n\t },\n\n\t getBox: function() {\n\t var axis = this.axis;\n\t var axes = axis.pane.axes;\n\t var length = axes.length;\n\t var vertical = axis.options.vertical;\n\t var box = axis.lineBox().clone();\n\t var dim = vertical ? X : Y;\n\t var axisLineBox;\n\n\t for (var i = 0; i < length; i++) {\n\t var currentAxis = axes[i];\n\t if (currentAxis.options.vertical !== vertical) {\n\t if (!axisLineBox) {\n\t axisLineBox = currentAxis.lineBox().clone();\n\t } else {\n\t axisLineBox.wrap(currentAxis.lineBox());\n\t }\n\t }\n\t }\n\n\t box[dim + 1] = axisLineBox[dim + 1];\n\t box[dim + 2] = axisLineBox[dim + 2];\n\n\t return box;\n\t },\n\n\t createVisual: function() {\n\t ChartElement.fn.createVisual.call(this);\n\n\t var options = this.options;\n\t this.line = new Path({\n\t stroke: {\n\t color: options.color,\n\t width: options.width,\n\t opacity: options.opacity,\n\t dashType: options.dashType\n\t },\n\t visible: false\n\t });\n\n\t this.moveLine();\n\t this.visual.append(this.line);\n\t },\n\n\t destroy: function() {\n\t if (this.tooltip) {\n\t this.tooltip.destroy();\n\t }\n\n\t ChartElement.fn.destroy.call(this);\n\t }\n\t});\n\n\tsetDefaultOptions(Crosshair, {\n\t color: BLACK,\n\t width: 2,\n\t zIndex: -1,\n\t tooltip: {\n\t visible: false\n\t }\n\t});\n\n\tvar ChartContainer = ChartElement.extend({\n\t init: function(options, pane) {\n\t ChartElement.fn.init.call(this, options);\n\t this.pane = pane;\n\t },\n\n\t shouldClip: function() {\n\t var children = this.children;\n\t var length = children.length;\n\n\t for (var i = 0; i < length; i++) {\n\t if (children[i].options.clip === true) {\n\t return true;\n\t }\n\t }\n\t return false;\n\t },\n\n\t _clipBox: function() {\n\t return this.pane.chartsBox();\n\t },\n\n\t createVisual: function() {\n\t this.visual = new Group({\n\t zIndex: 0\n\t });\n\n\t if (this.shouldClip()) {\n\t var clipBox = this.clipBox = this._clipBox();\n\t var clipRect = clipBox.toRect();\n\t var clipPath = Path.fromRect(clipRect);\n\t alignPathToPixel(clipPath);\n\n\t this.visual.clip(clipPath);\n\t this.unclipLabels();\n\t }\n\t },\n\n\t stackRoot: function() {\n\t return this;\n\t },\n\n\t unclipLabels: function() {\n\t var ref = this;\n\t var charts = ref.children;\n\t var clipBox = ref.clipBox;\n\n\t for (var i = 0; i < charts.length; i++) {\n\t var points = charts[i].points || {};\n\t var length = points.length;\n\n\t for (var j = 0; j < length; j++) {\n\t var point = points[j];\n\t if (point && point.visible !== false && point.overlapsBox && point.overlapsBox(clipBox)) {\n\t if (point.unclipElements) {\n\t point.unclipElements();\n\t } else {\n\t var label = point.label;\n\t var note = point.note;\n\n\t if (label && label.options.visible) {\n\t if (label.alignToClipBox) {\n\t label.alignToClipBox(clipBox);\n\t }\n\t label.options.noclip = true;\n\t }\n\n\t if (note && note.options.visible) {\n\t note.options.noclip = true;\n\t }\n\t }\n\t }\n\t }\n\t }\n\t },\n\n\t destroy: function() {\n\t ChartElement.fn.destroy.call(this);\n\n\t delete this.parent;\n\t }\n\t});\n\n\tChartContainer.prototype.isStackRoot = true;\n\n\tvar Pane = BoxElement.extend({\n\t init: function(options) {\n\t BoxElement.fn.init.call(this, options);\n\n\t this.id = paneID();\n\n\t this.createTitle();\n\n\t this.content = new ChartElement();\n\n\t this.chartContainer = new ChartContainer({}, this);\n\t this.append(this.content);\n\n\t this.axes = [];\n\t this.charts = [];\n\t },\n\n\t createTitle: function() {\n\t var titleOptions = this.options.title;\n\t if (isObject(titleOptions)) {\n\t titleOptions = deepExtend({}, titleOptions, {\n\t align: titleOptions.position,\n\t position: TOP\n\t });\n\t }\n\n\t this.title = dataviz.Title.buildTitle(titleOptions, this, Pane.prototype.options.title);\n\t },\n\n\t appendAxis: function(axis) {\n\t this.content.append(axis);\n\t this.axes.push(axis);\n\t axis.pane = this;\n\t },\n\n\t appendAxisAt: function(axis, pos) {\n\t this.content.append(axis);\n\t this.axes.splice(pos, 0, axis);\n\t axis.pane = this;\n\t },\n\n\t appendChart: function(chart) {\n\t if (this.chartContainer.parent !== this.content) {\n\t this.content.append(this.chartContainer);\n\t }\n\n\t this.charts.push(chart);\n\t this.chartContainer.append(chart);\n\t chart.pane = this;\n\t },\n\n\t empty: function() {\n\t var this$1 = this;\n\n\t var plotArea = this.parent;\n\n\t if (plotArea) {\n\t for (var i = 0; i < this.axes.length; i++) {\n\t plotArea.removeAxis(this$1.axes[i]);\n\t }\n\n\t for (var i$1 = 0; i$1 < this.charts.length; i$1++) {\n\t plotArea.removeChart(this$1.charts[i$1]);\n\t }\n\t }\n\n\t this.axes = [];\n\t this.charts = [];\n\n\t this.content.destroy();\n\t this.content.children = [];\n\t this.chartContainer.children = [];\n\t },\n\n\t reflow: function(targetBox) {\n\t // Content (such as charts) is rendered, but excluded from reflows\n\t var content;\n\t if (last(this.children) === this.content) {\n\t content = this.children.pop();\n\t }\n\n\t BoxElement.fn.reflow.call(this, targetBox);\n\n\t if (content) {\n\t this.children.push(content);\n\t }\n\n\t if (this.title) {\n\t this.contentBox.y1 += this.title.box.height();\n\t }\n\t },\n\n\t visualStyle: function() {\n\t var style = BoxElement.fn.visualStyle.call(this);\n\t style.zIndex = -10;\n\n\t return style;\n\t },\n\n\t renderComplete: function() {\n\t if (this.options.visible) {\n\t this.createGridLines();\n\t }\n\t },\n\n\t stackRoot: function() {\n\t return this;\n\t },\n\n\t clipRoot: function() {\n\t return this;\n\t },\n\n\t createGridLines: function() {\n\t var axes = this.axes;\n\t var allAxes = axes.concat(this.parent.axes);\n\t var vGridLines = [];\n\t var hGridLines = [];\n\n\t // TODO\n\t // Is full combination really necessary?\n\t for (var i = 0; i < axes.length; i++) {\n\t var axis = axes[i];\n\t var vertical = axis.options.vertical;\n\t var gridLines = vertical ? vGridLines : hGridLines;\n\t for (var j = 0; j < allAxes.length; j++) {\n\t if (gridLines.length === 0) {\n\t var altAxis = allAxes[j];\n\t if (vertical !== altAxis.options.vertical) {\n\t append(gridLines, axis.createGridLines(altAxis));\n\t }\n\t }\n\t }\n\t }\n\t },\n\n\t refresh: function() {\n\t this.visual.clear();\n\n\t this.content.parent = null;\n\t this.content.createGradient = this.createGradient.bind(this);\n\t this.content.renderVisual();\n\t this.content.parent = this;\n\n\t if (this.title) {\n\t this.visual.append(this.title.visual);\n\t }\n\n\t this.visual.append(this.content.visual);\n\n\t this.renderComplete();\n\t this.notifyRender();\n\t },\n\n\t chartsBox: function() {\n\t var axes = this.axes;\n\t var length = axes.length;\n\t var chartsBox = new Box();\n\n\t for (var idx = 0; idx < length; idx++) {\n\t var axis = axes[idx];\n\t var axisValueField = axis.options.vertical ? Y : X;\n\t var lineBox = axis.lineBox();\n\t chartsBox[axisValueField + 1] = lineBox[axisValueField + 1];\n\t chartsBox[axisValueField + 2] = lineBox[axisValueField + 2];\n\t }\n\n\t if (chartsBox.x2 === 0) {\n\t var allAxes = this.parent.axes;\n\t var length$1 = allAxes.length;\n\n\t for (var idx$1 = 0; idx$1 < length$1; idx$1++) {\n\t var axis$1 = allAxes[idx$1];\n\t if (!axis$1.options.vertical) {\n\t var lineBox$1 = axis$1.lineBox();\n\t chartsBox.x1 = lineBox$1.x1;\n\t chartsBox.x2 = lineBox$1.x2;\n\t }\n\t }\n\t }\n\t return chartsBox;\n\t },\n\n\t clipBox: function() {\n\t return this.chartContainer.clipBox;\n\t },\n\n\t notifyRender: function() {\n\t var service = this.getService();\n\t if (service) {\n\t service.notify(PANE_RENDER, {\n\t pane: new ChartPane(this),\n\t index: this.paneIndex,\n\t name: this.options.name\n\t });\n\t }\n\t }\n\t});\n\n\tvar ID = 1;\n\n\tfunction paneID() {\n\t return \"pane\" + ID++;\n\t}\n\n\tPane.prototype.isStackRoot = true;\n\n\tsetDefaultOptions(Pane, {\n\t zIndex: -1,\n\t shrinkToFit: true,\n\t title: {\n\t align: LEFT\n\t },\n\t visible: true\n\t});\n\n\tfunction appendIfNotNull(array, element) {\n\t if (element !== null) {\n\t array.push(element);\n\t }\n\t}\n\n\tfunction segmentVisible(series, fields, index) {\n\t var visible = fields.visible;\n\t if (defined(visible)) {\n\t return visible;\n\t }\n\n\t var pointVisibility = series.pointVisibility;\n\t if (pointVisibility) {\n\t return pointVisibility[index];\n\t }\n\t}\n\n\tfunction bindSegments(series) {\n\t var data = series.data;\n\t var points = [];\n\t var sum = 0;\n\t var count = 0;\n\n\t for (var idx = 0; idx < data.length; idx++) {\n\t var pointData = SeriesBinder.current.bindPoint(series, idx);\n\t var value = pointData.valueFields.value;\n\n\t if (isString(value)) {\n\t value = parseFloat(value);\n\t }\n\n\t if (isNumber(value)) {\n\t pointData.visible = segmentVisible(series, pointData.fields, idx) !== false;\n\n\t pointData.value = Math.abs(value);\n\t points.push(pointData);\n\n\t if (pointData.visible) {\n\t sum += pointData.value;\n\t }\n\n\t if (value !== 0) {\n\t count++;\n\t }\n\t } else {\n\t points.push(null);\n\t }\n\t }\n\n\t return {\n\t total: sum,\n\t points: points,\n\t count: count\n\t };\n\t}\n\n\tfunction equalsIgnoreCase(a, b) {\n\t if (a && b) {\n\t return a.toLowerCase() === b.toLowerCase();\n\t }\n\n\t return a === b;\n\t}\n\n\tfunction filterSeriesByType(series, types) {\n\t var result = [];\n\n\t var seriesTypes = [].concat(types);\n\t for (var idx = 0; idx < series.length; idx++) {\n\t var currentSeries = series[idx];\n\t if (inArray(currentSeries.type, seriesTypes)) {\n\t result.push(currentSeries);\n\t }\n\t }\n\n\t return result;\n\t}\n\n\tfunction getDateField(field, row, intlService) {\n\t if (row === null) {\n\t return row;\n\t }\n\n\t var key = \"_date_\" + field;\n\t var value = row[key];\n\n\t if (!value) {\n\t value = parseDate(intlService, getter(field, true)(row));\n\t row[key] = value;\n\t }\n\n\t return value;\n\t}\n\n\tfunction isDateAxis(axisOptions, sampleCategory) {\n\t var type = axisOptions.type;\n\t var dateCategory = sampleCategory instanceof Date;\n\n\t return (!type && dateCategory) || equalsIgnoreCase(type, DATE);\n\t}\n\n\tfunction singleItemOrArray(array) {\n\t return array.length === 1 ? array[0] : array;\n\t}\n\n\tvar AREA_REGEX = /area/i;\n\n\tfunction seriesMissingValues(series) {\n\t if (series.missingValues) {\n\t return series.missingValues;\n\t }\n\n\t return AREA_REGEX.test(series.type) || series.stack ? ZERO : INTERPOLATE;\n\t}\n\n\tfunction hasValue$1(series, item) {\n\t var fields = SeriesBinder.current.bindPoint(series, null, item);\n\t var valueFields = fields.valueFields;\n\n\t for (var field in valueFields) {\n\t if (dataviz.convertableToNumber(valueFields[field])) {\n\t return true;\n\t }\n\t }\n\t}\n\n\tfunction findNext(ref) {\n\t var start = ref.start;\n\t var dir = ref.dir;\n\t var min = ref.min;\n\t var max = ref.max;\n\t var getter$$1 = ref.getter;\n\t var hasItem = ref.hasItem;\n\t var series = ref.series;\n\n\t var pointHasValue, outPoint;\n\t var idx = start;\n\t do {\n\t idx += dir;\n\t //aggregating and binding the item takes too much time for large number of categories\n\t //will assume that if the aggregation does not create value for a missing item for one it will not create for others\n\t if (hasItem(idx)) {\n\t outPoint = getter$$1(idx);\n\t pointHasValue = hasValue$1(series, outPoint.item);\n\t }\n\t } while (min <= idx && idx <= max && !pointHasValue);\n\n\t if (pointHasValue) {\n\t return outPoint;\n\t }\n\t}\n\n\tfunction createOutOfRangePoints(series, range, count, getter$$1, hasItem) {\n\t var min = range.min;\n\t var max = range.max;\n\t var hasMinPoint = min > 0 && min < count;\n\t var hasMaxPoint = max + 1 < count;\n\n\t if (hasMinPoint || hasMaxPoint) {\n\t var missingValues = seriesMissingValues(series);\n\t var minPoint, maxPoint;\n\t if (missingValues !== INTERPOLATE) {\n\t if (hasMinPoint) {\n\t minPoint = getter$$1(min - 1);\n\t }\n\n\t if (hasMaxPoint) {\n\t maxPoint = getter$$1(max + 1);\n\t }\n\t } else {\n\t var outPoint, pointHasValue;\n\t if (hasMinPoint) {\n\t outPoint = getter$$1(min - 1);\n\t pointHasValue = hasValue$1(series, outPoint.item);\n\t if (!pointHasValue) {\n\t minPoint = findNext({\n\t start: min,\n\t dir: -1,\n\t min: 0,\n\t max: count - 1,\n\t getter: getter$$1,\n\t hasItem: hasItem,\n\t series: series\n\t });\n\t } else {\n\t minPoint = outPoint;\n\t }\n\t }\n\n\t if (hasMaxPoint) {\n\t outPoint = getter$$1(max + 1);\n\t pointHasValue = hasValue$1(series, outPoint.item);\n\t if (!pointHasValue) {\n\t maxPoint = findNext({\n\t start: max,\n\t dir: 1,\n\t min: 0,\n\t max: count - 1,\n\t getter: getter$$1,\n\t hasItem: hasItem,\n\t series: series\n\t });\n\t } else {\n\t maxPoint = outPoint;\n\t }\n\t }\n\t }\n\n\t if (minPoint) {\n\t series._outOfRangeMinPoint = minPoint;\n\t }\n\n\t if (maxPoint) {\n\t series._outOfRangeMaxPoint = maxPoint;\n\t }\n\t }\n\t}\n\n\tvar PlotAreaBase = ChartElement.extend({\n\t init: function(series, options, chartService) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.initFields(series, options);\n\t this.series = series;\n\t this.initSeries();\n\t this.charts = [];\n\t this.options.legend = this.options.legend || {};\n\t this.options.legend.items = [];\n\t this.axes = [];\n\t this.crosshairs = [];\n\t this.chartService = chartService;\n\t this.originalOptions = options;\n\n\t this.createPanes();\n\t this.render();\n\t this.createCrosshairs();\n\t },\n\n\t initFields: function() { },\n\n\t initSeries: function() {\n\t var series = this.series;\n\n\t for (var i = 0; i < series.length; i++) {\n\t series[i].index = i;\n\t }\n\t },\n\n\t createPanes: function() {\n\t var this$1 = this;\n\n\t var titleOptions = this.options.title || {};\n\t var paneDefaults = this.options.paneDefaults;\n\t var paneOptions = this.options.panes || [];\n\t var panesLength = Math.max(paneOptions.length, 1);\n\t var panes = [];\n\n\t var defaults = deepExtend({\n\t title: {\n\t color: titleOptions.color\n\t }\n\t }, paneDefaults);\n\n\t for (var i = 0; i < panesLength; i++) {\n\t var options = deepExtend({}, defaults, paneOptions[i]);\n\t if (isString(options.title)) {\n\t options.title = deepExtend({ text: options.title }, defaults.title);\n\t }\n\n\t var currentPane = new Pane(options);\n\t currentPane.paneIndex = i;\n\n\t panes.push(currentPane);\n\t this$1.append(currentPane);\n\t }\n\n\t this.panes = panes;\n\t },\n\n\t crosshairOptions: function(axis) {\n\t return axis.options.crosshair;\n\t },\n\n\t createCrosshairs: function(panes) {\n\t var this$1 = this;\n\t if (panes === void 0) { panes = this.panes; }\n\n\t for (var i = 0; i < panes.length; i++) {\n\t var pane = panes[i];\n\t for (var j = 0; j < pane.axes.length; j++) {\n\t var axis = pane.axes[j];\n\t var options = this$1.crosshairOptions(axis);\n\t if (options && options.visible) {\n\t var currentCrosshair = new Crosshair(this$1.chartService, axis, options);\n\n\t this$1.crosshairs.push(currentCrosshair);\n\t pane.content.append(currentCrosshair);\n\t }\n\t }\n\t }\n\t },\n\n\t removeCrosshairs: function(pane) {\n\t var crosshairs = this.crosshairs;\n\t var axes = pane.axes;\n\n\t for (var i = crosshairs.length - 1; i >= 0; i--) {\n\t for (var j = 0; j < axes.length; j++) {\n\t if (crosshairs[i].axis === axes[j]) {\n\t crosshairs.splice(i, 1);\n\t break;\n\t }\n\t }\n\t }\n\t },\n\n\t hideCrosshairs: function() {\n\t var crosshairs = this.crosshairs;\n\t for (var idx = 0; idx < crosshairs.length; idx++) {\n\t crosshairs[idx].hide();\n\t }\n\t },\n\n\t findPane: function(name) {\n\t var panes = this.panes;\n\t var matchingPane;\n\n\t for (var i = 0; i < panes.length; i++) {\n\t if (panes[i].options.name === name) {\n\t matchingPane = panes[i];\n\t break;\n\t }\n\t }\n\n\t return matchingPane || panes[0];\n\t },\n\n\t findPointPane: function(point) {\n\t var panes = this.panes;\n\t var matchingPane;\n\n\t for (var i = 0; i < panes.length; i++) {\n\t if (panes[i].box.containsPoint(point)) {\n\t matchingPane = panes[i];\n\t break;\n\t }\n\t }\n\n\t return matchingPane;\n\t },\n\n\t appendAxis: function(axis) {\n\t var pane = this.findPane(axis.options.pane);\n\n\t pane.appendAxis(axis);\n\t this.axes.push(axis);\n\t axis.plotArea = this;\n\t },\n\n\t removeAxis: function(axisToRemove) {\n\t var this$1 = this;\n\n\t var filteredAxes = [];\n\n\t for (var i = 0; i < this.axes.length; i++) {\n\t var axis = this$1.axes[i];\n\t if (axisToRemove !== axis) {\n\t filteredAxes.push(axis);\n\t } else {\n\t axis.destroy();\n\t }\n\t }\n\n\t this.axes = filteredAxes;\n\t },\n\n\t appendChart: function(chart, pane) {\n\t this.charts.push(chart);\n\t if (pane) {\n\t pane.appendChart(chart);\n\t } else {\n\t this.append(chart);\n\t }\n\t },\n\n\t removeChart: function(chartToRemove) {\n\t var this$1 = this;\n\n\t var filteredCharts = [];\n\n\t for (var i = 0; i < this.charts.length; i++) {\n\t var chart = this$1.charts[i];\n\t if (chart !== chartToRemove) {\n\t filteredCharts.push(chart);\n\t } else {\n\t chart.destroy();\n\t }\n\t }\n\n\t this.charts = filteredCharts;\n\t },\n\n\t addToLegend: function(series) {\n\t var count = series.length;\n\t var legend = this.options.legend;\n\t var labels = legend.labels || {};\n\t var inactiveItems = legend.inactiveItems || {};\n\t var inactiveItemsLabels = inactiveItems.labels || {};\n\t var data = [];\n\n\t for (var i = 0; i < count; i++) {\n\t var currentSeries = series[i];\n\t var seriesVisible = currentSeries.visible !== false;\n\t if (currentSeries.visibleInLegend === false) {\n\t continue;\n\t }\n\n\t var text = currentSeries.name;\n\t var labelTemplate = seriesVisible ? getTemplate(labels) : getTemplate(inactiveItemsLabels) || getTemplate(labels);\n\t if (labelTemplate) {\n\t text = labelTemplate({\n\t text: hasValue(text) ? text : \"\",\n\t series: currentSeries\n\t });\n\t }\n\n\t var defaults = currentSeries._defaults;\n\t var color = currentSeries.color;\n\t if (isFunction(color) && defaults) {\n\t color = defaults.color;\n\t }\n\n\t var itemLabelOptions = (void 0), markerColor = (void 0);\n\t if (seriesVisible) {\n\t itemLabelOptions = {};\n\t markerColor = color;\n\t } else {\n\t itemLabelOptions = {\n\t color: inactiveItemsLabels.color,\n\t font: inactiveItemsLabels.font\n\t };\n\t markerColor = inactiveItems.markers.color;\n\t }\n\n\t if (hasValue(text) && text !== \"\") {\n\t data.push({\n\t text: text,\n\t labels: itemLabelOptions,\n\t markerColor: markerColor,\n\t series: currentSeries,\n\t active: seriesVisible\n\t });\n\t }\n\t }\n\n\t append(legend.items, data);\n\t },\n\n\t groupAxes: function(panes) {\n\t var xAxes = [];\n\t var yAxes = [];\n\n\t for (var paneIx = 0; paneIx < panes.length; paneIx++) {\n\t var paneAxes = panes[paneIx].axes;\n\t for (var axisIx = 0; axisIx < paneAxes.length; axisIx++) {\n\t var axis = paneAxes[axisIx];\n\t if (axis.options.vertical) {\n\t yAxes.push(axis);\n\t } else {\n\t xAxes.push(axis);\n\t }\n\t }\n\t }\n\n\t return { x: xAxes, y: yAxes, any: xAxes.concat(yAxes) };\n\t },\n\n\t groupSeriesByPane: function() {\n\t var this$1 = this;\n\n\t var series = this.series;\n\t var seriesByPane = {};\n\n\t for (var i = 0; i < series.length; i++) {\n\t var currentSeries = series[i];\n\t var pane = this$1.seriesPaneName(currentSeries);\n\n\t if (seriesByPane[pane]) {\n\t seriesByPane[pane].push(currentSeries);\n\t } else {\n\t seriesByPane[pane] = [ currentSeries ];\n\t }\n\t }\n\n\t return seriesByPane;\n\t },\n\n\t filterVisibleSeries: function(series) {\n\t var result = [];\n\n\t for (var i = 0; i < series.length; i++) {\n\t var currentSeries = series[i];\n\t if (currentSeries.visible !== false) {\n\t result.push(currentSeries);\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t reflow: function(targetBox) {\n\t var options = this.options.plotArea;\n\t var panes = this.panes;\n\t var margin = getSpacing(options.margin);\n\n\t this.box = targetBox.clone().unpad(margin);\n\t this.reflowPanes();\n\n\t this.detachLabels();\n\t this.reflowAxes(panes);\n\t this.reflowCharts(panes);\n\t },\n\n\t redraw: function(panes) {\n\t var this$1 = this;\n\n\t var panesArray = [].concat(panes);\n\t this.initSeries();\n\n\t //prevents leak during partial redraws. the cached gradients observers retain reference to the destroyed elements.\n\t var root = this.getRoot();\n\t if (root) {\n\t root.cleanGradients();\n\t }\n\n\t for (var i = 0; i < panesArray.length; i++) {\n\t this$1.removeCrosshairs(panesArray[i]);\n\t panesArray[i].empty();\n\t }\n\n\t this.render(panesArray);\n\t this.detachLabels();\n\t this.reflowAxes(this.panes);\n\t this.reflowCharts(panesArray);\n\n\t this.createCrosshairs(panesArray);\n\n\t for (var i$1 = 0; i$1 < panesArray.length; i$1++) {\n\t panesArray[i$1].refresh();\n\t }\n\t },\n\n\t axisCrossingValues: function(axis, crossingAxes) {\n\t var options = axis.options;\n\t var crossingValues = [].concat(\n\t options.axisCrossingValues || options.axisCrossingValue\n\t );\n\t var valuesToAdd = crossingAxes.length - crossingValues.length;\n\t var defaultValue = crossingValues[0] || 0;\n\n\t for (var i = 0; i < valuesToAdd; i++) {\n\t crossingValues.push(defaultValue);\n\t }\n\n\t return crossingValues;\n\t },\n\n\t alignAxisTo: function(axis, targetAxis, crossingValue, targetCrossingValue) {\n\t var slot = axis.getSlot(crossingValue, crossingValue, true);\n\t var slotEdge = axis.options.reverse ? 2 : 1;\n\t var targetSlot = targetAxis.getSlot(targetCrossingValue, targetCrossingValue, true);\n\t var targetEdge = targetAxis.options.reverse ? 2 : 1;\n\t var axisBox = axis.box.translate(\n\t targetSlot[X + targetEdge] - slot[X + slotEdge],\n\t targetSlot[Y + targetEdge] - slot[Y + slotEdge]\n\t );\n\n\t if (axis.pane !== targetAxis.pane) {\n\t axisBox.translate(0, axis.pane.box.y1 - targetAxis.pane.box.y1);\n\t }\n\n\t axis.reflow(axisBox);\n\t },\n\n\t alignAxes: function(xAxes, yAxes) {\n\t var this$1 = this;\n\n\t var xAnchor = xAxes[0];\n\t var yAnchor = yAxes[0];\n\t var xAnchorCrossings = this.axisCrossingValues(xAnchor, yAxes);\n\t var yAnchorCrossings = this.axisCrossingValues(yAnchor, xAxes);\n\t var leftAnchors = {};\n\t var rightAnchors = {};\n\t var topAnchors = {};\n\t var bottomAnchors = {};\n\n\t for (var i = 0; i < yAxes.length; i++) {\n\t var axis = yAxes[i];\n\t var pane = axis.pane;\n\t var paneId = pane.id;\n\t var visible = axis.options.visible !== false;\n\n\t // Locate pane anchor, if any, and use its axisCrossingValues\n\t var anchor = paneAnchor(xAxes, pane) || xAnchor;\n\t var anchorCrossings = xAnchorCrossings;\n\n\t if (anchor !== xAnchor) {\n\t anchorCrossings = this$1.axisCrossingValues(anchor, yAxes);\n\t }\n\n\t this$1.alignAxisTo(axis, anchor, yAnchorCrossings[i], anchorCrossings[i]);\n\n\t if (axis.options._overlap) {\n\t continue;\n\t }\n\n\t if (round(axis.lineBox().x1) === round(anchor.lineBox().x1)) {\n\t // Push the axis to the left the previous y-axis so they don't overlap\n\t if (leftAnchors[paneId]) {\n\t axis.reflow(axis.box\n\t .alignTo(leftAnchors[paneId].box, LEFT)\n\t .translate(-axis.options.margin, 0)\n\t );\n\t }\n\n\t if (visible) {\n\t leftAnchors[paneId] = axis;\n\t }\n\t }\n\n\t if (round(axis.lineBox().x2) === round(anchor.lineBox().x2)) {\n\t // Flip the labels on the right if we're at the right end of the pane\n\t if (!axis._mirrored) {\n\t axis.options.labels.mirror = !axis.options.labels.mirror;\n\t axis._mirrored = true;\n\t }\n\n\t this$1.alignAxisTo(axis, anchor, yAnchorCrossings[i], anchorCrossings[i]);\n\n\t // Push the axis to the right the previous y-axis so they don't overlap\n\t if (rightAnchors[paneId]) {\n\t axis.reflow(axis.box\n\t .alignTo(rightAnchors[paneId].box, RIGHT)\n\t .translate(axis.options.margin, 0)\n\t );\n\t }\n\n\t if (visible) {\n\t rightAnchors[paneId] = axis;\n\t }\n\t }\n\n\t if (i !== 0 && yAnchor.pane === axis.pane) {\n\t axis.alignTo(yAnchor);\n\t axis.reflow(axis.box);\n\t }\n\t }\n\n\t for (var i$1 = 0; i$1 < xAxes.length; i$1++) {\n\t var axis$1 = xAxes[i$1];\n\t var pane$1 = axis$1.pane;\n\t var paneId$1 = pane$1.id;\n\t var visible$1 = axis$1.options.visible !== false;\n\n\t // Locate pane anchor and use its axisCrossingValues\n\t var anchor$1 = paneAnchor(yAxes, pane$1) || yAnchor;\n\t var anchorCrossings$1 = yAnchorCrossings;\n\t if (anchor$1 !== yAnchor) {\n\t anchorCrossings$1 = this$1.axisCrossingValues(anchor$1, xAxes);\n\t }\n\n\t this$1.alignAxisTo(axis$1, anchor$1, xAnchorCrossings[i$1], anchorCrossings$1[i$1]);\n\n\t if (axis$1.options._overlap) {\n\t continue;\n\t }\n\n\t if (round(axis$1.lineBox().y1) === round(anchor$1.lineBox().y1)) {\n\t // Flip the labels on top if we're at the top of the pane\n\t if (!axis$1._mirrored) {\n\t axis$1.options.labels.mirror = !axis$1.options.labels.mirror;\n\t axis$1._mirrored = true;\n\t }\n\t this$1.alignAxisTo(axis$1, anchor$1, xAnchorCrossings[i$1], anchorCrossings$1[i$1]);\n\n\t // Push the axis above the previous x-axis so they don't overlap\n\t if (topAnchors[paneId$1]) {\n\t axis$1.reflow(axis$1.box\n\t .alignTo(topAnchors[paneId$1].box, TOP)\n\t .translate(0, -axis$1.options.margin)\n\t );\n\t }\n\n\t if (visible$1) {\n\t topAnchors[paneId$1] = axis$1;\n\t }\n\t }\n\n\t if (round(axis$1.lineBox().y2, datavizConstants.COORD_PRECISION) === round(anchor$1.lineBox().y2, datavizConstants.COORD_PRECISION)) {\n\t // Push the axis below the previous x-axis so they don't overlap\n\t if (bottomAnchors[paneId$1]) {\n\t axis$1.reflow(axis$1.box\n\t .alignTo(bottomAnchors[paneId$1].box, BOTTOM)\n\t .translate(0, axis$1.options.margin)\n\t );\n\t }\n\n\t if (visible$1) {\n\t bottomAnchors[paneId$1] = axis$1;\n\t }\n\t }\n\n\t if (i$1 !== 0) {\n\t axis$1.alignTo(xAnchor);\n\t axis$1.reflow(axis$1.box);\n\t }\n\t }\n\t },\n\n\t shrinkAxisWidth: function(panes) {\n\t var axes = this.groupAxes(panes).any;\n\t var axisBox = axisGroupBox(axes);\n\t var overflowX = 0;\n\n\t for (var i = 0; i < panes.length; i++) {\n\t var currentPane = panes[i];\n\n\t if (currentPane.axes.length > 0) {\n\t overflowX = Math.max(\n\t overflowX,\n\t axisBox.width() - currentPane.contentBox.width()\n\t );\n\t }\n\t }\n\n\t if (overflowX !== 0) {\n\t for (var i$1 = 0; i$1 < axes.length; i$1++) {\n\t var currentAxis = axes[i$1];\n\n\t if (!currentAxis.options.vertical) {\n\t currentAxis.reflow(currentAxis.box.shrink(overflowX, 0));\n\t }\n\t }\n\t }\n\t },\n\n\t shrinkAxisHeight: function(panes) {\n\t var shrinked;\n\n\t for (var i = 0; i < panes.length; i++) {\n\t var currentPane = panes[i];\n\t var axes = currentPane.axes;\n\t var overflowY = Math.max(0, axisGroupBox(axes).height() - currentPane.contentBox.height());\n\n\t if (overflowY !== 0) {\n\t for (var j = 0; j < axes.length; j++) {\n\t var currentAxis = axes[j];\n\n\t if (currentAxis.options.vertical) {\n\t currentAxis.reflow(\n\t currentAxis.box.shrink(0, overflowY)\n\t );\n\t }\n\t }\n\t shrinked = true;\n\t }\n\t }\n\n\t return shrinked;\n\t },\n\n\t fitAxes: function(panes) {\n\t var axes = this.groupAxes(panes).any;\n\t var offsetX = 0;\n\n\t for (var i = 0; i < panes.length; i++) {\n\t var currentPane = panes[i];\n\t var paneAxes = currentPane.axes;\n\t var paneBox = currentPane.contentBox;\n\n\t if (paneAxes.length > 0) {\n\t var axisBox = axisGroupBox(paneAxes);\n\t // OffsetY is calculated and applied per pane\n\t var offsetY = Math.max(paneBox.y1 - axisBox.y1, paneBox.y2 - axisBox.y2);\n\n\t // OffsetX is calculated and applied globally\n\t offsetX = Math.max(offsetX, paneBox.x1 - axisBox.x1);\n\n\t for (var j = 0; j < paneAxes.length; j++) {\n\t var currentAxis = paneAxes[j];\n\n\t currentAxis.reflow(\n\t currentAxis.box.translate(0, offsetY)\n\t );\n\t }\n\t }\n\t }\n\n\t for (var i$1 = 0; i$1 < axes.length; i$1++) {\n\t var currentAxis$1 = axes[i$1];\n\n\t currentAxis$1.reflow(\n\t currentAxis$1.box.translate(offsetX, 0)\n\t );\n\t }\n\t },\n\n\t reflowAxes: function(panes) {\n\t var this$1 = this;\n\n\t var axes = this.groupAxes(panes);\n\n\t for (var i = 0; i < panes.length; i++) {\n\t this$1.reflowPaneAxes(panes[i]);\n\t }\n\n\t if (axes.x.length > 0 && axes.y.length > 0) {\n\t this.alignAxes(axes.x, axes.y);\n\t this.shrinkAxisWidth(panes);\n\n\t this.autoRotateAxisLabels(axes);\n\n\t this.alignAxes(axes.x, axes.y);\n\t if (this.shrinkAxisWidth(panes)) {\n\t this.alignAxes(axes.x, axes.y);\n\t }\n\n\t this.shrinkAxisHeight(panes);\n\t this.alignAxes(axes.x, axes.y);\n\n\t if (this.shrinkAxisHeight(panes)) {\n\t this.alignAxes(axes.x, axes.y);\n\t }\n\n\t this.fitAxes(panes);\n\t }\n\t },\n\n\t autoRotateAxisLabels: function(groupedAxes) {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var panes = ref.panes;\n\t var axes = allPaneAxes(panes);\n\t var rotated;\n\n\t for (var idx = 0; idx < axes.length; idx++) {\n\t var axis = axes[idx];\n\t if (axis.autoRotateLabels()) {\n\t rotated = true;\n\t }\n\t }\n\n\t if (rotated) {\n\t for (var idx$1 = 0; idx$1 < panes.length; idx$1++) {\n\t this$1.reflowPaneAxes(panes[idx$1]);\n\t }\n\n\t if (groupedAxes.x.length > 0 && groupedAxes.y.length > 0) {\n\t this.alignAxes(groupedAxes.x, groupedAxes.y);\n\t this.shrinkAxisWidth(panes);\n\t }\n\t }\n\t },\n\n\t reflowPaneAxes: function(pane) {\n\t var axes = pane.axes;\n\t var length = axes.length;\n\n\t if (length > 0) {\n\t for (var i = 0; i < length; i++) {\n\t axes[i].reflow(pane.contentBox);\n\t }\n\t }\n\t },\n\n\t reflowCharts: function(panes) {\n\t var charts = this.charts;\n\t var count = charts.length;\n\t var box = this.box;\n\n\t for (var i = 0; i < count; i++) {\n\t var chartPane = charts[i].pane;\n\t if (!chartPane || inArray(chartPane, panes)) {\n\t charts[i].reflow(box);\n\t }\n\t }\n\t },\n\n\t reflowPanes: function() {\n\t var ref = this;\n\t var box = ref.box;\n\t var panes = ref.panes;\n\t var panesLength = panes.length;\n\t var remainingHeight = box.height();\n\t var remainingPanes = panesLength;\n\t var autoHeightPanes = 0;\n\t var top = box.y1;\n\n\t for (var i = 0; i < panesLength; i++) {\n\t var currentPane = panes[i];\n\t var height = currentPane.options.height;\n\n\t currentPane.options.width = box.width();\n\n\t if (!currentPane.options.height) {\n\t autoHeightPanes++;\n\t } else {\n\t if (height.indexOf && height.indexOf(\"%\")) {\n\t var percents = parseInt(height, 10) / 100;\n\t currentPane.options.height = percents * box.height();\n\t }\n\n\t currentPane.reflow(box.clone());\n\n\t remainingHeight -= currentPane.options.height;\n\t }\n\t }\n\n\t for (var i$1 = 0; i$1 < panesLength; i$1++) {\n\t var currentPane$1 = panes[i$1];\n\n\t if (!currentPane$1.options.height) {\n\t currentPane$1.options.height = remainingHeight / autoHeightPanes;\n\t }\n\t }\n\n\t for (var i$2 = 0; i$2 < panesLength; i$2++) {\n\t var currentPane$2 = panes[i$2];\n\t var paneBox = box\n\t .clone()\n\t .move(box.x1, top);\n\n\t currentPane$2.reflow(paneBox);\n\n\t remainingPanes--;\n\t top += currentPane$2.options.height;\n\t }\n\t },\n\n\t backgroundBox: function() {\n\t var axes = this.axes;\n\t var axesCount = axes.length;\n\t var box;\n\n\t for (var i = 0; i < axesCount; i++) {\n\t var axisA = axes[i];\n\n\t for (var j = 0; j < axesCount; j++) {\n\t var axisB = axes[j];\n\n\t if (axisA.options.vertical !== axisB.options.vertical) {\n\t var lineBox = axisA.lineBox().clone().wrap(axisB.lineBox());\n\n\t if (!box) {\n\t box = lineBox;\n\t } else {\n\t box = box.wrap(lineBox);\n\t }\n\t }\n\t }\n\t }\n\n\t return box || this.box;\n\t },\n\n\t chartsBoxes: function() {\n\t var panes = this.panes;\n\t var boxes = [];\n\n\t for (var idx = 0; idx < panes.length; idx++) {\n\t boxes.push(panes[idx].chartsBox());\n\t }\n\n\t return boxes;\n\t },\n\n\t addBackgroundPaths: function(multipath) {\n\t var boxes = this.chartsBoxes();\n\t for (var idx = 0; idx < boxes.length; idx++) {\n\t multipath.paths.push(Path.fromRect(boxes[idx].toRect()));\n\t }\n\t },\n\n\t backgroundContainsPoint: function(point) {\n\t var boxes = this.chartsBoxes();\n\t for (var idx = 0; idx < boxes.length; idx++) {\n\t if (boxes[idx].containsPoint(point)) {\n\t return true;\n\t }\n\t }\n\t },\n\n\t createVisual: function() {\n\t ChartElement.fn.createVisual.call(this);\n\n\t var options = this.options.plotArea;\n\t var opacity = options.opacity;\n\t var background = options.background;\n\t var border = options.border; if (border === void 0) { border = {}; }\n\t if (isTransparent(background)) {\n\t background = WHITE;\n\t opacity = 0;\n\t }\n\n\t var bg = this._bgVisual = new drawing.MultiPath({\n\t fill: {\n\t color: background,\n\t opacity: opacity\n\t },\n\t stroke: {\n\t color: border.width ? border.color : \"\",\n\t width: border.width,\n\t dashType: border.dashType\n\t },\n\t zIndex: -1\n\t });\n\n\t this.addBackgroundPaths(bg);\n\n\t this.appendVisual(bg);\n\t },\n\n\t pointsByCategoryIndex: function(categoryIndex) {\n\t var charts = this.charts;\n\t var result = [];\n\n\t if (categoryIndex !== null) {\n\t for (var i = 0; i < charts.length; i++) {\n\t var chart = charts[i];\n\t if (chart.pane.options.name === \"_navigator\") {\n\t continue;\n\t }\n\n\t var points = charts[i].categoryPoints[categoryIndex];\n\t if (points && points.length) {\n\t for (var j = 0; j < points.length; j++) {\n\t var point = points[j];\n\t if (point && defined(point.value) && point.value !== null) {\n\t result.push(point);\n\t }\n\t }\n\t }\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t pointsBySeriesIndex: function(seriesIndex) {\n\t return this.filterPoints(function(point) {\n\t return point.series.index === seriesIndex;\n\t });\n\t },\n\n\t pointsBySeriesName: function(name) {\n\t return this.filterPoints(function(point) {\n\t return point.series.name === name;\n\t });\n\t },\n\n\t filterPoints: function(callback) {\n\t var charts = this.charts;\n\t var result = [];\n\n\t for (var i = 0; i < charts.length; i++) {\n\t var chart = charts[i];\n\t var points = chart.points;\n\t for (var j = 0; j < points.length; j++) {\n\t var point = points[j];\n\t if (point && point.visible !== false && callback(point)) {\n\t result.push(point);\n\t }\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t findPoint: function(callback) {\n\t var charts = this.charts;\n\n\t for (var i = 0; i < charts.length; i++) {\n\t var chart = charts[i];\n\t var points = chart.points;\n\t for (var j = 0; j < points.length; j++) {\n\t var point = points[j];\n\t if (point && point.visible !== false && callback(point)) {\n\t return point;\n\t }\n\t }\n\t }\n\t },\n\n\t paneByPoint: function(point) {\n\t var panes = this.panes;\n\n\t for (var i = 0; i < panes.length; i++) {\n\t var pane = panes[i];\n\t if (pane.box.containsPoint(point)) {\n\t return pane;\n\t }\n\t }\n\t },\n\n\t detachLabels: function() {\n\t var axes = this.groupAxes(this.panes);\n\t var xAxes = axes.x;\n\t var yAxes = axes.y;\n\n\t this.detachAxisGroupLabels(yAxes, xAxes);\n\t this.detachAxisGroupLabels(xAxes, yAxes);\n\t },\n\n\t detachAxisGroupLabels: function(axes, crossingAxes) {\n\t var this$1 = this;\n\n\t var labelAxisCount = 0;\n\n\t for (var i = 0; i < axes.length; i++) {\n\t var axis = axes[i];\n\t var pane = axis.pane;\n\t var anchor = paneAnchor(crossingAxes, pane) || crossingAxes[0];\n\t var axisIndex = i + labelAxisCount;\n\t var labelAxis = this$1.createLabelAxis(axis, axisIndex, anchor);\n\n\t if (labelAxis) {\n\t labelAxisCount++;\n\n\t var pos = pane.axes.indexOf(axis) + labelAxisCount;\n\t pane.appendAxisAt(labelAxis, pos);\n\t }\n\t }\n\t },\n\n\t createLabelAxis: function(axis, axisIndex, anchor) {\n\t var labelOptions = axis.options.labels;\n\t var position = labelOptions.position;\n\t var onAxis = position !== datavizConstants.END && position !== datavizConstants.START;\n\t var visible = labelOptions.visible;\n\n\t if (onAxis || visible === false) {\n\t return null;\n\t }\n\n\t var allAxes = this.groupAxes(this.panes);\n\t var crossingAxes = anchor.options.vertical ? allAxes.x : allAxes.y;\n\t var anchorCrossings = this.axisCrossingValues(anchor, crossingAxes);\n\t var end = position === datavizConstants.END;\n\t var range = anchor.range();\n\t var edge = end ? range.max : range.min;\n\t var crossingValue = limitValue(anchorCrossings[axisIndex], range.min, range.max);\n\n\t if (crossingValue - edge === 0) {\n\t return null;\n\t }\n\n\t anchorCrossings.splice(axisIndex + 1, 0, edge);\n\t anchor.options.axisCrossingValues = anchorCrossings;\n\n\t var labelAxis = axis.clone();\n\t axis.clear();\n\n\t labelAxis.options.name = undefined;\n\t labelAxis.options.line.visible = false;\n\n\t labelAxis.options.crosshair = undefined;\n\t labelAxis.options.notes = undefined;\n\t labelAxis.options.plotBands = undefined;\n\n\t return labelAxis;\n\t }\n\t});\n\n\tfunction isSingleAxis(axis) {\n\t return !axis.pane.axes.some(function (a) { return a.options.vertical === axis.options.vertical && a !== axis && a.options.visible !== false; }\n\t );\n\t}\n\n\tfunction axisGroupBox(axes) {\n\t var length = axes.length;\n\t var box;\n\n\t for (var i = 0; i < length; i++) {\n\t var axis = axes[i];\n\t var visible = axis.options.visible !== false;\n\t if (visible || isSingleAxis(axis)) {\n\t var axisBox = visible ? axis.contentBox() : axis.lineBox();\n\n\t if (!box) {\n\t box = axisBox.clone();\n\t } else {\n\t box.wrap(axisBox);\n\t }\n\t }\n\t }\n\n\t return box || new Box();\n\t}\n\n\tfunction paneAnchor(axes, pane) {\n\t for (var i = 0; i < axes.length; i++) {\n\t var anchor = axes[i];\n\t if (anchor && anchor.pane === pane) {\n\t return anchor;\n\t }\n\t }\n\t}\n\n\tfunction isTransparent(color) {\n\t return color === \"\" || color === null || color === \"none\" || color === \"transparent\" || !defined(color);\n\t}\n\n\tvar allPaneAxes = function (panes) { return panes.reduce(function (acc, pane) { return acc.concat(pane.axes); }, []); };\n\n\tsetDefaultOptions(PlotAreaBase, {\n\t series: [],\n\t plotArea: {\n\t margin: {}\n\t },\n\t background: \"\",\n\t border: {\n\t color: BLACK,\n\t width: 0\n\t },\n\t paneDefaults: {\n\t title: {}\n\t },\n\t legend: {\n\t inactiveItems: {\n\t labels: {\n\t color: \"#919191\"\n\t },\n\t markers: {\n\t color: \"#919191\"\n\t }\n\t }\n\t }\n\t});\n\n\tvar PlotAreaEventsMixin = {\n\t hover: function(chart, e) {\n\t this._dispatchEvent(chart, e, PLOT_AREA_HOVER);\n\t },\n\n\t click: function(chart, e) {\n\t this._dispatchEvent(chart, e, PLOT_AREA_CLICK);\n\t }\n\t};\n\n\tvar SeriesAggregator = Class.extend({\n\t init: function(series, binder, defaultAggregates) {\n\n\t var canonicalFields = binder.canonicalFields(series);\n\t var valueFields = binder.valueFields(series);\n\t var sourceFields = binder.sourceFields(series, canonicalFields);\n\t var seriesFields = this._seriesFields = [];\n\t var defaults = defaultAggregates.query(series.type);\n\t var rootAggregate = series.aggregate || defaults;\n\n\t this._series = series;\n\t this._binder = binder;\n\n\t for (var i = 0; i < canonicalFields.length; i++) {\n\t var field = canonicalFields[i];\n\t var fieldAggregate = (void 0);\n\n\t if (isObject(rootAggregate)) {\n\t fieldAggregate = rootAggregate[field];\n\t } else if (i === 0 || inArray(field, valueFields)) {\n\t fieldAggregate = rootAggregate;\n\t } else {\n\t break;\n\t }\n\n\t if (fieldAggregate) {\n\t seriesFields.push({\n\t canonicalName: field,\n\t name: sourceFields[i],\n\t transform: isFunction(fieldAggregate) ? fieldAggregate : Aggregates[fieldAggregate]\n\t });\n\t }\n\t }\n\t },\n\n\t aggregatePoints: function(srcPoints, group) {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var series = ref._series;\n\t var seriesFields = ref._seriesFields;\n\t var data = this._bindPoints(srcPoints || []);\n\t var firstDataItem = data.dataItems[0];\n\t var result = {};\n\n\t if (firstDataItem && !isNumber(firstDataItem) && !isArray(firstDataItem)) {\n\t var fn = function() {};\n\t fn.prototype = firstDataItem;\n\t result = new fn();\n\t }\n\n\t for (var i = 0; i < seriesFields.length; i++) {\n\t var field = seriesFields[i];\n\t var srcValues = this$1._bindField(data.values, field.canonicalName);\n\t var value = field.transform(srcValues, series, data.dataItems, group);\n\n\t if (value !== null && isObject(value) && !defined(value.length) && !(value instanceof Date)) {\n\t result = value;\n\t break;\n\t } else {\n\t if (defined(value)) {\n\t setValue(field.name, result, value);\n\t }\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t _bindPoints: function(points) {\n\t var ref = this;\n\t var binder = ref._binder;\n\t var series = ref._series;\n\t var values = [];\n\t var dataItems = [];\n\n\t for (var i = 0; i < points.length; i++) {\n\t var pointIx = points[i];\n\n\t values.push(binder.bindPoint(series, pointIx));\n\t dataItems.push(series.data[pointIx]);\n\t }\n\n\t return {\n\t values: values,\n\t dataItems: dataItems\n\t };\n\t },\n\n\t _bindField: function(data, field) {\n\t var values = [];\n\t var count = data.length;\n\n\t for (var i = 0; i < count; i++) {\n\t var item = data[i];\n\t var valueFields = item.valueFields;\n\t var value = (void 0);\n\n\t if (defined(valueFields[field])) {\n\t value = valueFields[field];\n\t } else {\n\t value = item.fields[field];\n\t }\n\n\t values.push(value);\n\t }\n\n\t return values;\n\t }\n\t});\n\n\tfunction setValue(fieldName, target, value) {\n\t var parentObj = target;\n\t var field = fieldName;\n\n\t if (fieldName.indexOf(\".\") > -1) {\n\t var parts = fieldName.split(\".\");\n\n\t while (parts.length > 1) {\n\t field = parts.shift();\n\t if (!defined(parentObj[field])) {\n\t parentObj[field] = {};\n\t }\n\t parentObj = parentObj[field];\n\t }\n\t field = parts.shift();\n\t }\n\n\t parentObj[field] = value;\n\t}\n\n\tvar DefaultAggregates = Class.extend({\n\t init: function() {\n\n\t this._defaults = {};\n\t },\n\n\t register: function(seriesTypes, aggregates) {\n\t var this$1 = this;\n\n\t for (var i = 0; i < seriesTypes.length; i++) {\n\t this$1._defaults[seriesTypes[i]] = aggregates;\n\t }\n\t },\n\n\t query: function(seriesType) {\n\t return this._defaults[seriesType];\n\t }\n\t});\n\n\tDefaultAggregates.current = new DefaultAggregates();\n\n\tvar RangeBar = Bar.extend({\n\t createLabel: function() {\n\t var labels = this.options.labels;\n\t var fromOptions = deepExtend({}, labels, labels.from);\n\t var toOptions = deepExtend({}, labels, labels.to);\n\n\t if (fromOptions.visible) {\n\t this.labelFrom = this._createLabel(fromOptions);\n\t this.append(this.labelFrom);\n\t }\n\n\t if (toOptions.visible) {\n\t this.labelTo = this._createLabel(toOptions);\n\t this.append(this.labelTo);\n\t }\n\t },\n\n\t _createLabel: function(options) {\n\t var labelTemplate = getTemplate(options);\n\t var pointData = this.pointData();\n\n\t var labelText;\n\n\t if (labelTemplate) {\n\t labelText = labelTemplate(pointData);\n\t } else {\n\t labelText = this.formatValue(options.format);\n\t }\n\n\t return new BarLabel(labelText,\n\t deepExtend({\n\t vertical: this.options.vertical\n\t },\n\t options\n\t ), pointData);\n\t },\n\n\t reflow: function(targetBox) {\n\t this.render();\n\n\t var ref = this;\n\t var labelFrom = ref.labelFrom;\n\t var labelTo = ref.labelTo;\n\t var value = ref.value;\n\n\t this.box = targetBox;\n\n\t if (labelFrom) {\n\t labelFrom.options.aboveAxis = value.from > value.to;\n\t labelFrom.reflow(targetBox);\n\t }\n\n\t if (labelTo) {\n\t labelTo.options.aboveAxis = value.to > value.from;\n\t labelTo.reflow(targetBox);\n\t }\n\n\t if (this.note) {\n\t this.note.reflow(targetBox);\n\t }\n\t }\n\t});\n\n\tRangeBar.prototype.defaults = deepExtend({}, RangeBar.prototype.defaults, {\n\t labels: {\n\t format: \"{0} - {1}\"\n\t },\n\t tooltip: {\n\t format: \"{1}\"\n\t }\n\t});\n\n\tvar RangeBarChart = BarChart.extend({\n\t pointType: function() {\n\t return RangeBar;\n\t },\n\n\t pointValue: function(data) {\n\t return data.valueFields;\n\t },\n\n\t formatPointValue: function(point, format) {\n\t if (point.value.from === null && point.value.to === null) {\n\t return \"\";\n\t }\n\n\t return this.chartService.format.auto(format, point.value.from, point.value.to);\n\t },\n\n\t plotRange: function(point) {\n\t if (!point) {\n\t return 0;\n\t }\n\n\t return [ point.value.from, point.value.to ];\n\t },\n\n\t updateRange: function(value, fields) {\n\t var axisName = fields.series.axis;\n\t var from = value.from;\n\t var to = value.to;\n\t var axisRange = this.valueAxisRanges[axisName];\n\n\t if (value !== null && isNumber(from) && isNumber(to)) {\n\t axisRange = this.valueAxisRanges[axisName] = axisRange || { min: MAX_VALUE, max: MIN_VALUE };\n\n\t axisRange.min = Math.min(axisRange.min, from);\n\t axisRange.max = Math.max(axisRange.max, from);\n\n\t axisRange.min = Math.min(axisRange.min, to);\n\t axisRange.max = Math.max(axisRange.max, to);\n\t }\n\t },\n\n\t aboveAxis: function(point) {\n\t var value = point.value;\n\t return value.from < value.to;\n\t }\n\t});\n\n\tRangeBarChart.prototype.plotLimits = CategoricalChart.prototype.plotLimits;\n\n\tvar RangeLinePoint = LinePoint.extend({\n\t aliasFor: function() {\n\t return this.parent;\n\t }\n\t});\n\n\tvar AUTO = 'auto';\n\tvar DEFAULT_FROM_FORMAT = '{0}';\n\tvar DEFAULT_TO_FORMAT = '{1}';\n\n\tvar RangeAreaPoint = ChartElement.extend({\n\t init: function(value, options) {\n\t ChartElement.fn.init.call(this);\n\n\t this.value = value;\n\t this.options = options;\n\t this.aboveAxis = valueOrDefault(this.options.aboveAxis, true);\n\t this.tooltipTracking = true;\n\t this.initLabelsFormat();\n\t },\n\n\t render: function() {\n\t if (this._rendered) {\n\t return;\n\t }\n\n\t this._rendered = true;\n\n\t var ref = this.options;\n\t var markers = ref.markers;\n\t var labels = ref.labels;\n\t var value = this.value;\n\n\t var fromPoint = this.fromPoint = new RangeLinePoint(value, deepExtend({}, this.options, {\n\t labels: labels.from,\n\t markers: markers.from\n\t }));\n\n\t var toPoint = this.toPoint = new RangeLinePoint(value, deepExtend({}, this.options, {\n\t labels: labels.to,\n\t markers: markers.to\n\t }));\n\n\t this.copyFields(fromPoint);\n\t this.copyFields(toPoint);\n\n\t this.append(fromPoint);\n\t this.append(toPoint);\n\t },\n\n\t reflow: function(targetBox) {\n\t this.render();\n\n\t var fromBox = targetBox.from;\n\t var toBox = targetBox.to;\n\n\t this.positionLabels(fromBox, toBox);\n\n\t this.fromPoint.reflow(fromBox);\n\t this.toPoint.reflow(toBox);\n\n\t this.box = this.fromPoint.markerBox().clone().wrap(this.toPoint.markerBox());\n\t },\n\n\t createHighlight: function() {\n\t var group = new Group();\n\t group.append(this.fromPoint.createHighlight());\n\t group.append(this.toPoint.createHighlight());\n\n\t return group;\n\t },\n\n\t highlightVisual: function() {\n\t return this.visual;\n\t },\n\n\t highlightVisualArgs: function() {\n\t return {\n\t options: this.options,\n\t from: this.fromPoint.highlightVisualArgs(),\n\t to: this.toPoint.highlightVisualArgs()\n\t };\n\t },\n\n\t tooltipAnchor: function() {\n\t var clipBox = this.owner.pane.clipBox();\n\t var showTooltip = !clipBox || clipBox.overlaps(this.box);\n\n\t if (showTooltip) {\n\t var box = this.box;\n\t var center = box.center();\n\t var horizontalAlign = LEFT;\n\t var x, y, verticalAlign;\n\n\t if (this.options.vertical) {\n\t x = center.x;\n\t y = box.y1 - TOOLTIP_OFFSET;\n\t verticalAlign = BOTTOM;\n\t } else {\n\t x = box.x2 + TOOLTIP_OFFSET;\n\t y = center.y;\n\t verticalAlign = CENTER;\n\t }\n\n\t return {\n\t point: new Point(x, y),\n\t align: {\n\t horizontal: horizontalAlign,\n\t vertical: verticalAlign\n\t }\n\t };\n\t }\n\t },\n\n\t formatValue: function(format) {\n\t return this.owner.formatPointValue(this, format);\n\t },\n\n\t overlapsBox: function(box) {\n\t return this.box.overlaps(box);\n\t },\n\n\t unclipElements: function() {\n\t this.fromPoint.unclipElements();\n\t this.toPoint.unclipElements();\n\t },\n\n\t initLabelsFormat: function() {\n\t var labels = this.options.labels;\n\t if (!labels.format) {\n\t if (!labels.from || !labels.from.format) {\n\t labels.from = $.extend({}, labels.from, {\n\t format: DEFAULT_FROM_FORMAT\n\t });\n\t }\n\n\t if (!labels.to || !labels.to.format) {\n\t labels.to = $.extend({}, labels.to, {\n\t format: DEFAULT_TO_FORMAT\n\t });\n\t }\n\t }\n\t },\n\n\t positionLabels: function(fromBox, toBox) {\n\t var ref = this.options;\n\t var labels = ref.labels;\n\t var vertical = ref.vertical;\n\n\t if (labels.position === AUTO) {\n\t var fromLabelPosition, toLabelPosition;\n\t if (vertical) {\n\t if (toBox.y1 <= fromBox.y1) {\n\t toLabelPosition = ABOVE;\n\t fromLabelPosition = BELOW;\n\t } else {\n\t toLabelPosition = BELOW;\n\t fromLabelPosition = ABOVE;\n\t }\n\t } else {\n\t if (toBox.x1 <= fromBox.x1) {\n\t toLabelPosition = LEFT;\n\t fromLabelPosition = RIGHT;\n\t } else {\n\t toLabelPosition = RIGHT;\n\t fromLabelPosition = LEFT;\n\t }\n\t }\n\n\t if (!labels.from || !labels.from.position) {\n\t this.fromPoint.options.labels.position = fromLabelPosition;\n\t }\n\n\t if (!labels.to || !labels.to.position) {\n\t this.toPoint.options.labels.position = toLabelPosition;\n\t }\n\t }\n\t },\n\n\t copyFields: function(point) {\n\t point.dataItem = this.dataItem;\n\t point.category = this.category;\n\t point.series = this.series;\n\t point.color = this.color;\n\t point.owner = this.owner;\n\t }\n\t});\n\n\tdeepExtend(RangeAreaPoint.prototype, PointEventsMixin);\n\tdeepExtend(RangeAreaPoint.prototype, NoteMixin);\n\n\tRangeAreaPoint.prototype.defaults = {\n\t markers: {\n\t visible: false,\n\t background: WHITE,\n\t size: LINE_MARKER_SIZE,\n\t type: CIRCLE,\n\t border: {\n\t width: 2\n\t },\n\t opacity: 1\n\t },\n\t labels: {\n\t visible: false,\n\t margin: getSpacing(3),\n\t padding: getSpacing(4),\n\t animation: {\n\t type: FADEIN,\n\t delay: INITIAL_ANIMATION_DURATION\n\t },\n\t position: AUTO\n\t },\n\t notes: {\n\t label: {}\n\t },\n\t highlight: {\n\t markers: {\n\t border: {\n\t color: WHITE,\n\t width: 2\n\t }\n\t },\n\t zIndex: datavizConstants.HIGHLIGHT_ZINDEX\n\t },\n\t tooltip: {\n\t format: '{0} - {1}'\n\t }\n\t};\n\n\tvar RangeAreaSegment = AreaSegment.extend({\n\t createStrokeSegments: function() {\n\t return this.segmentsFromPoints(this.toGeometryPoints(this.toPoints()));\n\t },\n\n\t stackSegments: function() {\n\t var fromSegments = this.fromSegments;\n\t if (!this.fromSegments) {\n\t fromSegments = this.fromSegments = this.segmentsFromPoints(this.toGeometryPoints(this.fromPoints().reverse()));\n\t }\n\n\t return fromSegments;\n\t },\n\n\t createStroke: function(style) {\n\t var toPath = new Path(style);\n\t var fromPath = new Path(style);\n\n\t toPath.segments.push.apply(toPath.segments, this.strokeSegments());\n\t fromPath.segments.push.apply(fromPath.segments, this.stackSegments());\n\n\t this.visual.append(toPath);\n\t this.visual.append(fromPath);\n\t },\n\n\t hasStackSegment: function() {\n\t return true;\n\t },\n\n\t fromPoints: function() {\n\t return this.linePoints.map(function (point) { return point.fromPoint; });\n\t },\n\n\t toPoints: function() {\n\t return this.linePoints.map(function (point) { return point.toPoint; });\n\t }\n\t});\n\n\tvar SplineRangeAreaSegment = RangeAreaSegment.extend({\n\t createStrokeSegments: function() {\n\t return this.createCurveSegments(this.toPoints());\n\t },\n\n\t stackSegments: function() {\n\t var fromSegments = this.fromSegments;\n\t if (!this.fromSegments) {\n\t fromSegments = this.fromSegments = this.createCurveSegments(this.fromPoints().reverse());\n\t }\n\n\t return fromSegments;\n\t },\n\n\t createCurveSegments: function(points) {\n\t var curveProcessor = new CurveProcessor();\n\n\t return curveProcessor.process(this.toGeometryPoints(points));\n\t }\n\t});\n\n\tvar StepRangeAreaSegment = RangeAreaSegment.extend({\n\t createStrokeSegments: function() {\n\t return this.segmentsFromPoints(this.calculateStepPoints(this.toPoints()));\n\t },\n\n\t stackSegments: function() {\n\t var fromSegments = this.fromSegments;\n\t if (!this.fromSegments) {\n\t fromSegments = this.fromSegments = this.segmentsFromPoints(this.calculateStepPoints(this.fromPoints()));\n\t fromSegments.reverse();\n\t }\n\n\t return fromSegments;\n\t }\n\t});\n\n\tdeepExtend(StepRangeAreaSegment.prototype, StepLineMixin);\n\n\tvar RangeAreaChart = CategoricalChart.extend({\n\t render: function() {\n\t CategoricalChart.fn.render.call(this);\n\n\t this.renderSegments();\n\t },\n\n\t pointType: function() {\n\t return RangeAreaPoint;\n\t },\n\n\t createPoint: function(data, fields) {\n\t var categoryIx = fields.categoryIx;\n\t var category = fields.category;\n\t var series = fields.series;\n\t var seriesIx = fields.seriesIx;\n\t var value = data.valueFields;\n\n\t if (!hasValue(value.from) && !hasValue(value.to)) {\n\t if (this.seriesMissingValues(series) === ZERO) {\n\t value = {\n\t from: 0,\n\t to: 0\n\t };\n\t } else {\n\t return null;\n\t }\n\t }\n\n\t var pointOptions = this.pointOptions(series, seriesIx);\n\t pointOptions = this.evalPointOptions(\n\t pointOptions, value, category, categoryIx, series, seriesIx\n\t );\n\n\t var color = data.fields.color || series.color;\n\t if (isFunction(series.color)) {\n\t color = pointOptions.color;\n\t }\n\n\t var point = new RangeAreaPoint(value, pointOptions);\n\t point.color = color;\n\n\t this.append(point);\n\n\t return point;\n\t },\n\n\t createSegment: function(linePoints, currentSeries, seriesIx) {\n\t var style = (currentSeries.line || {}).style;\n\t var segmentType;\n\t if (style === \"smooth\") {\n\t segmentType = SplineRangeAreaSegment;\n\t } else if (style === \"step\") {\n\t segmentType = StepRangeAreaSegment;\n\t } else {\n\t segmentType = RangeAreaSegment;\n\t }\n\n\t return new segmentType(linePoints, currentSeries, seriesIx);\n\t },\n\n\t plotRange: function(point, startValue) {\n\t if (!point) {\n\t return [ startValue, startValue ];\n\t }\n\n\t return [ point.value.from, point.value.to ];\n\t },\n\n\t valueSlot: function(valueAxis, plotRange) {\n\t var fromSlot = valueAxis.getSlot(plotRange[0], plotRange[0], !this.options.clip);\n\t var toSlot = valueAxis.getSlot(plotRange[1], plotRange[1], !this.options.clip);\n\t if (fromSlot && toSlot) {\n\t return {\n\t from: fromSlot,\n\t to: toSlot\n\t };\n\t }\n\t },\n\n\t pointSlot: function(categorySlot, valueSlot) {\n\t var from = valueSlot.from;\n\t var to = valueSlot.to;\n\t var fromSlot, toSlot;\n\n\t if (this.options.invertAxes) {\n\t fromSlot = new Box(from.x1, categorySlot.y1, from.x2, categorySlot.y2);\n\t toSlot = new Box(to.x1, categorySlot.y1, to.x2, categorySlot.y2);\n\t } else {\n\t fromSlot = new Box(categorySlot.x1, from.y1, categorySlot.x2, from.y2);\n\t toSlot = new Box(categorySlot.x1, to.y1, categorySlot.x2, to.y2);\n\t }\n\n\t return {\n\t from: fromSlot,\n\t to: toSlot\n\t };\n\t },\n\n\t addValue: function(data, fields) {\n\t var valueFields = data.valueFields;\n\t if (!isNumber(valueFields.from)) {\n\t valueFields.from = valueFields.to;\n\t }\n\n\t if (!isNumber(valueFields.to)) {\n\t valueFields.to = valueFields.from;\n\t }\n\n\t CategoricalChart.fn.addValue.call(this, data, fields);\n\t },\n\n\t updateRange: function(value, fields) {\n\t if (value !== null && isNumber(value.from) && isNumber(value.to)) {\n\t var axisName = fields.series.axis;\n\t var axisRange = this.valueAxisRanges[axisName] = this.valueAxisRanges[axisName] || { min: MAX_VALUE, max: MIN_VALUE };\n\t var from = value.from;\n\t var to = value.to;\n\n\t axisRange.min = Math.min(axisRange.min, from, to);\n\t axisRange.max = Math.max(axisRange.max, from, to);\n\t }\n\t },\n\n\t formatPointValue: function(point, format) {\n\t var value = point.value;\n\n\t return this.chartService.format.auto(format, value.from, value.to);\n\t },\n\n\t animationPoints: function() {\n\t var points = this.points;\n\t var result = [];\n\t for (var idx = 0; idx < points.length; idx++) {\n\t var point = points[idx];\n\t if (point) {\n\t result.push((point.fromPoint || {}).marker);\n\t result.push((point.toPoint || {}).marker);\n\t }\n\t }\n\n\t return result.concat(this._segments);\n\t }\n\t});\n\n\tdeepExtend(RangeAreaChart.prototype, LineChartMixin, ClipAnimationMixin);\n\n\tvar OHLCPoint = Candlestick.extend({\n\t reflow: function(box) {\n\t var ref = this;\n\t var options = ref.options;\n\t var value = ref.value;\n\t var chart = ref.owner;\n\t var valueAxis = chart.seriesValueAxis(options);\n\t var oPoints = [];\n\t var cPoints = [];\n\t var lhPoints = [];\n\n\t var lhSlot = valueAxis.getSlot(value.low, value.high);\n\t var oSlot = valueAxis.getSlot(value.open, value.open);\n\t var cSlot = valueAxis.getSlot(value.close, value.close);\n\n\t oSlot.x1 = cSlot.x1 = lhSlot.x1 = box.x1;\n\t oSlot.x2 = cSlot.x2 = lhSlot.x2 = box.x2;\n\n\t var mid = lhSlot.center().x;\n\n\t oPoints.push([ oSlot.x1, oSlot.y1 ]);\n\t oPoints.push([ mid, oSlot.y1 ]);\n\t cPoints.push([ mid, cSlot.y1 ]);\n\t cPoints.push([ cSlot.x2, cSlot.y1 ]);\n\t lhPoints.push([ mid, lhSlot.y1 ]);\n\t lhPoints.push([ mid, lhSlot.y2 ]);\n\n\t this.lines = [\n\t oPoints, cPoints, lhPoints\n\t ];\n\n\t this.box = lhSlot.clone().wrap(oSlot.clone().wrap(cSlot));\n\n\t this.reflowNote();\n\t },\n\n\t createBody: function() {}\n\t});\n\n\tvar OHLCChart = CandlestickChart.extend({\n\t pointType: function() {\n\t return OHLCPoint;\n\t }\n\t});\n\n\tvar WaterfallSegment = ChartElement.extend({\n\t init: function(from, to, series) {\n\t ChartElement.fn.init.call(this);\n\n\t this.from = from;\n\t this.to = to;\n\t this.series = series;\n\t },\n\n\t linePoints: function() {\n\t var from = this.from;\n\t var ref = this;\n\t var fromBox = ref.from.box;\n\t var toBox = ref.to.box;\n\t var points = [];\n\n\t if (from.isVertical) {\n\t var y = from.aboveAxis ? fromBox.y1 : fromBox.y2;\n\t points.push(\n\t [ fromBox.x1, y ],\n\t [ toBox.x2, y ]\n\t );\n\t } else {\n\t var x = from.aboveAxis ? fromBox.x2 : fromBox.x1;\n\t points.push(\n\t [ x, fromBox.y1 ],\n\t [ x, toBox.y2 ]\n\t );\n\t }\n\n\t return points;\n\t },\n\n\t createVisual: function() {\n\t ChartElement.fn.createVisual.call(this);\n\n\t var line = this.series.line || {};\n\n\t var path = Path.fromPoints(this.linePoints(), {\n\t stroke: {\n\t color: line.color,\n\t width: line.width,\n\t opacity: line.opacity,\n\t dashType: line.dashType\n\t }\n\t });\n\n\t alignPathToPixel(path);\n\t this.visual.append(path);\n\t }\n\t});\n\n\tsetDefaultOptions(WaterfallSegment, {\n\t animation: {\n\t type: FADEIN,\n\t delay: INITIAL_ANIMATION_DURATION\n\t }\n\t});\n\n\tvar WaterfallChart = BarChart.extend({\n\t render: function() {\n\t BarChart.fn.render.call(this);\n\t this.createSegments();\n\t },\n\n\t traverseDataPoints: function(callback) {\n\t var this$1 = this;\n\n\t var series = this.options.series;\n\t var totalCategories = categoriesCount(series);\n\t var isVertical = !this.options.invertAxes;\n\n\t for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n\t var currentSeries = series[seriesIx];\n\t var total = 0;\n\t var runningTotal = 0;\n\n\t for (var categoryIx = 0; categoryIx < totalCategories; categoryIx++) {\n\t var data = SeriesBinder.current.bindPoint(currentSeries, categoryIx);\n\t var value = data.valueFields.value;\n\t var summary = data.fields.summary;\n\t var from = total;\n\t var to = (void 0);\n\n\t if (summary) {\n\t if (summary.toLowerCase() === \"total\") {\n\t data.valueFields.value = total;\n\t from = 0;\n\t to = total;\n\t } else {\n\t data.valueFields.value = runningTotal;\n\t to = from - runningTotal;\n\t runningTotal = 0;\n\t }\n\t } else if (isNumber(value)) {\n\t runningTotal += value;\n\t total += value;\n\t to = total;\n\t }\n\n\t callback(data, {\n\t category: this$1.categoryAxis.categoryAt(categoryIx),\n\t categoryIx: categoryIx,\n\t series: currentSeries,\n\t seriesIx: seriesIx,\n\t total: total,\n\t runningTotal: runningTotal,\n\t from: from,\n\t to: to,\n\t isVertical: isVertical\n\t });\n\t }\n\t }\n\t },\n\n\t updateRange: function(value, fields) {\n\t BarChart.fn.updateRange.call(this, { value: fields.to }, fields);\n\t },\n\n\t aboveAxis: function(point) {\n\t return point.value >= 0;\n\t },\n\n\t plotRange: function(point) {\n\t return [ point.from, point.to ];\n\t },\n\n\t createSegments: function() {\n\t var this$1 = this;\n\n\t var series = this.options.series;\n\t var seriesPoints = this.seriesPoints;\n\t var segments = this.segments = [];\n\n\t for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n\t var currentSeries = series[seriesIx];\n\t var points = seriesPoints[seriesIx];\n\n\t if (points) {\n\t var prevPoint = (void 0);\n\t for (var pointIx = 0; pointIx < points.length; pointIx++) {\n\t var point = points[pointIx];\n\n\t if (point && prevPoint) {\n\t var segment = new WaterfallSegment(prevPoint, point, currentSeries);\n\t segments.push(segment);\n\t this$1.append(segment);\n\t }\n\n\t prevPoint = point;\n\t }\n\t }\n\t }\n\t }\n\t});\n\n\tvar AREA_SERIES = [ AREA, VERTICAL_AREA, RANGE_AREA, VERTICAL_RANGE_AREA ];\n\tvar OUT_OF_RANGE_SERIES = [ LINE, VERTICAL_LINE ].concat(AREA_SERIES);\n\n\tvar CategoricalPlotArea = PlotAreaBase.extend({\n\t initFields: function(series) {\n\t var this$1 = this;\n\n\t this.namedCategoryAxes = {};\n\t this.namedValueAxes = {};\n\t this.valueAxisRangeTracker = new AxisGroupRangeTracker();\n\n\t if (series.length > 0) {\n\t this.invertAxes = inArray(\n\t series[0].type, [ BAR, BULLET, VERTICAL_LINE, VERTICAL_AREA, VERTICAL_RANGE_AREA,\n\t RANGE_BAR, HORIZONTAL_WATERFALL, VERTICAL_BOX_PLOT ]\n\t );\n\n\t for (var i = 0; i < series.length; i++) {\n\t var stack = series[i].stack;\n\t if (stack && stack.type === \"100%\") {\n\t this$1.stack100 = true;\n\t break;\n\t }\n\t }\n\t }\n\n\t },\n\n\t render: function(panes) {\n\t if (panes === void 0) { panes = this.panes; }\n\n\t this.createCategoryAxes(panes);\n\t this.aggregateCategories(panes);\n\t this.createCategoryAxesLabels(panes);\n\t this.createCharts(panes);\n\t this.createValueAxes(panes);\n\t },\n\n\t removeAxis: function(axis) {\n\t var axisName = axis.options.name;\n\n\t PlotAreaBase.fn.removeAxis.call(this, axis);\n\n\t if (axis instanceof CategoryAxis) {\n\t delete this.namedCategoryAxes[axisName];\n\t } else {\n\t this.valueAxisRangeTracker.reset(axisName);\n\t delete this.namedValueAxes[axisName];\n\t }\n\n\t if (axis === this.categoryAxis) {\n\t delete this.categoryAxis;\n\t }\n\n\t if (axis === this.valueAxis) {\n\t delete this.valueAxis;\n\t }\n\t },\n\n\t createCharts: function(panes) {\n\t var this$1 = this;\n\n\t var seriesByPane = this.groupSeriesByPane();\n\n\t for (var i = 0; i < panes.length; i++) {\n\t var pane = panes[i];\n\t var paneSeries = seriesByPane[pane.options.name || \"default\"] || [];\n\t this$1.addToLegend(paneSeries);\n\n\t var visibleSeries = this$1.filterVisibleSeries(paneSeries);\n\t if (!visibleSeries) {\n\t continue;\n\t }\n\n\t var groups = this$1.groupSeriesByCategoryAxis(visibleSeries);\n\t for (var groupIx = 0; groupIx < groups.length; groupIx++) {\n\t this$1.createChartGroup(groups[groupIx], pane);\n\t }\n\t }\n\t },\n\n\t createChartGroup: function(series, pane) {\n\t this.createAreaChart(\n\t filterSeriesByType(series, [ AREA, VERTICAL_AREA ]), pane\n\t );\n\n\t this.createRangeAreaChart(\n\t filterSeriesByType(series, [ RANGE_AREA, VERTICAL_RANGE_AREA ]), pane\n\t );\n\n\t this.createBarChart(\n\t filterSeriesByType(series, [ COLUMN, BAR ]), pane\n\t );\n\n\t this.createRangeBarChart(\n\t filterSeriesByType(series, [ RANGE_COLUMN, RANGE_BAR ]), pane\n\t );\n\n\t this.createBulletChart(\n\t filterSeriesByType(series, [ BULLET, VERTICAL_BULLET ]), pane\n\t );\n\n\t this.createCandlestickChart(\n\t filterSeriesByType(series, CANDLESTICK), pane\n\t );\n\n\t this.createBoxPlotChart(\n\t filterSeriesByType(series, [ BOX_PLOT, VERTICAL_BOX_PLOT ]), pane\n\t );\n\n\t this.createOHLCChart(\n\t filterSeriesByType(series, OHLC), pane\n\t );\n\n\t this.createWaterfallChart(\n\t filterSeriesByType(series, [ WATERFALL, HORIZONTAL_WATERFALL ]), pane\n\t );\n\n\t this.createLineChart(\n\t filterSeriesByType(series, [ LINE, VERTICAL_LINE ]), pane\n\t );\n\t },\n\n\t aggregateCategories: function(panes) {\n\t var this$1 = this;\n\n\t var series = this.srcSeries || this.series;\n\t var processedSeries = [];\n\t this._currentPointsCache = {};\n\t this._seriesPointsCache = this._seriesPointsCache || {};\n\n\t for (var i = 0; i < series.length; i++) {\n\t var currentSeries = series[i];\n\t var categoryAxis = this$1.seriesCategoryAxis(currentSeries);\n\t var axisPane = this$1.findPane(categoryAxis.options.pane);\n\t var dateAxis = equalsIgnoreCase(categoryAxis.options.type, DATE);\n\n\t if ((dateAxis || currentSeries.categoryField) && inArray(axisPane, panes)) {\n\t currentSeries = this$1.aggregateSeries(currentSeries, categoryAxis);\n\t } else {\n\t currentSeries = this$1.filterSeries(currentSeries, categoryAxis);\n\t }\n\n\t processedSeries.push(currentSeries);\n\t }\n\n\t this._seriesPointsCache = this._currentPointsCache;\n\t this._currentPointsCache = null;\n\n\t this.srcSeries = series;\n\t this.series = processedSeries;\n\t },\n\n\t filterSeries: function(series, categoryAxis) {\n\t var dataLength = (series.data || {}).length;\n\t categoryAxis._seriesMax = Math.max(categoryAxis._seriesMax || 0, dataLength);\n\n\t if (!(isNumber(categoryAxis.options.min) || isNumber(categoryAxis.options.max))) {\n\t return series;\n\t }\n\n\t var range = categoryAxis.currentRangeIndices();\n\t var outOfRangePoints = inArray(series.type, OUT_OF_RANGE_SERIES);\n\t var currentSeries = deepExtend({}, series);\n\n\t currentSeries.data = (currentSeries.data || []).slice(range.min, range.max + 1);\n\n\t if (outOfRangePoints) {\n\t createOutOfRangePoints(currentSeries, range, dataLength, function (idx) { return ({\n\t item: series.data[idx],\n\t category: categoryAxis.categoryAt(idx, true),\n\t categoryIx: idx - range.min\n\t }); }, function (idx) { return defined(series.data[idx]); });\n\t }\n\n\t return currentSeries;\n\t },\n\n\t clearSeriesPointsCache: function() {\n\t this._seriesPointsCache = {};\n\t },\n\n\t seriesSourcePoints: function(series, categoryAxis) {\n\t var this$1 = this;\n\n\t var key = (series.index) + \";\" + (categoryAxis.categoriesHash());\n\t if (this._seriesPointsCache[key]) {\n\t this._currentPointsCache[key] = this._seriesPointsCache[key];\n\t return this._seriesPointsCache[key];\n\t }\n\n\t var axisOptions = categoryAxis.options;\n\t var srcCategories = axisOptions.srcCategories;\n\t var dateAxis = equalsIgnoreCase(axisOptions.type, DATE);\n\t var srcData = series.data;\n\t var getFn = dateAxis ? getDateField : getField;\n\t var result = [];\n\t if (!dateAxis) {\n\t categoryAxis.mapCategories();//fixes major performance issue caused by searching for the index for large data\n\t }\n\n\t for (var idx = 0; idx < srcData.length; idx++) {\n\t var category = (void 0);\n\t if (series.categoryField) {\n\t category = getFn(series.categoryField, srcData[idx], this$1.chartService.intl);\n\t } else {\n\t category = srcCategories[idx];\n\t }\n\n\t if (defined(category) && category !== null) {\n\t var categoryIx = categoryAxis.totalIndex(category);\n\t result[categoryIx] = result[categoryIx] || { items: [], category: category };\n\t result[categoryIx].items.push(idx);\n\t }\n\t }\n\n\t this._currentPointsCache[key] = result;\n\n\t return result;\n\t },\n\n\t aggregateSeries: function(series, categoryAxis) {\n\t var srcData = series.data;\n\t if (!srcData.length) {\n\t return series;\n\t }\n\n\t var srcPoints = this.seriesSourcePoints(series, categoryAxis);\n\t var result = deepExtend({}, series);\n\t var aggregator = new SeriesAggregator(deepExtend({}, series), SeriesBinder.current, DefaultAggregates.current);\n\t var data = result.data = [];\n\t var dataItems = categoryAxis.options.dataItems || [];\n\n\t var range = categoryAxis.currentRangeIndices();\n\t var categoryItem = function (idx) {\n\t var categoryIdx = idx - range.min;\n\t var point = srcPoints[idx];\n\t if (!point) {\n\t point = srcPoints[idx] = {};\n\t }\n\n\t point.categoryIx = categoryIdx;\n\n\t if (!point.item) {\n\t var category = categoryAxis.categoryAt(idx, true);\n\t point.category = category;\n\t point.item = aggregator.aggregatePoints(point.items, category);\n\t }\n\n\t return point;\n\t };\n\n\t for (var idx = range.min; idx <= range.max; idx++) {\n\t var point = categoryItem(idx);\n\t data[point.categoryIx] = point.item;\n\n\t if (point.items && point.items.length) {\n\t dataItems[point.categoryIx] = point.item;\n\t }\n\t }\n\n\t if (inArray(result.type, OUT_OF_RANGE_SERIES)) {\n\t createOutOfRangePoints(result, range, categoryAxis.totalCount(), categoryItem, function (idx) { return srcPoints[idx]; });\n\t }\n\n\t categoryAxis.options.dataItems = dataItems;\n\n\t return result;\n\t },\n\n\t appendChart: function(chart, pane) {\n\t var series = chart.options.series;\n\t var categoryAxis = this.seriesCategoryAxis(series[0]);\n\t var categories = categoryAxis.options.categories;\n\t var categoriesToAdd = Math.max(0, categoriesCount(series) - categories.length);\n\n\t if (categoriesToAdd > 0) {//consider setting an option to axis instead of adding fake categories\n\t categories = categoryAxis.options.categories = categoryAxis.options.categories.slice(0);\n\t while (categoriesToAdd--) {\n\t categories.push(\"\");\n\t }\n\t }\n\n\t this.valueAxisRangeTracker.update(chart.valueAxisRanges);\n\n\t PlotAreaBase.fn.appendChart.call(this, chart, pane);\n\t },\n\n\t seriesPaneName: function(series) {\n\t var options = this.options;\n\t var axisName = series.axis;\n\t var axisOptions = [].concat(options.valueAxis);\n\t var axis = grep(axisOptions, function(a) { return a.name === axisName; })[0];\n\t var panes = options.panes || [ {} ];\n\t var defaultPaneName = (panes[0] || {}).name || \"default\";\n\t var paneName = (axis || {}).pane || defaultPaneName;\n\n\t return paneName;\n\t },\n\n\t seriesCategoryAxis: function(series) {\n\t var axisName = series.categoryAxis;\n\t var axis = axisName ? this.namedCategoryAxes[axisName] : this.categoryAxis;\n\n\t if (!axis) {\n\t throw new Error(\"Unable to locate category axis with name \" + axisName);\n\t }\n\n\t return axis;\n\t },\n\n\t stackableChartOptions: function(firstSeries, pane) {\n\t var stack = firstSeries.stack;\n\t var isStacked100 = stack && stack.type === \"100%\";\n\t var clip = pane.options.clip;\n\n\t return {\n\t isStacked: stack,\n\t isStacked100: isStacked100,\n\t clip: clip\n\t };\n\t },\n\n\t groupSeriesByCategoryAxis: function(series) {\n\t var categoryAxes = [];\n\t var unique = {};\n\t for (var idx = 0; idx < series.length; idx++) {\n\t var name = series[idx].categoryAxis || \"$$default$$\";\n\t if (!unique.hasOwnProperty(name)) {\n\t unique[name] = true;\n\t categoryAxes.push(name);\n\t }\n\t }\n\n\t var groups = [];\n\t for (var axisIx = 0; axisIx < categoryAxes.length; axisIx++) {\n\t var axis = categoryAxes[axisIx];\n\t var axisSeries = groupSeries(series, axis, axisIx);\n\t if (axisSeries.length === 0) {\n\t continue;\n\t }\n\n\t groups.push(axisSeries);\n\t }\n\n\t return groups;\n\t },\n\n\t createBarChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var firstSeries = series[0];\n\t var barChart = new BarChart(this, $.extend({\n\t series: series,\n\t invertAxes: this.invertAxes,\n\t gap: firstSeries.gap,\n\t spacing: firstSeries.spacing\n\t }, this.stackableChartOptions(firstSeries, pane)));\n\n\t this.appendChart(barChart, pane);\n\t },\n\n\t createRangeBarChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var firstSeries = series[0];\n\t var rangeColumnChart = new RangeBarChart(this, {\n\t series: series,\n\t invertAxes: this.invertAxes,\n\t gap: firstSeries.gap,\n\t spacing: firstSeries.spacing\n\t });\n\n\t this.appendChart(rangeColumnChart, pane);\n\t },\n\n\t createBulletChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var firstSeries = series[0];\n\t var bulletChart = new BulletChart(this, {\n\t series: series,\n\t invertAxes: this.invertAxes,\n\t gap: firstSeries.gap,\n\t spacing: firstSeries.spacing,\n\t clip: pane.options.clip\n\t });\n\n\t this.appendChart(bulletChart, pane);\n\t },\n\n\t createLineChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var firstSeries = series[0];\n\t var lineChart = new LineChart(this, $.extend({\n\t invertAxes: this.invertAxes,\n\t series: series\n\t }, this.stackableChartOptions(firstSeries, pane)));\n\n\t this.appendChart(lineChart, pane);\n\t },\n\n\t createAreaChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var firstSeries = series[0];\n\t var areaChart = new AreaChart(this, $.extend({\n\t invertAxes: this.invertAxes,\n\t series: series\n\t }, this.stackableChartOptions(firstSeries, pane)));\n\n\t this.appendChart(areaChart, pane);\n\t },\n\n\t createRangeAreaChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var rangeAreaChart = new RangeAreaChart(this, {\n\t invertAxes: this.invertAxes,\n\t series: series,\n\t clip: pane.options.clip\n\t });\n\n\t this.appendChart(rangeAreaChart, pane);\n\t },\n\n\t createOHLCChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var firstSeries = series[0];\n\t var chart = new OHLCChart(this, {\n\t invertAxes: this.invertAxes,\n\t gap: firstSeries.gap,\n\t series: series,\n\t spacing: firstSeries.spacing,\n\t clip: pane.options.clip\n\t });\n\n\t this.appendChart(chart, pane);\n\t },\n\n\t createCandlestickChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var firstSeries = series[0];\n\t var chart = new CandlestickChart(this, {\n\t invertAxes: this.invertAxes,\n\t gap: firstSeries.gap,\n\t series: series,\n\t spacing: firstSeries.spacing,\n\t clip: pane.options.clip\n\t });\n\n\t this.appendChart(chart, pane);\n\t },\n\n\t createBoxPlotChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var firstSeries = series[0];\n\t var chart = new BoxPlotChart(this, {\n\t invertAxes: this.invertAxes,\n\t gap: firstSeries.gap,\n\t series: series,\n\t spacing: firstSeries.spacing,\n\t clip: pane.options.clip\n\t });\n\n\t this.appendChart(chart, pane);\n\t },\n\n\t createWaterfallChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var firstSeries = series[0];\n\t var waterfallChart = new WaterfallChart(this, {\n\t series: series,\n\t invertAxes: this.invertAxes,\n\t gap: firstSeries.gap,\n\t spacing: firstSeries.spacing\n\t });\n\n\t this.appendChart(waterfallChart, pane);\n\t },\n\n\t axisRequiresRounding: function(categoryAxisName, categoryAxisIndex) {\n\t var this$1 = this;\n\n\t var centeredSeries = filterSeriesByType(this.series, EQUALLY_SPACED_SERIES);\n\n\t for (var seriesIx = 0; seriesIx < this.series.length; seriesIx++) {\n\t var currentSeries = this$1.series[seriesIx];\n\t if (inArray(currentSeries.type, AREA_SERIES)) {\n\t var line = currentSeries.line;\n\t if (line && line.style === STEP) {\n\t centeredSeries.push(currentSeries);\n\t }\n\t }\n\t }\n\n\t for (var seriesIx$1 = 0; seriesIx$1 < centeredSeries.length; seriesIx$1++) {\n\t var seriesAxis = centeredSeries[seriesIx$1].categoryAxis || \"\";\n\t if (seriesAxis === categoryAxisName || (!seriesAxis && categoryAxisIndex === 0)) {\n\t return true;\n\t }\n\t }\n\t },\n\n\t aggregatedAxis: function(categoryAxisName, categoryAxisIndex) {\n\t var series = this.series;\n\n\t for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n\t var seriesAxis = series[seriesIx].categoryAxis || \"\";\n\t if ((seriesAxis === categoryAxisName || (!seriesAxis && categoryAxisIndex === 0)) && series[seriesIx].categoryField) {\n\t return true;\n\t }\n\t }\n\t },\n\n\t createCategoryAxesLabels: function() {\n\t var axes = this.axes;\n\t for (var i = 0; i < axes.length; i++) {\n\t if (axes[i] instanceof CategoryAxis) {\n\t axes[i].createLabels();\n\t }\n\t }\n\t },\n\n\t createCategoryAxes: function(panes) {\n\t var this$1 = this;\n\n\t var invertAxes = this.invertAxes;\n\t var definitions = [].concat(this.options.categoryAxis);\n\t var axes = [];\n\n\t for (var i = 0; i < definitions.length; i++) {\n\t var axisOptions = definitions[i];\n\t var axisPane = this$1.findPane(axisOptions.pane);\n\n\t if (inArray(axisPane, panes)) {\n\t var name = axisOptions.name;\n\t var categories = axisOptions.categories; if (categories === void 0) { categories = []; }\n\t axisOptions = deepExtend({\n\t vertical: invertAxes,\n\t reverse: !invertAxes && this$1.chartService.rtl,\n\t axisCrossingValue: invertAxes ? MAX_VALUE : 0\n\t }, axisOptions);\n\n\t if (!defined(axisOptions.justified)) {\n\t axisOptions.justified = this$1.isJustified();\n\t }\n\n\t if (this$1.axisRequiresRounding(name, i)) {\n\t axisOptions.justified = false;\n\t }\n\n\t var categoryAxis = (void 0);\n\n\t if (isDateAxis(axisOptions, categories[0])) {\n\t categoryAxis = new dataviz.DateCategoryAxis(axisOptions, this$1.chartService);\n\t } else {\n\t categoryAxis = new CategoryAxis(axisOptions, this$1.chartService);\n\t }\n\n\t definitions[i].categories = categoryAxis.options.srcCategories;\n\n\t if (name) {\n\t if (this$1.namedCategoryAxes[name]) {\n\t throw new Error((\"Category axis with name \" + name + \" is already defined\"));\n\t }\n\t this$1.namedCategoryAxes[name] = categoryAxis;\n\t }\n\n\t categoryAxis.axisIndex = i;\n\t axes.push(categoryAxis);\n\t this$1.appendAxis(categoryAxis);\n\t }\n\t }\n\n\t var primaryAxis = this.categoryAxis || axes[0];\n\t this.categoryAxis = primaryAxis;\n\n\t if (invertAxes) {\n\t this.axisY = primaryAxis;\n\t } else {\n\t this.axisX = primaryAxis;\n\t }\n\t },\n\n\t isJustified: function() {\n\t var series = this.series;\n\n\t for (var i = 0; i < series.length; i++) {\n\t var currentSeries = series[i];\n\t if (!inArray(currentSeries.type, AREA_SERIES)) {\n\t return false;\n\t }\n\t }\n\n\t return true;\n\t },\n\n\t createValueAxes: function(panes) {\n\t var this$1 = this;\n\n\t var tracker = this.valueAxisRangeTracker;\n\t var defaultRange = tracker.query();\n\t var definitions = [].concat(this.options.valueAxis);\n\t var invertAxes = this.invertAxes;\n\t var baseOptions = { vertical: !invertAxes, reverse: invertAxes && this.chartService.rtl };\n\t var axes = [];\n\n\t if (this.stack100) {\n\t baseOptions.roundToMajorUnit = false;\n\t baseOptions.labels = { format: \"P0\" };\n\t }\n\n\t for (var i = 0; i < definitions.length; i++) {\n\t var axisOptions = definitions[i];\n\t var axisPane = this$1.findPane(axisOptions.pane);\n\n\t if (inArray(axisPane, panes)) {\n\t var name = axisOptions.name;\n\t var defaultAxisRange = equalsIgnoreCase(axisOptions.type, LOGARITHMIC) ? { min: 0.1, max: 1 } : { min: 0, max: 1 };\n\t var range = tracker.query(name) || defaultRange || defaultAxisRange;\n\n\t if (i === 0 && range && defaultRange) {\n\t range.min = Math.min(range.min, defaultRange.min);\n\t range.max = Math.max(range.max, defaultRange.max);\n\t }\n\n\t var axisType = (void 0);\n\t if (equalsIgnoreCase(axisOptions.type, LOGARITHMIC)) {\n\t axisType = dataviz.LogarithmicAxis;\n\t } else {\n\t axisType = dataviz.NumericAxis;\n\t }\n\n\t var valueAxis = new axisType(range.min, range.max,\n\t deepExtend({}, baseOptions, axisOptions),\n\t this$1.chartService\n\t );\n\n\t if (name) {\n\t if (this$1.namedValueAxes[name]) {\n\t throw new Error((\"Value axis with name \" + name + \" is already defined\"));\n\t }\n\t this$1.namedValueAxes[name] = valueAxis;\n\t }\n\t valueAxis.axisIndex = i;\n\n\t axes.push(valueAxis);\n\t this$1.appendAxis(valueAxis);\n\t }\n\t }\n\n\t var primaryAxis = this.valueAxis || axes[0];\n\t this.valueAxis = primaryAxis;\n\n\t if (invertAxes) {\n\t this.axisX = primaryAxis;\n\t } else {\n\t this.axisY = primaryAxis;\n\t }\n\t },\n\n\t _dispatchEvent: function(chart, e, eventType) {\n\t var coords = chart._eventCoordinates(e);\n\t var point = new Point(coords.x, coords.y);\n\t var pane = this.pointPane(point);\n\t var categories = [];\n\t var values = [];\n\n\t if (!pane) {\n\t return;\n\t }\n\n\t var allAxes = pane.axes;\n\t for (var i = 0; i < allAxes.length; i++) {\n\t var axis = allAxes[i];\n\t if (axis.getValue) {\n\t appendIfNotNull(values, axis.getValue(point));\n\t } else {\n\t appendIfNotNull(categories, axis.getCategory(point));\n\t }\n\t }\n\n\t if (categories.length === 0) {\n\t appendIfNotNull(categories, this.categoryAxis.getCategory(point));\n\t }\n\n\t if (categories.length > 0 && values.length > 0) {\n\t chart.trigger(eventType, {\n\t element: eventElement(e),\n\t originalEvent: e,\n\t category: singleItemOrArray(categories),\n\t value: singleItemOrArray(values)\n\t });\n\t }\n\t },\n\n\t pointPane: function(point) {\n\t var panes = this.panes;\n\n\t for (var i = 0; i < panes.length; i++) {\n\t var currentPane = panes[i];\n\t if (currentPane.contentBox.containsPoint(point)) {\n\t return currentPane;\n\t }\n\t }\n\t },\n\n\t updateAxisOptions: function(axis, options) {\n\t updateAxisOptions(this.options, axis, options);\n\t updateAxisOptions(this.originalOptions, axis, options);\n\t }\n\t});\n\n\tfunction updateAxisOptions(targetOptions, axis, options) {\n\t var axesOptions = axis instanceof CategoryAxis ? [].concat(targetOptions.categoryAxis) : [].concat(targetOptions.valueAxis);\n\t deepExtend(axesOptions[axis.axisIndex], options);\n\t}\n\n\tfunction groupSeries(series, axis, axisIx) {\n\t return grep(series, function(s) {\n\t return (axisIx === 0 && !s.categoryAxis) || (s.categoryAxis === axis);\n\t });\n\t}\n\n\tsetDefaultOptions(CategoricalPlotArea, {\n\t categoryAxis: {},\n\t valueAxis: {}\n\t});\n\n\tdeepExtend(CategoricalPlotArea.prototype, PlotAreaEventsMixin);\n\n\tvar Highlight = Class.extend({\n\t init: function() {\n\n\t this._points = [];\n\t },\n\n\t destroy: function() {\n\t this._points = [];\n\t },\n\n\t show: function(points, opacity) {\n\t var this$1 = this;\n\n\t var arrayPoints = [].concat(points);\n\t this.hide();\n\n\t for (var i = 0; i < arrayPoints.length; i++) {\n\t var point = arrayPoints[i];\n\t if (point && point.toggleHighlight && point.hasHighlight()) {\n\t this$1.togglePointHighlight(point, true, opacity);\n\t this$1._points.push(point);\n\t }\n\t }\n\t },\n\n\t togglePointHighlight: function(point, show, opacity) {\n\t var toggleHandler = (point.options.highlight || {}).toggle;\n\t if (toggleHandler) {\n\t var eventArgs = {\n\t category: point.category,\n\t series: point.series,\n\t dataItem: point.dataItem,\n\t value: point.value,\n\t stackValue: point.stackValue,\n\t preventDefault: preventDefault,\n\t visual: point.highlightVisual(),\n\t show: show\n\t };\n\t toggleHandler(eventArgs);\n\t if (!eventArgs._defaultPrevented) {\n\t point.toggleHighlight(show, opacity);\n\t }\n\t } else {\n\t point.toggleHighlight(show, opacity);\n\t }\n\t },\n\n\t hide: function() {\n\t var this$1 = this;\n\n\t var points = this._points;\n\t while (points.length) {\n\t this$1.togglePointHighlight(points.pop(), false);\n\t }\n\t },\n\n\t isHighlighted: function(element) {\n\t var points = this._points;\n\n\t for (var i = 0; i < points.length; i++) {\n\t var point = points[i];\n\t if (element === point) {\n\t return true;\n\t }\n\t }\n\n\t return false;\n\t }\n\t});\n\n\tfunction preventDefault() {\n\t this._defaultPrevented = true;\n\t}\n\n\tfunction acceptKey(e, mouseKey) {\n\t var key = (mouseKey || \"\").toLowerCase();\n\t var event = e.event;\n\t var accept = (key === \"none\" && !(event.ctrlKey || event.shiftKey || event.altKey)) || event[key + \"Key\"];\n\n\t return accept;\n\t}\n\n\tfunction toChartAxisRanges(axisRanges) {\n\t var ranges = {};\n\t for (var idx = 0; idx < axisRanges.length; idx++) {\n\t var axisRange = axisRanges[idx];\n\t if (axisRange.axis.options.name) {\n\t ranges[axisRange.axis.options.name] = {\n\t min: axisRange.range.min,\n\t max: axisRange.range.max\n\t };\n\t }\n\t }\n\t return ranges;\n\t}\n\n\tvar Pannable = Class.extend({\n\t init: function(plotArea, options) {\n\n\t this.plotArea = plotArea;\n\t this.options = deepExtend({}, this.options, options);\n\t },\n\n\t start: function(e) {\n\t this._active = acceptKey(e, this.options.key);\n\t return this._active;\n\t },\n\n\t move: function(e) {\n\t if (this._active) {\n\t var axisRanges = this.axisRanges = this._panAxes(e, X).concat(this._panAxes(e, Y));\n\t if (axisRanges.length) {\n\t this.axisRanges = axisRanges;\n\t return toChartAxisRanges(axisRanges);\n\t }\n\t }\n\t },\n\n\t end: function() {\n\t var active = this._active;\n\t this._active = false;\n\n\t return active;\n\t },\n\n\t pan: function() {\n\t var ref = this;\n\t var plotArea = ref.plotArea;\n\t var axisRanges = ref.axisRanges;\n\t if (axisRanges.length) {\n\t for (var idx = 0; idx < axisRanges.length; idx++) {\n\t var range = axisRanges[idx];\n\t plotArea.updateAxisOptions(range.axis, range.range);\n\t }\n\t plotArea.redraw(plotArea.panes);\n\t }\n\t },\n\n\t destroy: function() {\n\t delete this.plotArea;\n\t },\n\n\t _panAxes: function(e, position) {\n\t var plotArea = this.plotArea;\n\t var delta = -e[position].delta;\n\t var lock = (this.options.lock || \"\").toLowerCase();\n\t var updatedAxes = [];\n\n\t if (delta !== 0 && (lock || \"\").toLowerCase() !== position) {\n\t var axes = plotArea.axes;\n\t for (var idx = 0; idx < axes.length; idx++) {\n\t var axis = axes[idx];\n\n\t if (position === X && !axis.options.vertical || position === Y && axis.options.vertical) {\n\t var range = axis.pan(delta);\n\n\t if (range) {\n\t range.limitRange = true;\n\t updatedAxes.push({\n\t axis: axis,\n\t range: range\n\t });\n\t }\n\t }\n\t }\n\t }\n\n\t return updatedAxes;\n\t }\n\t});\n\n\tPannable.prototype.options = {\n\t key: \"none\",\n\t lock: \"none\"\n\t};\n\n\tvar ZoomSelection = Class.extend({\n\t init: function(chart, options) {\n\n\t this.chart = chart;\n\t this.options = deepExtend({}, this.options, options);\n\t this.createElement();\n\t },\n\n\t createElement: function() {\n\t var marquee = this._marquee = document.createElement(\"div\");\n\t marquee.className = \"k-marquee\";\n\t var marqueeColor = document.createElement(\"div\");\n\t marqueeColor.className = \"k-marquee-color\";\n\t marquee.appendChild(marqueeColor);\n\t },\n\n\t removeElement: function() {\n\t if (this._marquee.parentNode) {\n\t this._marquee.parentNode.removeChild(this._marquee);\n\t }\n\t },\n\n\t setStyles: function(styles) {\n\t elementStyles(this._marquee, styles);\n\t },\n\n\t start: function(e) {\n\t if (acceptKey(e, this.options.key)) {\n\t var chart = this.chart;\n\t var point = chart._eventCoordinates(e);\n\t var zoomPane = this._zoomPane = chart._plotArea.paneByPoint(point);\n\t var clipBox = zoomPane ? zoomPane.chartsBox().clone() : null;\n\n\t if (zoomPane && clipBox) {\n\t var offset = this._elementOffset();\n\n\t clipBox.translate(offset.left, offset.top);\n\t this._zoomPaneClipBox = clipBox;\n\n\t document.body.appendChild(this._marquee);\n\t this.setStyles({\n\t left: e.pageX + 1,\n\t top: e.pageY + 1,\n\t width: 0,\n\t height: 0\n\t });\n\n\t return true;\n\t }\n\t }\n\t return false;\n\t },\n\n\t _elementOffset: function() {\n\t var chartElement = this.chart.element;\n\t var ref = elementStyles(chartElement, [ \"paddingLeft\", \"paddingTop\" ]);\n\t var paddingLeft = ref.paddingLeft;\n\t var paddingTop = ref.paddingTop;\n\t var offset = dataviz.elementOffset(chartElement);\n\n\t return {\n\t left: paddingLeft + offset.left,\n\t top: paddingTop + offset.top\n\t };\n\t },\n\n\t move: function(e) {\n\t var zoomPane = this._zoomPane;\n\t if (zoomPane) {\n\t this.setStyles(this._selectionPosition(e));\n\t }\n\t },\n\n\t end: function(e) {\n\t var zoomPane = this._zoomPane;\n\t if (zoomPane) {\n\t var elementOffset$$1 = this._elementOffset();\n\t var selectionPosition = this._selectionPosition(e);\n\t selectionPosition.left -= elementOffset$$1.left;\n\t selectionPosition.top -= elementOffset$$1.top;\n\n\t var start = { x: selectionPosition.left, y: selectionPosition.top };\n\t var end = { x: selectionPosition.left + selectionPosition.width, y: selectionPosition.top + selectionPosition.height };\n\t this._updateAxisRanges(start, end);\n\n\t this.removeElement();\n\t delete this._zoomPane;\n\n\t return toChartAxisRanges(this.axisRanges);\n\t }\n\t },\n\n\t zoom: function() {\n\t var axisRanges = this.axisRanges;\n\t if (axisRanges && axisRanges.length) {\n\t var plotArea = this.chart._plotArea;\n\t for (var idx = 0; idx < axisRanges.length; idx++) {\n\t var axisRange = axisRanges[idx];\n\t plotArea.updateAxisOptions(axisRange.axis, axisRange.range);\n\t }\n\t plotArea.redraw(plotArea.panes);\n\t }\n\t },\n\n\t destroy: function() {\n\t this.removeElement();\n\t delete this._marquee;\n\t delete this.chart;\n\t },\n\n\t _updateAxisRanges: function(start, end) {\n\t var lock = (this.options.lock || \"\").toLowerCase();\n\t var axisRanges = [];\n\n\t var axes = this._zoomPane.axes;\n\t for (var idx = 0; idx < axes.length; idx++) {\n\t var axis = axes[idx];\n\t var vertical = axis.options.vertical;\n\t if (!(lock === X && !vertical) && !(lock === Y && vertical) && defined(axis.axisIndex)) {\n\t var range = axis.pointsRange(start, end);\n\t if (range) {\n\t axisRanges.push({\n\t axis: axis,\n\t range: range\n\t });\n\t }\n\t }\n\t }\n\n\t this.axisRanges = axisRanges;\n\t },\n\n\t _selectionPosition: function(e) {\n\t var clipBox = this._zoomPaneClipBox;\n\t var startLocation = {\n\t x: e.x.startLocation,\n\t y: e.y.startLocation\n\t };\n\t var pageX = e.x.location;\n\t var pageY = e.y.location;\n\t var lock = (this.options.lock || \"\").toLowerCase();\n\t var left = Math.min(startLocation.x, pageX);\n\t var top = Math.min(startLocation.y, pageY);\n\t var width = Math.abs(startLocation.x - pageX);\n\t var height = Math.abs(startLocation.y - pageY);\n\n\t if (lock === X) {\n\t left = clipBox.x1;\n\t width = clipBox.width();\n\t }\n\t if (lock === Y) {\n\t top = clipBox.y1;\n\t height = clipBox.height();\n\t }\n\n\t if (pageX > clipBox.x2) {\n\t width = clipBox.x2 - startLocation.x;\n\t }\n\n\t if (pageX < clipBox.x1) {\n\t width = startLocation.x - clipBox.x1;\n\t }\n\n\t if (pageY > clipBox.y2) {\n\t height = clipBox.y2 - startLocation.y;\n\t }\n\n\t if (pageY < clipBox.y1) {\n\t height = startLocation.y - clipBox.y1;\n\t }\n\n\t return {\n\t left: Math.max(left, clipBox.x1),\n\t top: Math.max(top, clipBox.y1),\n\t width: width,\n\t height: height\n\t };\n\t }\n\t});\n\n\tZoomSelection.prototype.options = {\n\t key: \"shift\",\n\t lock: \"none\"\n\t};\n\n\tvar MousewheelZoom = Class.extend({\n\t init: function(chart, options) {\n\n\t this.chart = chart;\n\t this.options = deepExtend({\n\t rate: 0.3\n\t }, this.options, options);\n\t },\n\n\t updateRanges: function(delta, coords) {\n\t var this$1 = this;\n\n\t var lock = (this.options.lock || \"\").toLowerCase();\n\t var axisRanges = [];\n\t var axes = this.chart._plotArea.axes;\n\n\t for (var idx = 0; idx < axes.length; idx++) {\n\t var axis = axes[idx];\n\t var vertical = axis.options.vertical;\n\n\t if (!(lock === X && !vertical) && !(lock === Y && vertical) && axis.zoomRange) {\n\t var range = axis.zoomRange(-delta * this$1.options.rate, coords);\n\n\t if (range) {\n\t axisRanges.push({\n\t axis: axis,\n\t range: range\n\t });\n\t }\n\t }\n\t }\n\n\t this.axisRanges = axisRanges;\n\t return toChartAxisRanges(axisRanges);\n\t },\n\n\t zoom: function() {\n\t var axisRanges = this.axisRanges;\n\t var plotArea = this.chart._plotArea;\n\n\t if (axisRanges && axisRanges.length && plotArea.updateAxisOptions) {\n\t for (var idx = 0; idx < axisRanges.length; idx++) {\n\t var axisRange = axisRanges[idx];\n\t plotArea.updateAxisOptions(axisRange.axis, axisRange.range);\n\t }\n\t plotArea.redraw(plotArea.panes);\n\t }\n\t },\n\n\t destroy: function() {\n\t delete this.chart;\n\t }\n\t});\n\n\tvar LegendLayout = ChartElement.extend({\n\t init: function(options, chartService) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.chartService = chartService;\n\t },\n\n\t render: function() {\n\t var ref = this;\n\t var children = ref.children;\n\t var options = ref.options;\n\t var vertical = options.vertical;\n\n\t this.visual = new drawing.Layout(null, {\n\t spacing: vertical ? 0 : options.spacing,\n\t lineSpacing: vertical ? options.spacing : 0,\n\t orientation: vertical ? \"vertical\" : \"horizontal\",\n\t reverse: options.rtl,\n\t alignItems: vertical ? \"start\" : \"center\"\n\t });\n\n\t for (var idx = 0; idx < children.length; idx++) {\n\t var legendItem = children[idx];\n\t legendItem.reflow(new Box());\n\t legendItem.renderVisual();\n\t }\n\t },\n\n\t reflow: function(box) {\n\t this.visual.rect(box.toRect());\n\t this.visual.reflow();\n\t var bbox = this.visual.clippedBBox();\n\n\t if (bbox) {\n\t this.box = dataviz.rectToBox(bbox);\n\t } else {\n\t this.box = new Box();\n\t }\n\t },\n\n\t renderVisual: function() {\n\t this.addVisual();\n\t },\n\n\t createVisual: function() {}\n\t});\n\n\tvar LegendItem = BoxElement.extend({\n\t init: function(options) {\n\t BoxElement.fn.init.call(this, options);\n\n\t this.createContainer();\n\t if (!options.rtl) {\n\t this.createMarker();\n\t this.createLabel();\n\t } else {\n\t this.createLabel();\n\t this.createMarker();\n\t }\n\t },\n\n\t createContainer: function() {\n\t this.container = new dataviz.FloatElement({ vertical: false, wrap: false, align: CENTER, spacing: this.options.spacing });\n\t this.append(this.container);\n\t },\n\n\t createMarker: function() {\n\t this.container.append(new ShapeElement(this.markerOptions()));\n\t },\n\n\t markerOptions: function() {\n\t var options = this.options;\n\t var markerColor = options.markerColor;\n\t return deepExtend({}, options.markers, {\n\t background: markerColor,\n\t border: {\n\t color: markerColor\n\t }\n\t });\n\t },\n\n\t createLabel: function() {\n\t var options = this.options;\n\t var labelOptions = deepExtend({}, options.labels);\n\n\t this.container.append(new TextBox(options.text, labelOptions));\n\t },\n\n\t renderComplete: function() {\n\t BoxElement.fn.renderComplete.call(this);\n\n\t var cursor = this.options.cursor || {};\n\t var eventSink = this._itemOverlay = Path.fromRect(this.container.box.toRect(), {\n\t fill: {\n\t color: WHITE,\n\t opacity: 0\n\t },\n\t stroke: null,\n\t cursor: cursor.style || cursor\n\t });\n\n\t this.appendVisual(eventSink);\n\t },\n\n\t click: function(widget, e) {\n\t var args = this.eventArgs(e);\n\n\t if (!widget.trigger(LEGEND_ITEM_CLICK, args) && e && e.type === 'contextmenu') {\n\t e.preventDefault();\n\t }\n\t },\n\n\t over: function(widget, e) {\n\t var args = this.eventArgs(e);\n\n\t if (!widget.trigger(LEGEND_ITEM_HOVER, args)) {\n\t widget._legendItemHover(args.seriesIndex, args.pointIndex);\n\t }\n\n\t // Don't trigger point hover for legend items\n\t return true;\n\t },\n\n\t out: function(widget, e) {\n\t widget._unsetActivePoint();\n\n\t widget.trigger(LEGEND_ITEM_LEAVE, this.eventArgs(e));\n\t },\n\n\t eventArgs: function(e) {\n\t var options = this.options;\n\n\t return {\n\t element: eventElement(e),\n\t text: options.text,\n\t series: options.series,\n\t seriesIndex: options.series.index,\n\t pointIndex: options.pointIndex\n\t };\n\t },\n\n\t renderVisual: function() {\n\t var this$1 = this;\n\n\t var options = this.options;\n\t var customVisual = options.visual;\n\n\t if (customVisual) {\n\t this.visual = customVisual({\n\t active: options.active,\n\t series: options.series,\n\t sender: this.getSender(),\n\t pointIndex: options.pointIndex,\n\t options: {\n\t markers: this.markerOptions(),\n\t labels: options.labels\n\t },\n\t createVisual: function () {\n\t this$1.createVisual();\n\t this$1.renderChildren();\n\t this$1.renderComplete();\n\n\t var defaultVisual = this$1.visual;\n\n\t delete this$1.visual;\n\n\t return defaultVisual;\n\t }\n\t });\n\t this.addVisual();\n\t } else {\n\t BoxElement.fn.renderVisual.call(this);\n\t }\n\t }\n\t});\n\n\tvar HORIZONTAL = \"horizontal\";\n\tvar POINTER = \"pointer\";\n\tvar CUSTOM = \"custom\";\n\n\tvar Legend = ChartElement.extend({\n\t init: function(options, chartService) {\n\t if (chartService === void 0) { chartService = {}; }\n\n\t ChartElement.fn.init.call(this, options);\n\n\t this.chartService = chartService;\n\n\t if (!inArray(this.options.position, [ TOP, RIGHT, BOTTOM, LEFT, CUSTOM ])) {\n\t this.options.position = RIGHT;\n\t }\n\n\t this.createContainers();\n\n\t this.createLegendTitle(options.title);\n\n\t this.createItems();\n\t },\n\n\t createContainers: function() {\n\t var options = this.options;\n\t var position = options.position;\n\t var userAlign = options.align;\n\t var align = position;\n\t var vAlign = CENTER;\n\n\t if (position === CUSTOM) {\n\t align = LEFT;\n\t } else if (inArray(position, [ TOP, BOTTOM ])) {\n\t if (userAlign === \"start\") {\n\t align = LEFT;\n\t } else if (userAlign === \"end\") {\n\t align = RIGHT;\n\t } else {\n\t align = CENTER;\n\t }\n\t vAlign = position;\n\t } else if (userAlign) {\n\t if (userAlign === \"start\") {\n\t vAlign = TOP;\n\t } else if (userAlign === \"end\") {\n\t vAlign = BOTTOM;\n\t }\n\t }\n\n\t this.container = new BoxElement({\n\t margin: options.margin,\n\t padding: options.padding,\n\t background: options.background,\n\t border: options.border,\n\t vAlign: vAlign,\n\t align: align,\n\t zIndex: options.zIndex,\n\t shrinkToFit: true\n\t });\n\n\t if (this.hasTitle()) {\n\t this.itemsContainer = new BoxElement({\n\t vAlign: vAlign,\n\t align: align,\n\t zIndex: options.zIndex,\n\t shrinkToFit: true\n\t });\n\t } else {\n\t this.itemsContainer = this.container;\n\t }\n\n\t this.append(this.container);\n\t },\n\n\t createItems: function() {\n\t var chartService = this.getService();\n\t var options = this.options;\n\t var vertical = this.isVertical();\n\t var innerElement = new LegendLayout({\n\t vertical: vertical,\n\t spacing: options.spacing,\n\t rtl: chartService.rtl\n\t }, chartService);\n\t var items = options.items;\n\n\t if (options.reverse) {\n\t items = items.slice(0).reverse();\n\t }\n\n\t var count = items.length;\n\n\t for (var i = 0; i < count; i++) {\n\t var item = items[i];\n\n\t innerElement.append(new LegendItem(deepExtend({}, {\n\t markers: options.markers,\n\t labels: options.labels,\n\t rtl: chartService.rtl\n\t }, options.item, item)));\n\t }\n\n\t innerElement.render();\n\t this.itemsContainer.append(innerElement);\n\t },\n\n\t isVertical: function() {\n\t var ref = this.options;\n\t var orientation = ref.orientation;\n\t var position = ref.position;\n\t var vertical = (position === CUSTOM && orientation !== HORIZONTAL) ||\n\t (defined(orientation) ? orientation !== HORIZONTAL : inArray(position, [ LEFT, RIGHT ]));\n\n\t return vertical;\n\t },\n\n\t hasItems: function() {\n\t return this.container.children[0].children.length > 0;\n\t },\n\n\t reflow: function(targetBox) {\n\t var options = this.options;\n\t var legendBox = targetBox.clone();\n\n\t if (!this.hasItems()) {\n\t this.box = legendBox;\n\t return;\n\t }\n\n\t if (options.position === CUSTOM) {\n\t this.containerCustomReflow(legendBox);\n\t this.box = legendBox;\n\t } else {\n\t this.containerReflow(legendBox);\n\t }\n\n\t if (this.hasTitle()) {\n\t this.title.reflow(new Box(this.container.box.x1, this.title.box.y1, this.container.box.x2, this.title.box.y2));\n\t }\n\t },\n\n\t containerReflow: function(targetBox) {\n\t var ref = this;\n\t var options = ref.options;\n\t var container = ref.container;\n\t var position = options.position;\n\t var width = options.width;\n\t var height = options.height;\n\t var pos = position === TOP || position === BOTTOM ? X : Y;\n\t var vertical = this.isVertical();\n\t var alignTarget = targetBox.clone();\n\t var containerBox = targetBox.clone();\n\n\t if (position === LEFT || position === RIGHT) {\n\t containerBox.y1 = alignTarget.y1 = 0;\n\t }\n\n\t if (vertical && height) {\n\t containerBox.y2 = containerBox.y1 + height;\n\t containerBox.align(alignTarget, Y, container.options.vAlign);\n\t } else if (!vertical && width) {\n\t containerBox.x2 = containerBox.x1 + width;\n\t containerBox.align(alignTarget, X, container.options.align);\n\t }\n\n\t container.reflow(containerBox);\n\t containerBox = container.box;\n\n\t var box = containerBox.clone();\n\n\t if (options.offsetX || options.offsetY) {\n\t containerBox.translate(options.offsetX, options.offsetY);\n\t container.reflow(containerBox);\n\t }\n\n\t box[pos + 1] = targetBox[pos + 1];\n\t box[pos + 2] = targetBox[pos + 2];\n\n\t this.box = box;\n\t },\n\n\t containerCustomReflow: function(targetBox) {\n\t var ref = this;\n\t var options = ref.options;\n\t var container = ref.container;\n\t var offsetX = options.offsetX;\n\t var offsetY = options.offsetY;\n\t var width = options.width;\n\t var height = options.height;\n\t var vertical = this.isVertical();\n\t var containerBox = targetBox.clone();\n\n\t if (vertical && height) {\n\t containerBox.y2 = containerBox.y1 + height;\n\t } else if (!vertical && width) {\n\t containerBox.x2 = containerBox.x1 + width;\n\t }\n\t container.reflow(containerBox);\n\t containerBox = container.box;\n\n\t container.reflow(new Box(\n\t offsetX, offsetY,\n\t offsetX + containerBox.width(), offsetY + containerBox.height()\n\t ));\n\t },\n\n\t renderVisual: function() {\n\t if (this.hasItems()) {\n\t ChartElement.fn.renderVisual.call(this);\n\t }\n\t },\n\n\t createLegendTitle: function(title) {\n\t var titleOptions = deepExtend({}, {\n\t color: BLACK,\n\t position: TOP,\n\t align: CENTER\n\t }, title);\n\t var text = titleOptions.text;\n\n\t if (!title || title.visible === false) {\n\t return;\n\t }\n\n\t if (defined(titleOptions) && titleOptions.visible) {\n\t var labelTemplate = getTemplate(titleOptions);\n\t if (labelTemplate) {\n\t text = labelTemplate({ text: text });\n\t } else if (titleOptions.format) {\n\t text = this.chartService.format.auto(titleOptions.format, text);\n\t }\n\t }\n\n\t this.title = new TextBox(text, titleOptions);\n\n\t this.createTitleLayout();\n\n\t this.appendTitleLayoutContent();\n\t },\n\n\t createTitleLayout: function() {\n\t this.layout = new dataviz.FloatElement({\n\t vertical: true,\n\t wrap: false\n\t });\n\n\t this.container.append(this.layout);\n\t },\n\n\t hasTitle: function() {\n\t return Boolean(this.options.title && this.options.title.visible !== false);\n\t },\n\n\t appendTitleLayoutContent: function() {\n\t var options = this.options;\n\n\t if (options.title.position === BOTTOM) {\n\t this.layout.append(this.itemsContainer);\n\t this.layout.append(this.title);\n\t } else {\n\t this.layout.append(this.title);\n\t this.layout.append(this.itemsContainer);\n\t }\n\t }\n\t});\n\n\tsetDefaultOptions(Legend, {\n\t position: RIGHT,\n\t items: [],\n\t offsetX: 0,\n\t offsetY: 0,\n\t margin: getSpacing(5),\n\t padding: getSpacing(5),\n\t border: {\n\t color: BLACK,\n\t width: 0\n\t },\n\t item: {\n\t cursor: POINTER,\n\t spacing: 6\n\t },\n\t spacing: 6,\n\t background: \"\",\n\t zIndex: 1,\n\t markers: {\n\t border: {\n\t width: 0\n\t },\n\t width: 15,\n\t height: 3,\n\t type: \"rect\",\n\t align: LEFT,\n\t vAlign: CENTER\n\t }\n\t});\n\n\tvar PlotAreaFactory = Class.extend({\n\t init: function() {\n\n\t this._registry = [];\n\t },\n\n\t register: function(type, seriesTypes) {\n\t this._registry.push({\n\t type: type,\n\t seriesTypes: seriesTypes\n\t });\n\t },\n\n\t create: function(srcSeries, options, chartService) {\n\t var registry = this._registry;\n\t var match = registry[0];\n\t var series;\n\n\t for (var idx = 0; idx < registry.length; idx++) {\n\t var entry = registry[idx];\n\t series = filterSeriesByType(srcSeries, entry.seriesTypes);\n\n\t if (series.length > 0) {\n\t match = entry;\n\t break;\n\t }\n\t }\n\n\t return new match.type(series, options, chartService);\n\t }\n\t});\n\n\tPlotAreaFactory.current = new PlotAreaFactory();\n\n\tvar ZOOM_ACCELERATION = 3;\n\tvar SELECTOR_HEIGHT_ADJUST = 0.1;\n\n\tfunction createDiv(className) {\n\t var element = document.createElement(\"div\");\n\t if (className) {\n\t element.className = className;\n\t }\n\n\t return element;\n\t}\n\n\tfunction closestHandle(element) {\n\t var current = element;\n\t while (current && !hasClasses(current, \"k-handle\")) {\n\t current = current.parentNode;\n\t }\n\n\t return current;\n\t}\n\n\tvar Selection = Class.extend({\n\t init: function(chart, categoryAxis, options, observer) {\n\n\t var chartElement = chart.element;\n\n\t this.options = deepExtend({}, this.options, options);\n\t this.chart = chart;\n\t this.observer = observer;\n\t this.chartElement = chartElement;\n\t this.categoryAxis = categoryAxis;\n\t this._dateAxis = this.categoryAxis instanceof dataviz.DateCategoryAxis;\n\n\t this.initOptions();\n\n\t this.visible = this.options.visible && chartElement.offsetHeight;\n\n\t if (this.visible) {\n\t this.createElements();\n\n\t this.set(this._index(this.options.from), this._index(this.options.to));\n\n\t this.bindEvents();\n\t }\n\t },\n\n\t onPane: function(pane) {\n\t return this.categoryAxis.pane === pane;\n\t },\n\n\t createElements: function() {\n\t var options = this.options;\n\t var wrapper = this.wrapper = createDiv(\"k-selector\");\n\t elementStyles(wrapper, {\n\t top: options.offset.top,\n\t left: options.offset.left,\n\t width: options.width,\n\t height: options.height,\n\t direction: 'ltr'\n\t });\n\t var selection = this.selection = createDiv(\"k-selection\");\n\t this.leftMask = createDiv(\"k-mask\");\n\t this.rightMask = createDiv(\"k-mask\");\n\n\t wrapper.appendChild(this.leftMask);\n\t wrapper.appendChild(this.rightMask);\n\t wrapper.appendChild(selection);\n\n\t selection.appendChild(createDiv(\"k-selection-bg\"));\n\n\t var leftHandle = this.leftHandle = createDiv(\"k-handle k-left-handle\");\n\t var rightHandle = this.rightHandle = createDiv(\"k-handle k-right-handle\");\n\t leftHandle.appendChild(createDiv());\n\t rightHandle.appendChild(createDiv());\n\n\t selection.appendChild(leftHandle);\n\t selection.appendChild(rightHandle);\n\n\t this.chartElement.appendChild(wrapper);\n\t var selectionStyles = elementStyles(selection, [ \"borderLeftWidth\", \"borderRightWidth\", \"height\" ]);\n\t var leftHandleHeight = elementStyles(leftHandle, \"height\").height;\n\t var rightHandleHeight = elementStyles(rightHandle, \"height\").height;\n\n\t options.selection = {\n\t border: {\n\t left: selectionStyles.borderLeftWidth,\n\t right: selectionStyles.borderRightWidth\n\t }\n\t };\n\n\t elementStyles(leftHandle, {\n\t top: (selectionStyles.height - leftHandleHeight) / 2\n\t });\n\n\t elementStyles(rightHandle, {\n\t top: (selectionStyles.height - rightHandleHeight) / 2\n\t });\n\n\t wrapper.style.cssText = wrapper.style.cssText;\n\t },\n\n\t bindEvents: function() {\n\t if (this.options.mousewheel !== false) {\n\t this._mousewheelHandler = this._mousewheel.bind(this);\n\t var obj;\n\t bindEvents(this.wrapper, ( obj = {}, obj[ MOUSEWHEEL ] = this._mousewheelHandler, obj ));\n\t }\n\n\t this._domEvents = services.DomEventsBuilder.create(this.wrapper, {\n\t stopPropagation: true, // applicable for the jQuery UserEvents\n\t start: this._start.bind(this),\n\t move: this._move.bind(this),\n\t end: this._end.bind(this),\n\t tap: this._tap.bind(this),\n\t press: this._press.bind(this),\n\t gesturestart: this._gesturestart.bind(this),\n\t gesturechange: this._gesturechange.bind(this),\n\t gestureend: this._gestureend.bind(this)\n\t });\n\t },\n\n\t initOptions: function() {\n\t var ref = this;\n\t var options = ref.options;\n\t var categoryAxis = ref.categoryAxis;\n\t var box = categoryAxis.pane.chartsBox();\n\t var intlService = this.chart.chartService.intl;\n\n\t if (this._dateAxis) {\n\t deepExtend(options, {\n\t min: parseDate(intlService, options.min),\n\t max: parseDate(intlService, options.max),\n\t from: parseDate(intlService, options.from),\n\t to: parseDate(intlService, options.to)\n\t });\n\t }\n\n\t var ref$1 = elementStyles(this.chartElement, [ \"paddingLeft\", \"paddingTop\" ]);\n\t var paddingLeft = ref$1.paddingLeft;\n\t var paddingTop = ref$1.paddingTop;\n\n\t this.options = deepExtend({}, {\n\t width: box.width(),\n\t height: box.height() + SELECTOR_HEIGHT_ADJUST, //workaround for sub-pixel hover on the paths in chrome\n\t padding: {\n\t left: paddingLeft,\n\t top: paddingTop\n\t },\n\t offset: {\n\t left: box.x1 + paddingLeft,\n\t top: box.y1 + paddingTop\n\t },\n\t from: options.min,\n\t to: options.max\n\t }, options);\n\t },\n\n\t destroy: function() {\n\t if (this._domEvents) {\n\t this._domEvents.destroy();\n\t delete this._domEvents;\n\t }\n\n\t clearTimeout(this._mwTimeout);\n\t this._state = null;\n\n\t if (this.wrapper) {\n\t if (this._mousewheelHandler) {\n\t var obj;\n\t unbindEvents(this.wrapper, ( obj = {}, obj[ MOUSEWHEEL ] = this._mousewheelHandler, obj ));\n\t this._mousewheelHandler = null;\n\t }\n\t this.chartElement.removeChild(this.wrapper);\n\t this.wrapper = null;\n\t }\n\t },\n\n\t _rangeEventArgs: function(range) {\n\n\t return {\n\t axis: this.categoryAxis.options,\n\t from: this._value(range.from),\n\t to: this._value(range.to)\n\t };\n\t },\n\n\t _start: function(e) {\n\t var options = this.options;\n\t var target = eventElement(e);\n\n\t if (this._state || !target) {\n\t return;\n\t }\n\n\t this.chart._unsetActivePoint();\n\t this._state = {\n\t moveTarget: closestHandle(target) || target,\n\t startLocation: e.x ? e.x.location : 0,\n\t range: {\n\t from: this._index(options.from),\n\t to: this._index(options.to)\n\t }\n\t };\n\n\t var args = this._rangeEventArgs({\n\t from: this._index(options.from),\n\t to: this._index(options.to)\n\t });\n\n\t if (this.trigger(SELECT_START, args)) {\n\t this._state = null;\n\t }\n\t },\n\n\t _press: function(e) {\n\t var handle;\n\t if (this._state) {\n\t handle = this._state.moveTarget;\n\t } else {\n\t handle = closestHandle(eventElement(e));\n\t }\n\t if (handle) {\n\t dataviz.addClass(handle, \"k-handle-active\");\n\t }\n\t },\n\n\t _move: function(e) {\n\t if (!this._state) {\n\t return;\n\t }\n\n\t var ref = this;\n\t var state = ref._state;\n\t var options = ref.options;\n\t var categoryAxis = ref.categoryAxis;\n\t var range = state.range;\n\t var target = state.moveTarget;\n\t var reverse = categoryAxis.options.reverse;\n\t var from = this._index(options.from);\n\t var to = this._index(options.to);\n\t var min = this._index(options.min);\n\t var max = this._index(options.max);\n\t var delta = state.startLocation - e.x.location;\n\t var oldRange = { from: range.from, to: range.to };\n\t var span = range.to - range.from;\n\t var scale = elementStyles(this.wrapper, \"width\").width / (categoryAxis.categoriesCount() - 1);\n\t var offset = Math.round(delta / scale) * (reverse ? -1 : 1);\n\n\t if (!target) {\n\t return;\n\t }\n\n\t var leftHandle = hasClasses(target, \"k-left-handle\");\n\t var rightHandle = hasClasses(target, \"k-right-handle\");\n\n\t if (hasClasses(target, \"k-selection k-selection-bg\")) {\n\t range.from = Math.min(\n\t Math.max(min, from - offset),\n\t max - span\n\t );\n\t range.to = Math.min(\n\t range.from + span,\n\t max\n\t );\n\t } else if ((leftHandle && !reverse) || (rightHandle && reverse)) {\n\t range.from = Math.min(\n\t Math.max(min, from - offset),\n\t max - 1\n\t );\n\t range.to = Math.max(range.from + 1, range.to);\n\t } else if ((leftHandle && reverse) || (rightHandle && !reverse)) {\n\t range.to = Math.min(\n\t Math.max(min + 1, to - offset),\n\t max\n\t );\n\t range.from = Math.min(range.to - 1, range.from);\n\t }\n\n\t if (range.from !== oldRange.from || range.to !== oldRange.to) {\n\t this.move(range.from, range.to);\n\t this.trigger(SELECT, this._rangeEventArgs(range));\n\t }\n\t },\n\n\t _end: function() {\n\t if (this._state) {\n\t var moveTarget = this._state.moveTarget;\n\t if (moveTarget) {\n\t dataviz.removeClass(moveTarget, \"k-handle-active\");\n\t }\n\n\t var range = this._state.range;\n\t this.set(range.from, range.to);\n\t this.trigger(SELECT_END, this._rangeEventArgs(range));\n\n\t delete this._state;\n\t }\n\t },\n\n\t _tap: function(e) {\n\t var ref = this;\n\t var options = ref.options;\n\t var categoryAxis = ref.categoryAxis;\n\t var coords = this.chart._eventCoordinates(e);\n\t var categoryIx = categoryAxis.pointCategoryIndex(new Point(coords.x, categoryAxis.box.y1));\n\t var from = this._index(options.from);\n\t var to = this._index(options.to);\n\t var min = this._index(options.min);\n\t var max = this._index(options.max);\n\t var span = to - from;\n\t var mid = from + span / 2;\n\t var range = {};\n\t var rightClick = e.event.which === 3;\n\t var offset = Math.round(mid - categoryIx);\n\n\t if (this._state || rightClick) {\n\t return;\n\t }\n\n\t this.chart._unsetActivePoint();\n\n\t if (!categoryAxis.options.justified) {\n\t offset--;\n\t }\n\n\t range.from = Math.min(\n\t Math.max(min, from - offset),\n\t max - span\n\t );\n\n\t range.to = Math.min(range.from + span, max);\n\n\t this._start(e);\n\t if (this._state) {\n\t this._state.range = range;\n\t this.trigger(SELECT, this._rangeEventArgs(range));\n\t this._end();\n\t }\n\t },\n\n\t _mousewheel: function(e) {\n\t var this$1 = this;\n\n\t var delta = dataviz.mousewheelDelta(e);\n\n\t this._start({ target: this.selection });\n\n\t if (this._state) {\n\t var range = this._state.range;\n\n\t e.preventDefault();\n\t e.stopPropagation();\n\n\t if (Math.abs(delta) > 1) {\n\t delta *= ZOOM_ACCELERATION;\n\t }\n\n\t if (this.options.mousewheel.reverse) {\n\t delta *= -1;\n\t }\n\n\t if (this.expand(delta)) {\n\t this.trigger(SELECT, {\n\t axis: this.categoryAxis.options,\n\t delta: delta,\n\t originalEvent: e,\n\t from: this._value(range.from),\n\t to: this._value(range.to)\n\t });\n\t }\n\n\t if (this._mwTimeout) {\n\t clearTimeout(this._mwTimeout);\n\t }\n\n\t this._mwTimeout = setTimeout(function () {\n\t this$1._end();\n\t }, MOUSEWHEEL_DELAY);\n\t }\n\t },\n\n\t _gesturestart: function(e) {\n\t var options = this.options;\n\n\t this._state = {\n\t range: {\n\t from: this._index(options.from),\n\t to: this._index(options.to)\n\t }\n\t };\n\t var args = this._rangeEventArgs(this._state.range);\n\n\t if (this.trigger(SELECT_START, args)) {\n\t this._state = null;\n\t } else {\n\t e.preventDefault();\n\t }\n\t },\n\n\t _gestureend: function() {\n\t if (this._state) {\n\t this.trigger(SELECT_END, this._rangeEventArgs(this._state.range));\n\t delete this._state;\n\t }\n\t },\n\n\t _gesturechange: function(e) {\n\t var ref = this;\n\t var chart = ref.chart;\n\t var state = ref._state;\n\t var options = ref.options;\n\t var categoryAxis = ref.categoryAxis;\n\t var range = state.range;\n\t var p0 = chart._toModelCoordinates(e.touches[0].x.location).x;\n\t var p1 = chart._toModelCoordinates(e.touches[1].x.location).x;\n\t var left = Math.min(p0, p1);\n\t var right = Math.max(p0, p1);\n\n\t e.preventDefault();\n\n\t range.from = categoryAxis.pointCategoryIndex(new Point(left)) || options.min;\n\n\t range.to = categoryAxis.pointCategoryIndex(new Point(right)) || options.max;\n\n\t this.move(range.from, range.to);\n\n\t this.trigger(SELECT, this._rangeEventArgs(range));\n\t },\n\n\t _index: function(value) {\n\t var index = value;\n\n\t if (value instanceof Date) {\n\t index = this.categoryAxis.categoryIndex(value);\n\t }\n\n\t return index;\n\t },\n\n\t _value: function(index) {\n\t var value = index;\n\t if (this._dateAxis) {\n\t value = this.categoryAxis.categoryAt(index);\n\t if (value > this.options.max) {\n\t value = this.options.max;\n\t }\n\t }\n\n\t return value;\n\t },\n\n\t _slot: function(value) {\n\t var categoryAxis = this.categoryAxis;\n\t var index = this._index(value);\n\n\t return categoryAxis.getSlot(index, index, true);\n\t },\n\n\t move: function(from, to) {\n\t var options = this.options;\n\t var reverse = this.categoryAxis.options.reverse;\n\t var offset = options.offset;\n\t var padding = options.padding;\n\t var border = options.selection.border;\n\t var left = reverse ? to : from;\n\t var right = reverse ? from : to;\n\t var edge = 'x' + (reverse ? 2 : 1);\n\n\t var box = this._slot(left);\n\t var leftMaskWidth = round(box[edge] - offset.left + padding.left);\n\n\t elementStyles(this.leftMask, {\n\t width: leftMaskWidth\n\t });\n\t elementStyles(this.selection, {\n\t left: leftMaskWidth\n\t });\n\n\t box = this._slot(right);\n\n\t var rightMaskWidth = round(options.width - (box[edge] - offset.left + padding.left));\n\t elementStyles(this.rightMask, {\n\t width: rightMaskWidth\n\t });\n\n\t var distance = options.width - rightMaskWidth;\n\t if (distance !== options.width) {\n\t distance += border.right;\n\t }\n\n\t elementStyles(this.rightMask, {\n\t left: distance\n\t });\n\t elementStyles(this.selection, {\n\t width: Math.max(options.width - (leftMaskWidth + rightMaskWidth) - border.right, 0)\n\t });\n\t },\n\n\t set: function(from, to) {\n\t var options = this.options;\n\t var min = this._index(options.min);\n\t var max = this._index(options.max);\n\t var fromValue = limitValue(this._index(from), min, max);\n\t var toValue = limitValue(this._index(to), fromValue + 1, max);\n\n\t if (options.visible) {\n\t this.move(fromValue, toValue);\n\t }\n\n\t options.from = this._value(fromValue);\n\t options.to = this._value(toValue);\n\t },\n\n\t expand: function(delta) {\n\t var options = this.options;\n\t var min = this._index(options.min);\n\t var max = this._index(options.max);\n\t var zDir = options.mousewheel.zoom;\n\t var from = this._index(options.from);\n\t var to = this._index(options.to);\n\t var range = { from: from, to: to };\n\t var oldRange = deepExtend({}, range);\n\n\t if (this._state) {\n\t range = this._state.range;\n\t }\n\n\t if (zDir !== RIGHT) {\n\t range.from = limitValue(\n\t limitValue(from - delta, 0, to - 1),\n\t min, max\n\t );\n\t }\n\n\t if (zDir !== LEFT) {\n\t range.to = limitValue(\n\t limitValue(to + delta, range.from + 1, max),\n\t min,\n\t max\n\t );\n\t }\n\n\t if (range.from !== oldRange.from || range.to !== oldRange.to) {\n\t this.set(range.from, range.to);\n\t return true;\n\t }\n\t },\n\n\t zoom: function(delta, coords) {\n\t var options = this.options;\n\t var min = this._index(options.min);\n\t var max = this._index(options.max);\n\t var from = this._index(options.from);\n\t var to = this._index(options.to);\n\t var range = { from: from, to: to };\n\t var oldRange = deepExtend({}, range);\n\n\t var ref = this.categoryAxis.options;\n\t var reverse = ref.reverse;\n\t var origin = X + (reverse ? '2' : '1');\n\t var lineBox = this.categoryAxis.lineBox();\n\t var relative = Math.abs(lineBox[origin] - coords[X]);\n\t var size = lineBox.width();\n\t var position = round(relative / size, 2);\n\t var minDelta = round(position * delta);\n\t var maxDelta = round((1 - position) * delta);\n\n\t if (this._state) {\n\t range = this._state.range;\n\t }\n\n\t range.from = limitValue(\n\t limitValue(from - minDelta, 0, to - 1),\n\t min, max\n\t );\n\n\t range.to = limitValue(\n\t limitValue(to + maxDelta, range.from + 1, max),\n\t min,\n\t max\n\t );\n\n\t if (range.from !== oldRange.from || range.to !== oldRange.to) {\n\t this.set(range.from, range.to);\n\t return true;\n\t }\n\t },\n\n\t trigger: function(name, args) {\n\t return (this.observer || this.chart).trigger(name, args);\n\t }\n\t});\n\n\tsetDefaultOptions(Selection, {\n\t visible: true,\n\t mousewheel: {\n\t zoom: \"both\"\n\t },\n\t min: MIN_VALUE,\n\t max: MAX_VALUE\n\t});\n\n\tvar Tooltip = BaseTooltip.extend({\n\t show: function(point) {\n\t if (!point || !point.tooltipAnchor || (this._current && this._current === point)) {\n\t return;\n\t }\n\n\t var options = deepExtend({}, this.options, point.options.tooltip);\n\t var anchor = point.tooltipAnchor();\n\n\t if (anchor) {\n\t this._current = point;\n\t BaseTooltip.fn.show.call(this, {\n\t point: point,\n\t anchor: anchor\n\t }, options, point);\n\t } else {\n\t this.hide();\n\t }\n\t },\n\n\t hide: function() {\n\t delete this._current;\n\t BaseTooltip.fn.hide.call(this);\n\t }\n\t});\n\n\tvar SharedTooltip = BaseTooltip.extend({\n\t init: function(plotArea, options) {\n\t BaseTooltip.fn.init.call(this, plotArea.chartService, options);\n\n\t this.plotArea = plotArea;\n\t this.formatService = plotArea.chartService.format;\n\t },\n\n\t showAt: function(points, coords) {\n\t var tooltipPoints = grep(points, function(point) {\n\t var tooltip = point.series.tooltip;\n\t var excluded = tooltip && tooltip.visible === false;\n\n\t return !excluded;\n\t });\n\n\t if (tooltipPoints.length > 0) {\n\t var point = tooltipPoints[0];\n\t var slot = this.plotArea.categoryAxis.getSlot(point.categoryIx);\n\n\t var anchor = coords ? this._slotAnchor(coords, slot) : this._defaultAnchor(point, slot);\n\n\t this.show({\n\t anchor: anchor,\n\t shared: true,\n\t points: points,\n\t category: point.category,\n\t categoryText: this.formatService.auto(this.options.categoryFormat, point.category),\n\t series: this.plotArea.series\n\t }, this.options);\n\t }\n\t },\n\n\t _slotAnchor: function(point, slot) {\n\t var axis = this.plotArea.categoryAxis;\n\t var align = {\n\t horizontal: \"left\",\n\t vertical: \"center\"\n\t };\n\n\t if (!axis.options.vertical) {\n\t point.x = slot.center().x;\n\t }\n\n\t return {\n\t point: point,\n\t align: align\n\t };\n\t },\n\n\t _defaultAnchor: function(point, slot) {\n\t var box = point.owner.pane.chartsBox();\n\t var vertical = this.plotArea.categoryAxis.options.vertical;\n\t var center = box.center();\n\t var slotCenter = slot.center();\n\t var align = {\n\t horizontal: \"center\",\n\t vertical: \"center\"\n\t };\n\n\t var centerPoint;\n\t if (vertical) {\n\t centerPoint = new Point(center.x, slotCenter.y);\n\t } else {\n\t centerPoint = new Point(slotCenter.x, center.y);\n\t }\n\n\t return {\n\t point: centerPoint,\n\t align: align\n\t };\n\t }\n\t});\n\n\tsetDefaultOptions(SharedTooltip, {\n\t categoryFormat: '{0:d}'\n\t});\n\n\tvar BarChartAnimation = Animation.extend({\n\t setup: function() {\n\t var ref = this;\n\t var element = ref.element;\n\t var options = ref.options;\n\t var bbox = element.bbox();\n\n\t if (bbox) {\n\t this.origin = options.origin;\n\t var axis = options.vertical ? Y : X;\n\n\t var fromScale = this.fromScale = new GeometryPoint(1, 1);\n\t fromScale[axis] = START_SCALE;\n\n\t element.transform(transform()\n\t .scale(fromScale.x, fromScale.y)\n\t );\n\t } else {\n\t this.abort();\n\t }\n\t },\n\n\t step: function(pos) {\n\t var scaleX = dataviz.interpolateValue(this.fromScale.x, 1, pos);\n\t var scaleY = dataviz.interpolateValue(this.fromScale.y, 1, pos);\n\n\t this.element.transform(transform()\n\t .scale(scaleX, scaleY, this.origin)\n\t );\n\t },\n\n\t abort: function() {\n\t Animation.fn.abort.call(this);\n\t this.element.transform(null);\n\t }\n\t});\n\n\tsetDefaultOptions(BarChartAnimation, {\n\t duration: INITIAL_ANIMATION_DURATION\n\t});\n\n\tAnimationFactory.current.register(BAR, BarChartAnimation);\n\n\tvar BubbleAnimation = Animation.extend({\n\t setup: function() {\n\t var center = this.center = this.element.bbox().center();\n\t this.element.transform(transform()\n\t .scale(START_SCALE, START_SCALE, center)\n\t );\n\t },\n\n\t step: function(pos) {\n\t this.element.transform(transform()\n\t .scale(pos, pos, this.center)\n\t );\n\t }\n\t});\n\n\tsetDefaultOptions(BubbleAnimation, {\n\t easing: \"easeOutElastic\"\n\t});\n\n\tAnimationFactory.current.register(BUBBLE, BubbleAnimation);\n\n\tvar FadeInAnimation = Animation.extend({\n\t setup: function() {\n\t this.fadeTo = this.element.opacity();\n\t this.element.opacity(0);\n\t },\n\n\t step: function(pos) {\n\t this.element.opacity(pos * this.fadeTo);\n\t }\n\t});\n\n\tsetDefaultOptions(FadeInAnimation, {\n\t duration: 200,\n\t easing: \"linear\"\n\t});\n\n\tAnimationFactory.current.register(FADEIN, FadeInAnimation);\n\n\tvar PieAnimation = Animation.extend({\n\t setup: function() {\n\t this.element.transform(transform()\n\t .scale(START_SCALE, START_SCALE, this.options.center)\n\t );\n\t },\n\n\t step: function(pos) {\n\t this.element.transform(transform()\n\t .scale(pos, pos, this.options.center)\n\t );\n\t }\n\t});\n\n\tsetDefaultOptions(PieAnimation, {\n\t easing: \"easeOutElastic\",\n\t duration: INITIAL_ANIMATION_DURATION\n\t});\n\n\tAnimationFactory.current.register(PIE, PieAnimation);\n\n\tvar ScatterLineChart = ScatterChart.extend({\n\t render: function() {\n\t ScatterChart.fn.render.call(this);\n\n\t this.renderSegments();\n\t },\n\n\t createSegment: function(linePoints, currentSeries, seriesIx) {\n\t var style = currentSeries.style;\n\t var pointType;\n\n\t if (style === SMOOTH) {\n\t pointType = SplineSegment;\n\t } else {\n\t pointType = LineSegment;\n\t }\n\n\t return new pointType(linePoints, currentSeries, seriesIx);\n\t },\n\n\t animationPoints: function() {\n\t var points = ScatterChart.fn.animationPoints.call(this);\n\t return points.concat(this._segments);\n\t },\n\n\t createMissingValue: function(value, missingValues) {\n\t if (missingValues === ZERO) {\n\t var missingValue = {\n\t x: value.x,\n\t y: value.y\n\t };\n\t if (!hasValue(missingValue.x)) {\n\t missingValue.x = 0;\n\t }\n\t if (!hasValue(missingValue.y)) {\n\t missingValue.y = 0;\n\t }\n\t return missingValue;\n\t }\n\t }\n\t});\n\n\tdeepExtend(ScatterLineChart.prototype, LineChartMixin);\n\n\tvar XYPlotArea = PlotAreaBase.extend({\n\t initFields: function() {\n\t this.namedXAxes = {};\n\t this.namedYAxes = {};\n\n\t this.xAxisRangeTracker = new AxisGroupRangeTracker();\n\t this.yAxisRangeTracker = new AxisGroupRangeTracker();\n\t },\n\n\t render: function(panes) {\n\t var this$1 = this;\n\t if (panes === void 0) { panes = this.panes; }\n\n\t var seriesByPane = this.groupSeriesByPane();\n\n\t for (var i = 0; i < panes.length; i++) {\n\t var pane = panes[i];\n\t var paneSeries = seriesByPane[pane.options.name || \"default\"] || [];\n\t this$1.addToLegend(paneSeries);\n\t var filteredSeries = this$1.filterVisibleSeries(paneSeries);\n\n\t if (!filteredSeries) {\n\t continue;\n\t }\n\n\t this$1.createScatterChart(\n\t filterSeriesByType(filteredSeries, SCATTER),\n\t pane\n\t );\n\n\t this$1.createScatterLineChart(\n\t filterSeriesByType(filteredSeries, SCATTER_LINE),\n\t pane\n\t );\n\n\t this$1.createBubbleChart(\n\t filterSeriesByType(filteredSeries, BUBBLE),\n\t pane\n\t );\n\t }\n\n\t this.createAxes(panes);\n\t },\n\n\t appendChart: function(chart, pane) {\n\t this.xAxisRangeTracker.update(chart.xAxisRanges);\n\t this.yAxisRangeTracker.update(chart.yAxisRanges);\n\n\t PlotAreaBase.fn.appendChart.call(this, chart, pane);\n\t },\n\n\t removeAxis: function(axis) {\n\t var axisName = axis.options.name;\n\n\t PlotAreaBase.fn.removeAxis.call(this, axis);\n\n\t if (axis.options.vertical) {\n\t this.yAxisRangeTracker.reset(axisName);\n\t delete this.namedYAxes[axisName];\n\t } else {\n\t this.xAxisRangeTracker.reset(axisName);\n\t delete this.namedXAxes[axisName];\n\t }\n\n\t if (axis === this.axisX) {\n\t delete this.axisX;\n\t }\n\n\t if (axis === this.axisY) {\n\t delete this.axisY;\n\t }\n\t },\n\n\t seriesPaneName: function(series) {\n\t var options = this.options;\n\t var xAxisName = series.xAxis;\n\t var xAxisOptions = [].concat(options.xAxis);\n\t var xAxis = grep(xAxisOptions, function(a) { return a.name === xAxisName; })[0];\n\t var yAxisName = series.yAxis;\n\t var yAxisOptions = [].concat(options.yAxis);\n\t var yAxis = grep(yAxisOptions, function(a) { return a.name === yAxisName; })[0];\n\t var panes = options.panes || [ {} ];\n\t var defaultPaneName = panes[0].name || \"default\";\n\t var paneName = (xAxis || {}).pane || (yAxis || {}).pane || defaultPaneName;\n\n\t return paneName;\n\t },\n\n\t createScatterChart: function(series, pane) {\n\t if (series.length > 0) {\n\t this.appendChart(\n\t new ScatterChart(this, { series: series, clip: pane.options.clip }),\n\t pane\n\t );\n\t }\n\t },\n\n\t createScatterLineChart: function(series, pane) {\n\t if (series.length > 0) {\n\t this.appendChart(\n\t new ScatterLineChart(this, { series: series, clip: pane.options.clip }),\n\t pane\n\t );\n\t }\n\t },\n\n\t createBubbleChart: function(series, pane) {\n\t if (series.length > 0) {\n\t this.appendChart(\n\t new BubbleChart(this, { series: series, clip: pane.options.clip }),\n\t pane\n\t );\n\t }\n\t },\n\n\t createXYAxis: function(options, vertical, axisIndex) {\n\t var axisName = options.name;\n\t var namedAxes = vertical ? this.namedYAxes : this.namedXAxes;\n\t var tracker = vertical ? this.yAxisRangeTracker : this.xAxisRangeTracker;\n\t var axisOptions = deepExtend({ reverse: !vertical && this.chartService.rtl }, options, { vertical: vertical });\n\t var isLog = equalsIgnoreCase(axisOptions.type, LOGARITHMIC);\n\t var defaultRange = tracker.query();\n\t var defaultAxisRange = isLog ? { min: 0.1, max: 1 } : { min: 0, max: 1 };\n\t var range = tracker.query(axisName) || defaultRange || defaultAxisRange;\n\t var typeSamples = [ axisOptions.min, axisOptions.max ];\n\t var series = this.series;\n\n\t for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n\t var currentSeries = series[seriesIx];\n\t var seriesAxisName = currentSeries[vertical ? \"yAxis\" : \"xAxis\"];\n\t if ((seriesAxisName === axisOptions.name) || (axisIndex === 0 && !seriesAxisName)) {\n\t var firstPointValue = SeriesBinder.current.bindPoint(currentSeries, 0).valueFields;\n\t typeSamples.push(firstPointValue[vertical ? \"y\" : \"x\"]);\n\n\t break;\n\t }\n\t }\n\n\t if (axisIndex === 0 && defaultRange) {\n\t range.min = Math.min(range.min, defaultRange.min);\n\t range.max = Math.max(range.max, defaultRange.max);\n\t }\n\n\t var inferredDate;\n\n\t for (var i = 0; i < typeSamples.length; i++) {\n\t if (typeSamples[i] instanceof Date) {\n\t inferredDate = true;\n\t break;\n\t }\n\t }\n\n\t var axisType;\n\t if (equalsIgnoreCase(axisOptions.type, DATE) || (!axisOptions.type && inferredDate)) {\n\t axisType = dataviz.DateValueAxis;\n\t } else if (isLog) {\n\t axisType = dataviz.LogarithmicAxis;\n\t } else {\n\t axisType = dataviz.NumericAxis;\n\t }\n\n\t var axis = new axisType(range.min, range.max, axisOptions, this.chartService);\n\t axis.axisIndex = axisIndex;\n\n\t if (axisName) {\n\t if (namedAxes[axisName]) {\n\t throw new Error(((vertical ? \"Y\" : \"X\") + \" axis with name \" + axisName + \" is already defined\"));\n\t }\n\t namedAxes[axisName] = axis;\n\t }\n\n\t this.appendAxis(axis);\n\n\t return axis;\n\t },\n\n\t createAxes: function(panes) {\n\t var this$1 = this;\n\n\t var options = this.options;\n\t var xAxesOptions = [].concat(options.xAxis);\n\t var xAxes = [];\n\t var yAxesOptions = [].concat(options.yAxis);\n\t var yAxes = [];\n\n\t for (var idx = 0; idx < xAxesOptions.length; idx++) {\n\t var axisPane = this$1.findPane(xAxesOptions[idx].pane);\n\t if (inArray(axisPane, panes)) {\n\t xAxes.push(this$1.createXYAxis(xAxesOptions[idx], false, idx));\n\t }\n\t }\n\n\t for (var idx$1 = 0; idx$1 < yAxesOptions.length; idx$1++) {\n\t var axisPane$1 = this$1.findPane(yAxesOptions[idx$1].pane);\n\t if (inArray(axisPane$1, panes)) {\n\t yAxes.push(this$1.createXYAxis(yAxesOptions[idx$1], true, idx$1));\n\t }\n\t }\n\n\t this.axisX = this.axisX || xAxes[0];\n\t this.axisY = this.axisY || yAxes[0];\n\t },\n\n\t _dispatchEvent: function(chart, e, eventType) {\n\t var coords = chart._eventCoordinates(e);\n\t var point = new Point(coords.x, coords.y);\n\t var allAxes = this.axes;\n\t var length = allAxes.length;\n\t var xValues = [];\n\t var yValues = [];\n\n\t for (var i = 0; i < length; i++) {\n\t var axis = allAxes[i];\n\t var values = axis.options.vertical ? yValues : xValues;\n\t var currentValue = axis.getValue(point);\n\t if (currentValue !== null) {\n\t values.push(currentValue);\n\t }\n\t }\n\n\t if (xValues.length > 0 && yValues.length > 0) {\n\t chart.trigger(eventType, {\n\t element: eventElement(e),\n\t originalEvent: e,\n\t x: singleItemOrArray(xValues),\n\t y: singleItemOrArray(yValues)\n\t });\n\t }\n\t },\n\n\t updateAxisOptions: function(axis, options) {\n\t var vertical = axis.options.vertical;\n\t var axes = this.groupAxes(this.panes);\n\t var index = (vertical ? axes.y : axes.x).indexOf(axis);\n\n\t updateAxisOptions$1(this.options, index, vertical, options);\n\t updateAxisOptions$1(this.originalOptions, index, vertical, options);\n\t }\n\t});\n\n\tfunction updateAxisOptions$1(targetOptions, axisIndex, vertical, options) {\n\t var axisOptions = ([].concat(vertical ? targetOptions.yAxis : targetOptions.xAxis))[axisIndex];\n\t deepExtend(axisOptions, options);\n\t}\n\n\tsetDefaultOptions(XYPlotArea, {\n\t xAxis: {},\n\t yAxis: {}\n\t});\n\n\tdeepExtend(XYPlotArea.prototype, PlotAreaEventsMixin);\n\n\tvar PieSegment = ChartElement.extend({\n\t init: function(value, sector, options) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.value = value;\n\t this.sector = sector;\n\t },\n\n\t render: function() {\n\t var labels = this.options.labels;\n\t var chartService = this.owner.chartService;\n\t var labelText = this.value;\n\n\t if (this._rendered || this.visible === false) {\n\t return;\n\t }\n\t this._rendered = true;\n\n\t var labelTemplate = getTemplate(labels);\n\t var pointData = this.pointData();\n\n\t if (labelTemplate) {\n\t labelText = labelTemplate(pointData);\n\t } else if (labels.format) {\n\t labelText = chartService.format.auto(labels.format, labelText);\n\t }\n\n\t if (labels.visible && (labelText || labelText === 0)) {\n\t if (labels.position === CENTER || labels.position === INSIDE_END) {\n\t if (!labels.color) {\n\t labels.color = dataviz.autoTextColor(this.options.color);\n\t }\n\t if (!labels.background) {\n\t labels.background = this.options.color;\n\t }\n\t } else {\n\t var themeLabels = chartService.theme.seriesDefaults.labels;\n\t labels.color = labels.color || themeLabels.color;\n\t labels.background = labels.background || themeLabels.background;\n\t }\n\n\t this.label = new TextBox(labelText, deepExtend({}, labels, {\n\t align: CENTER,\n\t vAlign: \"\",\n\t animation: {\n\t type: FADEIN,\n\t delay: this.animationDelay\n\t }\n\t }), pointData);\n\n\t this.append(this.label);\n\t }\n\t },\n\n\t reflow: function(targetBox) {\n\t this.render();\n\t this.box = targetBox;\n\t this.reflowLabel();\n\t },\n\n\t reflowLabel: function() {\n\t var ref = this;\n\t var labelsOptions = ref.options.labels;\n\t var label = ref.label;\n\t var sector = this.sector.clone();\n\t var labelsDistance = labelsOptions.distance;\n\t var angle = sector.middle();\n\n\t if (label) {\n\t var labelHeight = label.box.height();\n\t var labelWidth = label.box.width();\n\t var lp;\n\n\t if (labelsOptions.position === CENTER) {\n\t sector.radius = Math.abs((sector.radius - labelHeight) / 2) + labelHeight;\n\t lp = sector.point(angle);\n\t label.reflow(new Box(lp.x, lp.y - labelHeight / 2, lp.x, lp.y));\n\t } else if (labelsOptions.position === INSIDE_END) {\n\t sector.radius = sector.radius - labelHeight / 2;\n\t lp = sector.point(angle);\n\t label.reflow(new Box(lp.x, lp.y - labelHeight / 2, lp.x, lp.y));\n\t } else {\n\t var x1;\n\t lp = sector.clone().expand(labelsDistance).point(angle);\n\t if (lp.x >= sector.center.x) {\n\t x1 = lp.x + labelWidth;\n\t label.orientation = RIGHT;\n\t } else {\n\t x1 = lp.x - labelWidth;\n\t label.orientation = LEFT;\n\t }\n\t label.reflow(new Box(x1, lp.y - labelHeight, lp.x, lp.y));\n\t }\n\t }\n\t },\n\n\t createVisual: function() {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var sector = ref.sector;\n\t var options = ref.options;\n\n\t ChartElement.fn.createVisual.call(this);\n\n\t if (this.value) {\n\t if (options.visual) {\n\t var startAngle = (sector.startAngle + 180) % 360;\n\t var visual = options.visual({\n\t category: this.category,\n\t dataItem: this.dataItem,\n\t value: this.value,\n\t series: this.series,\n\t percentage: this.percentage,\n\t center: new GeometryPoint(sector.center.x, sector.center.y),\n\t radius: sector.radius,\n\t innerRadius: sector.innerRadius,\n\t startAngle: startAngle,\n\t endAngle: startAngle + sector.angle,\n\t options: options,\n\t sender: this.getSender(),\n\t createVisual: function () {\n\t var group = new Group();\n\t this$1.createSegmentVisual(group);\n\n\t return group;\n\t }\n\t });\n\n\t if (visual) {\n\t this.visual.append(visual);\n\t }\n\t } else {\n\t this.createSegmentVisual(this.visual);\n\t }\n\t }\n\t },\n\n\t createSegmentVisual: function(group) {\n\t var ref = this;\n\t var sector = ref.sector;\n\t var options = ref.options;\n\t var borderOptions = options.border || {};\n\t var border = borderOptions.width > 0 ? {\n\t stroke: {\n\t color: borderOptions.color,\n\t width: borderOptions.width,\n\t opacity: borderOptions.opacity,\n\t dashType: borderOptions.dashType\n\t }\n\t } : {};\n\t var color = options.color;\n\t var fill = {\n\t color: color,\n\t opacity: options.opacity\n\t };\n\t var visual = this.createSegment(sector, deepExtend({\n\t fill: fill,\n\t stroke: {\n\t opacity: options.opacity\n\t },\n\t zIndex: options.zIndex\n\t }, border));\n\n\t group.append(visual);\n\n\t if (hasGradientOverlay(options)) {\n\t group.append(this.createGradientOverlay(visual, {\n\t baseColor: color,\n\t fallbackFill: fill\n\t }, deepExtend({\n\t center: [ sector.center.x, sector.center.y ],\n\t innerRadius: sector.innerRadius,\n\t radius: sector.radius,\n\t userSpace: true\n\t }, options.overlay)));\n\t }\n\t },\n\n\t createSegment: function(sector, options) {\n\t if (options.singleSegment) {\n\t return new drawing.Circle(new geometry.Circle(new GeometryPoint(sector.center.x, sector.center.y), sector.radius), options);\n\t }\n\n\t return dataviz.ShapeBuilder.current.createRing(sector, options);\n\t },\n\n\t createAnimation: function() {\n\t var ref = this;\n\t var options = ref.options;\n\t var center = ref.sector.center;\n\n\t deepExtend(options, {\n\t animation: {\n\t center: [ center.x, center.y ],\n\t delay: this.animationDelay\n\t }\n\t });\n\n\t ChartElement.fn.createAnimation.call(this);\n\t },\n\n\t createHighlight: function(options) {\n\t var highlight = this.options.highlight || {};\n\t var border = highlight.border || {};\n\n\t return this.createSegment(this.sector, deepExtend({}, options, {\n\t fill: {\n\t color: highlight.color,\n\t opacity: highlight.opacity\n\t },\n\t stroke: {\n\t opacity: border.opacity,\n\t width: border.width,\n\t color: border.color\n\t }\n\t }));\n\t },\n\n\t highlightVisual: function() {\n\t return this.visual.children[0];\n\t },\n\n\t highlightVisualArgs: function() {\n\t var sector = this.sector;\n\n\t return {\n\t options: this.options,\n\t radius: sector.radius,\n\t innerRadius: sector.innerRadius,\n\t center: new GeometryPoint(sector.center.x, sector.center.y),\n\t startAngle: sector.startAngle,\n\t endAngle: sector.angle + sector.startAngle,\n\t visual: this.visual\n\t };\n\t },\n\n\t tooltipAnchor: function() {\n\t var sector = this.sector.clone().expand(TOOLTIP_OFFSET);\n\t var midAndle = sector.middle();\n\t var midPoint = sector.point(midAndle);\n\n\t return {\n\t point: midPoint,\n\t align: tooltipAlignment(midAndle + 180)\n\t };\n\t },\n\n\t formatValue: function(format) {\n\t return this.owner.formatPointValue(this, format);\n\t },\n\n\t pointData: function() {\n\t return {\n\t dataItem: this.dataItem,\n\t category: this.category,\n\t value: this.value,\n\t series: this.series,\n\t percentage: this.percentage\n\t };\n\t }\n\t});\n\n\tvar RAD_30 = round(dataviz.rad(30), DEFAULT_PRECISION);\n\tvar RAD_60 = round(dataviz.rad(60), DEFAULT_PRECISION);\n\n\tfunction tooltipAlignment(angle) {\n\t var radians = dataviz.rad(angle);\n\t var sine = round(Math.sin(radians), DEFAULT_PRECISION);\n\t var cosine = round(Math.cos(radians), DEFAULT_PRECISION);\n\n\t var horizontal;\n\t if (Math.abs(sine) > RAD_60) {\n\t horizontal = CENTER;\n\t } else if (cosine < 0) {\n\t horizontal = RIGHT;\n\t } else {\n\t horizontal = LEFT;\n\t }\n\n\t var vertical;\n\t if (Math.abs(sine) < RAD_30) {\n\t vertical = CENTER;\n\t } else if (sine < 0) {\n\t vertical = BOTTOM;\n\t } else {\n\t vertical = TOP;\n\t }\n\n\t return {\n\t horizontal: horizontal,\n\t vertical: vertical\n\t };\n\t}\n\n\tsetDefaultOptions(PieSegment, {\n\t color: WHITE,\n\t overlay: {\n\t gradient: \"roundedBevel\"\n\t },\n\t border: {\n\t width: 0.5\n\t },\n\t labels: {\n\t visible: false,\n\t distance: 35,\n\t font: datavizConstants.DEFAULT_FONT,\n\t margin: getSpacing(0.5),\n\t align: CIRCLE,\n\t zIndex: 1,\n\t position: OUTSIDE_END\n\t },\n\t animation: {\n\t type: PIE\n\t },\n\t highlight: {\n\t visible: true,\n\t border: {\n\t width: 1\n\t }\n\t },\n\t visible: true\n\t});\n\n\tdeepExtend(PieSegment.prototype, PointEventsMixin);\n\n\tvar PieChartMixin = {\n\t createLegendItem: function(value, point, options) {\n\t var legendOptions = this.options.legend || {};\n\t var labelsOptions = legendOptions.labels || {};\n\t var inactiveItems = legendOptions.inactiveItems || {};\n\t var inactiveItemsLabels = inactiveItems.labels || {};\n\n\t if (options && options.visibleInLegend !== false) {\n\t var pointVisible = options.visible !== false;\n\t var labelTemplate = pointVisible ? getTemplate(labelsOptions) :\n\t getTemplate(inactiveItemsLabels) || getTemplate(labelsOptions);\n\t var text = options.category;\n\n\t if (labelTemplate) {\n\t text = labelTemplate({\n\t text: text,\n\t series: options.series,\n\t dataItem: options.dataItem,\n\t percentage: options.percentage,\n\t value: value\n\t });\n\t }\n\n\t var itemLabelOptions, markerColor;\n\t if (pointVisible) {\n\t itemLabelOptions = {};\n\t markerColor = point.color;\n\t } else {\n\t itemLabelOptions = {\n\t color: inactiveItemsLabels.color,\n\t font: inactiveItemsLabels.font\n\t };\n\t markerColor = (inactiveItems.markers || {}).color;\n\t }\n\n\t if (hasValue(text) && text !== \"\") {\n\t this.legendItems.push({\n\t active: pointVisible,\n\t pointIndex: options.index,\n\t text: text,\n\t series: options.series,\n\t markerColor: markerColor,\n\t labels: itemLabelOptions\n\t });\n\t }\n\t }\n\t }\n\t};\n\n\tvar PIE_SECTOR_ANIM_DELAY = 70;\n\n\tvar PieChart = ChartElement.extend({\n\t init: function(plotArea, options) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.plotArea = plotArea;\n\t this.chartService = plotArea.chartService;\n\t this.points = [];\n\t this.legendItems = [];\n\t this.render();\n\t },\n\n\t render: function() {\n\t this.traverseDataPoints(this.addValue.bind(this));\n\t },\n\n\t traverseDataPoints: function(callback) {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var options = ref.options;\n\t var seriesColors = ref.plotArea.options.seriesColors; if (seriesColors === void 0) { seriesColors = []; }\n\t var colorsCount = seriesColors.length;\n\t var series = options.series;\n\t var seriesCount = series.length;\n\n\t for (var seriesIx = 0; seriesIx < seriesCount; seriesIx++) {\n\t var currentSeries = series[seriesIx];\n\t var data = currentSeries.data;\n\t var ref$1 = bindSegments(currentSeries);\n\t var total = ref$1.total;\n\t var points = ref$1.points;\n\t var count = ref$1.count;\n\t var anglePerValue = 360 / total;\n\t var constantAngle = (void 0);\n\t if (!isFinite(anglePerValue)) {\n\t constantAngle = 360 / count;\n\t }\n\t var currentAngle = (void 0);\n\n\t if (defined(currentSeries.startAngle)) {\n\t currentAngle = currentSeries.startAngle;\n\t } else {\n\t currentAngle = options.startAngle;\n\t }\n\n\t if (seriesIx !== seriesCount - 1) {\n\t if (currentSeries.labels.position === OUTSIDE_END) {\n\t currentSeries.labels.position = CENTER;\n\t }\n\t }\n\n\t for (var i = 0; i < points.length; i++) {\n\t var pointData = points[i];\n\t if (!pointData) {\n\t continue;\n\t }\n\n\t var fields = pointData.fields;\n\t var value = pointData.value;\n\t var visible = pointData.visible;\n\t var angle = value !== 0 ? (constantAngle || (value * anglePerValue)) : 0;\n\t var explode = data.length !== 1 && Boolean(fields.explode);\n\n\t if (!isFunction(currentSeries.color)) {\n\t currentSeries.color = fields.color || seriesColors[i % colorsCount];\n\t }\n\n\t callback(pointData.valueFields.value, new dataviz.Ring(null, 0, 0, currentAngle, angle), {\n\t owner: this$1,\n\t category: defined(fields.category) ? fields.category : \"\",\n\t index: i,\n\t series: currentSeries,\n\t seriesIx: seriesIx,\n\t dataItem: data[i],\n\t percentage: total !== 0 ? value / total : 0,\n\t explode: explode,\n\t visibleInLegend: fields.visibleInLegend,\n\t visible: visible,\n\t zIndex: seriesCount - seriesIx,\n\t animationDelay: this$1.animationDelay(i, seriesIx, seriesCount)\n\t });\n\n\t if (visible !== false) {\n\t currentAngle += angle;\n\t }\n\t }\n\t }\n\t },\n\n\t evalSegmentOptions: function(options, value, fields) {\n\t var series = fields.series;\n\n\t evalOptions(options, {\n\t value: value,\n\t series: series,\n\t dataItem: fields.dataItem,\n\t category: fields.category,\n\t percentage: fields.percentage\n\t }, { defaults: series._defaults, excluded: [ \"data\", \"content\", \"template\", \"visual\", \"toggle\" ] });\n\t },\n\n\t addValue: function(value, sector, fields) {\n\t var segmentOptions = deepExtend({}, fields.series, { index: fields.index });\n\t this.evalSegmentOptions(segmentOptions, value, fields);\n\n\t this.createLegendItem(value, segmentOptions, fields);\n\n\t if (fields.visible === false) {\n\t return;\n\t }\n\n\t var segment = new PieSegment(value, sector, segmentOptions);\n\t $.extend(segment, fields);\n\t this.append(segment);\n\t this.points.push(segment);\n\t },\n\n\t reflow: function(targetBox) {\n\t var ref = this;\n\t var options = ref.options;\n\t var points = ref.points;\n\t var seriesConfigs = ref.seriesConfigs; if (seriesConfigs === void 0) { seriesConfigs = []; }\n\t var count = points.length;\n\t var box = targetBox.clone();\n\t var space = 5;\n\t var minWidth = Math.min(box.width(), box.height());\n\t var halfMinWidth = minWidth / 2;\n\t var defaultPadding = minWidth - minWidth * 0.85;\n\t var newBox = new Box(box.x1, box.y1, box.x1 + minWidth, box.y1 + minWidth);\n\t var newBoxCenter = newBox.center();\n\t var boxCenter = box.center();\n\t var seriesCount = options.series.length;\n\t var leftSideLabels = [];\n\t var rightSideLabels = [];\n\t var padding = valueOrDefault(options.padding, defaultPadding);\n\n\t this.targetBox = targetBox;\n\n\t padding = padding > halfMinWidth - space ? halfMinWidth - space : padding;\n\t newBox.translate(boxCenter.x - newBoxCenter.x, boxCenter.y - newBoxCenter.y);\n\n\t var radius = halfMinWidth - padding;\n\t var center = new Point(\n\t radius + newBox.x1 + padding,\n\t radius + newBox.y1 + padding\n\t );\n\n\t for (var i = 0; i < count; i++) {\n\t var segment = points[i];\n\t var sector = segment.sector;\n\t var seriesIndex = segment.seriesIx;\n\t sector.radius = radius;\n\t sector.center = center;\n\n\t if (seriesConfigs.length) {\n\t var seriesConfig = seriesConfigs[seriesIndex];\n\t sector.innerRadius = seriesConfig.innerRadius;\n\t sector.radius = seriesConfig.radius;\n\t }\n\n\t if (seriesIndex === seriesCount - 1 && segment.explode) {\n\t sector.center = sector.clone().setRadius(sector.radius * 0.15).point(sector.middle());\n\t }\n\n\t segment.reflow(newBox);\n\n\t var label = segment.label;\n\t if (label) {\n\t if (label.options.position === OUTSIDE_END) {\n\t if (seriesIndex === seriesCount - 1) {\n\t if (label.orientation === RIGHT) {\n\t rightSideLabels.push(label);\n\t } else {\n\t leftSideLabels.push(label);\n\t }\n\t }\n\t }\n\t }\n\t }\n\n\t if (leftSideLabels.length > 0) {\n\t leftSideLabels.sort(this.labelComparator(true));\n\t this.leftLabelsReflow(leftSideLabels);\n\t }\n\n\t if (rightSideLabels.length > 0) {\n\t rightSideLabels.sort(this.labelComparator(false));\n\t this.rightLabelsReflow(rightSideLabels);\n\t }\n\n\t this.box = newBox;\n\t },\n\n\t leftLabelsReflow: function(labels) {\n\t var distances = this.distanceBetweenLabels(labels);\n\n\t this.distributeLabels(distances, labels);\n\t },\n\n\t rightLabelsReflow: function(labels) {\n\t var distances = this.distanceBetweenLabels(labels);\n\n\t this.distributeLabels(distances, labels);\n\t },\n\n\t distanceBetweenLabels: function(labels) {\n\t var segment = last(this.points);\n\t var sector = segment.sector;\n\t var count = labels.length - 1;\n\t var lr = sector.radius + segment.options.labels.distance;\n\t var distances = [];\n\t var firstBox = labels[0].box;\n\t var distance = round(firstBox.y1 - (sector.center.y - lr - firstBox.height() - firstBox.height() / 2));\n\n\t distances.push(distance);\n\n\t for (var i = 0; i < count; i++) {\n\t var secondBox = labels[i + 1].box;\n\n\t firstBox = labels[i].box;\n\t distance = round(secondBox.y1 - firstBox.y2);\n\t distances.push(distance);\n\t }\n\t distance = round(sector.center.y + lr - labels[count].box.y2 - labels[count].box.height() / 2);\n\t distances.push(distance);\n\n\t return distances;\n\t },\n\n\t distributeLabels: function(distances, labels) {\n\t var this$1 = this;\n\n\t var count = distances.length;\n\t var left, right, remaining;\n\n\t for (var i = 0; i < count; i++) {\n\t remaining = -distances[i];\n\t left = right = i;\n\n\t while (remaining > 0 && (left >= 0 || right < count)) {\n\t remaining = this$1._takeDistance(distances, i, --left, remaining);\n\t remaining = this$1._takeDistance(distances, i, ++right, remaining);\n\t }\n\t }\n\n\t this.reflowLabels(distances, labels);\n\t },\n\n\t _takeDistance: function(distances, anchor, position, amount) {\n\t var result = amount;\n\t if (distances[position] > 0) {\n\t var available = Math.min(distances[position], result);\n\t result -= available;\n\t distances[position] -= available;\n\t distances[anchor] += available;\n\t }\n\n\t return result;\n\t },\n\n\t reflowLabels: function(distances, labels) {\n\t var this$1 = this;\n\n\t var segment = last(this.points);\n\t var sector = segment.sector;\n\t var labelOptions = segment.options.labels;\n\t var labelsCount = labels.length;\n\t var labelDistance = labelOptions.distance;\n\t var boxY = sector.center.y - (sector.radius + labelDistance) - labels[0].box.height();\n\t var boxX;\n\n\t distances[0] += 2;\n\t for (var i = 0; i < labelsCount; i++) {\n\t var label = labels[i];\n\t var box = label.box;\n\n\t boxY += distances[i];\n\t boxX = this$1.hAlignLabel(\n\t box.x2,\n\t sector.clone().expand(labelDistance),\n\t boxY,\n\t boxY + box.height(),\n\t label.orientation === RIGHT);\n\n\t if (label.orientation === RIGHT) {\n\t if (labelOptions.align !== CIRCLE) {\n\t boxX = sector.radius + sector.center.x + labelDistance;\n\t }\n\t label.reflow(new Box(boxX + box.width(), boxY, boxX, boxY));\n\t } else {\n\t if (labelOptions.align !== CIRCLE) {\n\t boxX = sector.center.x - sector.radius - labelDistance;\n\t }\n\t label.reflow(new Box(boxX - box.width(), boxY, boxX, boxY));\n\t }\n\n\t boxY += box.height();\n\t }\n\t },\n\n\t createVisual: function() {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var connectors = ref.options.connectors;\n\t var points = ref.points;\n\t var count = points.length;\n\t var space = 4;\n\n\t ChartElement.fn.createVisual.call(this);\n\n\t this._connectorLines = [];\n\n\t for (var i = 0; i < count; i++) {\n\t var segment = points[i];\n\t var sector = segment.sector;\n\t var label = segment.label;\n\t var angle = sector.middle();\n\t var connectorsColor = (segment.options.connectors || {}).color || connectors.color;\n\n\t if (label) {\n\t var connectorLine = new Path({\n\t stroke: {\n\t color: connectorsColor,\n\t width: connectors.width\n\t },\n\t animation: {\n\t type: FADEIN,\n\t delay: segment.animationDelay\n\t }\n\t });\n\n\t if (label.options.position === OUTSIDE_END) {\n\t var box = label.box;\n\t var centerPoint = sector.center;\n\t var start = sector.point(angle);\n\t var middle = new Point(box.x1, box.center().y);\n\t var sr = (void 0), end = (void 0), crossing = (void 0);\n\n\t start = sector.clone().expand(connectors.padding).point(angle);\n\t connectorLine.moveTo(start.x, start.y);\n\t // TODO: Extract into a method to remove duplication\n\t if (label.orientation === RIGHT) {\n\t end = new Point(box.x1 - connectors.padding, box.center().y);\n\t crossing = intersection(centerPoint, start, middle, end);\n\t middle = new Point(end.x - space, end.y);\n\t crossing = crossing || middle;\n\t crossing.x = Math.min(crossing.x, middle.x);\n\n\t if (this$1.pointInCircle(crossing, sector.center, sector.radius + space) ||\n\t crossing.x < sector.center.x) {\n\t sr = sector.center.x + sector.radius + space;\n\t if (segment.options.labels.align !== COLUMN) {\n\t if (sr < middle.x) {\n\t connectorLine.lineTo(sr, start.y);\n\t } else {\n\t connectorLine.lineTo(start.x + space * 2, start.y);\n\t }\n\t } else {\n\t connectorLine.lineTo(sr, start.y);\n\t }\n\t connectorLine.lineTo(middle.x, end.y);\n\t } else {\n\t crossing.y = end.y;\n\t connectorLine.lineTo(crossing.x, crossing.y);\n\t }\n\t } else {\n\t end = new Point(box.x2 + connectors.padding, box.center().y);\n\t crossing = intersection(centerPoint, start, middle, end);\n\t middle = new Point(end.x + space, end.y);\n\t crossing = crossing || middle;\n\t crossing.x = Math.max(crossing.x, middle.x);\n\n\t if (this$1.pointInCircle(crossing, sector.center, sector.radius + space) ||\n\t crossing.x > sector.center.x) {\n\t sr = sector.center.x - sector.radius - space;\n\t if (segment.options.labels.align !== COLUMN) {\n\t if (sr > middle.x) {\n\t connectorLine.lineTo(sr, start.y);\n\t } else {\n\t connectorLine.lineTo(start.x - space * 2, start.y);\n\t }\n\t } else {\n\t connectorLine.lineTo(sr, start.y);\n\t }\n\t connectorLine.lineTo(middle.x, end.y);\n\t } else {\n\t crossing.y = end.y;\n\t connectorLine.lineTo(crossing.x, crossing.y);\n\t }\n\t }\n\n\t connectorLine.lineTo(end.x, end.y);\n\n\t this$1._connectorLines.push(connectorLine);\n\t this$1.visual.append(connectorLine);\n\t }\n\t }\n\t }\n\t },\n\n\t renderVisual: function() {\n\t ChartElement.fn.renderVisual.call(this);\n\n\t if (dataviz.find(this.options.series, function (options) { return options.autoFit; })) {\n\t var targetBox = this.targetBox;\n\t var pieCenter = this.box.center();\n\t var bbox = this.visual.bbox();\n\t if (!bbox) {\n\t return;\n\t }\n\n\t var bboxBottom = bbox.bottomRight();\n\n\t var scale = Math.min(\n\t (pieCenter.y - targetBox.y1) / (pieCenter.y - bbox.origin.y),\n\t (targetBox.y2 - pieCenter.y) / (bboxBottom.y - pieCenter.y),\n\t (pieCenter.x - targetBox.x1) / (pieCenter.x - bbox.origin.x),\n\t (targetBox.x2 - pieCenter.x) / (bboxBottom.x - pieCenter.x)\n\t );\n\n\t if (scale < 1) {\n\t this.visual.transform(transform().scale(scale, scale, [ pieCenter.x, pieCenter.y ]));\n\t }\n\t }\n\t },\n\n\t labelComparator: function(reverse) {\n\t var reverseValue = reverse ? -1 : 1;\n\n\t return function(a, b) {\n\t var first = (a.parent.sector.middle() + 270) % 360;\n\t var second = (b.parent.sector.middle() + 270) % 360;\n\t return (first - second) * reverseValue;\n\t };\n\t },\n\n\t hAlignLabel: function(originalX, sector, y1, y2, direction) {\n\t var radius = sector.radius;\n\t var sector_center = sector.center;\n\t var cx = sector_center.x;\n\t var cy = sector_center.y;\n\t var t = Math.min(Math.abs(cy - y1), Math.abs(cy - y2));\n\n\t if (t > radius) {\n\t return originalX;\n\t }\n\n\t return cx + Math.sqrt((radius * radius) - (t * t)) * (direction ? 1 : -1);\n\t },\n\n\t pointInCircle: function(point, center, radius) {\n\t return Math.pow(center.x - point.x, 2) + Math.pow(center.y - point.y, 2) < Math.pow(radius, 2);\n\t },\n\n\t formatPointValue: function(point, format) {\n\t return this.chartService.format.auto(format, point.value);\n\t },\n\n\t animationDelay: function(categoryIndex) {\n\t return categoryIndex * PIE_SECTOR_ANIM_DELAY;\n\t },\n\n\t stackRoot: function() {\n\t return this;\n\t }\n\t});\n\n\tfunction intersection(a1, a2, b1, b2) {\n\t var uat = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n\t var ub = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n\n\t var result;\n\t if (ub !== 0) {\n\t var ua = (uat / ub);\n\n\t result = new Point(\n\t a1.x + ua * (a2.x - a1.x),\n\t a1.y + ua * (a2.y - a1.y)\n\t );\n\t }\n\n\t return result;\n\t}\n\n\tsetDefaultOptions(PieChart, {\n\t startAngle: 90,\n\t connectors: {\n\t width: 2,\n\t color: \"#939393\",\n\t padding: 8\n\t },\n\t inactiveItems: {\n\t markers: {},\n\t labels: {}\n\t }\n\t});\n\n\tdeepExtend(PieChart.prototype, PieChartMixin);\n\n\tPieChart.prototype.isStackRoot = true;\n\n\tvar PiePlotArea = PlotAreaBase.extend({\n\t render: function() {\n\t this.createPieChart(this.series);\n\t },\n\n\t createPieChart: function(series) {\n\t var firstSeries = series[0];\n\t var pieChart = new PieChart(this, {\n\t series: series,\n\t padding: firstSeries.padding,\n\t startAngle: firstSeries.startAngle,\n\t connectors: firstSeries.connectors,\n\t legend: this.options.legend\n\t });\n\n\t this.appendChart(pieChart);\n\t },\n\n\t appendChart: function(chart, pane) {\n\t PlotAreaBase.fn.appendChart.call(this, chart, pane);\n\t append(this.options.legend.items, chart.legendItems);\n\t }\n\t});\n\n\tvar DonutSegment = PieSegment.extend({\n\t reflowLabel: function() {\n\t var ref = this;\n\t var labelsOptions = ref.options.labels;\n\t var label = ref.label;\n\t var sector = this.sector.clone();\n\t var angle = sector.middle();\n\n\t if (label) {\n\t var labelHeight = label.box.height();\n\t if (labelsOptions.position === CENTER) {\n\t sector.radius -= (sector.radius - sector.innerRadius) / 2;\n\n\t var lp = sector.point(angle);\n\n\t label.reflow(new Box(lp.x, lp.y - labelHeight / 2, lp.x, lp.y));\n\t } else {\n\t PieSegment.fn.reflowLabel.call(this);\n\t }\n\t }\n\t },\n\n\t createSegment: function(sector, options) {\n\t return dataviz.ShapeBuilder.current.createRing(sector, options);\n\t }\n\t});\n\n\tsetDefaultOptions(DonutSegment, {\n\t overlay: {\n\t gradient: \"roundedGlass\"\n\t },\n\t labels: {\n\t position: CENTER\n\t },\n\t animation: {\n\t type: PIE\n\t }\n\t});\n\n\tdeepExtend(DonutSegment.prototype, PointEventsMixin);\n\n\tvar DONUT_SECTOR_ANIM_DELAY = 50;\n\n\tvar DonutChart = PieChart.extend({\n\t addValue: function(value, sector, fields) {\n\t var segmentOptions = deepExtend({}, fields.series, { index: fields.index });\n\t this.evalSegmentOptions(segmentOptions, value, fields);\n\n\t this.createLegendItem(value, segmentOptions, fields);\n\n\t if (!value || fields.visible === false) {\n\t return;\n\t }\n\n\t var segment = new DonutSegment(value, sector, segmentOptions);\n\n\t $.extend(segment, fields);\n\t this.append(segment);\n\t this.points.push(segment);\n\t },\n\n\t reflow: function(targetBox) {\n\t var this$1 = this;\n\n\t var options = this.options;\n\t var box = targetBox.clone();\n\t var space = 5;\n\t var minWidth = Math.min(box.width(), box.height());\n\t var halfMinWidth = minWidth / 2;\n\t var defaultPadding = minWidth - minWidth * 0.85;\n\t var series = options.series;\n\t var seriesCount = series.length;\n\n\t var padding = valueOrDefault(options.padding, defaultPadding);\n\t padding = padding > halfMinWidth - space ? halfMinWidth - space : padding;\n\n\t var totalSize = halfMinWidth - padding;\n\t var seriesWithoutSize = 0;\n\t var holeSize;\n\n\t for (var i = 0; i < seriesCount; i++) {\n\t var currentSeries = series[i];\n\t if (i === 0) {\n\t if (defined(currentSeries.holeSize)) {\n\t holeSize = currentSeries.holeSize;\n\t totalSize -= currentSeries.holeSize;\n\t }\n\t }\n\n\t if (defined(currentSeries.size)) {\n\t totalSize -= currentSeries.size;\n\t } else {\n\t seriesWithoutSize++;\n\t }\n\n\t if (defined(currentSeries.margin) && i !== seriesCount - 1) {\n\t totalSize -= currentSeries.margin;\n\t }\n\t }\n\n\t if (!defined(holeSize)) {\n\t var currentSize = (halfMinWidth - padding) / (seriesCount + 0.75);\n\t holeSize = currentSize * 0.75;\n\t totalSize -= holeSize;\n\t }\n\n\t var innerRadius = holeSize;\n\t var margin = 0;\n\t var size, radius;\n\n\t this.seriesConfigs = [];\n\n\t for (var i$1 = 0; i$1 < seriesCount; i$1++) {\n\t var currentSeries$1 = series[i$1];\n\t size = valueOrDefault(currentSeries$1.size, totalSize / seriesWithoutSize);\n\t innerRadius += margin;\n\t radius = innerRadius + size;\n\t this$1.seriesConfigs.push({ innerRadius: innerRadius, radius: radius });\n\t margin = currentSeries$1.margin || 0;\n\t innerRadius = radius;\n\t }\n\n\t PieChart.fn.reflow.call(this, targetBox);\n\t },\n\n\t animationDelay: function(categoryIndex, seriesIndex, seriesCount) {\n\t return categoryIndex * DONUT_SECTOR_ANIM_DELAY +\n\t (INITIAL_ANIMATION_DURATION * (seriesIndex + 1) / (seriesCount + 1));\n\t }\n\t});\n\n\tsetDefaultOptions(DonutChart, {\n\t startAngle: 90,\n\t connectors: {\n\t width: 2,\n\t color: \"#939393\",\n\t padding: 8\n\t }\n\t});\n\n\tvar DonutPlotArea = PiePlotArea.extend({\n\t render: function() {\n\t this.createDonutChart(this.series);\n\t },\n\n\t createDonutChart: function(series) {\n\t var firstSeries = series[0];\n\t var donutChart = new DonutChart(this, {\n\t series: series,\n\t padding: firstSeries.padding,\n\t connectors: firstSeries.connectors,\n\t legend: this.options.legend\n\t });\n\n\t this.appendChart(donutChart);\n\t }\n\t});\n\n\tvar DEFAULT_PADDING = 0.15;\n\n\tvar PolarPlotAreaBase = PlotAreaBase.extend({\n\t initFields: function() {\n\t this.valueAxisRangeTracker = new AxisGroupRangeTracker();\n\t },\n\n\t render: function() {\n\t this.addToLegend(this.series);\n\t this.createPolarAxis();\n\t this.createCharts();\n\t this.createValueAxis();\n\t },\n\n\t alignAxes: function() {\n\t var axis = this.valueAxis;\n\t var range = axis.range();\n\t var crossingValue = axis.options.reverse ? range.max : range.min;\n\t var slot = axis.getSlot(crossingValue);\n\t var center = this.polarAxis.getSlot(0).center;\n\t var axisBox = axis.box.translate(\n\t center.x - slot.x1,\n\t center.y - slot.y1\n\t );\n\n\t axis.reflow(axisBox);\n\t },\n\n\t createValueAxis: function() {\n\t var tracker = this.valueAxisRangeTracker;\n\t var defaultRange = tracker.query();\n\t var axisOptions = this.valueAxisOptions({\n\t roundToMajorUnit: false,\n\t zIndex: -1\n\t });\n\t var axisType, axisDefaultRange;\n\n\t if (axisOptions.type === LOGARITHMIC) {\n\t axisType = dataviz.RadarLogarithmicAxis;\n\t axisDefaultRange = { min: 0.1, max: 1 };\n\t } else {\n\t axisType = dataviz.RadarNumericAxis;\n\t axisDefaultRange = { min: 0, max: 1 };\n\t }\n\n\t var range = tracker.query(name) || defaultRange || axisDefaultRange;\n\n\t if (range && defaultRange) {\n\t range.min = Math.min(range.min, defaultRange.min);\n\t range.max = Math.max(range.max, defaultRange.max);\n\t }\n\n\t var valueAxis = new axisType(\n\t range.min, range.max,\n\t axisOptions,\n\t this.chartService\n\t );\n\n\t this.valueAxis = valueAxis;\n\t this.appendAxis(valueAxis);\n\t },\n\n\t reflowAxes: function() {\n\t var ref = this;\n\t var options = ref.options.plotArea;\n\t var valueAxis = ref.valueAxis;\n\t var polarAxis = ref.polarAxis;\n\t var box = ref.box;\n\t var defaultPadding = Math.min(box.width(), box.height()) * DEFAULT_PADDING;\n\t var padding = getSpacing(options.padding || {}, defaultPadding);\n\t var paddingBox = box.clone().unpad(padding);\n\t var axisBox = paddingBox.clone();\n\n\t axisBox.y2 = axisBox.y1 + Math.min(axisBox.width(), axisBox.height());\n\t axisBox.align(paddingBox, Y, CENTER);\n\n\t var valueAxisBox = axisBox.clone().shrink(0, axisBox.height() / 2);\n\n\t polarAxis.reflow(axisBox);\n\t valueAxis.reflow(valueAxisBox);\n\t var heightDiff = valueAxis.lineBox().height() - valueAxis.box.height();\n\t valueAxis.reflow(valueAxis.box.unpad({ top: heightDiff }));\n\n\t this.axisBox = axisBox;\n\t this.alignAxes(axisBox);\n\t },\n\n\t backgroundBox: function() {\n\t return this.box;\n\t },\n\n\t detachLabels: function() {}\n\t});\n\n\tvar PolarScatterChart = ScatterChart.extend({\n\t pointSlot: function(slotX, slotY) {\n\t var valueRadius = slotX.center.y - slotY.y1;\n\t var slot = Point.onCircle(slotX.center, slotX.startAngle, valueRadius);\n\n\t return new Box(slot.x, slot.y, slot.x, slot.y);\n\t }\n\t});\n\n\tsetDefaultOptions(PolarScatterChart, {\n\t clip: false\n\t});\n\n\tvar PolarLineChart = ScatterLineChart.extend({\n\n\t});\n\n\tPolarLineChart.prototype.pointSlot = PolarScatterChart.prototype.pointSlot;\n\n\tsetDefaultOptions(PolarLineChart, {\n\t clip: false\n\t});\n\n\tvar SplinePolarAreaSegment = SplineAreaSegment.extend({\n\t fillToAxes: function(fillPath) {\n\t var center = this._polarAxisCenter();\n\t fillPath.lineTo(center.x, center.y);\n\t },\n\n\t _polarAxisCenter: function() {\n\t var polarAxis = this.parent.plotArea.polarAxis;\n\t var center = polarAxis.box.center();\n\t return center;\n\t },\n\n\t strokeSegments: function() {\n\t var segments = this._strokeSegments;\n\n\t if (!segments) {\n\t var center = this._polarAxisCenter();\n\t var curveProcessor = new CurveProcessor(false);\n\t var linePoints = this.points();\n\n\t linePoints.push(center);\n\t segments = this._strokeSegments = curveProcessor.process(linePoints);\n\t segments.pop();\n\t }\n\n\t return segments;\n\t }\n\t});\n\n\tvar PolarAreaSegment = AreaSegment.extend({\n\t fillToAxes: function(fillPath) {\n\t var polarAxis = this.parent.plotArea.polarAxis;\n\t var center = polarAxis.box.center();\n\t var centerSegment = new geometry.Segment([ center.x, center.y ]);\n\n\t fillPath.segments.unshift(centerSegment);\n\t fillPath.segments.push(centerSegment);\n\t }\n\t});\n\n\tvar PolarAreaChart = PolarLineChart.extend({\n\t createSegment: function(linePoints, currentSeries, seriesIx) {\n\t var style = (currentSeries.line || {}).style;\n\t var segment;\n\n\t if (style === SMOOTH) {\n\t segment = new SplinePolarAreaSegment(linePoints, currentSeries, seriesIx);\n\t } else {\n\t segment = new PolarAreaSegment(linePoints, currentSeries, seriesIx);\n\t }\n\t return segment;\n\t },\n\n\t createMissingValue: function(value, missingValues) {\n\t var missingValue;\n\n\t if (hasValue(value.x) && missingValues !== INTERPOLATE) {\n\t missingValue = {\n\t x: value.x,\n\t y: value.y\n\t };\n\t if (missingValues === ZERO) {\n\t missingValue.y = 0;\n\t }\n\t }\n\n\t return missingValue;\n\t },\n\n\t seriesMissingValues: function(series) {\n\t return series.missingValues || ZERO;\n\t },\n\n\t _hasMissingValuesGap: function() {\n\t var this$1 = this;\n\n\t var series = this.options.series;\n\n\t for (var idx = 0; idx < series.length; idx++) {\n\t if (this$1.seriesMissingValues(series[idx]) === GAP) {\n\t return true;\n\t }\n\t }\n\t },\n\n\t sortPoints: function(points) {\n\t var this$1 = this;\n\n\t points.sort(xComparer);\n\n\t if (this._hasMissingValuesGap()) {\n\t for (var idx = 0; idx < points.length; idx++) {\n\t var point = points[idx];\n\t if (point) {\n\t var value = point.value;\n\t if (!hasValue(value.y) && this$1.seriesMissingValues(point.series) === GAP) {\n\t delete points[idx];\n\t }\n\t }\n\t }\n\t }\n\n\t return points;\n\t }\n\t});\n\n\tfunction xComparer(a, b) {\n\t return a.value.x - b.value.x;\n\t}\n\n\tvar PolarPlotArea = PolarPlotAreaBase.extend({\n\t createPolarAxis: function() {\n\t var polarAxis = new dataviz.PolarAxis(this.options.xAxis, this.chartService);\n\n\t this.polarAxis = polarAxis;\n\t this.axisX = polarAxis;\n\t this.appendAxis(polarAxis);\n\t },\n\n\t valueAxisOptions: function(defaults) {\n\t return deepExtend(defaults, {\n\t majorGridLines: { type: ARC },\n\t minorGridLines: { type: ARC }\n\t }, this.options.yAxis);\n\t },\n\n\t createValueAxis: function() {\n\t PolarPlotAreaBase.fn.createValueAxis.call(this);\n\t this.axisY = this.valueAxis;\n\t },\n\n\t appendChart: function(chart, pane) {\n\t this.valueAxisRangeTracker.update(chart.yAxisRanges);\n\n\t PlotAreaBase.prototype.appendChart.call(this, chart, pane);\n\t },\n\n\t createCharts: function() {\n\t var series = this.filterVisibleSeries(this.series);\n\t var pane = this.panes[0];\n\n\t this.createLineChart(\n\t filterSeriesByType(series, [ POLAR_LINE ]),\n\t pane\n\t );\n\n\t this.createScatterChart(\n\t filterSeriesByType(series, [ POLAR_SCATTER ]),\n\t pane\n\t );\n\n\t this.createAreaChart(\n\t filterSeriesByType(series, [ POLAR_AREA ]),\n\t pane\n\t );\n\t },\n\n\t createLineChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var lineChart = new PolarLineChart(this, { series: series });\n\n\t this.appendChart(lineChart, pane);\n\t },\n\n\t createScatterChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var scatterChart = new PolarScatterChart(this, { series: series });\n\n\t this.appendChart(scatterChart, pane);\n\t },\n\n\t createAreaChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var areaChart = new PolarAreaChart(this, { series: series });\n\n\t this.appendChart(areaChart, pane);\n\t },\n\n\t _dispatchEvent: function(chart, e, eventType) {\n\t var coords = chart._eventCoordinates(e);\n\t var point = new Point(coords.x, coords.y);\n\t var xValue = this.axisX.getValue(point);\n\t var yValue = this.axisY.getValue(point);\n\n\t if (xValue !== null && yValue !== null) {\n\t chart.trigger(eventType, {\n\t element: eventElement(e),\n\t x: xValue,\n\t y: yValue\n\t });\n\t }\n\t },\n\n\t createCrosshairs: function() {}\n\t});\n\n\tsetDefaultOptions(PolarPlotArea, {\n\t xAxis: {},\n\t yAxis: {}\n\t});\n\n\tdeepExtend(PolarPlotArea.prototype, PlotAreaEventsMixin);\n\n\tfunction groupBySeriesIx(segments) {\n\t var seriesSegments = [];\n\t for (var idx = 0; idx < segments.length; idx++) {\n\t var segment = segments[idx];\n\t seriesSegments[segment.seriesIx] = seriesSegments[segment.seriesIx] || [];\n\t seriesSegments[segment.seriesIx].push(segment);\n\t }\n\n\t return seriesSegments;\n\t}\n\n\tvar RadarLineChart = LineChart.extend({\n\t pointSlot: function(categorySlot, valueSlot) {\n\t var valueRadius = categorySlot.center.y - valueSlot.y1;\n\t var slot = Point.onCircle(categorySlot.center, categorySlot.middle(), valueRadius);\n\n\t return new Box(slot.x, slot.y, slot.x, slot.y);\n\t },\n\n\t renderSegments: function() {\n\t LineChart.fn.renderSegments.call(this);\n\n\t if (this._segments && this._segments.length > 1) {\n\t var seriesSegments = groupBySeriesIx(this._segments);\n\n\t for (var idx = 0; idx < seriesSegments.length; idx++) {\n\t var segments = seriesSegments[idx];\n\t if (segments && segments.length > 1) {\n\t var firstPoint = segments[0].linePoints[0];\n\t var lastSegment = last(segments);\n\t var lastPoint = last(lastSegment.linePoints);\n\t var isFirstDataPoint = firstPoint.categoryIx === 0;\n\t var isLastDataPoint = lastPoint.categoryIx === lastPoint.categoriesCount - 1;\n\t if (isFirstDataPoint && isLastDataPoint) {\n\t last(segments).linePoints.push(firstPoint);\n\t }\n\t }\n\t }\n\t }\n\t },\n\n\t createSegment: function(linePoints, currentSeries, seriesIx) {\n\t var style = currentSeries.style;\n\t var pointType;\n\n\t if (style === SMOOTH) {\n\t pointType = SplineSegment;\n\t } else {\n\t pointType = LineSegment;\n\t }\n\n\t var segment = new pointType(linePoints, currentSeries, seriesIx);\n\t var missingValues = this.seriesMissingValues(currentSeries);\n\n\t if (linePoints.length === currentSeries.data.length || missingValues === INTERPOLATE) {\n\t segment.options.closed = true;\n\t }\n\n\t return segment;\n\t }\n\t});\n\n\tsetDefaultOptions(RadarLineChart, {\n\t clip: false,\n\t limitPoints: false\n\t});\n\n\tvar SplineRadarAreaSegment = SplineAreaSegment.extend({\n\t fillToAxes: function() {}\n\t});\n\n\tvar RadarAreaSegment = AreaSegment.extend({\n\t fillToAxes: function() {}\n\t});\n\n\tvar RadarAreaChart = RadarLineChart.extend({\n\t createSegment: function(linePoints, currentSeries, seriesIx, prevSegment) {\n\t var isStacked = this.options.isStacked;\n\t var style = (currentSeries.line || {}).style;\n\t var previousSegment;\n\t var stackPoints;\n\t var segment;\n\n\t if (isStacked && seriesIx > 0 && prevSegment) {\n\t stackPoints = prevSegment.linePoints.slice(0);\n\t previousSegment = prevSegment;\n\t }\n\n\t if (style === SMOOTH) {\n\t segment = new SplineRadarAreaSegment(linePoints, currentSeries, seriesIx, previousSegment, stackPoints);\n\t segment.options.closed = true;\n\t } else {\n\t linePoints.push(linePoints[0]);\n\t segment = new RadarAreaSegment(linePoints, currentSeries, seriesIx, previousSegment, stackPoints);\n\t }\n\n\t return segment;\n\t },\n\n\t seriesMissingValues: function(series) {\n\t return series.missingValues || ZERO;\n\t }\n\t});\n\n\tvar RadarSegment = DonutSegment.extend({\n\t init: function(value, options) {\n\t DonutSegment.fn.init.call(this, value, null, options);\n\t }\n\t});\n\n\tsetDefaultOptions(RadarSegment, {\n\t overlay: {\n\t gradient: \"none\"\n\t },\n\t labels: {\n\t distance: 10\n\t }\n\t});\n\n\tvar RadarClusterLayout = ChartElement.extend({\n\t init: function(options) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.forEach = options.rtl ? forEachReverse : forEach;\n\t },\n\n\t reflow: function(sector) {\n\t var ref = this;\n\t var options = ref.options;\n\t var children = ref.children;\n\t var gap = options.gap;\n\t var spacing = options.spacing;\n\t var count = children.length;\n\t var slots = count + gap + (spacing * (count - 1));\n\t var slotAngle = sector.angle / slots;\n\t var angle = sector.startAngle + slotAngle * (gap / 2);\n\n\t this.forEach(children, function (child) {\n\t var slotSector = sector.clone();\n\t slotSector.startAngle = angle;\n\t slotSector.angle = slotAngle;\n\n\t if (child.sector) {\n\t slotSector.radius = child.sector.radius;\n\t }\n\n\t child.reflow(slotSector);\n\t child.sector = slotSector;\n\n\t angle += slotAngle + (slotAngle * spacing);\n\t });\n\t }\n\t});\n\n\tsetDefaultOptions(RadarClusterLayout, {\n\t gap: 1,\n\t spacing: 0\n\t});\n\n\tvar RadarStackLayout = ChartElement.extend({\n\t reflow: function(sector) {\n\t var ref = this;\n\t var reverse = ref.options.reverse;\n\t var children = ref.children;\n\t var childrenCount = children.length;\n\t var first = reverse ? childrenCount - 1 : 0;\n\t var step = reverse ? -1 : 1;\n\n\t this.box = new Box();\n\n\t for (var i = first; i >= 0 && i < childrenCount; i += step) {\n\t var childSector = children[i].sector;\n\t childSector.startAngle = sector.startAngle;\n\t childSector.angle = sector.angle;\n\t }\n\t }\n\t});\n\n\tvar RadarBarChart = BarChart.extend({\n\t pointType: function() {\n\t return RadarSegment;\n\t },\n\n\t clusterType: function() {\n\t return RadarClusterLayout;\n\t },\n\n\t stackType: function() {\n\t return RadarStackLayout;\n\t },\n\n\t categorySlot: function(categoryAxis, categoryIx) {\n\t return categoryAxis.getSlot(categoryIx);\n\t },\n\n\t pointSlot: function(categorySlot, valueSlot) {\n\t var slot = categorySlot.clone();\n\t var y = categorySlot.center.y;\n\n\t slot.radius = y - valueSlot.y1;\n\t slot.innerRadius = y - valueSlot.y2;\n\n\t return slot;\n\t },\n\n\t reflowPoint: function(point, pointSlot) {\n\t point.sector = pointSlot;\n\t point.reflow();\n\t },\n\n\t createAnimation: function() {\n\t this.options.animation.center = this.box.toRect().center();\n\t BarChart.fn.createAnimation.call(this);\n\t }\n\t});\n\n\tRadarBarChart.prototype.reflow = CategoricalChart.prototype.reflow;\n\n\tsetDefaultOptions(RadarBarChart, {\n\t clip: false,\n\t limitPoints: false,\n\t animation: {\n\t type: \"pie\"\n\t }\n\t});\n\n\tvar RadarPlotArea = PolarPlotAreaBase.extend({\n\t createPolarAxis: function() {\n\t var categoryAxis = new dataviz.RadarCategoryAxis(this.options.categoryAxis, this.chartService);\n\n\t this.polarAxis = categoryAxis;\n\t this.categoryAxis = categoryAxis;\n\t this.appendAxis(categoryAxis);\n\t this.aggregateCategories();\n\t this.createCategoryAxesLabels();\n\t },\n\n\t valueAxisOptions: function(defaults) {\n\t if (this._hasBarCharts) {\n\t deepExtend(defaults, {\n\t majorGridLines: { type: ARC },\n\t minorGridLines: { type: ARC }\n\t });\n\t }\n\n\t if (this._isStacked100) {\n\t deepExtend(defaults, {\n\t roundToMajorUnit: false,\n\t labels: { format: \"P0\" }\n\t });\n\t }\n\n\t return deepExtend(defaults, this.options.valueAxis);\n\t },\n\n\t aggregateCategories: function() {\n\t // No separate panes in radar charts\n\t CategoricalPlotArea.prototype.aggregateCategories.call(this, this.panes);\n\t },\n\n\t createCategoryAxesLabels: function() {\n\t CategoricalPlotArea.prototype.createCategoryAxesLabels.call(this, this.panes);\n\t },\n\n\t filterSeries: function(currentSeries) {\n\t // Not supported for radar charts\n\t return currentSeries;\n\t },\n\n\t createCharts: function() {\n\t var series = this.filterVisibleSeries(this.series);\n\t var pane = this.panes[0];\n\n\t this.createAreaChart(\n\t filterSeriesByType(series, [ RADAR_AREA ]),\n\t pane\n\t );\n\n\t this.createLineChart(\n\t filterSeriesByType(series, [ RADAR_LINE ]),\n\t pane\n\t );\n\n\t this.createBarChart(\n\t filterSeriesByType(series, [ RADAR_COLUMN ]),\n\t pane\n\t );\n\t },\n\n\t chartOptions: function(series) {\n\t var options = { series: series };\n\t var firstSeries = series[0];\n\t if (firstSeries) {\n\t var filteredSeries = this.filterVisibleSeries(series);\n\t var stack = firstSeries.stack;\n\t options.isStacked = stack && filteredSeries.length > 1;\n\t options.isStacked100 = stack && stack.type === \"100%\" && filteredSeries.length > 1;\n\n\t if (options.isStacked100) {\n\t this._isStacked100 = true;\n\t }\n\t }\n\n\t return options;\n\t },\n\n\t createAreaChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var areaChart = new RadarAreaChart(this, this.chartOptions(series));\n\t this.appendChart(areaChart, pane);\n\t },\n\n\t createLineChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var lineChart = new RadarLineChart(this, this.chartOptions(series));\n\t this.appendChart(lineChart, pane);\n\t },\n\n\t createBarChart: function(series, pane) {\n\t if (series.length === 0) {\n\t return;\n\t }\n\n\t var firstSeries = series[0];\n\t var options = this.chartOptions(series);\n\t options.gap = firstSeries.gap;\n\t options.spacing = firstSeries.spacing;\n\n\t var barChart = new RadarBarChart(this, options);\n\t this.appendChart(barChart, pane);\n\n\t this._hasBarCharts = true;\n\t },\n\n\t seriesCategoryAxis: function() {\n\t return this.categoryAxis;\n\t },\n\n\t _dispatchEvent: function(chart, e, eventType) {\n\t var coords = chart._eventCoordinates(e);\n\t var point = new Point(coords.x, coords.y);\n\t var category = this.categoryAxis.getCategory(point);\n\t var value = this.valueAxis.getValue(point);\n\n\t if (category !== null && value !== null) {\n\t chart.trigger(eventType, {\n\t element: eventElement(e),\n\t category: category,\n\t value: value\n\t });\n\t }\n\t },\n\n\t createCrosshairs: function() {}\n\t});\n\n\tdeepExtend(RadarPlotArea.prototype, PlotAreaEventsMixin, {\n\t appendChart: CategoricalPlotArea.prototype.appendChart,\n\t aggregateSeries: CategoricalPlotArea.prototype.aggregateSeries,\n\t seriesSourcePoints: CategoricalPlotArea.prototype.seriesSourcePoints\n\t});\n\n\tsetDefaultOptions(RadarPlotArea, {\n\t categoryAxis: {\n\t categories: []\n\t },\n\t valueAxis: {}\n\t});\n\n\tvar FunnelSegment = ChartElement.extend({\n\t init: function(value, options, segmentOptions) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.value = value;\n\t this.options.index = segmentOptions.index;\n\t },\n\n\t reflow: function(chartBox) {\n\t var points = this.points;\n\t var label = this.children[0];\n\n\t this.box = new Box(points[0].x, points[0].y, points[1].x, points[2].y);\n\n\t if (label) {\n\t label.reflow(new Box(chartBox.x1, points[0].y, chartBox.x2, points[2].y));\n\t }\n\t },\n\n\t createVisual: function() {\n\t var this$1 = this;\n\n\t var options = this.options;\n\t var visual;\n\n\t ChartElement.fn.createVisual.call(this);\n\n\t if (options.visual) {\n\t visual = options.visual({\n\t category: this.category,\n\t dataItem: this.dataItem,\n\t value: this.value,\n\t series: this.series,\n\t percentage: this.percentage,\n\t points: this.points,\n\t options: options,\n\t sender: this.getSender(),\n\t createVisual: function () { return this$1.createPath(); }\n\t });\n\t } else {\n\t visual = this.createPath();\n\t }\n\n\t if (visual) {\n\t this.visual.append(visual);\n\t }\n\t },\n\n\t createPath: function() {\n\t var options = this.options;\n\t var border = options.border;\n\t var path = Path.fromPoints(this.points, {\n\t fill: {\n\t color: options.color,\n\t opacity: options.opacity\n\t },\n\t stroke: {\n\t color: border.color,\n\t opacity: border.opacity,\n\t width: border.width\n\t }\n\t }).close();\n\n\t return path;\n\t },\n\n\t createHighlight: function(style) {\n\t return Path.fromPoints(this.points, style);\n\t },\n\n\t highlightVisual: function() {\n\t return this.visual.children[0];\n\t },\n\n\t highlightVisualArgs: function() {\n\t var path = Path.fromPoints(this.points).close();\n\n\t return {\n\t options: this.options,\n\t path: path\n\t };\n\t },\n\n\t tooltipAnchor: function() {\n\t var box = this.box;\n\t return {\n\t point: new Point(box.center().x, box.y1),\n\t align: {\n\t horizontal: \"center\",\n\t vertical: \"top\"\n\t }\n\t };\n\t },\n\n\t formatValue: function(format) {\n\t var point = this;\n\t return point.owner.formatPointValue(point, format);\n\t }\n\t});\n\n\tsetDefaultOptions(FunnelSegment, {\n\t color: WHITE,\n\t border: {\n\t width: 1\n\t }\n\t});\n\n\tdeepExtend(FunnelSegment.prototype, PointEventsMixin);\n\n\tvar FunnelChart = ChartElement.extend({\n\t init: function(plotArea, options) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.plotArea = plotArea;\n\t this.points = [];\n\t this.labels = [];\n\t this.legendItems = [];\n\t this.render();\n\t },\n\n\t formatPointValue: function(point, format) {\n\t return this.chartService.format.auto(format,point.value);\n\t },\n\n\t render: function() {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var options = ref.options;\n\t var seriesColors = ref.plotArea.options.seriesColors; if (seriesColors === void 0) { seriesColors = []; }\n\t var series = options.series[0];\n\t var data = series.data;\n\n\t if (!data) {\n\t return;\n\t }\n\n\t var ref$1 = bindSegments(series);\n\t var total = ref$1.total;\n\t var points = ref$1.points;\n\n\t for (var i = 0; i < points.length; i++) {\n\t var pointData = points[i];\n\n\t if (!pointData) {\n\t continue;\n\t }\n\n\t var fields = pointData.fields;\n\n\t if (!isFunction(series.color)) {\n\t series.color = fields.color || seriesColors[i % seriesColors.length];\n\t }\n\n\t fields = deepExtend({\n\t index: i,\n\t owner: this$1,\n\t series: series,\n\t dataItem: data[i],\n\t percentage: pointData.value / total\n\t }, fields, { visible: pointData.visible });\n\n\t var value = pointData.valueFields.value;\n\t var segment = this$1.createSegment(value, fields);\n\t var label = this$1.createLabel(value, fields);\n\n\t if (segment && label) {\n\t segment.append(label);\n\t }\n\t }\n\t },\n\n\t evalSegmentOptions: function(options, value, fields) {\n\t var series = fields.series;\n\n\t evalOptions(options, {\n\t value: value,\n\t series: series,\n\t dataItem: fields.dataItem,\n\t index: fields.index\n\t }, { defaults: series._defaults, excluded: [ \"data\", \"content\", \"template\", \"toggle\", \"visual\" ] });\n\t },\n\n\t createSegment: function(value, fields) {\n\t var seriesOptions = deepExtend({}, fields.series);\n\t this.evalSegmentOptions(seriesOptions, value, fields);\n\n\t this.createLegendItem(value, seriesOptions, fields);\n\n\t if (fields.visible !== false) {\n\n\t var segment = new FunnelSegment(value, seriesOptions, fields);\n\t $.extend(segment, fields);\n\n\t this.append(segment);\n\t this.points.push(segment);\n\n\t return segment;\n\t }\n\t },\n\n\t createLabel: function(value, fields) {\n\t var series = fields.series;\n\t var dataItem = fields.dataItem;\n\t var labels = deepExtend({}, this.options.labels, series.labels);\n\t var text = value;\n\n\t if (labels.visible) {\n\t var labelTemplate = getTemplate(labels);\n\t var data = {\n\t dataItem: dataItem,\n\t value: value,\n\t percentage: fields.percentage,\n\t category: fields.category,\n\t series: series\n\t };\n\t if (labelTemplate) {\n\t text = labelTemplate(data);\n\t } else if (labels.format) {\n\t text = this.plotArea.chartService.format.auto(labels.format, text);\n\t }\n\n\t if (!labels.color) {\n\t labels.color = dataviz.autoTextColor(series.color);\n\t if (!labels.background) {\n\t labels.background = series.color;\n\t }\n\t }\n\n\t this.evalSegmentOptions(labels, value, fields);\n\t var textBox = new TextBox(text, deepExtend({\n\t vAlign: labels.position\n\t }, labels), data);\n\n\t this.labels.push(textBox);\n\n\t return textBox;\n\t }\n\t },\n\n\t labelPadding: function() {\n\t var labels = this.labels;\n\t var padding = { left: 0, right: 0 };\n\n\t for (var i = 0; i < labels.length; i++) {\n\t var label = labels[i];\n\t var align = label.options.align;\n\t if (align !== CENTER) {\n\t var width = labels[i].box.width();\n\n\t if (align === LEFT) {\n\t padding.left = Math.max(padding.left, width);\n\t } else {\n\t padding.right = Math.max(padding.right, width);\n\t }\n\t }\n\t }\n\n\t return padding;\n\t },\n\n\t dynamicSlopeReflow: function(box, width, totalHeight) {\n\t var ref = this;\n\t var options = ref.options;\n\t var segments = ref.points;\n\t var count = segments.length;\n\t var firstSegment = segments[0];\n\t var maxSegment = firstSegment;\n\n\t for (var idx = 0; idx < segments.length; idx++) {\n\t if (segments[idx].percentage > maxSegment.percentage) {\n\t maxSegment = segments[idx];\n\t }\n\t }\n\n\t var lastUpperSide = (firstSegment.percentage / maxSegment.percentage) * width;\n\t var previousOffset = (width - lastUpperSide) / 2;\n\t var previousHeight = 0;\n\n\t for (var idx$1 = 0; idx$1 < count; idx$1++) {\n\t var percentage = segments[idx$1].percentage;\n\t var nextSegment = segments[idx$1 + 1];\n\t var nextPercentage = (nextSegment ? nextSegment.percentage : percentage);\n\t var points = segments[idx$1].points = [];\n\t var height = (options.dynamicHeight) ? (totalHeight * percentage) : (totalHeight / count);\n\t var offset = (void 0);\n\n\t if (!percentage) {\n\t offset = nextPercentage ? 0 : width / 2;\n\t } else {\n\t offset = (width - lastUpperSide * (nextPercentage / percentage)) / 2;\n\t }\n\n\t offset = limitValue(offset, 0, width);\n\n\t points.push(new GeometryPoint(box.x1 + previousOffset, box.y1 + previousHeight));\n\t points.push(new GeometryPoint(box.x1 + width - previousOffset, box.y1 + previousHeight));\n\t points.push(new GeometryPoint(box.x1 + width - offset, box.y1 + height + previousHeight));\n\t points.push(new GeometryPoint(box.x1 + offset, box.y1 + height + previousHeight));\n\n\t previousOffset = offset;\n\t previousHeight += height + options.segmentSpacing;\n\t lastUpperSide = limitValue(width - 2 * offset, 0, width);\n\t }\n\t },\n\n\t constantSlopeReflow: function(box, width, totalHeight) {\n\t var ref = this;\n\t var options = ref.options;\n\t var segments = ref.points;\n\t var count = segments.length;\n\t var decreasingWidth = options.neckRatio <= 1;\n\t var neckRatio = decreasingWidth ? options.neckRatio * width : width;\n\t var previousOffset = decreasingWidth ? 0 : (width - width / options.neckRatio) / 2;\n\t var topMostWidth = decreasingWidth ? width : width - previousOffset * 2;\n\t var finalNarrow = (topMostWidth - neckRatio) / 2;\n\t var previousHeight = 0;\n\n\t for (var idx = 0; idx < count; idx++) {\n\t var points = segments[idx].points = [];\n\t var percentage = segments[idx].percentage;\n\t var offset = (options.dynamicHeight) ? (finalNarrow * percentage) : (finalNarrow / count);\n\t var height = (options.dynamicHeight) ? (totalHeight * percentage) : (totalHeight / count);\n\n\t points.push(new GeometryPoint(box.x1 + previousOffset, box.y1 + previousHeight));\n\t points.push(new GeometryPoint(box.x1 + width - previousOffset, box.y1 + previousHeight));\n\t points.push(new GeometryPoint(box.x1 + width - previousOffset - offset, box.y1 + height + previousHeight));\n\t points.push(new GeometryPoint(box.x1 + previousOffset + offset,box.y1 + height + previousHeight));\n\t previousOffset += offset;\n\t previousHeight += height + options.segmentSpacing;\n\t }\n\t },\n\n\t reflow: function(chartBox) {\n\t var points = this.points;\n\t var count = points.length;\n\n\t if (!count) {\n\t return;\n\t }\n\n\t var options = this.options;\n\t var box = chartBox.clone().unpad(this.labelPadding());\n\t var totalHeight = box.height() - options.segmentSpacing * (count - 1);\n\t var width = box.width();\n\n\t if (options.dynamicSlope) {\n\t this.dynamicSlopeReflow(box, width, totalHeight);\n\t } else {\n\t this.constantSlopeReflow(box, width, totalHeight);\n\t }\n\n\t for (var idx = 0; idx < count; idx++) {\n\t points[idx].reflow(chartBox);\n\t }\n\t }\n\t});\n\n\tsetDefaultOptions(FunnelChart, {\n\t neckRatio: 0.3,\n\t width: 300,\n\t dynamicSlope: false,\n\t dynamicHeight: true,\n\t segmentSpacing: 0,\n\t labels: {\n\t visible: false,\n\t align: CENTER,\n\t position: CENTER,\n\t zIndex: 1\n\t }\n\t});\n\n\tdeepExtend(FunnelChart.prototype, PieChartMixin);\n\n\tvar FunnelPlotArea = PlotAreaBase.extend({\n\t render: function() {\n\t this.createFunnelChart(this.series);\n\t },\n\n\t createFunnelChart: function(series) {\n\t var firstSeries = series[0];\n\t var funnelChart = new FunnelChart(this, {\n\t series: series,\n\t legend: this.options.legend,\n\t neckRatio: firstSeries.neckRatio,\n\t dynamicHeight: firstSeries.dynamicHeight,\n\t dynamicSlope: firstSeries.dynamicSlope,\n\t segmentSpacing: firstSeries.segmentSpacing,\n\t highlight: firstSeries.highlight\n\t });\n\n\t this.appendChart(funnelChart);\n\t },\n\n\t appendChart: function(chart, pane) {\n\t PlotAreaBase.fn.appendChart.call(this, chart, pane);\n\t append(this.options.legend.items, chart.legendItems);\n\t }\n\t});\n\n\t// Linear color scale from the given color to white minus minimum lightness offset.\n\tvar colorScale = function (color, minLightnessOffset) {\n\t if (minLightnessOffset === void 0) { minLightnessOffset = 0.05; }\n\n\t var baseColor = kendo.parseColor(color);\n\t var offset = 1 - minLightnessOffset;\n\n\t return function (value) {\n\t var hsl = baseColor .toHSL();\n\t var range = 100 - hsl.l;\n\t var point = offset - value;\n\t hsl.l += Math.min(point * range, range);\n\n\t return hsl.toCss();\n\t };\n\t};\n\n\tvar HeatmapPoint = ChartElement.extend({\n\t init: function(value, options) {\n\t ChartElement.fn.init.call(this);\n\n\t this.options = options;\n\t this.color = options.color || WHITE;\n\t this.value = value;\n\t },\n\n\t render: function() {\n\t if (this._rendered) {\n\t return;\n\t }\n\n\t this._rendered = true;\n\n\t this.createMarker();\n\t this.createLabel();\n\t this.createNote();\n\t },\n\n\t createLabel: function() {\n\t var options = this.options;\n\t var labels = options.labels;\n\n\t if (labels.visible) {\n\t var pointData = this.pointData();\n\t var labelTemplate = getTemplate(labels);\n\t var labelText;\n\t var labelColor = labels.color;\n\n\t if (labelTemplate) {\n\t labelText = labelTemplate(pointData);\n\t } else {\n\t labelText = this.formatValue(labels.format);\n\t }\n\n\t if (!labelColor) {\n\t labelColor = dataviz.autoTextColor(this.color);\n\t }\n\n\t this.label = new TextBox(labelText,\n\t deepExtend({\n\t align: CENTER,\n\t vAlign: CENTER,\n\t margin: {\n\t left: 5,\n\t right: 5\n\t },\n\t zIndex: valueOrDefault(labels.zIndex, this.series.zIndex)\n\t },\n\t labels, {\n\t color: labelColor\n\t }),\n\t pointData\n\t );\n\t this.append(this.label);\n\t }\n\t },\n\n\t formatValue: function(format) {\n\t return this.owner.formatPointValue(this, format);\n\t },\n\n\t reflow: function(targetBox) {\n\t this.render();\n\n\t var label = this.label;\n\n\t this.box = targetBox;\n\n\t if (label) {\n\t label.reflow(this.markerBox());\n\t }\n\n\t if (this.note) {\n\t this.note.reflow(targetBox);\n\t }\n\n\t this.marker.reflow(this.markerBox());\n\t },\n\n\t markerBox: function() {\n\t var options = this.options;\n\t var markers = options.markers;\n\t var border = markers.border;\n\t var rect = this.box.toRect();\n\t var type = valueOrDefault(markers.type, 'rect');\n\t var isRoundRect = type === datavizConstants.ROUNDED_RECT;\n\t var borderWidth = valueOrDefault(border.width, isRoundRect ? 1 : 0);\n\t var halfBorderWidth = Math.round(borderWidth / 2);\n\n\t if (markers.size) {\n\t var center = rect.center();\n\t rect.size.width = rect.size.height = markers.size;\n\t rect.origin.x = Math.round(center.x - rect.size.width / 2);\n\t rect.origin.y = Math.round(center.y - rect.size.height / 2);\n\t }\n\n\t rect.size.width -= borderWidth;\n\t rect.size.height -= borderWidth;\n\t rect.origin.y += halfBorderWidth + 0.5;\n\t rect.origin.x += halfBorderWidth + 0.5;\n\n\t return dataviz.rectToBox(rect);\n\t },\n\n\t markerBorder: function() {\n\t var options = this.options;\n\t var markers = options.markers;\n\t var border = markers.border;\n\t var opacity = valueOrDefault(border.opacity, options.opacity);\n\n\t return {\n\t color: border.color || this.color,\n\t width: border.width,\n\t opacity: opacity,\n\t dashType: border.dashType\n\t };\n\t },\n\n\t createMarker: function() {\n\t var options = this.options;\n\t var markerOptions = options.markers;\n\t var marker = new ShapeElement({\n\t type: valueOrDefault(markerOptions.type, 'rect'),\n\t width: markerOptions.size,\n\t height: markerOptions.size,\n\t rotation: markerOptions.rotation,\n\t background: this.color,\n\t border: this.markerBorder(),\n\t borderRadius: markerOptions.borderRadius,\n\t opacity: this.series.opacity || options.opacity,\n\t zIndex: valueOrDefault(options.zIndex, this.series.zIndex),\n\t animation: options.animation,\n\t visual: options.visual\n\t }, {\n\t dataItem: this.dataItem,\n\t value: this.value,\n\t series: this.series,\n\t category: this.category\n\t });\n\n\t this.marker = marker;\n\t this.append(marker);\n\t },\n\n\t createHighlight: function(style) {\n\t var options = this.options;\n\t var markerOptions = this.options.highlight.markers || this.options.markers;\n\n\t var highlight = new ShapeElement({\n\t type: valueOrDefault(markerOptions.type, 'rect'),\n\t width: markerOptions.size,\n\t height: markerOptions.size,\n\t rotation: markerOptions.rotation,\n\t background: markerOptions.color || this.color,\n\t border: this.markerBorder(),\n\t borderRadius: markerOptions.borderRadius,\n\t opacity: this.series.opacity || options.opacity,\n\t zIndex: valueOrDefault(options.zIndex, this.series.zIndex)\n\t });\n\n\t highlight.reflow(this.markerBox());\n\t var visual = highlight.getElement();\n\n\t visual.options.fill = style.fill;\n\t visual.options.stroke = style.stroke;\n\n\t return visual;\n\t },\n\n\t highlightVisual: function() {\n\t return this.rectVisual;\n\t },\n\n\t highlightVisualArgs: function() {\n\t return {\n\t options: this.options,\n\t rect: this.box.toRect(),\n\t visual: this.rectVisual\n\t };\n\t },\n\n\t tooltipAnchor: function() {\n\t var left = this.box.center().x;\n\t var top = this.box.y1 - TOOLTIP_OFFSET;\n\n\t return {\n\t point: new Point(left, top),\n\t align: {\n\t horizontal: CENTER,\n\t vertical: BOTTOM\n\t }\n\t };\n\t },\n\n\t overlapsBox: function(box) {\n\t return this.box.overlaps(box);\n\t },\n\n\t unclipElements: function() {\n\t /* noop, clip labels */\n\t },\n\n\t pointData: function() {\n\t return {\n\t x: this.value.x,\n\t y: this.value.y,\n\t value: this.value.value,\n\t dataItem: this.dataItem,\n\t series: this.series\n\t };\n\t }\n\t});\n\n\tdeepExtend(HeatmapPoint.prototype, PointEventsMixin);\n\tdeepExtend(HeatmapPoint.prototype, NoteMixin);\n\n\tHeatmapPoint.prototype.defaults = {\n\t markers: {\n\t type: 'rect',\n\t borderRadius: 4,\n\t border: {\n\t color: 'transparent'\n\t }\n\t },\n\t padding: { top: 1 },\n\t labels: {\n\t visible: false,\n\t padding: 3\n\t },\n\t opacity: 1,\n\t notes: {\n\t label: {}\n\t }\n\t};\n\n\tvar HeatmapChart = ChartElement.extend({\n\t init: function(plotArea, options) {\n\t ChartElement.fn.init.call(this, options);\n\n\t this.plotArea = plotArea;\n\t this.chartService = plotArea.chartService;\n\t this._initFields();\n\n\t this.render();\n\t },\n\n\t _initFields: function() {\n\t this.points = [];\n\t this.seriesOptions = [];\n\t this.valueRange = { min: MAX_VALUE, max: MIN_VALUE };\n\t this._evalSeries = [];\n\t },\n\n\t render: function() {\n\t this.setRange();\n\t this.traverseDataPoints(this.addValue.bind(this));\n\t },\n\n\t setRange: function() {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var series = ref.options.series;\n\n\t for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n\t var currentSeries = series[seriesIx];\n\n\t for (var pointIx = 0; pointIx < currentSeries.data.length; pointIx++) {\n\t var ref$1 = this$1._bindPoint(currentSeries, seriesIx, pointIx);\n\t var valueFields = ref$1.valueFields;\n\t this$1.valueRange.min = Math.min(this$1.valueRange.min, valueFields.value);\n\t this$1.valueRange.max = Math.max(this$1.valueRange.max, valueFields.value);\n\t }\n\t }\n\t },\n\n\t addValue: function(value, fields) {\n\t var point;\n\t if (value) {\n\t point = this.createPoint(value, fields);\n\t if (point) {\n\t $.extend(point, fields);\n\t }\n\t }\n\n\t this.points.push(point);\n\t },\n\n\t evalPointOptions: function(options, value, fields) {\n\t var series = fields.series;\n\t var seriesIx = fields.seriesIx;\n\t var state = { defaults: series._defaults, excluded: [ \"data\", \"tooltip\", \"content\", \"template\", \"visual\", \"toggle\" ] };\n\n\t var doEval = this._evalSeries[seriesIx];\n\t if (!defined(doEval)) {\n\t this._evalSeries[seriesIx] = doEval = evalOptions(options, {}, state, true);\n\t }\n\n\t var pointOptions = options;\n\t if (doEval) {\n\t pointOptions = deepExtend({}, options);\n\t evalOptions(pointOptions, {\n\t value: value,\n\t series: series,\n\t dataItem: fields.dataItem,\n\t min: this.valueRange.min,\n\t max: this.valueRange.max\n\t }, state);\n\t }\n\n\t return pointOptions;\n\t },\n\n\t pointType: function() {\n\t return HeatmapPoint;\n\t },\n\n\t pointOptions: function(series, seriesIx) {\n\t var options = this.seriesOptions[seriesIx];\n\t if (!options) {\n\t var defaults = this.pointType().prototype.defaults;\n\t this.seriesOptions[seriesIx] = options = deepExtend({}, defaults, {\n\t markers: {\n\t opacity: series.opacity\n\t },\n\t tooltip: {\n\t format: this.options.tooltip.format\n\t },\n\t labels: {\n\t format: this.options.labels.format\n\t }\n\t }, series);\n\t }\n\n\t return options;\n\t },\n\n\t createPoint: function(value, fields) {\n\t var series = fields.series;\n\t var pointOptions = this.pointOptions(series, fields.seriesIx);\n\t var color = fields.color || series.color;\n\n\t pointOptions = this.evalPointOptions(pointOptions, value, fields);\n\n\t if (isFunction(series.color)) {\n\t color = pointOptions.color;\n\t } else {\n\t var scale = colorScale(color);\n\t color = scale(value.value / this.valueRange.max);\n\t }\n\n\t var point = new HeatmapPoint(value, pointOptions);\n\t point.color = color;\n\n\t this.append(point);\n\n\t return point;\n\t },\n\n\t seriesAxes: function(series) {\n\t var xAxisName = series.xAxis;\n\t var yAxisName = series.yAxis;\n\t var plotArea = this.plotArea;\n\t var xAxis = xAxisName ? plotArea.namedXAxes[xAxisName] : plotArea.axisX;\n\t var yAxis = yAxisName ? plotArea.namedYAxes[yAxisName] : plotArea.axisY;\n\n\t if (!xAxis) {\n\t throw new Error(\"Unable to locate X axis with name \" + xAxisName);\n\t }\n\n\t if (!yAxis) {\n\t throw new Error(\"Unable to locate Y axis with name \" + yAxisName);\n\t }\n\n\t return { xAxis: xAxis, yAxis: yAxis };\n\t },\n\n\t reflow: function(targetBox) {\n\t var this$1 = this;\n\n\t var chartPoints = this.points;\n\t var limit = !this.options.clip;\n\t var pointIx = 0;\n\n\t this.traverseDataPoints(function (value, fields) {\n\t var point = chartPoints[pointIx++];\n\t var ref = this$1.seriesAxes(fields.series);\n\t var xAxis = ref.xAxis;\n\t var yAxis = ref.yAxis;\n\t var indexX = xAxis.categoryIndex(value.x);\n\t var indexY = yAxis.categoryIndex(value.y);\n\t var slotX = xAxis.getSlot(indexX, indexX, limit);\n\t var slotY = yAxis.getSlot(indexY, indexY, limit);\n\n\t if (point) {\n\t if (slotX && slotY) {\n\t var pointSlot = this$1.pointSlot(slotX, slotY);\n\t point.reflow(pointSlot);\n\t } else {\n\t point.visible = false;\n\t }\n\t }\n\t });\n\n\t this.box = targetBox;\n\t },\n\n\t pointSlot: function(slotX, slotY) {\n\t return new Box(slotX.x1, slotY.y1, slotX.x2, slotY.y2);\n\t },\n\n\t traverseDataPoints: function(callback) {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var series = ref.options.series;\n\n\t for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n\t var currentSeries = series[seriesIx];\n\t var ref$1 = this$1.seriesAxes(currentSeries);\n\t var xAxis = ref$1.xAxis;\n\t var yAxis = ref$1.yAxis;\n\t var xRange = xAxis.currentRangeIndices();\n\t var yRange = yAxis.currentRangeIndices();\n\n\t for (var pointIx = 0; pointIx < currentSeries.data.length; pointIx++) {\n\t var ref$2 = this$1._bindPoint(currentSeries, seriesIx, pointIx);\n\t var value = ref$2.valueFields;\n\t var fields = ref$2.fields;\n\t var xIndex = xAxis.totalIndex(value.x);\n\t var yIndex = yAxis.totalIndex(value.y);\n\t var xIn = xRange.min <= xIndex && xIndex <= xRange.max;\n\t var yIn = yRange.min <= yIndex && yIndex <= yRange.max;\n\n\t if (xIn && yIn) {\n\t callback(value, deepExtend({\n\t pointIx: pointIx,\n\t series: currentSeries,\n\t seriesIx: seriesIx,\n\t dataItem: currentSeries.data[pointIx],\n\t owner: this$1\n\t }, fields));\n\t }\n\t }\n\t }\n\t },\n\n\t formatPointValue: function(point, format) {\n\t var value = point.value;\n\t return this.chartService.format.auto(format, value.x, value.y, value.value);\n\t },\n\n\t animationPoints: function() {\n\t var points = this.points;\n\t var result = [];\n\t for (var idx = 0; idx < points.length; idx++) {\n\t result.push((points[idx] || {}).marker);\n\t }\n\t return result;\n\t }\n\t});\n\tsetDefaultOptions(HeatmapChart, {\n\t series: [],\n\t tooltip: {\n\t format: \"{0}, {1}: {2}\"\n\t },\n\t labels: {\n\t format: \"{2}\"\n\t },\n\t clip: true\n\t});\n\tdeepExtend(HeatmapChart.prototype, {\n\t _bindPoint: CategoricalChart.prototype._bindPoint\n\t});\n\n\tvar HeatmapPlotArea = PlotAreaBase.extend({\n\t initFields: function() {\n\t this.namedXAxes = {};\n\t this.namedYAxes = {};\n\t },\n\n\t render: function(panes) {\n\t if (panes === void 0) { panes = this.panes; }\n\n\t this.bindCategories();\n\t this.createAxes(panes);\n\t this.createCharts(panes);\n\t this.createAxisLabels();\n\t },\n\n\t bindCategories: function() {\n\t var this$1 = this;\n\n\t var series = this.srcSeries || this.series;\n\n\t for (var i = 0; i < series.length; i++) {\n\t var currentSeries = series[i];\n\t var data = currentSeries.data || [];\n\t var ref = this$1.seriesAxes(currentSeries);\n\t var xAxis = ref.xAxis;\n\t var yAxis = ref.yAxis;\n\n\t var xCategories = dataviz.createHashSet(xAxis.categories || []);\n\t var yCategories = dataviz.createHashSet(yAxis.categories || []);\n\n\t for (var pointIndex = 0; pointIndex < data.length; pointIndex++) {\n\t var ref$1 = SeriesBinder.current.bindPoint(currentSeries, pointIndex).valueFields;\n\t var x = ref$1.x;\n\t var y = ref$1.y;\n\n\t if (!xCategories.has(x)) {\n\t xCategories.add(x);\n\t }\n\n\t if (!yCategories.has(y)) {\n\t yCategories.add(y);\n\t }\n\t }\n\n\t xAxis.categories = xCategories.values();\n\t yAxis.categories = yCategories.values();\n\t }\n\t },\n\n\t createCharts: function(panes) {\n\t var this$1 = this;\n\n\t var seriesByPane = this.groupSeriesByPane();\n\n\t for (var i = 0; i < panes.length; i++) {\n\t var pane = panes[i];\n\t var paneSeries = seriesByPane[pane.options.name || \"default\"] || [];\n\t this$1.addToLegend(paneSeries);\n\t var filteredSeries = this$1.filterVisibleSeries(paneSeries);\n\n\t if (!filteredSeries) {\n\t continue;\n\t }\n\n\t this$1.createHeatmapChart(\n\t filterSeriesByType(filteredSeries, [ HEATMAP ]),\n\t pane\n\t );\n\t }\n\t },\n\n\t createHeatmapChart: function(series, pane) {\n\t var chart = new HeatmapChart(this, {\n\t series: series\n\t });\n\n\t this.appendChart(chart, pane);\n\t },\n\n\t seriesPaneName: function(series) {\n\t var options = this.options;\n\t var xAxisName = series.xAxis;\n\t var xAxisOptions = [].concat(options.xAxis);\n\t var xAxis = grep(xAxisOptions, function(a) { return a.name === xAxisName; })[0];\n\t var yAxisName = series.yAxis;\n\t var yAxisOptions = [].concat(options.yAxis);\n\t var yAxis = grep(yAxisOptions, function(a) { return a.name === yAxisName; })[0];\n\t var panes = options.panes || [ {} ];\n\t var defaultPaneName = panes[0].name || \"default\";\n\t var paneName = (xAxis || {}).pane || (yAxis || {}).pane || defaultPaneName;\n\n\t return paneName;\n\t },\n\n\t seriesAxes: function(series) {\n\t var xAxis;\n\t var yAxis;\n\n\t var options = this.options;\n\n\t var xAxisOptions = [].concat(options.xAxis);\n\t var xAxisName = series.xAxis;\n\t if (xAxisName) {\n\t xAxis = xAxisOptions.find(function (axis) { return axis.name === xAxisName; });\n\t } else {\n\t xAxis = xAxisOptions[0];\n\t }\n\n\t var yAxisOptions = [].concat(options.yAxis);\n\t var yAxisName = series.yAxis;\n\t if (yAxisName) {\n\t yAxis = yAxisOptions.find(function (axis) { return axis.name === yAxisName; });\n\t } else {\n\t yAxis = yAxisOptions[0];\n\t }\n\n\t if (!xAxis) {\n\t throw new Error(\"Unable to locate X axis with name \" + xAxisName);\n\t }\n\n\t if (!yAxis) {\n\t throw new Error(\"Unable to locate Y axis with name \" + yAxisName);\n\t }\n\n\t return { xAxis: xAxis, yAxis: yAxis };\n\t },\n\n\t createAxisLabels: function() {\n\t var axes = this.axes;\n\t for (var i = 0; i < axes.length; i++) {\n\t axes[i].createLabels();\n\t }\n\t },\n\n\t createXYAxis: function(options, vertical, axisIndex) {\n\t var axisName = options.name;\n\t var namedAxes = vertical ? this.namedYAxes : this.namedXAxes;\n\t var axisOptions = $.extend({\n\t axisCrossingValue: 0\n\t }, options, {\n\t vertical: vertical,\n\t reverse: (vertical || this.chartService.rtl) ? !options.reverse : options.reverse,\n\t justified: false\n\t });\n\t var firstCategory = axisOptions.categories ? axisOptions.categories[0] : null;\n\t var typeSamples = [ axisOptions.min, axisOptions.max, firstCategory ];\n\t var series = this.series;\n\n\t for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n\t var currentSeries = series[seriesIx];\n\t var seriesAxisName = currentSeries[vertical ? \"yAxis\" : \"xAxis\"];\n\t if ((seriesAxisName === axisOptions.name) || (axisIndex === 0 && !seriesAxisName)) {\n\t var firstPointValue = SeriesBinder.current.bindPoint(currentSeries, 0).valueFields;\n\t typeSamples.push(firstPointValue[vertical ? \"y\" : \"x\"]);\n\n\t break;\n\t }\n\t }\n\n\t var inferredDate;\n\n\t for (var i = 0; i < typeSamples.length; i++) {\n\t if (typeSamples[i] instanceof Date) {\n\t inferredDate = true;\n\t break;\n\t }\n\t }\n\n\t var axisType;\n\t if (equalsIgnoreCase(axisOptions.type, DATE) || (!axisOptions.type && inferredDate)) {\n\t axisType = dataviz.DateCategoryAxis;\n\t } else {\n\t axisType = CategoryAxis;\n\t }\n\n\t var axis = new axisType(axisOptions, this.chartService);\n\t axis.axisIndex = axisIndex;\n\n\t if (axisName) {\n\t if (namedAxes[axisName]) {\n\t throw new Error(((vertical ? \"Y\" : \"X\") + \" axis with name \" + axisName + \" is already defined\"));\n\t }\n\t namedAxes[axisName] = axis;\n\t }\n\n\t this.appendAxis(axis);\n\t axis.mapCategories();\n\n\t return axis;\n\t },\n\n\t createAxes: function(panes) {\n\t var this$1 = this;\n\n\t var options = this.options;\n\t var xAxesOptions = [].concat(options.xAxis);\n\t var xAxes = [];\n\t var yAxesOptions = [].concat(options.yAxis);\n\t var yAxes = [];\n\n\t for (var idx = 0; idx < xAxesOptions.length; idx++) {\n\t var axisPane = this$1.findPane(xAxesOptions[idx].pane);\n\t if (inArray(axisPane, panes)) {\n\t xAxes.push(this$1.createXYAxis(xAxesOptions[idx], false, idx));\n\t }\n\t }\n\n\t for (var idx$1 = 0; idx$1 < yAxesOptions.length; idx$1++) {\n\t var axisPane$1 = this$1.findPane(yAxesOptions[idx$1].pane);\n\t if (inArray(axisPane$1, panes)) {\n\t yAxes.push(this$1.createXYAxis(yAxesOptions[idx$1], true, idx$1));\n\t }\n\t }\n\n\t this.axisX = this.axisX || xAxes[0];\n\t this.axisY = this.axisY || yAxes[0];\n\t },\n\n\t removeAxis: function(axis) {\n\t var axisName = axis.options.name;\n\n\t PlotAreaBase.fn.removeAxis.call(this, axis);\n\n\t if (axis.options.vertical) {\n\t delete this.namedYAxes[axisName];\n\t } else {\n\t delete this.namedXAxes[axisName];\n\t }\n\n\t if (axis === this.axisX) {\n\t delete this.axisX;\n\t }\n\n\t if (axis === this.axisY) {\n\t delete this.axisY;\n\t }\n\t },\n\n\t _dispatchEvent: function(chart, e, eventType) {\n\t var coords = chart._eventCoordinates(e);\n\t var point = new Point(coords.x, coords.y);\n\t var allAxes = this.axes;\n\t var length = allAxes.length;\n\t var xValues = [];\n\t var yValues = [];\n\n\t for (var i = 0; i < length; i++) {\n\t var axis = allAxes[i];\n\t var values = axis.options.vertical ? yValues : xValues;\n\t appendIfNotNull(values, axis.getCategory(point));\n\t }\n\n\t if (xValues.length > 0 && yValues.length > 0) {\n\t chart.trigger(eventType, {\n\t element: eventElement(e),\n\t originalEvent: e,\n\t x: singleItemOrArray(xValues),\n\t y: singleItemOrArray(yValues)\n\t });\n\t }\n\t },\n\n\t updateAxisOptions: function(axis, options) {\n\t var vertical = axis.options.vertical;\n\t var axes = this.groupAxes(this.panes);\n\t var index = (vertical ? axes.y : axes.x).indexOf(axis);\n\n\t updateAxisOptions$2(this.options, index, vertical, options);\n\t updateAxisOptions$2(this.originalOptions, index, vertical, options);\n\t },\n\n\t crosshairOptions: function(axis) {\n\t // Stack the crosshair above the series points.\n\t return $.extend({}, axis.options.crosshair, { zIndex: 0 });\n\t }\n\t});\n\n\tfunction updateAxisOptions$2(targetOptions, axisIndex, vertical, options) {\n\t var axisOptions = ([].concat(vertical ? targetOptions.yAxis : targetOptions.xAxis))[axisIndex];\n\t deepExtend(axisOptions, options);\n\t}\n\n\tsetDefaultOptions(HeatmapPlotArea, {\n\t xAxis: {},\n\t yAxis: {}\n\t});\n\n\tdeepExtend(HeatmapPlotArea.prototype, PlotAreaEventsMixin);\n\n\tvar COLOR = \"color\";\n\tvar FIRST = \"first\";\n\tvar FROM = \"from\";\n\tvar MAX = \"max\";\n\tvar MIN = \"min\";\n\tvar NOTE_TEXT = \"noteText\";\n\tvar SUMMARY_FIELD = \"summary\";\n\tvar TO = \"to\";\n\n\tPlotAreaFactory.current.register(CategoricalPlotArea, [\n\t BAR, COLUMN, LINE, VERTICAL_LINE, AREA, VERTICAL_AREA,\n\t CANDLESTICK, OHLC, BULLET, VERTICAL_BULLET, BOX_PLOT, VERTICAL_BOX_PLOT,\n\t RANGE_COLUMN, RANGE_BAR, WATERFALL, HORIZONTAL_WATERFALL, RANGE_AREA, VERTICAL_RANGE_AREA\n\t]);\n\n\tPlotAreaFactory.current.register(XYPlotArea, [\n\t SCATTER, SCATTER_LINE, BUBBLE\n\t]);\n\n\tPlotAreaFactory.current.register(PiePlotArea, [ PIE ]);\n\tPlotAreaFactory.current.register(DonutPlotArea, [ DONUT ]);\n\tPlotAreaFactory.current.register(FunnelPlotArea, [ FUNNEL ]);\n\n\tPlotAreaFactory.current.register(PolarPlotArea, [ POLAR_AREA, POLAR_LINE, POLAR_SCATTER ]);\n\tPlotAreaFactory.current.register(RadarPlotArea, [ RADAR_AREA, RADAR_COLUMN, RADAR_LINE ]);\n\n\tPlotAreaFactory.current.register(HeatmapPlotArea, [ HEATMAP ]);\n\n\tSeriesBinder.current.register(\n\t [ BAR, COLUMN, LINE, VERTICAL_LINE, AREA, VERTICAL_AREA ],\n\t [ VALUE ], [ CATEGORY, COLOR, NOTE_TEXT, ERROR_LOW_FIELD, ERROR_HIGH_FIELD ]\n\t);\n\n\tSeriesBinder.current.register(\n\t [ RANGE_COLUMN, RANGE_BAR, RANGE_AREA, VERTICAL_RANGE_AREA ],\n\t [ FROM, TO ], [ CATEGORY, COLOR, NOTE_TEXT ]\n\t);\n\n\tSeriesBinder.current.register(\n\t [ WATERFALL, HORIZONTAL_WATERFALL ],\n\t [ VALUE ], [ CATEGORY, COLOR, NOTE_TEXT, SUMMARY_FIELD ]\n\t);\n\n\tSeriesBinder.current.register([ POLAR_AREA, POLAR_LINE, POLAR_SCATTER ], [ X, Y ], [ COLOR ]);\n\tSeriesBinder.current.register([ RADAR_AREA, RADAR_COLUMN, RADAR_LINE ], [ VALUE ], [ COLOR ]);\n\n\tSeriesBinder.current.register(\n\t [ FUNNEL ],\n\t [ VALUE ], [ CATEGORY, COLOR, \"visibleInLegend\", \"visible\" ]\n\t);\n\n\tDefaultAggregates.current.register(\n\t [ BAR, COLUMN, LINE, VERTICAL_LINE, AREA, VERTICAL_AREA, WATERFALL, HORIZONTAL_WATERFALL ],\n\t { value: MAX, color: FIRST, noteText: FIRST, errorLow: MIN, errorHigh: MAX }\n\t);\n\n\tDefaultAggregates.current.register(\n\t [ RANGE_COLUMN, RANGE_BAR, RANGE_AREA, VERTICAL_RANGE_AREA ],\n\t { from: MIN, to: MAX, color: FIRST, noteText: FIRST }\n\t);\n\n\tDefaultAggregates.current.register(\n\t [ RADAR_AREA, RADAR_COLUMN, RADAR_LINE ],\n\t { value: MAX, color: FIRST }\n\t);\n\n\tSeriesBinder.current.register(\n\t [ SCATTER, SCATTER_LINE, BUBBLE ],\n\t [ X, Y ], [ COLOR, NOTE_TEXT, X_ERROR_LOW_FIELD, X_ERROR_HIGH_FIELD, Y_ERROR_LOW_FIELD, Y_ERROR_HIGH_FIELD ]\n\t);\n\n\tSeriesBinder.current.register(\n\t [ BUBBLE ], [ X, Y, \"size\" ], [ COLOR, CATEGORY, NOTE_TEXT ]\n\t);\n\n\tSeriesBinder.current.register(\n\t [ HEATMAP ],\n\t [ X, Y, VALUE ], [ COLOR, NOTE_TEXT ]\n\t);\n\n\tSeriesBinder.current.register(\n\t [ CANDLESTICK, OHLC ],\n\t [ \"open\", \"high\", \"low\", \"close\" ], [ CATEGORY, COLOR, \"downColor\", NOTE_TEXT ]\n\t);\n\n\tDefaultAggregates.current.register(\n\t [ CANDLESTICK, OHLC ],\n\t { open: MAX, high: MAX, low: MIN, close: MAX,\n\t color: FIRST, downColor: FIRST, noteText: FIRST }\n\t);\n\n\tSeriesBinder.current.register(\n\t [ BOX_PLOT, VERTICAL_BOX_PLOT ],\n\t [ \"lower\", \"q1\", \"median\", \"q3\", \"upper\", \"mean\", \"outliers\" ], [ CATEGORY, COLOR, NOTE_TEXT ]\n\t);\n\n\tDefaultAggregates.current.register(\n\t [ BOX_PLOT, VERTICAL_BOX_PLOT ],\n\t { lower: MAX, q1: MAX, median: MAX, q3: MAX, upper: MAX, mean: MAX, outliers: FIRST,\n\t color: FIRST, noteText: FIRST }\n\t);\n\n\tSeriesBinder.current.register(\n\t [ BULLET, VERTICAL_BULLET ],\n\t [ \"current\", \"target\" ], [ CATEGORY, COLOR, \"visibleInLegend\", NOTE_TEXT ]\n\t);\n\n\tDefaultAggregates.current.register(\n\t [ BULLET, VERTICAL_BULLET ],\n\t { current: MAX, target: MAX, color: FIRST, noteText: FIRST }\n\t);\n\n\tSeriesBinder.current.register(\n\t [ PIE, DONUT ],\n\t [ VALUE ], [ CATEGORY, COLOR, \"explode\", \"visibleInLegend\", \"visible\" ]\n\t);\n\n\tvar AXIS_NAMES = [ CATEGORY, VALUE, X, Y ];\n\n\tvar MOUSEMOVE = \"mousemove\";\n\tvar CONTEXTMENU = \"contextmenu\";\n\tvar MOUSELEAVE = \"mouseleave\";\n\tvar MOUSEMOVE_DELAY = 20;\n\n\tvar Chart = Class.extend({\n\t init: function(element, userOptions, themeOptions, context) {\n\t var this$1 = this;\n\t if (context === void 0) { context = {}; }\n\n\t this.observers = [];\n\t this.addObserver(context.observer);\n\t this.chartService = new services.ChartService(this, context);\n\t this.chartService.theme = themeOptions;\n\n\t this._initElement(element);\n\n\t var options = deepExtend({}, this.options, userOptions);\n\t this._originalOptions = deepExtend({}, options);\n\t this._theme = themeOptions;\n\t this._initTheme(options, themeOptions);\n\n\t this._initHandlers();\n\t this._initSurface();\n\n\t this.bindCategories();\n\t dataviz.FontLoader.preloadFonts(userOptions, function () {\n\t this$1.fontLoaded = true;\n\t if (!this$1._destroyed) {\n\t this$1.trigger('init');\n\t this$1._redraw();\n\t this$1._attachEvents();\n\t }\n\t });\n\t },\n\n\t _initElement: function(element) {\n\t this._setElementClass(element);\n\t element.style.position = \"relative\";\n\t while (element.firstChild) {\n\t element.removeChild(element.firstChild);\n\t }\n\t this.element = element;\n\t },\n\n\t _setElementClass: function(element) {\n\t dataviz.addClass(element, \"k-chart\");\n\t },\n\n\t _initTheme: function(options, themeOptions) {\n\t var seriesCopies = [];\n\t var series = options.series || [];\n\n\t for (var i = 0; i < series.length; i++) {\n\t seriesCopies.push($.extend({}, series[i]));\n\t }\n\t options.series = seriesCopies;\n\n\t resolveAxisAliases(options);\n\t this.applyDefaults(options, themeOptions);\n\n\t // Clean up default if not overriden by data attributes\n\t if (options.seriesColors === null) {\n\t delete options.seriesColors;\n\t }\n\n\t this.options = deepExtend({}, themeOptions, options);\n\t this.applySeriesColors();\n\t },\n\n\t getSize: function() {\n\t var chartArea = this.options.chartArea || {};\n\t var width = chartArea.width ? parseInt(chartArea.width, 10) : Math.floor(this.element.offsetWidth);\n\t var height = chartArea.height ? parseInt(chartArea.height, 10) : Math.floor(this.element.offsetHeight);\n\n\t return {\n\t width: width,\n\t height: height\n\t };\n\t },\n\n\t resize: function(force) {\n\t var size = this.getSize();\n\t var currentSize = this._size;\n\t var hasSize = size.width > 0 || size.height > 0;\n\n\t if (force || hasSize && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\n\t this._size = size;\n\t this._resize(size, force);\n\t this.trigger(\"resize\", size);\n\t } else if (hasSize && this._selections && dataviz.find(this._selections, function (s) { return !s.visible; })) {\n\t this._destroySelections();\n\t this._setupSelection();\n\t }\n\t },\n\n\t _resize: function() {\n\t this._noTransitionsRedraw();\n\t },\n\n\t redraw: function(paneName) {\n\t this.applyDefaults(this.options);\n\t this.applySeriesColors();\n\n\t if (paneName) {\n\t var plotArea = this._model._plotArea;\n\t var pane = plotArea.findPane(paneName);\n\t plotArea.redraw(pane);\n\t } else {\n\t this._redraw();\n\t }\n\t },\n\n\t getAxis: function(name) {\n\t return findAxisByName(name, this._plotArea.axes);\n\t },\n\n\t findAxisByName: function(name) {\n\t return this.getAxis(name);\n\t },\n\n\t findPaneByName: function(name) {\n\t var panes = this._plotArea.panes;\n\n\t for (var idx = 0; idx < panes.length; idx++) {\n\t if (panes[idx].options.name === name) {\n\t return new ChartPane(panes[idx]);\n\t }\n\t }\n\t },\n\n\t findPaneByIndex: function(idx) {\n\t var panes = this._plotArea.panes;\n\t if (panes[idx]) {\n\t return new ChartPane(panes[idx]);\n\t }\n\t },\n\n\t plotArea: function() {\n\t return new ChartPlotArea(this._plotArea);\n\t },\n\n\t toggleHighlight: function(show, filter) {\n\t var plotArea = this._plotArea;\n\t var firstSeries = (plotArea.srcSeries || plotArea.series || [])[0];\n\t var points;\n\n\t if (isFunction(filter)) {\n\t points = plotArea.filterPoints(filter);\n\t } else {\n\t var seriesName, categoryName;\n\t if (isObject(filter)) {\n\t seriesName = filter.series;\n\t categoryName = filter.category;\n\t } else {\n\t seriesName = categoryName = filter;\n\t }\n\n\t if (firstSeries.type === DONUT) {\n\t points = pointByCategoryName(plotArea.pointsBySeriesName(seriesName), categoryName);\n\t } else if (firstSeries.type === PIE || firstSeries.type === FUNNEL) {\n\t points = pointByCategoryName((plotArea.charts[0] || {}).points, categoryName);\n\t } else {\n\t points = plotArea.pointsBySeriesName(seriesName);\n\t }\n\t }\n\n\t if (points) {\n\t this.togglePointsHighlight(show, points);\n\t }\n\t },\n\n\t togglePointsHighlight: function(show, points) {\n\t var highlight = this._highlight;\n\t for (var idx = 0; idx < points.length; idx++) {\n\t highlight.togglePointHighlight(points[idx], show);\n\t }\n\t },\n\n\t showTooltip: function(filter) {\n\t var shared = this._sharedTooltip();\n\t var ref = this;\n\t var tooltip = ref._tooltip;\n\t var plotArea = ref._plotArea;\n\t var point, categoryIndex;\n\n\t if (isFunction(filter)) {\n\t point = plotArea.findPoint(filter);\n\t if (point && shared) {\n\t categoryIndex = point.categoryIx;\n\t }\n\t } else if (shared && defined(filter)) {\n\t categoryIndex = plotArea.categoryAxis.categoryIndex(filter);\n\t }\n\n\t if (shared) {\n\t if (categoryIndex >= 0) {\n\t var points = this._plotArea.pointsByCategoryIndex(categoryIndex);\n\t tooltip.showAt(points);\n\t }\n\t } else if (point) {\n\t tooltip.show(point);\n\t }\n\t },\n\n\t hideTooltip: function() {\n\t this._tooltip.hide();\n\t },\n\n\t _initSurface: function() {\n\t var surface = this.surface;\n\t var wrap = this._surfaceWrap();\n\n\t var chartArea = this.options.chartArea || {};\n\t if (chartArea.width) {\n\t dataviz.elementSize(wrap, { width: chartArea.width });\n\t }\n\t if (chartArea.height) {\n\t dataviz.elementSize(wrap, { height: chartArea.height });\n\t }\n\n\t if (!surface || surface.options.type !== this.options.renderAs) {\n\t this._destroySurface();\n\n\t this.surface = drawing.Surface.create(wrap, {\n\t type: this.options.renderAs\n\t });\n\n\t this.surface.bind(\"mouseenter\", this._surfaceMouseenterHandler);\n\t this.surface.bind(\"mouseleave\", this._surfaceMouseleaveHandler);\n\n\t } else {\n\t this.surface.clear();\n\t this.surface.resize();\n\t }\n\t },\n\n\t _surfaceWrap: function() {\n\t return this.element;\n\t },\n\n\t _redraw: function() {\n\t var model = this._getModel();\n\t this._size = {\n\t width: model.options.width,\n\t height: model.options.height\n\t };\n\n\t this._destroyView();\n\n\t this._model = model;\n\t this._plotArea = model._plotArea;\n\n\t model.renderVisual();\n\n\t if (this.options.transitions !== false) {\n\t model.traverse(function(element) {\n\t if (element.animation) {\n\t element.animation.setup();\n\t }\n\t });\n\t }\n\n\t this._initSurface();\n\t this.surface.draw(model.visual);\n\n\t if (this.options.transitions !== false) {\n\t model.traverse(function(element) {\n\t if (element.animation) {\n\t element.animation.play();\n\t }\n\t });\n\t }\n\n\t this._tooltip = this._createTooltip();\n\t this._highlight = new Highlight();\n\t this._setupSelection();\n\t this._createPannable();\n\t this._createZoomSelection();\n\t this._createMousewheelZoom();\n\n\t this.trigger(RENDER);\n\t triggerPaneRender(this._plotArea.panes);\n\n\t if (!this._navState) {\n\t this._cancelDomEvents();\n\t }\n\t },\n\n\t exportVisual: function(exportOptions) {\n\t var visual;\n\t if (exportOptions && (exportOptions.width || exportOptions.height || exportOptions.options)) {\n\t var currentOptions = this.options;\n\t var options = deepExtend({}, exportOptions.options, {\n\t chartArea: {\n\t width: exportOptions.width,\n\t height: exportOptions.height\n\t }\n\t });\n\n\t clearMissingValues(this._originalOptions, options);\n\t this.options = deepExtend({}, this._originalOptions, options);\n\t this._initTheme(this.options, this._theme);\n\t this.bindCategories();\n\n\t var model = this._getModel();\n\n\t model.renderVisual();\n\t triggerPaneRender(model._plotArea.panes);\n\n\t visual = model.visual;\n\n\t this.options = currentOptions;\n\t } else {\n\t visual = this.surface.exportVisual();\n\t }\n\n\t return visual;\n\t },\n\n\t _sharedTooltip: function() {\n\t return this._plotArea instanceof CategoricalPlotArea && this.options.tooltip && this.options.tooltip.shared;\n\t },\n\n\t _createPannable: function() {\n\t var options = this.options;\n\t if (options.pannable !== false) {\n\t this._pannable = new Pannable(this._plotArea, options.pannable);\n\t }\n\t },\n\n\t _createZoomSelection: function() {\n\t var zoomable = this.options.zoomable;\n\t var selection = (zoomable || {}).selection;\n\t if (zoomable !== false && selection !== false) {\n\t this._zoomSelection = new ZoomSelection(this, selection);\n\t }\n\t },\n\n\t _createMousewheelZoom: function() {\n\t var zoomable = this.options.zoomable;\n\t var mousewheel = (zoomable || {}).mousewheel;\n\t if (zoomable !== false && mousewheel !== false) {\n\t this._mousewheelZoom = new MousewheelZoom(this, mousewheel);\n\t }\n\t },\n\n\t _toggleDragZoomEvents: function() {\n\t var pannable = this.options.pannable;\n\t var zoomable = this.options.zoomable;\n\t var selection = (zoomable || {}).selection;\n\t var mousewheel = (zoomable || {}).mousewheel;\n\t var allowDrag = !pannable && (zoomable === false || selection === false) && !this.requiresHandlers([ DRAG_START, DRAG, DRAG_END ]);\n\t var allowZoom = (zoomable === false || mousewheel === false) && !this.requiresHandlers([ ZOOM_START, ZOOM, ZOOM_END ]);\n\t var element = this.element;\n\n\t if (this._dragZoomEnabled && allowDrag && allowZoom) {\n\t element.style.touchAction = this._touchAction || '';\n\t this._dragZoomEnabled = false;\n\t } else if (!this._dragZoomEnabled && !(allowDrag && allowZoom)) {\n\t element.style.touchAction = \"none\";\n\n\t this._dragZoomEnabled = true;\n\t }\n\n\t this._toggleDomEvents(!allowDrag, !allowZoom);\n\t },\n\n\t _toggleDomEvents: function(drag, zoom) {\n\t var domEvents = this.domEvents;\n\t if (!domEvents) {\n\t return;\n\t }\n\n\t if (domEvents.toggleDrag) {\n\t domEvents.toggleDrag(drag);\n\t }\n\n\t if (domEvents.toggleZoom) {\n\t domEvents.toggleZoom(zoom);\n\t }\n\t },\n\n\t _createTooltip: function() {\n\t var ref = this;\n\t var tooltipOptions = ref.options.tooltip;\n\t var tooltip;\n\n\t if (this._sharedTooltip()) {\n\t tooltip = this._createSharedTooltip(tooltipOptions);\n\t } else {\n\t tooltip = new Tooltip(this.chartService, tooltipOptions);\n\t }\n\n\t return tooltip;\n\t },\n\n\t _createSharedTooltip: function(options) {\n\t return new SharedTooltip(this._plotArea, options);\n\t },\n\n\t applyDefaults: function(options, themeOptions) {\n\t applyAxisDefaults(options, themeOptions);\n\t applySeriesDefaults(options, themeOptions);\n\t },\n\n\t applySeriesColors: function() {\n\t var options = this.options;\n\t var series = options.series;\n\t var colors = options.seriesColors || [];\n\n\t for (var i = 0; i < series.length; i++) {\n\t var currentSeries = series[i];\n\t var seriesColor = colors[i % colors.length];\n\t var defaults = currentSeries._defaults;\n\n\t currentSeries.color = currentSeries.color || seriesColor;\n\t if (defaults) {\n\t defaults.color = defaults.color || seriesColor;\n\t }\n\t }\n\t },\n\n\t _getModel: function() {\n\t var options = this.options;\n\t var plotArea = this._createPlotArea();\n\t var model = new dataviz.RootElement(this._modelOptions());\n\t model.chart = this;\n\t model._plotArea = plotArea;\n\n\t dataviz.Title.buildTitle(options.title, model);\n\n\t if (options.legend && options.legend.visible) {\n\t model.append(new Legend(plotArea.options.legend, this.chartService));\n\t }\n\t model.append(plotArea);\n\t model.reflow();\n\n\t return model;\n\t },\n\n\t _modelOptions: function() {\n\t var options = this.options;\n\t var size = this.getSize();\n\n\t return deepExtend({\n\t transitions: options.transitions,\n\t width: size.width || datavizConstants.DEFAULT_WIDTH,\n\t height: size.height || datavizConstants.DEFAULT_HEIGHT\n\t }, options.chartArea);\n\t },\n\n\t _createPlotArea: function(skipSeries) {\n\t var options = this.options;\n\n\t var plotArea = PlotAreaFactory.current.create(skipSeries ? [] : options.series, options, this.chartService);\n\n\t return plotArea;\n\t },\n\n\t _setupSelection: function() {\n\t var this$1 = this;\n\n\t var ref = this;\n\t var axes = ref._plotArea.axes;\n\t var selections = this._selections = [];\n\n\t for (var i = 0; i < axes.length; i++) {\n\t var axis = axes[i];\n\t var options = axis.options;\n\t if (axis instanceof CategoryAxis && options.select && !options.vertical) {\n\t var range = axis.range();\n\n\t var selection = new Selection(this$1, axis,\n\t deepExtend({ min: range.min, max: range.max }, options.select)\n\t );\n\n\t selections.push(selection);\n\t }\n\t }\n\t },\n\n\t _selectStart: function(e) {\n\t return this.trigger(SELECT_START, e);\n\t },\n\n\t _select: function(e) {\n\t return this.trigger(SELECT, e);\n\t },\n\n\t _selectEnd: function(e) {\n\t return this.trigger(SELECT_END, e);\n\t },\n\n\t _initHandlers: function() {\n\t this._clickHandler = this._click.bind(this);\n\t this._mousewheelHandler = this._mousewheel.bind(this);\n\t this._mouseleaveHandler = this._mouseleave.bind(this);\n\t this._surfaceMouseenterHandler = this._mouseover.bind(this);\n\t this._surfaceMouseleaveHandler = this._mouseout.bind(this);\n\n\t this._mousemove = kendo.throttle(\n\t this._mousemove.bind(this),\n\t MOUSEMOVE_DELAY\n\t );\n\t },\n\n\t addObserver: function(observer) {\n\t if (observer) {\n\t this.observers.push(observer);\n\t }\n\t },\n\n\t removeObserver: function(observer) {\n\t var index = this.observers.indexOf(observer);\n\t if (index >= 0) {\n\t this.observers.splice(index, 1);\n\t }\n\t },\n\n\t requiresHandlers: function(eventNames) {\n\t var observers = this.observers;\n\t for (var idx = 0; idx < observers.length; idx++) {\n\t if (observers[idx].requiresHandlers(eventNames)) {\n\t return true;\n\t }\n\t }\n\t },\n\n\t trigger: function(name, args) {\n\t if (args === void 0) { args = {}; }\n\n\t if (name === SHOW_TOOLTIP) {\n\t args.anchor.point = this._toDocumentCoordinates(args.anchor.point);\n\t }\n\t args.sender = this;\n\n\t var observers = this.observers;\n\t var isDefaultPrevented = false;\n\t for (var idx = 0; idx < observers.length; idx++) {\n\t if (observers[idx].trigger(name, args)) {\n\t isDefaultPrevented = true;\n\t }\n\t }\n\n\t return isDefaultPrevented;\n\t },\n\n\t _attachEvents: function() {\n\t var element = this.element;\n\n\t this._touchAction = element.style.touchAction;\n\n\t var obj;\n\t bindEvents(element, ( obj = {}, obj[ CONTEXTMENU ] = this._clickHandler, obj[ MOUSEWHEEL ] = this._mousewheelHandler, obj[ MOUSELEAVE ] = this._mouseleaveHandler, obj ));\n\n\t if (this._shouldAttachMouseMove()) {\n\t var obj$1;\n\t bindEvents(element, ( obj$1 = {}, obj$1[ MOUSEMOVE ] = this._mousemove, obj$1 ));\n\t }\n\n\t this.domEvents = services.DomEventsBuilder.create(this.element, {\n\t start: this._start.bind(this),\n\t move: this._move.bind(this),\n\t end: this._end.bind(this),\n\t tap: this._tap.bind(this),\n\t gesturestart: this._gesturestart.bind(this),\n\t gesturechange: this._gesturechange.bind(this),\n\t gestureend: this._gestureend.bind(this)\n\t });\n\n\t this._toggleDragZoomEvents();\n\t },\n\n\t _mouseleave: function(e) {\n\t if (this._hoveredPoint) {\n\t this._hoveredPoint.out(this, e);\n\t this._hoveredPoint = null;\n\t }\n\n\t if (this._plotArea.hovered) {\n\t this.trigger(PLOT_AREA_LEAVE);\n\t this._plotArea.hovered = false;\n\t }\n\t },\n\n\t _cancelDomEvents: function() {\n\t if (this.domEvents && this.domEvents.cancel) {\n\t this.domEvents.cancel();\n\t }\n\t },\n\n\t _gesturestart: function(e) {\n\t if (this._mousewheelZoom && !this._stopChartHandlers(e)) {\n\t this._gestureDistance = e.distance;\n\t this._unsetActivePoint();\n\t this.surface.suspendTracking();\n\t }\n\t },\n\n\t _gestureend: function(e) {\n\t if (this._zooming && !this._stopChartHandlers(e)) {\n\t if (this.surface) {\n\t this.surface.resumeTracking();\n\t }\n\t this._zooming = false;\n\t this.trigger(ZOOM_END, {});\n\t }\n\t },\n\n\t _gesturechange: function(e) {\n\t var mousewheelZoom = this._mousewheelZoom;\n\n\t if (mousewheelZoom && !this._stopChartHandlers(e)) {\n\t e.preventDefault();\n\t var previousGestureDistance = this._gestureDistance;\n\t var scaleDelta = -e.distance / previousGestureDistance + 1;\n\n\t if (Math.abs(scaleDelta) >= 0.1) {\n\t scaleDelta = Math.round(scaleDelta * 10);\n\n\t this._gestureDistance = e.distance;\n\t var args = { delta: scaleDelta, axisRanges: axisRanges(this._plotArea.axes), originalEvent: e };\n\t if (this._zooming || !this.trigger(ZOOM_START, args)) {\n\t var coords = this._eventCoordinates(e);\n\n\t if (!this._zooming) {\n\t this._zooming = true;\n\t }\n\n\t var ranges = args.axisRanges = mousewheelZoom.updateRanges(scaleDelta, coords);\n\t if (ranges && !this.trigger(ZOOM, args)) {\n\t mousewheelZoom.zoom();\n\t }\n\t }\n\t }\n\t }\n\t },\n\n\t _mouseout: function(e) {\n\t if (e.element) {\n\t var element = this._drawingChartElement(e.element, e);\n\n\t if (element && element.leave) {\n\t element.leave(this, e.originalEvent);\n\t }\n\t }\n\t },\n\n\t _start: function(e) {\n\t var coords = this._eventCoordinates(e);\n\n\t if (this._stopChartHandlers(e) || !this._plotArea.backgroundContainsPoint(coords)) {\n\t return;\n\t }\n\n\t if (this.requiresHandlers([ DRAG_START, DRAG, DRAG_END ])) {\n\t this._startNavigation(e, coords, DRAG_START);\n\t }\n\n\t if (this._pannable && this._pannable.start(e)) {\n\t this.surface.suspendTracking();\n\t this._unsetActivePoint();\n\t this._suppressHover = true;\n\t this.chartService.panning = true;\n\t }\n\n\t if (this._zoomSelection) {\n\t if (this._zoomSelection.start(e)) {\n\t this.trigger(ZOOM_START, { axisRanges: axisRanges(this._plotArea.axes), originalEvent: e });\n\t }\n\t }\n\t },\n\n\t _move: function(e) {\n\t var ref = this;\n\t var state = ref._navState;\n\t var pannable = ref._pannable;\n\n\t if (this._stopChartHandlers(e)) {\n\t return;\n\t }\n\n\t if (pannable) {\n\t var ranges = pannable.move(e);\n\n\t if (ranges && !this.trigger(DRAG, { axisRanges: ranges, originalEvent: e })) {\n\t pannable.pan();\n\t }\n\t } else if (state) {\n\t var ranges$1 = {};\n\t var axes = state.axes;\n\n\t for (var i = 0; i < axes.length; i++) {\n\t var currentAxis = axes[i];\n\t var axisName = currentAxis.options.name;\n\t if (axisName) {\n\t var axis = currentAxis.options.vertical ? e.y : e.x;\n\t var delta = axis.startLocation - axis.location;\n\n\t if (delta !== 0) {\n\t ranges$1[currentAxis.options.name] = currentAxis.translateRange(delta);\n\t }\n\t }\n\t }\n\n\t state.axisRanges = ranges$1;\n\t this.trigger(DRAG, {\n\t axisRanges: ranges$1,\n\t originalEvent: e\n\t });\n\t }\n\n\t if (this._zoomSelection) {\n\t this._zoomSelection.move(e);\n\t }\n\t },\n\n\t _end: function(e) {\n\t if (this._stopChartHandlers(e)) {\n\t return;\n\t }\n\n\t var pannable = this._pannable;\n\t if (pannable && pannable.end(e)) {\n\t this.surface.resumeTracking();\n\t this.trigger(DRAG_END, {\n\t axisRanges: axisRanges(this._plotArea.axes),\n\t originalEvent: e\n\t });\n\t this._suppressHover = false;\n\t this.chartService.panning = false;\n\t } else {\n\t this._endNavigation(e, DRAG_END);\n\t }\n\n\t if (this._zoomSelection) {\n\t var ranges = this._zoomSelection.end(e);\n\t if (ranges && !this.trigger(ZOOM, { axisRanges: ranges, originalEvent: e })) {\n\t this._zoomSelection.zoom();\n\t this.trigger(ZOOM_END, { axisRanges: ranges, originalEvent: e });\n\t }\n\t }\n\t },\n\n\t _stopChartHandlers: function(e) {\n\t var selections = this._selections || [];\n\t if (!selections.length) {\n\t return false;\n\t }\n\n\t var coords = this._eventCoordinates(e);\n\t var pane = this._plotArea.paneByPoint(coords);\n\t if (pane) {\n\t for (var idx = 0; idx < selections.length; idx++) {\n\t if (selections[idx].onPane(pane)) {\n\t return true;\n\t }\n\t }\n\t }\n\t },\n\n\t _mousewheelZoomRate: function() {\n\t var zoomable = this.options.zoomable;\n\t var mousewheel = (zoomable || {}).mousewheel || {};\n\t return valueOrDefault(mousewheel.rate, MOUSEWHEEL_ZOOM_RATE);\n\t },\n\n\t _mousewheel: function(e) {\n\t var this$1 = this;\n\n\t var delta = dataviz.mousewheelDelta(e);\n\t var mousewheelZoom = this._mousewheelZoom;\n\t var coords = this._eventCoordinates(e);\n\n\t if (this._stopChartHandlers(e) || !this._plotArea.backgroundContainsPoint(coords)) {\n\t return;\n\t }\n\n\t if (mousewheelZoom) {\n\t var args = { delta: delta, axisRanges: axisRanges(this._plotArea.axes), originalEvent: e };\n\t if (this._zooming || !this.trigger(ZOOM_START, args)) {\n\t e.preventDefault();\n\n\t if (!this._zooming) {\n\t this._unsetActivePoint();\n\t this.surface.suspendTracking();\n\t this._zooming = true;\n\t }\n\n\t if (this._mwTimeout) {\n\t clearTimeout(this._mwTimeout);\n\t }\n\n\t args.axisRanges = mousewheelZoom.updateRanges(delta, coords);\n\t if (args.axisRanges && !this.trigger(ZOOM, args)) {\n\t mousewheelZoom.zoom();\n\t }\n\n\t this._mwTimeout = setTimeout(function () {\n\t this$1.trigger(ZOOM_END, args);\n\t this$1._zooming = false;\n\t if (this$1.surface) {\n\t this$1.surface.resumeTracking();\n\t }\n\t }, MOUSEWHEEL_DELAY);\n\t }\n\t } else {\n\t var state = this._navState;\n\t if (!state) {\n\t var prevented = this._startNavigation(e, coords, ZOOM_START);\n\t if (!prevented) {\n\t state = this._navState;\n\t }\n\t }\n\n\t if (state) {\n\t var totalDelta = state.totalDelta || delta;\n\t state.totalDelta = totalDelta + delta;\n\n\t var axes = this._navState.axes;\n\t var ranges = {};\n\n\t for (var i = 0; i < axes.length; i++) {\n\t var currentAxis = axes[i];\n\t var axisName = currentAxis.options.name;\n\t if (axisName) {\n\t ranges[axisName] = currentAxis.scaleRange(-totalDelta * this$1._mousewheelZoomRate(), coords);\n\t }\n\t }\n\n\t this.trigger(ZOOM, {\n\t delta: delta,\n\t axisRanges: ranges,\n\t originalEvent: e\n\t });\n\n\t if (this._mwTimeout) {\n\t clearTimeout(this._mwTimeout);\n\t }\n\n\t this._mwTimeout = setTimeout(function () {\n\t this$1._endNavigation(e, ZOOM_END);\n\t }, MOUSEWHEEL_DELAY);\n\t }\n\t }\n\t },\n\n\t _startNavigation: function(e, coords, chartEvent) {\n\t var plotArea = this._model._plotArea;\n\t var pane = plotArea.findPointPane(coords);\n\t var axes = plotArea.axes.slice(0);\n\n\t if (!pane) {\n\t return;\n\t }\n\n\t var ranges = axisRanges(axes);\n\n\t var prevented = this.trigger(chartEvent, {\n\t axisRanges: ranges,\n\t originalEvent: e\n\t });\n\n\t if (prevented) {\n\t this._cancelDomEvents();\n\t } else {\n\t this._suppressHover = true;\n\t this._unsetActivePoint();\n\t this._navState = {\n\t axisRanges: ranges,\n\t pane: pane,\n\t axes: axes\n\t };\n\t }\n\t },\n\n\t _endNavigation: function(e, chartEvent) {\n\t if (this._navState) {\n\t this.trigger(chartEvent, {\n\t axisRanges: this._navState.axisRanges,\n\t originalEvent: e\n\t });\n\t this._suppressHover = false;\n\t this._navState = null;\n\t }\n\t },\n\n\t _getChartElement: function(e, match) {\n\t var element = this.surface.eventTarget(e);\n\t if (element) {\n\t return this._drawingChartElement(element, e, match);\n\t }\n\t },\n\n\t _drawingChartElement: function(element, e, match) {\n\t var current = element;\n\t var chartElement;\n\t while (current && !chartElement) {\n\t chartElement = current.chartElement;\n\t current = current.parent;\n\t }\n\n\t if (chartElement) {\n\t if (chartElement.aliasFor) {\n\t chartElement = chartElement.aliasFor(e, this._eventCoordinates(e));\n\t }\n\n\t if (match) {\n\t chartElement = chartElement.closest(match);\n\t if (chartElement && chartElement.aliasFor) {\n\t chartElement = chartElement.aliasFor();\n\t }\n\t }\n\n\t return chartElement;\n\t }\n\t },\n\n\t _eventCoordinates: function(e) {\n\t var coordinates = dataviz.eventCoordinates(e);\n\t return this._toModelCoordinates(coordinates.x, coordinates.y);\n\t },\n\n\t _elementPadding: function() {\n\t if (!this._padding) {\n\t var ref = elementStyles(this.element, [ \"paddingLeft\", \"paddingTop\" ]);\n\t var paddingLeft = ref.paddingLeft;\n\t var paddingTop = ref.paddingTop;\n\t this._padding = {\n\t top: paddingTop,\n\t left: paddingLeft\n\t };\n\t }\n\n\t return this._padding;\n\t },\n\n\t _toDocumentCoordinates: function(point) {\n\t var padding = this._elementPadding();\n\t var offset = dataviz.elementOffset(this.element);\n\n\t return {\n\t left: round(point.x + padding.left + offset.left),\n\t top: round(point.y + padding.top + offset.top)\n\t };\n\t },\n\n\t _toModelCoordinates: function(clientX, clientY) {\n\t var element = this.element;\n\t var offset = dataviz.elementOffset(element);\n\t var padding = this._elementPadding();\n\t var inverseTransform = dataviz.elementScale(element).invert();\n\t var point = new GeometryPoint(\n\t clientX - offset.left - padding.left,\n\t clientY - offset.top - padding.top\n\t ).transform(inverseTransform);\n\n\t return new Point(point.x, point.y);\n\t },\n\n\t _tap: function(e) {\n\t var this$1 = this;\n\n\t var drawingElement = this.surface.eventTarget(e);\n\t var element = this._drawingChartElement(drawingElement, e);\n\t var sharedTooltip = this._sharedTooltip();\n\n\t if (!this._startHover(drawingElement, e) && !sharedTooltip) {\n\t this._unsetActivePoint();\n\t }\n\n\t if (sharedTooltip) {\n\t this._trackSharedTooltip(this._eventCoordinates(e), e, true);\n\t }\n\n\t this._propagateClick(element, e);\n\n\t //part of fix for hover issue on windows touch\n\t this.handlingTap = true;\n\t setTimeout(function () {\n\t this$1.handlingTap = false;\n\t }, 0);\n\t },\n\n\t _click: function(e) {\n\t var element = this._getChartElement(e);\n\t this._propagateClick(element, e);\n\t },\n\n\t _propagateClick: function(element, e) {\n\t var this$1 = this;\n\n\t var current = element;\n\t while (current) {\n\t if (current.click) {\n\t current.click(this$1, e);\n\t }\n\n\t current = current.parent;\n\t }\n\t },\n\n\t _startHover: function(element, e) {\n\t if (this._suppressHover) {\n\t return false;\n\t }\n\n\t var point = this._drawingChartElement(element, e, function(element) {\n\t return (element.hover || element.over) && !(element instanceof PlotAreaBase);\n\t });\n\n\t var activePoint = this._activePoint;\n\t var multipleSeries = this._plotArea.series.length > 1;\n\t var hasInactiveOpacity = this._hasInactiveOpacity();\n\n\t this._updateHoveredPoint(point, e);\n\n\t if (point && activePoint !== point && point.hover) {\n\t this._activePoint = point;\n\n\t if (!this._sharedTooltip() && !point.hover(this, e)) {\n\t this._displayTooltip(point);\n\n\t if (hasInactiveOpacity) {\n\t this._displayInactiveOpacity(point, multipleSeries);\n\t } else {\n\t this._highlight.show(point);\n\t }\n\t }\n\t } else if (!point && hasInactiveOpacity) {\n\t if (multipleSeries && this._activeChartInstance) {\n\t this._updateSeriesOpacity(point, true);\n\t this._applySeriesOpacity(this._activeChartInstance.children, null, true);\n\t this._activeChartInstance = null;\n\t }\n\t this._highlight && this._highlight.hide();\n\t this._activePoint = null;\n\t }\n\n\t return point;\n\t },\n\n\t _displayTooltip: function(point) {\n\t var tooltipOptions = deepExtend({}, this.options.tooltip, point.options.tooltip);\n\t if (tooltipOptions.visible) {\n\t this._tooltip.show(point);\n\t }\n\t },\n\n\t _displayInactiveOpacity: function(activePoint, multipleSeries, highlightPoints) {\n\t var chartInstance = this._activeChartInstance = this._chartInstanceFromPoint(activePoint);\n\t if (!chartInstance) {\n\t return;\n\t }\n\n\t if (multipleSeries) {\n\t this._updateSeriesOpacity(activePoint);\n\t this._applySeriesOpacity(chartInstance.children, null, true);\n\t this._applySeriesOpacity(chartInstance.children, activePoint.series);\n\t this._highlight.show(highlightPoints || activePoint);\n\t } else {\n\t var inactivePoints;\n\n\t if (!chartInstance.supportsPointInactiveOpacity()) {\n\t this._highlight.show(activePoint);\n\t return;\n\t }\n\n\t inactivePoints = this._getInactivePoints(activePoint, chartInstance);\n\n\t if (inactivePoints && inactivePoints.length) {\n\t this._highlight.show(inactivePoints, 1 - this._getInactiveOpacityForSeries(activePoint.series));\n\t }\n\t }\n\t },\n\n\t _getInactivePoints: function(activePoint, chartInstance) {\n\t var allPoints = this._getAllPointsOfType(chartInstance, activePoint.constructor);\n\n\t return allPoints.filter(function (point) { return point !== activePoint; });\n\t },\n\n\t _getAllPointsOfType: function(container, type) {\n\t var this$1 = this;\n\n\t var points = [];\n\n\t for (var i = 0; i < container.children.length; i++) {\n\t var element = container.children[i];\n\n\t if (element.constructor === type) {\n\t points.push(element);\n\t } else if (element.children && element.children.length) {\n\t points = points.concat(this$1._getAllPointsOfType(element, type));\n\t }\n\t }\n\n\t return points;\n\t },\n\n\t _updateHoveredPoint: function(point, e) {\n\t var hoveredPoint = this._hoveredPoint;\n\n\t if (hoveredPoint && hoveredPoint !== point) {\n\t hoveredPoint.out(this, e);\n\t this._hoveredPoint = null;\n\t }\n\n\t if (point && hoveredPoint !== point && point.over) {\n\t this._hoveredPoint = point;\n\t point.over(this, e);\n\t }\n\t },\n\n\t _updateSeriesOpacity: function(point, resetOpacity) {\n\t var this$1 = this;\n\n\t var plotArea = this._plotArea;\n\t var length = plotArea.series.length;\n\n\t for (var i = 0; i < length; i++) {\n\t var currSeries = plotArea.series[i];\n\t var defaultOpacity = this$1._getDefaultOpacityForSeries(currSeries);\n\t var inactiveOpacity = this$1._getInactiveOpacityForSeries(currSeries);\n\n\t if (!resetOpacity && currSeries !== point.series) {\n\t currSeries.defaultOpacity = defaultOpacity;\n\t currSeries.opacity = inactiveOpacity;\n\n\t if (currSeries.line) {\n\t currSeries.line.opacity = inactiveOpacity;\n\t }\n\t } else {\n\t currSeries.opacity = defaultOpacity;\n\n\t if (currSeries.line) {\n\t currSeries.line.opacity = defaultOpacity;\n\t }\n\t }\n\t }\n\t },\n\n\t _applySeriesOpacity: function(elements, activeSeries, reset, series) {\n\t var this$1 = this;\n\n\t for (var i = 0; i < elements.length; i++) {\n\t var element = elements[i];\n\t var currSeries = element.series || series;\n\n\t if (currSeries && element.visual) {\n\t var opacity = series ? series.opacity : element.series.opacity;\n\t if (currSeries !== activeSeries || reset) {\n\t element.visual.opacity(reset ? 1 : opacity);\n\t }\n\t }\n\n\t if (element.children && element.children.length) {\n\t this$1._applySeriesOpacity(element.children, activeSeries, reset, element.series);\n\t }\n\t }\n\t },\n\n\t _chartInstanceFromPoint: function(point) {\n\t var chartInstance = point.parent;\n\n\t while (chartInstance && !chartInstance.plotArea) {\n\t chartInstance = chartInstance.parent;\n\t }\n\n\t return chartInstance;\n\t },\n\n\t _hasInactiveOpacity: function() {\n\t var hasDefaultInactiveOpacity = this.options.seriesDefaults.highlight.inactiveOpacity !== undefined;\n\t var hasInactiveOpacity = this.options.series.filter(function (s) { return s.highlight.inactiveOpacity !== undefined; } ).length > 0;\n\t return hasDefaultInactiveOpacity || hasInactiveOpacity;\n\t },\n\n\t _getInactiveOpacityForSeries: function(series) {\n\t var defaultInactiveOpacity = this.options.seriesDefaults.highlight.inactiveOpacity;\n\t var seriesInactiveOpacity = series.highlight.inactiveOpacity;\n\t return seriesInactiveOpacity || defaultInactiveOpacity || series.opacity || datavizConstants.DEFAULT_SERIES_OPACITY;\n\t },\n\n\t _getDefaultOpacityForSeries: function(series) {\n\t return series.defaultOpacity || series.opacity || datavizConstants.DEFAULT_SERIES_OPACITY;\n\t },\n\n\t _mouseover: function(e) {\n\t var point = this._startHover(e.element, e.originalEvent);\n\n\t if (point && point.tooltipTracking && !this._mouseMoveTrackHandler && !this._sharedTooltip()) {\n\t this._mouseMoveTrackHandler = this._mouseMoveTracking.bind(this);\n\t var obj;\n\t bindEvents(document, ( obj = {}, obj[ MOUSEMOVE ] = this._mouseMoveTrackHandler, obj ));\n\t }\n\t },\n\n\t _mouseMoveTracking: function(e) {\n\t var ref = this;\n\t var options = ref.options;\n\t var tooltip = ref._tooltip;\n\t var highlight = ref._highlight;\n\t var point = ref._activePoint;\n\t var coords = this._eventCoordinates(e);\n\n\t if (this._plotArea.box.containsPoint(coords)) {\n\t if (point && point.tooltipTracking && point.series && point.parent.getNearestPoint) {\n\t var seriesPoint = point.parent.getNearestPoint(coords.x, coords.y, point.seriesIx);\n\t if (seriesPoint && seriesPoint !== point) {\n\t this._activePoint = seriesPoint;\n\n\t if (!seriesPoint.hover(this, e)) {\n\t var tooltipOptions = deepExtend({}, options.tooltip, seriesPoint.options.tooltip);\n\t if (tooltipOptions.visible) {\n\t tooltip.show(seriesPoint);\n\t }\n\n\t highlight.show(seriesPoint);\n\t }\n\t }\n\t }\n\t } else {\n\t var obj;\n\t unbindEvents(document, ( obj = {}, obj[ MOUSEMOVE ] = this._mouseMoveTrackHandler, obj ));\n\t this._unsetActivePoint();\n\t this._mouseMoveTrackHandler = null;\n\t }\n\t },\n\n\t _mousemove: function(e) {\n\t var coords = this._eventCoordinates(e);\n\t var plotArea = this._plotArea;\n\n\t this._trackCrosshairs(coords);\n\n\t if (plotArea.hover) {\n\t var overPlotArea = plotArea.backgroundContainsPoint(coords);\n\t if (overPlotArea) {\n\t plotArea.hovered = true;\n\t this._plotArea.hover(this, e);\n\t } else if (plotArea.hovered && !overPlotArea) {\n\t this.trigger(PLOT_AREA_LEAVE);\n\t plotArea.hovered = false;\n\t }\n\t }\n\n\t if (this._sharedTooltip()) {\n\t this._trackSharedTooltip(coords, e);\n\t }\n\t },\n\n\t _trackCrosshairs: function(coords) {\n\t var crosshairs = this._plotArea.crosshairs;\n\n\t for (var i = 0; i < crosshairs.length; i++) {\n\t var current = crosshairs[i];\n\n\t if (current.box.containsPoint(coords)) {\n\t current.showAt(coords);\n\t } else {\n\t current.hide();\n\t }\n\t }\n\t },\n\n\t _trackSharedTooltip: function(coords, e, toggle) {\n\t if (this._suppressHover) {\n\t return;\n\t }\n\n\t var ref = this;\n\t var tooltipOptions = ref.options.tooltip;\n\t var plotArea = ref._plotArea;\n\t var categoryAxis = ref._plotArea.categoryAxis;\n\t var tooltip = ref._tooltip;\n\t var highlight = ref._highlight;\n\n\t if (plotArea.backgroundContainsPoint(coords)) {\n\t var index = categoryAxis.pointCategoryIndex(coords);\n\t if (index !== this._tooltipCategoryIx || (!this._sharedHighlight && toggle)) {\n\t var points = plotArea.pointsByCategoryIndex(index);\n\t var pointArgs = points.map(function(point) {\n\t return point.eventArgs(e);\n\t });\n\t var hoverArgs = pointArgs[0] || {};\n\t hoverArgs.categoryPoints = pointArgs;\n\n\t if (points.length > 0 && !this.trigger(SERIES_HOVER, hoverArgs)) {\n\t if (tooltipOptions.visible) {\n\t tooltip.showAt(points, coords);\n\t }\n\n\t highlight.show(points);\n\n\t this._sharedHighlight = true;\n\t } else {\n\t tooltip.hide();\n\t }\n\n\t this._tooltipCategoryIx = index;\n\t } else if (toggle && this._sharedHighlight) {\n\t highlight.hide();\n\t tooltip.hide();\n\t this._sharedHighlight = false;\n\t }\n\t } else if (this._sharedHighlight) {\n\t highlight.hide();\n\t tooltip.hide();\n\t this._tooltipCategoryIx = null;\n\t this._sharedHighlight = false;\n\t }\n\t },\n\n\t hideElements: function(options) {\n\t var plotArea = this._plotArea;\n\t this._mousemove.cancel();\n\n\t plotArea.hideCrosshairs();\n\n\t this._unsetActivePoint(options);\n\t },\n\n\t _unsetActivePoint: function(options) {\n\t var ref = this;\n\t var tooltip = ref._tooltip;\n\t var highlight = ref._highlight;\n\n\t this._activePoint = null;\n\t this._hoveredPoint = null;\n\n\t if (tooltip && !(options && options.keepTooltipOpen)) {\n\t tooltip.hide();\n\t }\n\n\t this._tooltipCategoryIx = null;\n\t this._sharedHighlight = false;\n\n\t if (highlight) {\n\t highlight.hide();\n\t }\n\t },\n\n\t _deferRedraw: function() {\n\t this._redraw();\n\t },\n\n\t _clearRedrawTimeout: function() {\n\t if (this._redrawTimeout) {\n\t clearInterval(this._redrawTimeout);\n\t this._redrawTimeout = null;\n\t }\n\t },\n\n\t bindCategories: function() {\n\t var this$1 = this;\n\n\t var options = this.options;\n\t var definitions = [].concat(options.categoryAxis);\n\n\t for (var axisIx = 0; axisIx < definitions.length; axisIx++) {\n\t var axis = definitions[axisIx];\n\t if (axis.autoBind !== false) {\n\t this$1.bindCategoryAxisFromSeries(axis, axisIx);\n\t }\n\t }\n\t },\n\n\t bindCategoryAxisFromSeries: function(axis, axisIx) {\n\t var this$1 = this;\n\n\t var series = this.options.series;\n\t var seriesLength = series.length;\n\t var uniqueCategories = new dataviz.HashMap();//perf improvement in case type category with dates\n\t var items = [];\n\t var bindable = false;\n\t var dateAxis;\n\n\t for (var seriesIx = 0; seriesIx < seriesLength; seriesIx++) {\n\t var s = series[seriesIx];\n\t var onAxis = s.categoryAxis === axis.name || (!s.categoryAxis && axisIx === 0);\n\t var data = s.data;\n\t var dataLength = data.length;\n\t var bind = s.categoryField && onAxis;\n\t bindable = bind || bindable;\n\n\t if (bind && dataLength > 0) {\n\t dateAxis = isDateAxis(axis, getField(s.categoryField, data[0]));\n\n\t var getFn = dateAxis ? getDateField : getField;\n\n\t for (var dataIx = 0; dataIx < dataLength; dataIx++) {\n\t var dataRow = data[dataIx];\n\t var category = getFn(s.categoryField, dataRow, this$1.chartService.intl);\n\n\t if (dateAxis || !uniqueCategories.get(category)) {\n\t items.push([ category, dataRow ]);\n\n\t if (!dateAxis) {\n\t uniqueCategories.set(category, true);\n\t }\n\t }\n\t }\n\t }\n\t }\n\n\t if (items.length > 0) {\n\t if (dateAxis) {\n\t items = uniqueDates(items, function(a, b) {\n\t return dataviz.dateComparer(a[0], b[0]);\n\t });\n\t }\n\n\t var result = transpose(items);\n\t axis.categories = result[0];\n\t } else if (bindable) {\n\t axis.categories = [];\n\t }\n\t },\n\n\t _isBindable: function(series) {\n\t var valueFields = SeriesBinder.current.valueFields(series);\n\t var result = true;\n\n\t for (var i = 0; i < valueFields.length; i++) {\n\t var field = valueFields[i];\n\t if (field === VALUE) {\n\t field = \"field\";\n\t } else {\n\t field = field + \"Field\";\n\t }\n\n\t if (!defined(series[field])) {\n\t result = false;\n\t break;\n\t }\n\t }\n\n\t return result;\n\t },\n\n\t _noTransitionsRedraw: function() {\n\t var options = this.options;\n\t var transitionsState;\n\n\t if (options.transitions !== false) {\n\t options.transitions = false;\n\t transitionsState = true;\n\t }\n\n\t this._redraw();\n\n\t if (transitionsState) {\n\t options.transitions = true;\n\t }\n\t },\n\n\t _legendItemHover: function(seriesIndex, pointIndex) {\n\t var ref = this;\n\t var plotArea = ref._plotArea;\n\t var highlight = ref._highlight;\n\t var currentSeries = (plotArea.srcSeries || plotArea.series)[seriesIndex];\n\t var items;\n\n\t if (inArray(currentSeries.type, [ PIE, DONUT, FUNNEL ])) {\n\t items = plotArea.findPoint(function(point) {\n\t return point.series.index === seriesIndex && point.index === pointIndex;\n\t });\n\t } else {\n\t items = plotArea.pointsBySeriesIndex(seriesIndex);\n\t }\n\n\t if (this._hasInactiveOpacity() && currentSeries.visible && items) {\n\t var multipleSeries = plotArea.series.length > 1;\n\t var point = items.length ? items[0] : items;\n\n\t this._displayInactiveOpacity(point, multipleSeries, items);\n\t } else {\n\t highlight.show(items);\n\t }\n\t },\n\n\t _shouldAttachMouseMove: function() {\n\t return this._plotArea.crosshairs.length || (this._tooltip && this._sharedTooltip()) || this.requiresHandlers([ PLOT_AREA_HOVER, PLOT_AREA_LEAVE ]);\n\t },\n\n\t updateMouseMoveHandler: function() {\n\t var obj;\n\t unbindEvents(this.element, ( obj = {}, obj[ MOUSEMOVE ] = this._mousemove, obj ));\n\n\t if (this._shouldAttachMouseMove()) {\n\t var obj$1;\n\t bindEvents(this.element, ( obj$1 = {}, obj$1[ MOUSEMOVE ] = this._mousemove, obj$1 ));\n\t }\n\t },\n\n\t applyOptions: function(options, theme) {\n\t clearMissingValues(this._originalOptions, options);\n\t this._originalOptions = deepExtend(this._originalOptions, options);\n\t this.options = deepExtend({}, this._originalOptions);\n\n\t if (theme) {\n\t this._theme = theme;\n\t this.chartService.theme = theme;\n\t }\n\t this._initTheme(this.options, this._theme);\n\n\t this._toggleDragZoomEvents();\n\t },\n\n\t setOptions: function(options, theme) {\n\t this.applyOptions(options, theme);\n\t this.bindCategories();\n\t this.redraw();\n\t this.updateMouseMoveHandler();\n\t },\n\n\t setDirection: function(rtl) {\n\t this.chartService.rtl = Boolean(rtl);\n\t if (this.surface && this.surface.type === 'svg') {\n\t this._destroySurface();\n\t }\n\t },\n\n\t setIntlService: function(intl) {\n\t this.chartService.intl = intl;\n\t },\n\n\t noTransitionsRedraw: function() {\n\t this._noTransitionsRedraw();\n\t },\n\n\t destroy: function() {\n\t this._destroyed = true;\n\n\t var obj;\n\t unbindEvents(this.element, ( obj = {}, obj[ CONTEXTMENU ] = this._clickHandler, obj[ MOUSEWHEEL ] = this._mousewheelHandler, obj[ MOUSEMOVE ] = this._mousemove, obj[ MOUSELEAVE ] = this._mouseleaveHandler, obj ));\n\n\t if (this.domEvents) {\n\t this.domEvents.destroy();\n\t delete this.domEvents;\n\t }\n\n\t if (this._mouseMoveTrackHandler) {\n\t var obj$1;\n\t unbindEvents(document, ( obj$1 = {}, obj$1[ MOUSEMOVE ] = this._mouseMoveTrackHandler, obj$1 ));\n\t }\n\n\t this._destroyView();\n\n\t this._destroySurface();\n\n\t this._clearRedrawTimeout();\n\t },\n\n\t _destroySurface: function() {\n\t var surface = this.surface;\n\t if (surface) {\n\t surface.unbind(\"mouseenter\", this._surfaceMouseenterHandler);\n\t surface.unbind(\"mouseleave\", this._surfaceMouseleaveHandler);\n\t surface.destroy();\n\n\t this.surface = null;\n\t }\n\t },\n\n\t _destroySelections: function() {\n\t var selections = this._selections;\n\n\t if (selections) {\n\t while (selections.length > 0) {\n\t selections.shift().destroy();\n\t }\n\t }\n\t },\n\n\t _destroyView: function() {\n\t var model = this._model;\n\n\t if (model) {\n\t model.destroy();\n\t this._model = null;\n\t }\n\n\t this._unsetActivePoint();\n\n\t this._destroySelections();\n\n\t if (this._tooltip) {\n\t this._tooltip.destroy();\n\t }\n\n\t if (this._highlight) {\n\t this._highlight.destroy();\n\t }\n\n\t if (this._zoomSelection) {\n\t this._zoomSelection.destroy();\n\t delete this._zoomSelection;\n\t }\n\n\t if (this._pannable) {\n\t this._pannable.destroy();\n\t delete this._pannable;\n\t }\n\n\t if (this._mousewheelZoom) {\n\t this._mousewheelZoom.destroy();\n\t delete this._mousewheelZoom;\n\t }\n\t }\n\t});\n\n\tfunction resolveAxisAliases(options) {\n\t var aliases = AXIS_NAMES;\n\n\t for (var idx = 0; idx < aliases.length; idx++) {\n\t var alias = aliases[idx] + \"Axes\";\n\t if (options[alias]) {\n\t options[aliases[idx] + \"Axis\"] = options[alias];\n\t delete options[alias];\n\t }\n\t }\n\t}\n\n\tfunction pointByCategoryName(points, name) {\n\t if (points) {\n\t for (var idx = 0; idx < points.length; idx++) {\n\t if (points[idx].category === name) {\n\t return [ points[idx] ];\n\t }\n\t }\n\t }\n\t}\n\n\tfunction applyAxisDefaults(options, themeOptions) {\n\t var themeAxisDefaults = ((themeOptions || {}).axisDefaults) || {};\n\t var axisName, axisDefaults, axes;\n\n\t function mapAxisOptions(axisOptions) {\n\t var axisColor = (axisOptions || {}).color || axisDefaults.color;\n\t var result = deepExtend({},\n\t themeAxisDefaults,\n\t themeAxisDefaults[axisName],\n\t axisDefaults,\n\t axisDefaults[axisName], {\n\t line: { color: axisColor },\n\t labels: { color: axisColor },\n\t title: { color: axisColor }\n\t },\n\t axisOptions\n\t );\n\n\t delete result[axisName];\n\n\t return result;\n\t }\n\n\t for (var idx = 0; idx < AXIS_NAMES.length; idx++) {\n\t axisName = AXIS_NAMES[idx] + \"Axis\";\n\t axisDefaults = options.axisDefaults || {};\n\t axes = [].concat(options[axisName]);\n\n\t axes = axes.map(mapAxisOptions);\n\n\t options[axisName] = axes.length > 1 ? axes : axes[0];\n\t }\n\t}\n\n\tfunction applySeriesDefaults(options, themeOptions) {\n\t var series = options.series;\n\t var seriesLength = series.length;\n\t var seriesDefaults = options.seriesDefaults;\n\t var commonDefaults = deepExtend({}, options.seriesDefaults);\n\t var themeSeriesDefaults = themeOptions ? deepExtend({}, themeOptions.seriesDefaults) : {};\n\t var commonThemeDefaults = deepExtend({}, themeSeriesDefaults);\n\n\t cleanupNestedSeriesDefaults(commonDefaults);\n\t cleanupNestedSeriesDefaults(commonThemeDefaults);\n\n\t for (var i = 0; i < seriesLength; i++) {\n\t var seriesType = series[i].type || options.seriesDefaults.type;\n\n\t var baseOptions = deepExtend(\n\t { data: [] },\n\t commonThemeDefaults,\n\t themeSeriesDefaults[seriesType],\n\t { tooltip: options.tooltip },\n\t commonDefaults,\n\t seriesDefaults[seriesType]\n\t );\n\n\t series[i]._defaults = baseOptions;\n\t series[i] = deepExtend({}, baseOptions, series[i]);\n\t series[i].data = series[i].data || [];\n\t }\n\t}\n\n\tfunction cleanupNestedSeriesDefaults(seriesDefaults) {\n\t delete seriesDefaults.bar;\n\t delete seriesDefaults.column;\n\t delete seriesDefaults.rangeColumn;\n\t delete seriesDefaults.line;\n\t delete seriesDefaults.verticalLine;\n\t delete seriesDefaults.pie;\n\t delete seriesDefaults.donut;\n\t delete seriesDefaults.area;\n\t delete seriesDefaults.verticalArea;\n\t delete seriesDefaults.scatter;\n\t delete seriesDefaults.scatterLine;\n\t delete seriesDefaults.bubble;\n\t delete seriesDefaults.candlestick;\n\t delete seriesDefaults.ohlc;\n\t delete seriesDefaults.boxPlot;\n\t delete seriesDefaults.bullet;\n\t delete seriesDefaults.verticalBullet;\n\t delete seriesDefaults.polarArea;\n\t delete seriesDefaults.polarLine;\n\t delete seriesDefaults.radarArea;\n\t delete seriesDefaults.radarLine;\n\t delete seriesDefaults.waterfall;\n\t}\n\n\tfunction axisRanges(axes) {\n\t var ranges = {};\n\n\t for (var i = 0; i < axes.length; i++) {\n\t var axis = axes[i];\n\t var axisName = axis.options.name;\n\t if (axisName) {\n\t ranges[axisName] = axis.range();\n\t }\n\t }\n\n\t return ranges;\n\t}\n\n\tfunction sortDates(dates, comparer) {\n\t if (comparer === void 0) { comparer = dataviz.dateComparer; }\n\n\t for (var i = 1, length = dates.length; i < length; i++) {\n\t if (comparer(dates[i], dates[i - 1]) < 0) {\n\t dates.sort(comparer);\n\t break;\n\t }\n\t }\n\n\t return dates;\n\t}\n\n\tfunction uniqueDates(srcDates, comparer) {\n\t if (comparer === void 0) { comparer = dataviz.dateComparer; }\n\n\t var dates = sortDates(srcDates, comparer);\n\t var length = dates.length;\n\t var result = length > 0 ? [ dates[0] ] : [];\n\n\t for (var i = 1; i < length; i++) {\n\t if (comparer(dates[i], last(result)) !== 0) {\n\t result.push(dates[i]);\n\t }\n\t }\n\n\t return result;\n\t}\n\n\tfunction transpose(rows) {\n\t var rowCount = rows.length;\n\t var result = [];\n\n\t for (var rowIx = 0; rowIx < rowCount; rowIx++) {\n\t var row = rows[rowIx];\n\t var colCount = row.length;\n\n\t for (var colIx = 0; colIx < colCount; colIx++) {\n\t result[colIx] = result[colIx] || [];\n\t result[colIx].push(row[colIx]);\n\t }\n\t }\n\n\t return result;\n\t}\n\n\tvar DATA_FIELDS = [ 'data', 'categories' ];\n\n\tfunction clearMissingValues(originalOptions, options) {\n\t for (var field in options) {\n\t if (!inArray(field, DATA_FIELDS) && options.hasOwnProperty(field)) {\n\t var fieldValue = options[field];\n\t var originalValue = originalOptions[field];\n\t if (defined(originalValue)) {\n\t var nullValue = fieldValue === null;\n\t if ((nullValue || !defined(fieldValue))) {\n\t delete originalOptions[field];\n\t if (nullValue) {\n\t delete options[field];\n\t }\n\t } else if (originalValue && isObject(fieldValue)) {\n\t if (isObject(originalValue)) {\n\t clearMissingValues(originalValue, fieldValue);\n\t }\n\t }\n\t }\n\t }\n\t }\n\t}\n\n\tfunction triggerPaneRender(panes) {\n\t for (var idx = 0; idx < panes.length; idx++) {\n\t panes[idx].notifyRender();\n\t }\n\t}\n\n\tsetDefaultOptions(Chart, {\n\t renderAs: \"\",\n\t chartArea: {},\n\t legend: {\n\t visible: true,\n\t labels: {}\n\t },\n\t categoryAxis: {},\n\t seriesDefaults: {\n\t type: COLUMN,\n\t data: [],\n\t highlight: {\n\t visible: true\n\t },\n\t labels: {},\n\t negativeValues: {\n\t visible: false\n\t }\n\t },\n\t series: [],\n\t seriesColors: null,\n\t tooltip: {\n\t visible: false\n\t },\n\t transitions: true,\n\t valueAxis: {},\n\t plotArea: {},\n\t title: {},\n\t xAxis: {},\n\t yAxis: {},\n\t panes: [ {} ],\n\t pannable: false,\n\t zoomable: false\n\t});\n\n\tkendo.deepExtend(kendo.dataviz, {\n\t constants: constants,\n\t Aggregates: Aggregates,\n\t AreaChart: AreaChart,\n\t AreaSegment: AreaSegment,\n\t AxisGroupRangeTracker: AxisGroupRangeTracker,\n\t Bar: Bar,\n\t BarChart: BarChart,\n\t BarLabel: BarLabel,\n\t BoxPlotChart: BoxPlotChart,\n\t BoxPlot: BoxPlot,\n\t BubbleChart: BubbleChart,\n\t Bullet: Bullet,\n\t BulletChart: BulletChart,\n\t CandlestickChart: CandlestickChart,\n\t Candlestick: Candlestick,\n\t CategoricalChart: CategoricalChart,\n\t CategoricalErrorBar: CategoricalErrorBar,\n\t CategoricalPlotArea: CategoricalPlotArea,\n\t Chart: Chart,\n\t ChartContainer: ChartContainer,\n\t ClipAnimation: ClipAnimation,\n\t ClusterLayout: ClusterLayout,\n\t Crosshair: Crosshair,\n\t CrosshairTooltip: CrosshairTooltip,\n\t DefaultAggregates: DefaultAggregates,\n\t DonutChart: DonutChart,\n\t DonutPlotArea: DonutPlotArea,\n\t DonutSegment: DonutSegment,\n\t ErrorBarBase: ErrorBarBase,\n\t ErrorRangeCalculator: ErrorRangeCalculator,\n\t Highlight: Highlight,\n\t SharedTooltip: SharedTooltip,\n\t Legend: Legend,\n\t LegendItem: LegendItem,\n\t LegendLayout: LegendLayout,\n\t LineChart: LineChart,\n\t LinePoint: LinePoint,\n\t LineSegment: LineSegment,\n\t Pane: Pane,\n\t PieAnimation: PieAnimation,\n\t PieChart: PieChart,\n\t PieChartMixin: PieChartMixin,\n\t PiePlotArea: PiePlotArea,\n\t PieSegment: PieSegment,\n\t PlotAreaBase: PlotAreaBase,\n\t PlotAreaEventsMixin: PlotAreaEventsMixin,\n\t PlotAreaFactory: PlotAreaFactory,\n\t PointEventsMixin: PointEventsMixin,\n\t RangeBar: RangeBar,\n\t RangeBarChart: RangeBarChart,\n\t RangeAreaPoint: RangeAreaPoint,\n\t RangeAreaChart: RangeAreaChart,\n\t ScatterChart: ScatterChart,\n\t ScatterErrorBar: ScatterErrorBar,\n\t ScatterLineChart: ScatterLineChart,\n\t Selection: Selection,\n\t SeriesAggregator: SeriesAggregator,\n\t SeriesBinder: SeriesBinder,\n\t SplineSegment: SplineSegment,\n\t SplineAreaSegment: SplineAreaSegment,\n\t StackWrap: StackWrap,\n\t Tooltip: Tooltip,\n\t OHLCChart: OHLCChart,\n\t OHLCPoint: OHLCPoint,\n\t WaterfallChart: WaterfallChart,\n\t WaterfallSegment: WaterfallSegment,\n\t XYPlotArea: XYPlotArea,\n\t MousewheelZoom: MousewheelZoom,\n\t ZoomSelection: ZoomSelection,\n\t Pannable: Pannable,\n\t ChartAxis: ChartAxis,\n\t ChartPane: ChartPane,\n\t ChartPlotArea: ChartPlotArea,\n\t findAxisByName: findAxisByName,\n\t anyHasZIndex: anyHasZIndex,\n\t appendIfNotNull: appendIfNotNull,\n\t areNumbers: areNumbers,\n\t bindSegments: bindSegments,\n\t categoriesCount: categoriesCount,\n\t countNumbers: countNumbers,\n\t equalsIgnoreCase: equalsIgnoreCase,\n\t evalOptions: evalOptions,\n\t filterSeriesByType: filterSeriesByType,\n\t getDateField: getDateField,\n\t getField: getField,\n\t hasGradientOverlay: hasGradientOverlay,\n\t hasValue: hasValue,\n\t isDateAxis: isDateAxis,\n\t segmentVisible: segmentVisible,\n\t singleItemOrArray: singleItemOrArray,\n\t createOutOfRangePoints: createOutOfRangePoints\n\t});\n\n\t})(window.kendo.jQuery);\n\n\t}, __webpack_require__(3));\n\n/***/ }),\n\n/***/ 895:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.core\");\n\n/***/ }),\n\n/***/ 896:\n/***/ (function(module, exports) {\n\n\tmodule.exports = require(\"../../kendo.color\");\n\n/***/ })\n\n/******/ });"],"sourceRoot":""}