{"version":3,"sources":["webpack:///../../../../../src/.internal/charts/axes/DateAxisBreak.ts","webpack:///../../../../../src/.internal/charts/axes/DateAxis.ts","webpack:///../../../../../src/.internal/charts/axes/CategoryAxisBreak.ts","webpack:///../../../../../src/.internal/charts/axes/CategoryAxis.ts","webpack:///../../../../../src/.internal/charts/series/XYSeries.ts","webpack:///../../../../../src/.internal/charts/cursors/Cursor.ts","webpack:///../../../../../src/.internal/charts/cursors/XYCursor.ts","webpack:///../../../../../src/.internal/charts/elements/XYChartScrollbar.ts","webpack:///../../../../../src/.internal/charts/types/XYChart.ts","webpack:///../../../../../src/.internal/charts/series/LineSeriesSegment.ts","webpack:///../../../../../src/.internal/charts/series/LineSeries.ts","webpack:///../../../../../src/.internal/charts/series/RadarSeries.ts","webpack:///../../../../../src/.internal/charts/cursors/RadarCursor.ts","webpack:///../../../../../src/.internal/charts/axes/AxisFillCircular.ts","webpack:///../../../../../src/.internal/charts/axes/GridCircular.ts","webpack:///../../../../../src/.internal/charts/axes/AxisRendererCircular.ts","webpack:///../../../../../src/.internal/charts/axes/AxisRendererRadial.ts","webpack:///../../../../../src/.internal/charts/types/RadarChart.ts","webpack:///../../../../../src/.internal/charts/elements/ClockHand.ts","webpack:///../../../../../src/.internal/charts/types/GaugeChart.ts","webpack:///../../../../../src/.internal/charts/series/PieSeries3D.ts","webpack:///../../../../../src/.internal/charts/types/PieChart3D.ts","webpack:///../../../../../src/.internal/charts/types/SlicedChart.ts","webpack:///../../../../../src/.internal/charts/elements/ChordNode.ts","webpack:///../../../../../src/.internal/core/elements/QuadraticCurve.ts","webpack:///../../../../../src/.internal/charts/elements/ChordLink.ts","webpack:///../../../../../src/.internal/charts/types/ChordDiagram.ts","webpack:///../../../../../src/.internal/charts/series/ColumnSeries.ts","webpack:///../../../../../src/.internal/charts/series/TreeMapSeries.ts","webpack:///../../../../../src/.internal/charts/types/TreeMap.ts","webpack:///../../../../../src/.internal/charts/axes/AxisRendererX3D.ts","webpack:///../../../../../src/.internal/charts/axes/AxisRendererY3D.ts","webpack:///../../../../../src/.internal/charts/series/ColumnSeries3D.ts","webpack:///../../../../../src/.internal/charts/types/XYChart3D.ts","webpack:///../../../../../src/.internal/charts/elements/Candlestick.ts","webpack:///../../../../../src/.internal/charts/series/CandlestickSeries.ts","webpack:///../../../../../src/.internal/charts/elements/OHLC.ts","webpack:///../../../../../src/.internal/charts/series/OHLCSeries.ts","webpack:///../../../../../src/.internal/charts/series/StepLineSeriesSegment.ts","webpack:///../../../../../src/.internal/charts/series/StepLineSeries.ts","webpack:///../../../../../src/.internal/charts/elements/RadarColumn.ts","webpack:///../../../../../src/.internal/charts/series/RadarColumnSeries.ts","webpack:///../../../../../src/.internal/charts/series/PyramidSeries.ts","webpack:///../../../../../src/.internal/charts/series/PictorialStackedSeries.ts","webpack:///../../../../../src/.internal/charts/elements/ConeColumn.ts","webpack:///../../../../../src/.internal/charts/series/ConeSeries.ts","webpack:///../../../../../src/.internal/charts/elements/CurvedColumn.ts","webpack:///../../../../../src/.internal/charts/series/CurvedColumnSeries.ts","webpack:///../../../../../src/.internal/charts/axes/DurationAxis.ts","webpack:///../../../../../src/.internal/charts/elements/CircleBullet.ts","webpack:///../../../../../src/.internal/charts/elements/ErrorBullet.ts","webpack:///../../../../../src/.internal/charts/elements/NavigationBar.ts","webpack:///./charts.js"],"names":["DateAxisBreak_DateAxisBreak","_super","DateAxisBreak","_this","call","this","className","applyTheme","tslib_es6","Object","defineProperty","prototype","getPropertyValue","value","setPropertyValue","startValue","getTime","axis","invalidate","invalidateSeries","endValue","ValueAxisBreak","Registry","registeredClasses","DateAxis_DateAxisDataItem","DateAxisDataItem","values","date","endDate","dates","setDate","ValueAxis","DateAxis_DateAxis","DateAxis","gridIntervals","List","dateFormats","Dictionary","periodChangeDateFormats","_baseIntervalReal","timeUnit","count","_minDifference","snapTooltip","pushAll","axisFieldName","fillRule","dataItem","component","gridInterval","_gridInterval","gridDuration","Time","Math","round","min","axisFill","__disabled","applyInternalDefaults","hasKey","setKey","language","translate","createDataItem","createAxisBreak","validateDataItems","start","end","periodCount","max","baseDuration","maxZoomFactor","zoom","handleSelectionExtremesChange","calculateZoom","chooseInterval","adjustDifference","_minZoomed","_maxZoomed","_gridCount","baseInterval","_gridDate","Date","getFirstWeekDay","_nextGridUnit","_intervalDuration","ceil","_difference","floor","Iterator","series","iterator","baseAxis","field_1","getAxisField","startIndex","dataItems","findClosestIndex","x","maxZoomed","endIndex","validateData","Type","minDifference","Number","MAX_VALUE","each","uid","seriesDataChangeUpdate","postProcessSeriesDataItems","JSON","stringify","_baseInterval","postProcessSeriesDataItem","addEmptyUnitsBreaks","dataItemsByAxis","getKey","utils_Object","key","time","getDate","startTime","setCalculatedValue","toString","skipEmptyPeriods","axisBreaks","clear","axisBreak","startTimeStr","this_1","undefined","create","startDate","fixAxisBreaks","length","breakGridCount","endPosition","startPosition","adjustedEndValue","adjustedStartValue","gridDate","dateFormatter","firstDayOfWeek","getGridDate","intervalCount","realIntervalCount","prevTimestamp","newDate","timestamp","isInBreak","durationBreaksRemoved","getBreaklessDate","validateAxisElements","prevGridDate","dataItemsIterator_1","_dataItemsIterator","resetIterators","this_2","format","markUnitChange","text","find","appendDataItem","validateDataElement","renderer_1","renderer","breakSize","timeUnit_1","intervalCount_1","utils_Math","startPoint","endPoint","minGridDistance","prevGridDate_1","timestamp_1","text_1","moveValue","adjustedMax","endTimestamp","position","valueToPosition","fillEndPosition","isRange","tick","disabled","updateTickElement","grid","updateGridElement","fill","updateFillElement","mask","label","location_1","location","updateLabelElement","adjustMinMax","step","fixMin","startLocation","fixMax","endLocation","index","duration","gridCount","getIndex","intervalDuration","lastIndex","formatLabel","dateToPosition","anyToPosition","dateToPoint","point","positionToPoint","angle","positionToAngle","y","anyToPoint","valueToPoint","positionToDate","positionToValue","getX","getTimeByLocation","baseValue","getY","stack","getValue","getAngle","stackKey","workingLocations","endTime","processSeriesDataItem","axisLetter","openTime","openDate","prevSeriesTime","_prevSeriesTime","difference","abs","differece","updateAxisBySeries","timeInterval","invalidateData","breakTemplate","template","startLine","endLine","fillShape","getTooltipText","tooltipDateFormat","dateFormat","getPositionLabel","adapter","apply","roundPosition","getCellStartPosition","getCellEndPosition","getSeriesDataItem","findNearest","key_1","getCurrentLabelFormat","initRenderer","ticks","labels","baseGrid","zoomToDates","skipRangeEvent","instantly","parse","zoomToValues","asIs","field","copyFrom","source","showTooltipAtPosition","local","toAxisPosition","closestDate_1","actualTime_1","xAxis","dateX","yAxis","dateY","closestTime_1","seriesPoints_1","showTooltipAtDataItem","push","hideTooltip","chart","sortSeriesTooltips","CategoryAxisBreak_CategoryAxisBreak","CategoryAxisBreak","indexToPosition","invalidateDataItems","category","categoryToIndex","AxisBreak","CategoryAxis_CategoryAxisDataItem","CategoryAxisDataItem","Adapter","locations","endCategory","isEnabled","properties","setProperty","Axis","CategoryAxis_CategoryAxis","CategoryAxis","dataItemsByCategory","_lastDataItem","_disposers","validateDataRange","_series","invalidateDataRange","firstSeriesDataItem","lastSeriesDataItem","positionToIndex","i","fdi","getFirstSeriesDataItem","ldi","getLastSeriesDataItem","validate","dataCount","invalid","maxCount","axisLength","frequency","_startIndex","_endIndex","_frequency","itemIndex","len","frequency_1","itemIndex_1","b","validateBreaks","validateAxisRanges","ghostLabel","invalidateLayout","fillEndIndex","fillPosition","measuredWidth","measuredHeight","currentText","processDataItem","dataContext","existingDataItem","remove","breakStartIndex","breakEndIndex","categoryToPosition","categoryToPoint","zoomToCategories","startCategory","zoomToIndexes","getAnyRangePath","startPos","endPos","getPositionRangePath","categoryX","categoryY","index_1","sdi_1","category_1","seriesDataItem","categories","basePoint","breakStartPosition","breakEndPosition","breakPosition","XYSeries_XYSeriesDataItem","XYSeriesDataItem","valueX","valueY","openValueX","openValueY","openDateX","openDateY","setLocation","setValue","setCategory","openCategoryX","openCategoryY","getMin","fields","working","stackValue","utils_Array","getWorkingValue","getMax","Series","XYSeries_XYSeries","XYSeries","_xAxis","Disposer","_yAxis","_xValueFields","_yValueFields","isMeasured","cursorTooltipEnabled","mainContainer","Sprite","setElement","paper","add","stacked","tooltip","pointerOrientation","events","on","returnBulletDefaultState","readerTitle","dataChangeUpdate","_tmin","_tmax","_smin","_smax","defineFields","data","updateItemReaderText","dataFields","_xField","_yField","Error","name","disable","enable","setInitialWorkingValues","e","_chart","raiseCriticalError","disposeData","dataItemsX","dataItemsY","xAxisFieldName","xField","xOpenField","Utils","yAxisFieldName","yField","yOpenField","_xOpenField","_yOpenField","addValueField","indexOf","setCategoryAxisField","setDateAxisField","afterDraw","createMask","path_1","getMaskPath","axisRanges","range","fillPath","path","Path","width","height","dataRangeInvalid","pixelY","pixelX","_showBullets","minBulletDistance","get","xAxes","oldAxis","removeKey","dispose","removeValue","set","registerSeries","yAxes","_baseAxis","processValues","minX","Infinity","maxX","minY","maxY","getStackValue","stackX","stackY","processSeriesDataItems","xAxisId","yAxisId","stackedSeries","dispatchImmediately","appeared","_prevTooltipDataItem","xPosition","yPosition","visible","isHiding","isShowing","tooltipText","updateLegendValue","tooltipDataItem","tooltipXField","tooltipYField","tooltipPoint","getPoint","tooltipX","tooltipY","type","target","_a","bullets","_b","next","done","isHover","showTooltip","bullet","isDisposed","positionBullet","hasValue","bulletLocationX","getBulletLocationX","bulletLocationY","getBulletLocationY","locationX","locationY","moveTo","bulletLocation","show","anim","delay","interpolationDuration","defaultState","transitionDuration","a","sequencedInterpolation","sequencedInterpolationDelay","animation","isFinished","hide","minZoomed","hiddenState","validateDataElements","handleDataItemWorkingValueChange","axisSeries","invalidateProcessedData","backwards","prevSeries","prevDataItem","prevValue","_tooltipXField","_tooltipYField","selectionMin","selectionMax","processConfig","config","map","processingErrors","xKey","yKey","stackKeyX","stackKeyY","val","itemReaderText","Cursor_Cursor","Cursor","_stick","Percent","shouldClone","trackable","clickable","interaction","Interaction","body","handleCursorDown","handleCursorUp","handleCursorMove","event","interactionsEnabled","_generalBehavior","downPoint","isLocalElement","pointer","svg","_stickPoint","fitsToBounds","triggerMove","isHidden","hideReal","stick","triggerMoveReal","invalidatePosition","getPositions","dispatch","triggerDown","triggerDownReal","setGlobalStyle","Mouse","grabbing","triggerUp","triggerUpReal","updatePoint","upPoint","_upPointOrig","_downPointOrig","getHitOption","interactions","default","updateSelection","innerWidth","innerHeight","cancelable","preventDefault","plotContainer","lockElement","Container","XYCursor_XYCursor","XYCursor","_lineX","_lineY","behavior","maxPanOut","interfaceColors","InterfaceColorSet","selection","createChild","fillOpacity","getFor","lineX","stroke","Color","strokeDasharray","strokeOpacity","lineY","updateSize","_usesSelection","w","_positionPrecision","h","pixelHeight","pixelWidth","validatePosition","fixPoint","snapToSeries","updateLinePositions","getPanningRanges","selectionX","selectionY","getRanges","startX","startY","deltaX","deltaY","xRange","yRange","endX","endY","handleXTooltipPosition","handleYTooltipPosition","fullWidthLineX","currentItemStartPoint","currentItemEndPoint","fullWidthLineY","parent","reset","_selection","element","_snapToDisposer","handleSnap","opposite","xx","yy","animationDuration","easing","animationEasing","animate","property","to","XYChartScrollbar_XYChartScrollbar","XYChartScrollbar","padding","scrollbarChart","XYChart_XYChart","margin","_scrollbarChart","minHeight","minWidth","unselectedOverlay","toBack","_unselectedOverlay","background","cornerRadius","thumbBackground","thumb","hoverState","states","downState","handleSeriesAdded","handleSeriesRemoved","sourceSeries","newValue","zoomOutButton","addXAxis","addYAxis","clone","title","rangeChangeDuration","id","inside","line","minLabelPosition","maxLabelPosition","axisFills","showOnInit","zoomOutAxes","filters","DesaturateFilter","updateByOrientation","orientation","clonedFrom","oldValue","off","handleDataChanged","dataProvider","updateThumb","Scrollbar","XYChart_XYChartDataItem","XYChartDataItem","SerialChart","XYChart","_axisRendererX","AxisRendererX","_axisRendererY","AxisRendererY","maskBullets","arrangeTooltips","chartContainer","layout","topAxesCont","zIndex","topAxesContainer","yAxesAndPlotCont","yAxesAndPlotContainer","bottomAxesCont","bottomAxesContainer","leftAxesCont","contentAlign","updateXAxesMargins","leftAxesContainer","plotCont","mouseWheelBehavior","_cursorContainer","rightAxesCont","rightAxesContainer","seriesContainer","bulletsContainer","ZoomOutButton","align","valign","MAX_SAFE_INTEGER","marginTop","marginRight","_bulletMask","exportable","draw","toFront","updateSeriesLegend","updatePlotElements","_parseDataFrom","leftAxesWidth","rightAxesWidth","paddingLeft","paddingRight","handleXAxisChange","updateXAxis","handleYAxisChange","updateYAxis","processXAxis","observe","handleXAxisRangeChange","processAxis","processYAxis","handleYAxisRangeChange","getCommonAxisRange","scrollbarX","zoomAxes","toggleZoomOutButton","updateScrollbar","show_1","seriesAppeared","scrollbarY","scrollbar","skipRangeEvents","axes","axisStart","axisEnd","inversed","processRenderer","_dataUsers","gridContainer","breakContainer","addDisposer","dataUsers","inited","_xAxes","handleAxisRemoval","autoDispose","_yAxes","removeFromInvalidComponents","dataInvalid","colors","_cursor","cursor","removeDispose","handleCursorPositionChange","handleCursorZoomStart","handleCursorZoomEnd","handleCursorPanStart","handleCursorPanning","handleCursorPanEnd","handleCursorCanceled","handleHideCursor","createCursor","showSeriesTooltip","exceptAxis","showAxisTooltip","hideObjectTooltip","sprites","sprite","seriesPoints","setBounds","topLeft","bottomRight","sum","filteredSeriesPoints","seriesPoint","sort","averageY","svgContainer","SVGContainer","top_1","bottom","dropped","nextHeight","pointY","pixelMarginTop","nextY","pixelMarginBottom","except","getUpdatedRange","priority","_panStartXRange","_panStartYRange","_panEndXRange","delta","panEndRange","_panEndYRange","panStartRange","axisRange","newStart","newEnd","newRange","_scrollbarX","startGrip","endGrip","handleXScrollbarChange","arg","_scrollbarY","handleYScrollbarChange","fixRange","declination","realRange","diff","handleWheel","svgPoint","htmlContainer","cssScale","plotPoint","shift","rangeX","rangeY","differenceX","newStartX","newEndX","differenceY","newStartY","newEndY","maxWidth","maxHeight","_mouseWheelDisposer","wheelable","hoverable","dataSourceDateFields","populateDataSourceFields","dataSourceNumberFields","configOrder","createSeries","_zoomOutButton","button","addData","rawDataItem","removeCount","Responsive","relevant","maybeXS","state","stateId","LineSeriesSegment_LineSeriesSegment","LineSeriesSegment","fillSprite","strokeSprite","drawSegment","points","closePoints","smoothnessX","smoothnessY","Smoothing","smooth","lineElement","fillElement","LineSeries_LineSeriesDataItem","LineSeriesDataItem","LineSeries_LineSeries","LineSeries","minDistance","segments","createSegment","applyOnClones","_segmentsIterator","createNewItems","connect","tensionX","tensionY","segmentsContainer","previousDataItem","initialY","workingValue","setWorkingValue","setWorkingLocation","initialX","segment","tooltipColorSource","openSegmentWrapper","_adjustedStartIndex","sliceData","findAdjustedIndex","_workingStartIndex","_workingEndIndex","adjustedIndex","propertyFields","openIndex","params","openSegment","closeIndex","propertiesChanged","getFirst","contents","hasProperties","updateSegmentProperties","addPoints","closeSegment","itemProperties","checkOnly","changed","propertyName","currentValue","currentValueStr","valueStr","createLegendMarker","marker","disposeChildren","Line","x2","Rectangle","legendDataItem","color","colorOrig","copyToLegendMarker","hasLabels_1","children","child","Label","RadarSeries_RadarSeriesDataItem","RadarSeriesDataItem","RadarSeries_RadarSeries","RadarSeries","connectEnds","radius","startAngle","endAngle","pixelRadius","pixelInnerRadius","unshift","RadarCursor_RadarCursor","RadarCursor","innerRadius","truePixelRadius","updateLineX","updateLineY","fillStartAngle","arc","downAngle","downRadius","currentRadius","_prevAngle","downSin","downCos","sin","cos","upAngle","upRadius","setPercentProperty","innerRadiusModifyer","AxisFillCircular_AxisFillCircular","AxisFillCircular","AxisFill","GridCircular_GridCircular","GridCircular","pixelPerfect","Grid","AxisRendererCircular_AxisRendererCircular","AxisRendererCircular","pixelRadiusReal","useChartAngles","tooltipLocation","setAxis","atan2","PI","coordinate","positionToCoordinate","updateAxisLine","gridInnerRadius","toggleVisibility","tickLength","fixPosition","invalidateAxisItems","createGrid","createFill","createLabel","AxisLabelCircular","pointToPosition","coordinateToPosition","AxisRenderer","AxisRendererRadial_AxisRendererRadial","AxisRendererRadial","gridType","axisAngle","horizontalCenter","verticalCenter","rotation","gridLocation","count_1","cellEndLocation","positionItem","updateBaseGridElement","count_2","updateBreakElement","createBreakSprites","WavedCircle","updateTooltip","tooltipOrientation","bigNum","axisFullLength","RadarChart_RadarChartDataItem","RadarChartDataItem","RadarChart_RadarChart","RadarChart","radarContainer","Circle","opacity","beforeDraw","rect","innerRect","wr","hr","mr","maxRadius","diameter","_pixelInnerRadius","definedBBox","ClockHand_ClockHand","ClockHand","_axis","pin","startWidth","endWidth","hand","Trapezoid","leftSide","rightSide","x0","x1","_pin","_hand","showValue","_value","newAngle","currentAngle","rotationDirection","updateValue","GaugeChart_GaugeChartDataItem","GaugeChartDataItem","GaugeChart_GaugeChart","GaugeChart","hands","processHand","PieSeries3D_PieSeries3DDataItem","PieSeries3DDataItem","depthValue","PieSeries","PieSeries3D_PieSeries3D","PieSeries3D","createSlice","Slice3D","slice","depth","depthPercent","percent","PieChart3D_PieChart3DDataItem","PieChart3DDataItem","PieChart","PieChart3D_PieChart3D","PieChart3D","invalidateDataUsers","SlicedChart_SlicedChartDataItem","SlicedChartDataItem","PercentChart","SlicedChart_SlicedChart","SlicedChart","ChordNode_ChordNode","ChordNode","updateRotation","Slice","setStateOnChildren","ix","iy","invalidateLinks","total","arc_1","sliceStartAngle_1","Bullet","childAngle","childRadius","labelAngle","adjustedTotal","nextAngle","_outgoingSorted","link","linksContainer","nonRibbon","percentWidth","valueAngle","toNode","_incomingSorted","fromNode","mAngle","trueStartAngle","tx","ty","dx","dy","FlowDiagramNode","QuadraticCurve_QuadraticCurve","QuadraticCurve","y1","y2","cpx","cpy","p1","p2","cp","d","point1","point2","ChordLink_ChordLink","ChordLink","middleLine","isTemplate","fromX","fromY","toX","toY","bulletsMask","mAngle1","mAngle2","positionBullets","FlowDiagramLink","ChordDiagram_ChordDiagramDataItem","ChordDiagramDataItem","FlowDiagram","ChordDiagram_ChordDiagram","ChordDiagram","nodePadding","chordContainer","nodesContainer","newTotal","_sorted","strNode","node","getNodeValue","minNodeSize","links","createNode","createLink","ColumnSeries_ColumnSeriesDataItem","ColumnSeriesDataItem","_column","column","setColumn","addSprite","columns","_rangesColumns","ColumnSeries_ColumnSeries","ColumnSeries","_startLocation","_endLocation","clustered","columnsContainer","_columnsContainer","baseAxisSeries","clusterCount","cellStartLocation","disableUnusedColumns","validateDataElementReal","getStartLocation","simplifiedProcessing","getEndLocation","l","r","t","percentHeight","pixelPaddingLeft","pixelPaddingRight","paddingTop","pixelPaddingTop","paddingBottom","pixelPaddingBottom","outOfBounds","offset","fixHorizontalCoordinate","fixVerticalCoordinate","bottomLocation","topLocation","axisLenght","rightLocation","leftLocation","column_1","itemsFocusable","role","focusable","once","ev","populateString","realX","realY","realWidth","realHeight","virtualParent","setColumnStates","rangeColumn","rangesColumns","itemWidth","itemHeight","open_1","change","droppedFromOpen","_dropFromOpenState","setState","_riseFromOpenState","droppedFromPrevious","_dropFromPreviousState","_riseFromPreviousState","_columns","createColumnTemplate","Column","fromOpenState_1","fromPreviousState_1","removeChildren","RoundedRectangle","TreeMapSeries_TreeMapSeriesDataItem","TreeMapSeriesDataItem","treeMapDataItem","_dataContext","TreeMapSeries_TreeMapSeries","TreeMapSeries","configField","showReal","TreeMap_TreeMapDataItem","TreeMapDataItem","rows","y0","hasChildren","getDuration","childValue","level","TreeMap_TreeMap","TreeMap","layoutAlgorithm","squarify","zoomable","maxLevels","currentLevel","ColorSet","sorting","strictMinMax","xRenderer","yRenderer","seriesTemplates","zoomToChartDataItem","_homeDataItem","_navigationBar","navigationBar","createTreeSeries","homeDataItem","_homeText","layoutItems","_updateDataItemIndexes","_tempSeries","navigationData","parentDataItem","initSeries","reverse","createTreeSeriesReal","cursorOverStyle","zoomToSeriesDataItem","toggleBullets","currentlyZoomed","rangeChangeAnimation","_dataDisposers","binaryTree","dice","sliceDice","validateLayout","validateRawData","nodes","n","sums","Array","partition","j","valueOffset","valueTarget","k","hi","mid","valueLeft","valueRight","xk","yk","nodeValue","sumValue","minValue","maxValue","newRatio","minRatio","alpha","beta","ratio","sqrt","i0","i1","row","handleDataItemValueChange","feedLegend","legend","legendData_1","hiddenInLegend","AxisRendererX3D_AxisRendererX3D","AxisRendererX3D","dx3D","dy3D","getHeight","handle3DChanged","AxisRendererY3D_AxisRendererY3D","AxisRendererY3D","getWidth","ColumnSeries3D_ColumnSeries3DDataItem","ColumnSeries3DDataItem","ColumnSeries3D_ColumnSeries3D","ColumnSeries3D","column3D","Column3D","XYChart3D_XYChart3DDataItem","XYChart3DDataItem","XYChart3D_XYChart3D","XYChart3D","fixLayout","fixColumns","depthIndex","s","i_1","maskColumns","Candlestick_Candlestick","Candlestick","createAssets","lowLine","highLine","CandlestickSeries_CandlestickSeriesDataItem","CandlestickSeriesDataItem","lowValueX","lowValueY","highValueX","highValueY","CandlestickSeries_CandlestickSeries","CandlestickSeries","positiveColor","negativeColor","dropFromOpenState","riseFromOpenState","validateCandlestick","lowLine_1","highLine_1","close_1","yOpen","yClose","yLow","yLowField","yHigh","yHighField","open_2","close_2","xOpen","xClose","xLow","xLowField","xHigh","xHighField","rangeLowLine","rangehighLine","_xLowField","_yLowField","_xHighField","_yHighField","cw","ch","OHLC_OHLC","OHLC","openLine","highLowLine","closeLine","OHLCSeries_OHLCSeriesDataItem","OHLCSeriesDataItem","OHLCSeries_OHLCSeries","OHLCSeries","openLine_1","highLowLine_1","closeLine_1","rangeOpenLine","rangeCloseLine","rangeHighLowLine","StepLineSeriesSegment_StepLineSeriesSegment","StepLineSeriesSegment","noRisers","vertical","StepLineSeries_StepLineSeriesDataItem","StepLineSeriesDataItem","StepLineSeries_StepLineSeries","StepLineSeries","prevPoint","point0","RadarColumn_RadarColumn","RadarColumn","radarColumn","getTooltipX","getTooltipY","RadarColumnSeries_RadarColumnSeriesDataItem","RadarColumnSeriesDataItem","RadarColumnSeries_RadarColumnSeries","RadarColumnSeries","lAngle","rAngle","tRadius","bRadius","cellAngle","temp","PyramidSeries_PyramidSeriesDataItem","PyramidSeriesDataItem","FunnelSeries","PyramidSeries_PyramidSeries","PyramidSeries","topWidth","bottomWidth","pyramidHeight","valueIs","sliceLinks","_nextWidth","getNextValue","nextValue","slicesContainer","relValue","sliceLink","_pyramidHeight","_pyramidWidth","labelsContainer","ticksContainer","decorateSlice","pyramidWidth","linkWidth","linkHeight","sliceTopWidth","c","tan","sliceHeight","sliceBottomWidth","square","_nextY","alignLabels","sliceWidth","PictorialStackedSeries_PictorialStackedSeriesDataItem","PictorialStackedSeriesDataItem","PictorialStackedSeries_PictorialStackedSeries","PictorialStackedSeries","_maskSprite","maskSprite","pictureWidth","scale","pictureHeight","newWidth","newHeight","slices","initSlice","hs","expandDistance","ConeColumn_ConeColumn","ConeColumn","coneColumn","Cone","ConeSeries_ConeSeriesDataItem","ConeSeriesDataItem","ConeSeries_ConeSeries","ConeSeries","radiusY","CurvedColumn_CurvedColumn","CurvedColumn","curvedColumn","tension","CurvedColumnSeries_CurvedColumnSeriesDataItem","CurvedColumnSeriesDataItem","CurvedColumnSeries_CurvedColumnSeries","CurvedColumnSeries","DurationAxis_DurationAxisDataItem","DurationAxisDataItem","DurationAxis_DurationAxis","DurationAxis","_baseUnit","durationFormatter","axisDurationFormat","strictMode","minMaxStep","baseUnit","initialMin","initialMax","divisors","realDivisor","divisors_1","divisors_1_1","divisor","exponent","log","LOG10E","power","pow","reducedCount","getValueUnit","getFormat","_tooltipDurationFormat","_stepDecimalPlaces","tooltipDurationFormat","CircleBullet_CircleBullet","CircleBullet","circle","ErrorBullet_ErrorBullet","ErrorBullet","errorLine","isDynamic","NavigationBar_NavigationBarDataItem","NavigationBarDataItem","DataItem","NavigationBar_NavigationBar","NavigationBar","textLink","TextLink","_linksIterator","triangle","Triangle","direction","marginLeft","separators","activeLink","fontWeight","getLast","separator","Component","window","am4charts","charts_namespaceObject"],"mappings":";;;;;;;;;;;;;;;;;;;+vLA0EAA,EAAA,SAAAC,GAyCC,SAAAC,IAAA,IAAAC,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,gBACjBH,EAAKI,eA+CP,OA3FmCC,EAAA,EAAAN,EAAAD,GAoDlCQ,OAAAC,eAAWR,EAAAS,UAAA,iBAaX,WACC,OAAON,KAAKO,iBAAiB,kBAd9B,SAAqBC,GAChBR,KAAKS,iBAAiB,YAAaD,KACtCR,KAAKU,WAAaF,EAAMG,UACpBX,KAAKY,OACRZ,KAAKY,KAAKC,aACVb,KAAKY,KAAKE,sDAiBbV,OAAAC,eAAWR,EAAAS,UAAA,eAaX,WACC,OAAON,KAAKO,iBAAiB,gBAd9B,SAAmBC,GACdR,KAAKS,iBAAiB,UAAWD,KACpCR,KAAKe,SAAWP,EAAMG,UAClBX,KAAKY,OACRZ,KAAKY,KAAKC,aACVb,KAAKY,KAAKE,sDAYdjB,EA3FA,CAAmCmB,EAAA,GAmGnCC,EAAA,EAASC,kBAAiC,cAAIvB,kEChI9CwB,EAAA,SAAAvB,GAUC,SAAAwB,IAAA,IAAAtB,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,mBACjBH,EAAKI,aAELJ,EAAKuB,OAAOC,QACZxB,EAAKuB,OAAOE,aAsCd,OAtDsCpB,EAAA,EAAAiB,EAAAxB,GAwBrCQ,OAAAC,eAAWe,EAAAd,UAAA,YAQX,WACC,OAAON,KAAKwB,MAAY,UATzB,SAAgBF,GACftB,KAAKyB,QAAQ,OAAQH,GACrBtB,KAAKQ,MAAQc,EAAKX,2CAgBnBP,OAAAC,eAAWe,EAAAd,UAAA,eAQX,WACC,OAAON,KAAKwB,MAAe,aAT5B,SAAmBF,GAClBtB,KAAKyB,QAAQ,UAAWH,GACxBtB,KAAKe,SAAWO,EAAKX,2CAUvBS,EAtDA,CAAsCM,EAAA,GAoKtCC,EAAA,SAAA/B,GA6MC,SAAAgC,IAAA,IAAA9B,EAGCF,EAAAG,KAAAC,OAAOA,YA/HDF,EAAA+B,cAAqC,IAAIC,EAAA,EA4BzChC,EAAAiC,YAA4C,IAAIC,EAAA,EAqBhDlC,EAAAmC,wBAAwD,IAAID,EAAA,EAoCzDlC,EAAAoC,mBAAqCC,SAAU,MAAOC,MAAO,GAW7DtC,EAAAuC,kBAgCTvC,EAAKG,UAAY,WAEjBH,EAAKW,iBAAiB,kBAAkB,GACxCX,EAAKwC,aAAc,EAMnBxC,EAAK+B,cAAcU,UAChBJ,SAAU,cAAeC,MAAO,IAChCD,SAAU,cAAeC,MAAO,IAChCD,SAAU,cAAeC,MAAO,KAChCD,SAAU,cAAeC,MAAO,KAChCD,SAAU,cAAeC,MAAO,MAChCD,SAAU,cAAeC,MAAO,MAChCD,SAAU,SAAUC,MAAO,IAC3BD,SAAU,SAAUC,MAAO,IAC3BD,SAAU,SAAUC,MAAO,KAC3BD,SAAU,SAAUC,MAAO,KAC3BD,SAAU,SAAUC,MAAO,IAC3BD,SAAU,SAAUC,MAAO,IAC3BD,SAAU,SAAUC,MAAO,KAC3BD,SAAU,SAAUC,MAAO,KAC3BD,SAAU,SAAUC,MAAO,KAC3BD,SAAU,OAAQC,MAAO,IACzBD,SAAU,OAAQC,MAAO,IACzBD,SAAU,OAAQC,MAAO,IACzBD,SAAU,OAAQC,MAAO,KACzBD,SAAU,MAAOC,MAAO,IACxBD,SAAU,MAAOC,MAAO,IACxBD,SAAU,MAAOC,MAAO,IACxBD,SAAU,MAAOC,MAAO,IACxBD,SAAU,MAAOC,MAAO,IACxBD,SAAU,OAAQC,MAAO,IACzBD,SAAU,QAASC,MAAO,IAC1BD,SAAU,QAASC,MAAO,IAC1BD,SAAU,QAASC,MAAO,IAC1BD,SAAU,QAASC,MAAO,IAC1BD,SAAU,OAAQC,MAAO,IACzBD,SAAU,OAAQC,MAAO,IACzBD,SAAU,OAAQC,MAAO,IACzBD,SAAU,OAAQC,MAAO,KACzBD,SAAU,OAAQC,MAAO,KACzBD,SAAU,OAAQC,MAAO,MACzBD,SAAU,OAAQC,MAAO,MACzBD,SAAU,OAAQC,MAAO,MACzBD,SAAU,OAAQC,MAAO,MACzBD,SAAU,OAAQC,MAAO,MACzBD,SAAU,OAAQC,MAAO,MACzBD,SAAU,OAAQC,MAAO,MACzBD,SAAU,OAAQC,MAAO,OAI5BtC,EAAK0C,cAAgB,OAGrB1C,EAAKI,eA23CP,OAtoDqEC,EAAA,EAAAyB,EAAAhC,GA4L7DgC,EAAAtB,UAAAmC,SAAP,SAAgBC,GACf,IAAIlC,EAAQkC,EAASlC,MACjBI,EAAO8B,EAASC,UAChBC,EAAehC,EAAKiC,cACpBC,EAAeC,EAAA,YAAkBH,EAAaT,SAAUS,EAAaR,OAErEY,KAAKC,OAAOzC,EAAQI,EAAKsC,KAAOJ,GAAgB,GAAKE,KAAKC,MAAMD,KAAKC,OAAOzC,EAAQI,EAAKsC,KAAOJ,GAAgB,GACnHJ,EAASS,SAASC,YAAa,EAG/BV,EAASS,SAASC,YAAa,GA6EvBxB,EAAAtB,UAAA+C,sBAAV,WACCzD,EAAAU,UAAM+C,sBAAqBtD,KAAAC,MAGtBA,KAAK+B,YAAYuB,OAAO,gBAC5BtD,KAAK+B,YAAYwB,OAAO,cAAevD,KAAKwD,SAASC,UAAU,sBAE3DzD,KAAK+B,YAAYuB,OAAO,WAC5BtD,KAAK+B,YAAYwB,OAAO,SAAUvD,KAAKwD,SAASC,UAAU,iBAEtDzD,KAAK+B,YAAYuB,OAAO,WAC5BtD,KAAK+B,YAAYwB,OAAO,SAAUvD,KAAKwD,SAASC,UAAU,iBAEtDzD,KAAK+B,YAAYuB,OAAO,SAC5BtD,KAAK+B,YAAYwB,OAAO,OAAQvD,KAAKwD,SAASC,UAAU,eAEpDzD,KAAK+B,YAAYuB,OAAO,QAC5BtD,KAAK+B,YAAYwB,OAAO,MAAOvD,KAAKwD,SAASC,UAAU,cAEnDzD,KAAK+B,YAAYuB,OAAO,SAC5BtD,KAAK+B,YAAYwB,OAAO,OAAQvD,KAAKwD,SAASC,UAAU,cAEpDzD,KAAK+B,YAAYuB,OAAO,UAC5BtD,KAAK+B,YAAYwB,OAAO,QAASvD,KAAKwD,SAASC,UAAU,gBAErDzD,KAAK+B,YAAYuB,OAAO,SAC5BtD,KAAK+B,YAAYwB,OAAO,OAAQvD,KAAKwD,SAASC,UAAU,eAGpDzD,KAAKiC,wBAAwBqB,OAAO,gBACxCtD,KAAKiC,wBAAwBsB,OAAO,cAAevD,KAAKwD,SAASC,UAAU,sBAEvEzD,KAAKiC,wBAAwBqB,OAAO,WACxCtD,KAAKiC,wBAAwBsB,OAAO,SAAUvD,KAAKwD,SAASC,UAAU,iBAElEzD,KAAKiC,wBAAwBqB,OAAO,WACxCtD,KAAKiC,wBAAwBsB,OAAO,SAAUvD,KAAKwD,SAASC,UAAU,iBAElEzD,KAAKiC,wBAAwBqB,OAAO,SACxCtD,KAAKiC,wBAAwBsB,OAAO,OAAQvD,KAAKwD,SAASC,UAAU,eAEhEzD,KAAKiC,wBAAwBqB,OAAO,QACxCtD,KAAKiC,wBAAwBsB,OAAO,MAAOvD,KAAKwD,SAASC,UAAU,cAE/DzD,KAAKiC,wBAAwBqB,OAAO,SACxCtD,KAAKiC,wBAAwBsB,OAAO,OAAQvD,KAAKwD,SAASC,UAAU,cAEhEzD,KAAKiC,wBAAwBqB,OAAO,UACxCtD,KAAKiC,wBAAwBsB,OAAO,QAASvD,KAAKwD,SAASC,UAAU,eAAiB,IAAMzD,KAAKwD,SAASC,UAAU,gBAW5G7B,EAAAtB,UAAAoD,eAAV,WACC,OAAO,IAAIvC,GAQFS,EAAAtB,UAAAqD,gBAAV,WACC,OAAO,IAAIhE,GAQLiC,EAAAtB,UAAAsD,kBAAP,WAEC,IAAIC,EAAgB7D,KAAK6D,MACrBC,EAAc9D,KAAK8D,IACnBC,GAAuB/D,KAAKgE,IAAMhE,KAAKkD,KAAOlD,KAAKiE,aAEvDrE,EAAAU,UAAMsD,kBAAiB7D,KAAAC,MAEvBA,KAAKkE,eAAiBlE,KAAKgE,IAAMhE,KAAKkD,KAAOlD,KAAKiE,aAIlDJ,IAAiBC,EAAMD,IAAU,EAAIE,IADP/D,KAAKgE,IAAMhE,KAAKkD,KAAOlD,KAAKiE,eAE1DjE,KAAKmE,MAAON,MAAOA,EAAOC,IAAKA,IAAO,GAAO,IASvClC,EAAAtB,UAAA8D,8BAAP,aASOxC,EAAAtB,UAAA+D,cAAP,eAAAvE,EAAAE,KACCJ,EAAAU,UAAM+D,cAAatE,KAAAC,MAEnB,IAAI4C,EAA8B5C,KAAKsE,eAAe,EAAGtE,KAAKuE,iBAAiBvE,KAAKwE,WAAYxE,KAAKyE,YAAazE,KAAK0E,YAEnH3B,EAAA,YAAkBH,EAAaT,SAAUS,EAAaR,OAASpC,KAAKiE,eACvErB,EAAezC,EAAA,KAAKH,KAAK2E,eAG1B3E,KAAK6C,cAAgBD,EAErB5C,KAAK4E,UAAY7B,EAAA,MAAY,IAAI8B,KAAK7E,KAAKkD,KAAMN,EAAaT,SAAUS,EAAaR,MAAOpC,KAAK8E,mBACjG9E,KAAK+E,cAAgBhC,EAAA,YAAkBH,EAAaT,UAGpDnC,KAAKgF,kBAAoBjC,EAAA,YAAkBH,EAAaT,SAAUS,EAAaR,OAC/E,IAAIA,EAAgBY,KAAKiC,KAAKjF,KAAKkF,YAAclF,KAAKgF,mBACtD5C,EAAQY,KAAKmC,MAAMnF,KAAK6D,MAAQzB,GAAS,EAEzCW,EAAA,IAAU/C,KAAK4E,UAAWhC,EAAaT,SAAUC,EAAQQ,EAAaR,OAGtEgD,EAAA,KAAWpF,KAAKqF,OAAOC,WAAY,SAACD,GACnC,GAAIA,EAAOE,UAAYzF,EAAM,CAC5B,IAAI0F,EAAgCH,EAAOI,aAAa3F,GAGpD4F,EAAqBL,EAAOM,UAAUC,iBAAiB9F,EAAK0E,WAAY,SAACqB,GAAM,OAAQA,EAAEL,IAAQ,QAEjGb,EAAe7E,EAAK6E,aACpBmB,EAAY/C,EAAA,IAAUA,EAAA,MAAY,IAAI8B,KAAK/E,EAAK2E,YAAaE,EAAaxC,SAAUwC,EAAavC,OAAQuC,EAAaxC,SAAUwC,EAAavC,OAAOzB,UAAY,EAEhKoF,EAAmBV,EAAOM,UAAUC,iBAAiBE,EAAW,SAACD,GAAM,OAAQA,EAAEL,IAAQ,SAAW,EAExGH,EAAOK,WAAaA,EACpBL,EAAOU,SAAWA,MAUdnE,EAAAtB,UAAA0F,aAAP,WACCpG,EAAAU,UAAM0F,aAAYjG,KAAAC,MACbiG,EAAA,SAAejG,KAAK2E,aAAavC,SACrCpC,KAAK2E,aAAavC,MAAQ,IAO5BhC,OAAAC,eAAWuB,EAAAtB,UAAA,qBAAX,eAAAR,EAAAE,KACKkG,EAAgBC,OAAOC,UAW3B,OAVApG,KAAKqF,OAAOgB,KAAK,SAAChB,GACba,EAAgBpG,EAAKuC,eAAegD,EAAOiB,OAC9CJ,EAAgBpG,EAAKuC,eAAegD,EAAOiB,QAIzCJ,GAAiBC,OAAOC,WAA8B,GAAjBF,IACxCA,EAAgBnD,EAAA,YAAkB,QAG5BmD,mCAUDtE,EAAAtB,UAAAiG,uBAAP,SAA8BlB,GAC7BrF,KAAKqC,eAAegD,EAAOiB,KAAOH,OAAOC,WASnCxE,EAAAtB,UAAAkG,2BAAP,eAAA1G,EAAAE,KACCA,KAAKqF,OAAOgB,KAAK,SAAChB,GACboB,KAAKC,UAAUrB,EAAOsB,cAAc7G,EAAKwG,OAASG,KAAKC,UAAU5G,EAAK6E,gBACzEU,EAAOM,UAAUU,KAAK,SAAC3D,GACtB5C,EAAK8G,0BAA0BlE,KAEhC2C,EAAOsB,cAAc7G,EAAKwG,KAAOxG,EAAK6E,gBAIxC3E,KAAK6G,uBAUCjF,EAAAtB,UAAAsG,0BAAP,SAAiClE,GAAjC,IAAA5C,EAAAE,KAEK2E,EAA8B3E,KAAK2E,aAGnCmC,EADmBpE,EAASC,UACHmE,gBAAgBC,OAAO/G,KAAKsG,KAEzDU,EAAA,KAAatE,EAASlB,MAAO,SAACyF,GAC7B,IACIC,EADaxE,EAASyE,QAAQF,GAClBtG,UAGZyG,EADkBrE,EAAA,MAAY,IAAI8B,KAAKqC,GAAOvC,EAAaxC,SAAUwC,EAAavC,MAAOtC,EAAKgF,mBACxEnE,UACtBY,EAAgBwB,EAAA,IAAU,IAAI8B,KAAKuC,GAAYzC,EAAaxC,SAAUwC,EAAavC,OAEvFM,EAAS2E,mBAAmBJ,EAAKG,EAAW,QAC5C1E,EAAS2E,mBAAmBJ,EAAK1F,EAAQZ,UAAW,SAEpDmG,EAAgBvD,OAAO6D,EAAUE,WAAY5E,MAerCd,EAAAtB,UAAAuG,oBAAV,eAAA/G,EAAAE,KAEC,GAAIA,KAAKuH,kBAAoBtB,EAAA,SAAejG,KAAKkD,MAAQ+C,EAAA,SAAejG,KAAKgE,KAAM,CAClF,IAAI7B,EAAqBnC,KAAK2E,aAAaxC,SACvCC,EAAgBpC,KAAK2E,aAAavC,MAEtCpC,KAAKwH,WAAWC,QAKhB,IAHA,IAAInG,EAAayB,EAAA,MAAY,IAAI8B,KAAK7E,KAAKkD,KAAMf,EAAUC,EAAOpC,KAAK8E,mBACnE4C,OAAS,eAGZ3E,EAAA,IAAUzB,EAAMa,EAAUC,GAE1B,IAAIgF,EAAoB9F,EAAKX,UACzBgH,EAAuBP,EAAUE,WAEvBlC,EAAA,SAAewC,EAAKvC,OAAOC,WAAY,SAACD,GACrD,QAASA,EAAOyB,gBAAgBC,OAAOjH,EAAKwG,KAAKS,OAAOY,KAYpDD,IAEHA,EAAUnG,QAAU,IAAIsD,KAAKuC,EAAY,GACzCM,OAAYG,GAVRH,KACJA,EAA2BE,EAAKJ,WAAWM,UACjCC,UAAY,IAAIlD,KAAKuC,YAd3B9F,EAAKX,UAAYX,KAAKgE,IAAMhE,KAAKiE,oBAkCnCrC,EAAAtB,UAAA0H,cAAP,eAAAlI,EAAAE,KACCJ,EAAAU,UAAM0H,cAAajI,KAAAC,MAEnB,IAAIwH,EAAaxH,KAAKwH,WAClBA,EAAWS,OAAS,GAEvBT,EAAWnB,KAAK,SAACqB,GAChB,IAAIQ,EAAyBlF,KAAKiC,KAAKnF,EAAK4E,YAAc1B,KAAKE,IAAIpD,EAAKgE,IAAK4D,EAAUS,aAAenF,KAAKgB,IAAIlE,EAAK+D,MAAO6D,EAAUU,iBAAmBtI,EAAKgE,IAAMhE,EAAK+D,QACxK6D,EAAU9E,aAAe9C,EAAKwE,eAAe,EAAGoD,EAAUW,iBAAmBX,EAAUY,mBAAoBJ,GAC3G,IAAIK,EAAWxF,EAAA,MAAY,IAAI8B,KAAK6C,EAAUY,oBAAqBZ,EAAU9E,aAAaT,SAAUuF,EAAU9E,aAAaR,MAAOtC,EAAKgF,mBACnIyD,EAAS5H,UAAY+G,EAAUK,UAAUpH,WAC5CoC,EAAA,IAAUwF,EAAUb,EAAU9E,aAAaT,SAAUuF,EAAU9E,aAAaR,OAG7EsF,EAAUa,SAAWA,KAQd3G,EAAAtB,UAAAwE,gBAAV,WACC,OAAI9E,KAAKwI,cACDxI,KAAKwI,cAAcC,eAGpB,GAYD7G,EAAAtB,UAAAoI,YAAP,SAAmBpH,EAAYqH,GAC9B,IAAIxG,EAAqBnC,KAAK6C,cAAcV,SACxCyG,EAA4B5I,KAAK6C,cAAcT,MAEnDW,EAAA,MAAYzB,EAAMa,EAAU,EAAGnC,KAAK8E,mBAEpC,IAAI+D,EAAwBvH,EAAKX,UAE7BmI,EAAgB/F,EAAA,KAAWzB,GAE3ByH,EAAoBhG,EAAA,IAAU+F,EAAS3G,EAAUwG,GAAehI,UAGhE+G,EAA0C1H,KAAKgJ,UAAUD,GACzDrB,IACHoB,EAAU,IAAIjE,KAAK6C,EAAUnG,QAAQZ,WACrCoC,EAAA,MAAY+F,EAAS3G,EAAUyG,EAAmB5I,KAAK8E,mBACnDgE,EAAQnI,UAAY+G,EAAUnG,QAAQZ,WACzCoC,EAAA,IAAU+F,EAAS3G,EAAUyG,GAE9BG,EAAYD,EAAQnI,WAIrB,IAAIsI,EAAgCjJ,KAAKuE,iBAAiBsE,EAAeE,GAKzE,OAHiC/F,KAAKC,MAAMgG,EAAwBlG,EAAA,YAAkBZ,IAG7DyG,EACjB5I,KAAK0I,YAAYpH,EAAMqH,EAAgBC,GAGxCE,GAaDlH,EAAAtB,UAAA4I,iBAAP,SAAwBxB,EAA0BvF,EAAoBC,GACrE,IAAId,EAAO,IAAIuD,KAAK6C,EAAU3G,UAC9BgC,EAAA,MAAYzB,EAAMa,EAAUC,EAAOpC,KAAK8E,mBACxC/B,EAAA,IAAUzB,EAAMa,EAAUC,GAE1B,IAAI2G,EAAYzH,EAAKX,UAGrB,OADA+G,EAA2B1H,KAAKgJ,UAAUD,IAElC/I,KAAKkJ,iBAAiBxB,EAAWvF,EAAUC,GAE5Cd,GASDM,EAAAtB,UAAA6I,qBAAP,eAAArJ,EAAAE,KACC,GAAIiG,EAAA,SAAejG,KAAKgE,MAAQiC,EAAA,SAAejG,KAAKkD,KAAM,CAEzDlD,KAAKqE,gBAGL,IAAI0E,EAAY/I,KAAK4E,UAAUjE,UAC3BwB,EAAWnC,KAAK6C,cAAcV,SAC9BwG,EAAgB3I,KAAK6C,cAAcT,MACnCgH,EAAerG,EAAA,KAAW/C,KAAK4E,WAE/ByE,EAAoBrJ,KAAKsJ,mBAC7BtJ,KAAKuJ,iBAEL,qBACC,IAAIjI,EAAOkI,EAAKd,YAAY3F,EAAA,KAAWqG,GAAeT,GAEtDI,EAAYzH,EAAKX,UAEjB,IAAIY,EAAUwB,EAAA,KAAWzB,GACzBC,EAAUwB,EAAA,IAAUxB,EAASY,EAAUwG,GAEvC,IAAIc,EAASD,EAAKzH,YAAYgF,OAAO5E,GAEjCqH,EAAKE,gBAAkBN,GACtBrG,EAAA,YAAkBzB,EAAM8H,EAAcI,EAAKzE,gBAC7B,SAAb5C,IACHsH,EAASD,EAAKvH,wBAAwB8E,OAAO5E,IAKhD,IAAIwH,EAAOH,EAAKhB,cAAciB,OAAOnI,EAAMmI,GAEvC/G,EAAW2G,EAAkBO,KAAK,SAAC/D,GAAM,OAAAA,EAAE8D,OAASA,IACpDjH,EAASU,aACZV,EAASU,YAAa,GAEvBoG,EAAKK,eAAenH,GAEpBA,EAASgF,eAAYG,EACrBnF,EAASpB,KAAOA,EAChBoB,EAASnB,QAAUA,EAEnBmB,EAASiH,KAAOA,EAEhBP,EAAe9H,EAEfkI,EAAKM,oBAAoBpH,WAlCnBqG,GAAa/I,KAAKyE,gBAsCzB,IAAIsF,EAAyB/J,KAAKgK,SAElC5E,EAAA,KAAWpF,KAAKwH,WAAWlC,WAAY,SAACoC,GACvC,GAAIA,EAAUuC,UAAY,EAAG,CAC5B,IAAIC,EAAqBxC,EAAU9E,aAAaT,SAC5CgI,EAAwBzC,EAAU9E,aAAaR,MAGnD,GAAIgI,EAAA,YAAkB1C,EAAU2C,WAAY3C,EAAU4C,UAAuC,EAA3BP,EAASQ,gBAK1E,IAJA,IAEIC,EAFAC,EAAoB/C,EAAUa,SAAS5H,UAGvCyB,EAAgB,eAEnB,IAAId,EAAayB,EAAA,KAAW2E,EAAUa,UAGtC,GAFAkC,EAAY1H,EAAA,IAAUzB,EAAM4I,EAAUC,EAAgB/H,GAAOzB,UAC7DyB,IACIqI,EAAY/C,EAAUY,oBAAsBmC,EAAY/C,EAAUW,iBAAkB,CACvF,IAAI9G,EAAUwB,EAAA,KAAWzB,GACzBC,EAAUwB,EAAA,IAAUxB,EAAS2I,EAAUC,GAEvC,IAAIV,EAAiB3J,EAAKiC,YAAYgF,OAAOmD,GAEzCpK,EAAK4J,gBAAkBc,GACtBzH,EAAA,YAAkBzB,EAAMkJ,EAAc1K,EAAKiF,gBAC7B,SAAbmF,IACHT,EAAS3J,EAAKmC,wBAAwB8E,OAAOmD,IAKhD,IAAIQ,EAAe5K,EAAK0I,cAAciB,OAAOnI,EAAMmI,GAE/C/G,EAA8B2G,EAAkBO,KAAK,SAAC/D,GAAM,OAAAA,EAAE8D,OAASe,IACvEhI,EAASU,aACZV,EAASU,YAAa,GAGvBtD,EAAK+J,eAAenH,GACpBA,EAASgF,UAAYA,EACrBA,EAAU/B,UAAUgF,UAAUjI,GAE9BA,EAASpB,KAAOA,EAChBoB,EAASnB,QAAUA,EACnBmB,EAASiH,KAAOe,EAChBF,EAAelJ,EACfxB,EAAKgK,oBAAoBpH,KAjCpB+H,GAAa/C,EAAUkD,sBAgD5BhJ,EAAAtB,UAAAwJ,oBAAP,SAA2BpH,GAE1B,GAAIuD,EAAA,SAAejG,KAAKgE,MAAQiC,EAAA,SAAejG,KAAKkD,KAAM,CACzD,IAAI8G,EAAyBhK,KAAKgK,SAE9BjB,EAAYrG,EAASlC,MACrBqK,EAAenI,EAAS3B,SAEvBkF,EAAA,SAAe4E,KACnBA,EAAe9B,GAGhB,IAAI+B,EAAmB9K,KAAK+K,gBAAgBhC,GACxCZ,EAAsBnI,KAAK+K,gBAAgBF,GAC3CG,EAAkB7C,GAEjBzF,EAASuI,SAAWjL,KAAK6C,cAAcT,MAAQpC,KAAK2E,aAAavC,QACrE+F,EAAc2C,GAAY3C,EAAc2C,IAAa9K,KAAK6C,cAAcT,MAAQpC,KAAK2E,aAAavC,QAGnGM,EAASoI,SAAWA,EAEpB,IAAII,EAAiBxI,EAASwI,KAC1BA,IAASA,EAAKC,UACjBnB,EAASoB,kBAAkBF,EAAMJ,EAAU3C,GAG5C,IAAIkD,EAAa3I,EAAS2I,KACtBA,IAASA,EAAKF,UACjBnB,EAASsB,kBAAkBD,EAAMP,EAAU3C,GAG5C,IAAIoD,EAAiB7I,EAASS,SAC1BoI,IAASA,EAAKJ,WACjBnB,EAASwB,kBAAkBD,EAAMT,EAAUE,GACtCtI,EAASuI,SACbjL,KAAKyC,SAASC,IAIhB,IAAI+I,EAAiB/I,EAAS+I,KAC1BA,GACHzB,EAASwB,kBAAkBC,EAAMX,EAAU3C,GAG5C,IAAIuD,EAAmBhJ,EAASgJ,MAChC,GAAIA,IAAUA,EAAMP,SAAU,CAC7B,IAAIQ,EAAWD,EAAME,SAIL,GAAZD,IAKFA,EAJ+B,GAA5B3L,KAAK6C,cAAcT,OAA6C,QAA/BpC,KAAK6C,cAAcV,UAAuBO,EAASuI,QAI5E,EAHA,IAQbjB,EAAS6B,mBAAmBH,EAAOZ,EAAU3C,EAAawD,MAU7DvL,OAAAC,eAAWuB,EAAAtB,UAAA,oBAAX,WACC,OAAOyC,EAAA,YAAkB/C,KAAK2E,aAAaxC,SAAUnC,KAAK2E,aAAavC,wCAYjER,EAAAtB,UAAAwL,aAAP,SAAoB5I,EAAac,GAChC,OAASd,IAAKA,EAAKc,IAAKA,EAAK+H,KAAM/L,KAAKiE,eAS/BrC,EAAAtB,UAAA0L,OAAV,SAAiBxL,GAEhB,IAAI4G,EAAYrE,EAAA,MAAY,IAAI8B,KAAKrE,GAAQR,KAAK2E,aAAaxC,SAAUnC,KAAK2E,aAAavC,MAAOpC,KAAK8E,mBAAmBnE,UAE1H,OAAOyG,GADOrE,EAAA,IAAU,IAAI8B,KAAKuC,GAAYpH,KAAK2E,aAAaxC,SAAUnC,KAAK2E,aAAavC,OAAOzB,UACpEyG,GAAapH,KAAKiM,eASvCrK,EAAAtB,UAAA4L,OAAV,SAAiB1L,GAEhB,IAAI4G,EAAYrE,EAAA,MAAY,IAAI8B,KAAKrE,GAAQR,KAAK2E,aAAaxC,SAAUnC,KAAK2E,aAAavC,MAAOpC,KAAK8E,mBAAmBnE,UAE1H,OAAOyG,GADOrE,EAAA,IAAU,IAAI8B,KAAKuC,GAAYpH,KAAK2E,aAAaxC,SAAUnC,KAAK2E,aAAavC,OAAOzB,UACpEyG,GAAapH,KAAKmM,aAa1CvK,EAAAtB,UAAAgE,eAAP,SAAsB8H,EAAeC,EAAkBC,GACtD,IAAIzK,EAAqC7B,KAAK6B,cAE1Ce,EAA8Bf,EAAc0K,SAASH,GAErDI,EAA2BzJ,EAAA,YAAkBH,EAAaT,SAAUS,EAAaR,OAEjFqK,EAAoB5K,EAAcoG,OAAS,EAC/C,GAAImE,GAASK,EACZ,OAAOtM,EAAA,KAAK0B,EAAc0K,SAASE,IAGpC,IAAIrK,EAAgBY,KAAKiC,KAAKoH,EAAWG,GAEzC,OAAIH,EAAWG,GAAoBJ,EAAQ,EACnCjM,EAAA,KAAK0B,EAAc0K,SAASH,EAAQ,IAGxChK,GAASkK,EACLnM,EAAA,KAAK0B,EAAc0K,SAASH,IAE/BA,EAAQ,EAAIvK,EAAcoG,OACtBjI,KAAKsE,eAAe8H,EAAQ,EAAGC,EAAUC,GAEzCnM,EAAA,KAAK0B,EAAc0K,SAASH,KAW/BxK,EAAAtB,UAAAoM,YAAP,SAAmBlM,GAClB,OAAOR,KAAKwI,cAAciB,OAAOjJ,IAS3BoB,EAAAtB,UAAAqM,eAAP,SAAsBrL,GACrB,OAAOtB,KAAK+K,gBAAgBzJ,EAAKX,YAS3BiB,EAAAtB,UAAAsM,cAAP,SAAqBtL,GACpB,OAAIA,aAAgBuD,KACZ7E,KAAK2M,eAAerL,GAGpBtB,KAAK+K,gBAAgBzJ,IAUvBM,EAAAtB,UAAAuM,YAAP,SAAmBvL,GAClB,IAAIwJ,EAAW9K,KAAK2M,eAAerL,GAC/BwL,EAAQ9M,KAAKgK,SAAS+C,gBAAgBjC,GACtCkC,EAAQhN,KAAKgK,SAASiD,gBAAgBnC,GAC1C,OAASjF,EAAGiH,EAAMjH,EAAGqH,EAAGJ,EAAMI,EAAGF,MAAOA,IAUlCpL,EAAAtB,UAAA6M,WAAP,SAAkB7L,GACjB,OAAIA,aAAgBuD,KACZ7E,KAAK6M,YAAYvL,GAGjBtB,KAAKoN,aAAa9L,IAUpBM,EAAAtB,UAAA+M,eAAP,SAAsBvC,GACrB,OAAO,IAAIjG,KAAK7E,KAAKsN,gBAAgBxC,KAa/BlJ,EAAAtB,UAAAiN,KAAP,SAAY7K,EAA4BuE,EAAa2E,GACpD,IAAIpL,EAAgBR,KAAKwN,kBAAkB9K,EAAUuE,EAAK2E,GAO1D,OAJK3F,EAAA,SAAezF,KACnBA,EAAQR,KAAKyN,WAGPzN,KAAKgK,SAAS+C,gBAAgB/M,KAAK+K,gBAAgBvK,IAAQqF,GAa5DjE,EAAAtB,UAAAoN,KAAP,SAAYhL,EAA4BuE,EAAa2E,GACpD,IAAIpL,EAAgBR,KAAKwN,kBAAkB9K,EAAUuE,EAAK2E,GACtD+B,EAAgBjL,EAASkL,SAAS,SAAU,SAMhD,OAJK3H,EAAA,SAAezF,KACnBA,EAAQR,KAAKyN,WAGPzN,KAAKgK,SAAS+C,gBAAgB/M,KAAK+K,gBAAgBvK,EAAQmN,IAAQT,GAcpEtL,EAAAtB,UAAAuN,SAAP,SAAgBnL,EAA4BuE,EAAa2E,EAAmBkC,GAC3E,IAAItN,EAAgBR,KAAKwN,kBAAkB9K,EAAUuE,EAAK2E,GACtD+B,EAAgBjL,EAASkL,SAASE,EAAU,SAMhD,OAJK7H,EAAA,SAAezF,KACnBA,EAAQR,KAAKyN,WAGPzN,KAAKiN,gBAAgBjN,KAAK+K,gBAAgBvK,EAAQmN,KAahD/L,EAAAtB,UAAAkN,kBAAV,SAA4B9K,EAA4BuE,EAAa2E,GACpE,GAAK3F,EAAA,SAAegB,GAApB,CAIKhB,EAAA,SAAe2F,KACnBA,EAAWlJ,EAASqL,iBAAiB9G,GAEhChB,EAAA,SAAe2F,KACnBA,EAAW,IAIb,IAAIxE,EAAoB1E,EAASrB,OAAO4F,GAAW,KAC/C+G,EAAkBtL,EAASrB,OAAO4F,GAAY,MAElD,OAAIhB,EAAA,SAAemB,IAAcnB,EAAA,SAAe+H,GACxC5G,GAAa4G,EAAU5G,GAAawE,OAD5C,IAYMhK,EAAAtB,UAAA2N,sBAAP,SAA6BvL,EAA4BwL,GAExD,IACIhH,EADA7B,EAAS3C,EAASC,UAGlBrB,EAAmBoB,EAAU,OAASwL,GAC1C,GAAI5M,EAAJ,CACC4F,EAAO5F,EAAKX,UAKb,IAIIwN,EAJAC,EAAuB1L,EAAU,WAAawL,GAC9CG,EAAyBrO,KAAKsO,gBAQlC,GAJIF,IACHD,EAAWC,EAASzN,WAGjBsF,EAAA,SAAekI,GAAW,CAC7B,IAAII,EAAavL,KAAKwL,IAAItH,EAAOiH,GAE7BnO,KAAKqC,eAAegD,EAAOiB,KAAOiI,IACrCvO,KAAKqC,eAAegD,EAAOiB,KAAOiI,GAIpC,IAAIE,EAAoBvH,EAAOmH,EAE3BI,EAAY,GACXzO,KAAKqC,eAAegD,EAAOiB,KAAOmI,IACrCzO,KAAKqC,eAAegD,EAAOiB,KAAOmI,GAIpCzO,KAAKsO,gBAAkBpH,EAEnB7B,EAAOsB,cAAc3G,KAAKsG,KAC7BtG,KAAK4G,0BAA0BlE,GAG3B1C,KAAK2G,gBACRtB,EAAOsB,cAAc3G,KAAKsG,KAAOtG,KAAK2G,cACtC3G,KAAK4G,0BAA0BlE,MAW3Bd,EAAAtB,UAAAoO,mBAAP,WACC9O,EAAAU,UAAMoO,mBAAkB3O,KAAAC,MAExB,IAAI2E,EAA8B3E,KAAKsE,eAAe,EAAGtE,KAAKkG,cAAe,GAEzElG,KAAKkG,eAAiBnD,EAAA,YAAkB,MAAO,KAAgC,QAAzB4B,EAAaxC,WACtEwC,EAAaxC,SAAW,QACxBwC,EAAavC,MAAQ,GAGlBpC,KAAKkG,eAAiBnD,EAAA,YAAkB,OAAQ,KAAgC,QAAzB4B,EAAaxC,WACvEwC,EAAaxC,SAAW,MACxBwC,EAAavC,MAAQ,GAGtBpC,KAAKkC,kBAAoByC,GAiB1BvE,OAAAC,eAAWuB,EAAAtB,UAAA,oBAWX,WACC,OAAIN,KAAK2G,cACD3G,KAAK2G,cAGL3G,KAAKkC,uBAhBd,SAAwByM,GACnBlI,KAAKC,UAAU1G,KAAK2G,gBAAkBF,KAAKC,UAAUiI,KACxD3O,KAAK2G,cAAgBgI,EACrB3O,KAAKa,aACLb,KAAKwG,+DAqCPpG,OAAAC,eAAWuB,EAAAtB,UAAA,wBAiBX,WACC,OAAON,KAAKO,iBAAiB,yBAlB9B,SAA4BC,GAK3B,GAJIR,KAAKS,iBAAiB,mBAAoBD,IAC7CR,KAAK4O,iBAGFpO,EAAO,CACV,IAAIqO,EAAgB7O,KAAKwH,WAAWsH,SACpCD,EAAcE,UAAU5D,UAAW,EACnC0D,EAAcG,QAAQ7D,UAAW,EACjC0D,EAAcI,UAAU9D,UAAW,EACnC0D,EAAc5E,UAAY,oCAkB5B7J,OAAAC,eAAWuB,EAAAtB,UAAA,yBAOX,WACC,OAAON,KAAKO,iBAAiB,0BAR9B,SAA6BC,GAC5BR,KAAKS,iBAAiB,oBAAqBD,oCAiB5CJ,OAAAC,eAAWuB,EAAAtB,UAAA,sBASX,WACC,OAAON,KAAKO,iBAAiB,uBAV9B,SAA0BC,GACrBR,KAAKS,iBAAiB,iBAAkBD,IAC3CR,KAAK4O,kDAsBAhN,EAAAtB,UAAA4O,eAAP,SAAsBpE,GACrB,IAAInB,EACArI,EAAOtB,KAAKqN,eAAevC,GAG/B,GAFAxJ,EAAOyB,EAAA,MAAYzB,EAAMtB,KAAK2E,aAAaxC,SAAUnC,KAAK2E,aAAavC,MAAOpC,KAAK8E,mBAE/EmB,EAAA,SAAejG,KAAKmP,mBACvBxF,EAAO3J,KAAKwI,cAAciB,OAAOnI,EAAMtB,KAAKmP,uBAExC,CACJ,IAAIC,EAAapP,KAAK+B,YAAYgF,OAAO/G,KAAK2E,aAAaxC,UAE1DwH,EADGyF,EACIpP,KAAKwI,cAAciB,OAAOnI,EAAM8N,GAGhCpP,KAAKqP,iBAAiBvE,GAG/B,OAAO9K,KAAKsP,QAAQC,MAAM,iBAAkB5F,IAWtC/H,EAAAtB,UAAAkP,cAAP,SAAqB1E,EAAkBc,GACtC,IAAIjH,EAAe3E,KAAK2E,aACpBxC,EAAWwC,EAAaxC,SACxBC,EAAQuC,EAAavC,MAErBd,EAAatB,KAAKqN,eAAevC,GAQrC,GANA/H,EAAA,MAAYzB,EAAMa,EAAUC,EAAOpC,KAAK8E,mBAEpC8G,EAAW,GACd7I,EAAA,IAAUzB,EAAMa,EAAUyJ,EAAWxJ,GAGlCpC,KAAKgJ,UAAU1H,EAAKX,WACvB,KAAOW,EAAKX,UAAYX,KAAKgE,MAC5BjB,EAAA,IAAUzB,EAAMa,EAAUC,GACrBpC,KAAKgJ,UAAU1H,EAAKX,cAM3B,OAAOX,KAAK2M,eAAerL,IAWrBM,EAAAtB,UAAAmP,qBAAP,SAA4B3E,GAC3B,OAAO9K,KAAKwP,cAAc1E,EAAU,IAW9BlJ,EAAAtB,UAAAoP,mBAAP,SAA0B5E,GACzB,OAAO9K,KAAKwP,cAAc1E,EAAU,IAiB9BlJ,EAAAtB,UAAAqP,kBAAP,SAAyBtK,EAAkByF,EAAkB8E,GAE5D,IAyDKC,EAzDDrP,EAAgBR,KAAKsN,gBAAgBxC,GACrCxJ,EAAayB,EAAA,MAAY,IAAI8B,KAAKrE,GAAQR,KAAK2E,aAAaxC,SAAUnC,KAAK2E,aAAavC,MAAOpC,KAAK8E,mBAIpGpC,EAFkB2C,EAAOyB,gBAAgBC,OAAO/G,KAAKsG,KAE1BS,OAAOzF,EAAKX,UAAU2G,aAGhD5E,GAAYkN,IAoDfC,EADsB,KAAnB7P,KAAKkO,WACF,QAGA,QAGPxL,EAAW2C,EAAOM,UAAU4G,SAASlH,EAAOM,UAAUC,iBAAiBtE,EAAKX,UAAW,SAACkF,GAAM,OAAQA,EAAEgK,GAAKlP,WAAW,SAGzH,OAAO+B,GAeDd,EAAAtB,UAAA+O,iBAAP,SAAwBvE,GAEvB,IAAIxJ,EAAOtB,KAAKqN,eAAevC,GAC/B,OAAO9K,KAAKwI,cAAciB,OAAOnI,EAAMtB,KAAK8P,0BAQnClO,EAAAtB,UAAAwP,sBAAV,WACC,OAAO9P,KAAK+B,YAAYgF,OAAO/G,KAAK6C,cAAgB7C,KAAK6C,cAAcV,SAAW,QAQ5EP,EAAAtB,UAAAyP,aAAP,WACCnQ,EAAAU,UAAMyP,aAAYhQ,KAAAC,MAClB,IAAIgK,EAAWhK,KAAKgK,SAChBA,IAEHA,EAASgG,MAAMlB,SAASlD,SAAW,EACnC5B,EAASqB,KAAKyD,SAASlD,SAAW,EAClC5B,EAASiG,OAAOnB,SAASlD,SAAW,EACpC5B,EAASkG,SAAS/E,UAAW,IAU/B/K,OAAAC,eAAWuB,EAAAtB,UAAA,iBAAX,WACC,OAASuF,EAAG,EAAGqH,EAAG,oCAYZtL,EAAAtB,UAAA6P,YAAP,SAAmBpI,EAAiBxG,EAAe6O,EAA0BC,GAC5EtI,EAAY/H,KAAKwI,cAAc8H,MAAMvI,GACrCxG,EAAUvB,KAAKwI,cAAc8H,MAAM/O,GACnCvB,KAAKuQ,aAAaxI,EAAUpH,UAAWY,EAAQZ,UAAWyP,EAAgBC,IASjEzO,EAAAtB,UAAAkQ,KAAV,SAAeC,GACd,MAAgB,gBAATA,GAA2B7Q,EAAAU,UAAMkQ,KAAIzQ,KAAAC,KAACyQ,IAQvC7O,EAAAtB,UAAAoQ,SAAP,SAAgBC,GACf/Q,EAAAU,UAAMoQ,SAAQ3Q,KAAAC,KAAC2Q,GACf3Q,KAAK+B,YAAc4O,EAAO5O,YAC1B/B,KAAKiC,wBAA0B0O,EAAO1O,wBAClC0O,EAAsB,gBACzB3Q,KAAK2E,aAAegM,EAAOhM,eAWtB/C,EAAAtB,UAAAsQ,sBAAP,SAA6B9F,EAAkB+F,GAA/C,IAAA/Q,EAAAE,KAMC,GAJK6Q,IACJ/F,EAAW9K,KAAK8Q,eAAehG,IAG5B9K,KAAKsC,YAAa,CACrB,IAGIyO,EADAC,EAFajO,EAAA,MAAY/C,KAAKqN,eAAevC,GAAW9K,KAAK2E,aAAaxC,SAAU,EAAGnC,KAAK8E,mBAEpEnE,UA2B5B,GAxBAX,KAAKqF,OAAOgB,KAAK,SAAChB,GACjB,GAAGA,EAAOE,UAAYzF,EAAK,CAC1B,IAAI4C,EAAW5C,EAAK6P,kBAAkBtK,EAAQyF,GAAU,GACxD,GAAIpI,EAAU,CACb,IAAIpB,OAAI,EACJ+D,EAAO4L,OAASnR,IACnBwB,EAAOoB,EAASwO,OAEb7L,EAAO8L,OAASrR,IACnBwB,EAAOoB,EAAS0O,OAGZL,EAIA/N,KAAKwL,IAAIuC,EAAYpQ,UAAYqQ,GAAchO,KAAKwL,IAAIlN,EAAKX,UAAYqQ,KAC5ED,EAAczP,GAJfyP,EAAczP,MAWdyP,EAAa,CAChB,IAAIM,EAAcN,EAAYpQ,UAC9BoQ,EAAchO,EAAA,MAAY,IAAI8B,KAAKwM,GAAcrR,KAAK2E,aAAaxC,SAAUnC,KAAK2E,aAAavC,MAAOpC,KAAK8E,mBAC3GuM,EAAcN,EAAYpQ,UAC1BoQ,EAAc,IAAIlM,KAAKkM,EAAYpQ,UAAYX,KAAKiE,aAAe,GACnE6G,EAAW9K,KAAK2M,eAAeoE,GAE/B,IAAIO,KAEJtR,KAAKqF,OAAOgB,KAAK,SAAChB,GACjB,IAAI3C,EAAW2C,EAAOyB,gBAAgBC,OAAOjH,EAAKwG,KAAKS,OAAOsK,EAAY/J,YACtEwF,EAAQzH,EAAOkM,sBAAsB7O,GACrCoK,EACHwE,EAAaE,MAAOnM,OAAQA,EAAQyH,MAAOA,IAG3CzH,EAAOoM,gBAITzR,KAAK0R,MAAMC,mBAAmBL,IAIhC1R,EAAAU,UAAMsQ,sBAAqB7Q,KAAAC,KAAC8K,GAAU,IAUvC1K,OAAAC,eAAWuB,EAAAtB,UAAA,mBAOX,WACC,OAAON,KAAKO,iBAAiB,oBAR9B,SAAuBC,GACtBR,KAAKS,iBAAiB,cAAeD,oCAgBtCJ,OAAAC,eAAWuB,EAAAtB,UAAA,oBAAX,WACC,OAAON,KAAK6C,+CAGdjB,EAtoDA,CAAqEF,EAAA,GA8oDrET,EAAA,EAASC,kBAA4B,SAAIS,EACzCV,EAAA,EAASC,kBAAoC,iBAAIC,sDC/xDjDyQ,EAAA,SAAAhS,GAyBC,SAAAiS,IAAA,IAAA/R,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,oBACjBH,EAAKI,eA6HP,OAzJuCC,EAAA,EAAA0R,EAAAjS,GAqCtCQ,OAAAC,eAAWwR,EAAAvR,UAAA,qBAAX,WACC,GAAIN,KAAKY,KACR,OAAOZ,KAAKY,KAAKkR,gBAAgB9R,KAAKsI,qDAUxClI,OAAAC,eAAWwR,EAAAvR,UAAA,mBAAX,WACC,GAAIN,KAAKY,KACR,OAAOZ,KAAKY,KAAKkR,gBAAgB9R,KAAKqI,mDASxCjI,OAAAC,eAAWwR,EAAAvR,UAAA,qBAYX,WACC,OAAON,KAAKO,iBAAiB,sBAb9B,SAAyBC,GACpBR,KAAKS,iBAAiB,gBAAiBD,IACtCR,KAAKY,OACRZ,KAAKY,KAAKmR,sBACV/R,KAAKY,KAAKE,qDAiBbV,OAAAC,eAAWwR,EAAAvR,UAAA,mBAYX,WACC,OAAON,KAAKO,iBAAiB,oBAb9B,SAAuBC,GAClBR,KAAKS,iBAAiB,cAAeD,IACpCR,KAAKY,OACRZ,KAAKY,KAAKmR,sBACV/R,KAAKY,KAAKE,qDAiBbV,OAAAC,eAAWwR,EAAAvR,UAAA,kBAYX,WACC,IAAI0R,EAAmBhS,KAAKO,iBAAiB,iBAC7C,OAAIyR,EACIhS,KAAKY,KAAKqR,gBAAgBD,GAG1BhS,KAAKO,iBAAiB,mBAlB/B,SAAsBC,GACjBR,KAAKS,iBAAiB,aAAcD,IACnCR,KAAKY,OACRZ,KAAKY,KAAKmR,sBACV/R,KAAKY,KAAKE,qDAwBbV,OAAAC,eAAWwR,EAAAvR,UAAA,gBAYX,WACC,IAAI0R,EAAmBhS,KAAKO,iBAAiB,eAC7C,OAAIyR,EACIhS,KAAKY,KAAKqR,gBAAgBD,GAG1BhS,KAAKO,iBAAiB,iBAlB/B,SAAoBC,GACfR,KAAKS,iBAAiB,WAAYD,IACjCR,KAAKY,OACRZ,KAAKY,KAAKmR,sBACV/R,KAAKY,KAAKE,qDAmBd+Q,EAzJA,CAAuCK,EAAA,GAiKvCjR,EAAA,EAASC,kBAAqC,kBAAI0Q,kBC3LlDO,EAAA,SAAAvS,GAeC,SAAAwS,IAAA,IAAAtS,EACCF,EAAAG,KAAAC,OAAOA,YANDF,EAAAwP,QAAU,IAAI+C,EAAA,EAA6DvS,GAOjFA,EAAKG,UAAY,uBACjBH,EAAK6J,KAAO,aAEZ7J,EAAKwS,UAAUN,SAAW,EAC1BlS,EAAKwS,UAAUC,YAAc,EAE7BzS,EAAKI,eAuCP,OA9D0CC,EAAA,EAAAiS,EAAAxS,GA+BzCQ,OAAAC,eAAW+R,EAAA9R,UAAA,gBAOX,WACC,OAAIN,KAAKsP,QAAQkD,UAAU,YACnBxS,KAAKsP,QAAQC,MAAM,WAAYvP,KAAKyS,WAAqB,UAE1DzS,KAAKyS,WAAqB,cAXlC,SAAoBjS,GACnBR,KAAK0S,YAAY,WAAYlS,oCAoB9BJ,OAAAC,eAAW+R,EAAA9R,UAAA,mBAOX,WACC,OAAON,KAAKyS,WAAwB,iBARrC,SAAuBjS,GACtBR,KAAK0S,YAAY,cAAelS,oCASlC4R,EA9DA,CAA0CO,EAAA,GAoJ1CC,EAAA,SAAAhT,GAwDC,SAAAiT,IAAA,IAAA/S,EAGCF,EAAAG,KAAAC,OAAOA,YAdDF,EAAAgT,oBAA6D,IAAI9Q,EAAA,EAevElC,EAAKG,UAAY,eAGjBH,EAAK0C,cAAgB,WAErB1C,EAAKiT,cAAgBjT,EAAK4D,iBAC1B5D,EAAKiT,cAAcpQ,UAAY7C,EAC/BA,EAAKkT,WAAWxB,KAAK1R,EAAKiT,eAI1BjT,EAAKI,eA2zBP,OAl4ByEC,EAAA,EAAA0S,EAAAjT,GAiF9DiT,EAAAvS,UAAAoD,eAAV,WACC,OAAO,IAAIyO,GAQFU,EAAAvS,UAAAqD,gBAAV,WACC,OAAO,IAAIiO,GASLiB,EAAAvS,UAAA2S,kBAAP,eAAAnT,EAAAE,KAECJ,EAAAU,UAAM2S,kBAAiBlT,KAAAC,MAEvBoF,EAAA,KAAWpF,KAAKkT,QAAQ5N,WAAY,SAACD,GACpC,GAAKA,EAAO4L,iBAAiB4B,GAAkBxN,EAAO8L,iBAAiB0B,EACtExN,EAAO8N,0BAEH,CAOJ,IANA,IAAIC,OAAmB,EACnBC,OAAkB,EAElB3N,EAAa5F,EAAKwT,gBAAgBxT,EAAK+D,OACvCkC,EAAWjG,EAAKwT,gBAAgBxT,EAAKgE,KAEjCyP,EAAI7N,EAAY6N,GAAKxN,EAAUwN,IAAI,CAC1C,IAAI7Q,EAAW5C,EAAK6F,UAAU4G,SAASgH,GACvC,GAAG7Q,EAAS,CACX,IAAI8Q,EAAM1T,EAAK2T,uBAAuBpO,EAAQ3C,EAASsP,UACpDwB,IACGJ,IACJA,EAAsBI,GAGnBJ,GAAuBI,EAAIpH,MAAQgH,EAAoBhH,QAC1DgH,EAAsBI,IAIxB,IAAIE,EAAM5T,EAAK6T,sBAAsBtO,EAAQ3C,EAASsP,UACnD0B,IACGL,IACJA,EAAqBK,GAGlBL,GAAsBK,EAAItH,MAAQiH,EAAmBjH,QACxDiH,EAAqBK,KAMrBN,EACH/N,EAAOK,WAAa0N,EAAoBhH,MAGxC/G,EAAOxB,MAAQ/D,EAAK+D,MAEjBwP,EACHhO,EAAOU,SAAWsN,EAAmBjH,MAAQ,EAG7C/G,EAAOvB,IAAMhE,EAAKgE,IAIfhE,EAAK0H,WAAWS,OAAS,GAC5B5C,EAAO8N,0BAYJN,EAAAvS,UAAAsT,SAAP,eAAA9T,EAAAE,KAECJ,EAAAU,UAAMsT,SAAQ7T,KAAAC,MAEd,IAAI6T,EAAoB7T,KAAK2F,UAAUsC,OAEnCvC,EAAa0E,EAAA,WAAiBpH,KAAKmC,MAAMnF,KAAK6D,MAAQgQ,EAAY,GAAI,EAAGA,GACzE9N,EAAWqE,EAAA,WAAiBpH,KAAKiC,KAAKjF,KAAK8D,IAAM+P,GAAY,EAAGA,GAEhE7T,KAAKgK,SAAS8J,SACjB9T,KAAKgK,SAAS4J,WAIf,IAAIG,EAAmB/T,KAAKgK,SAASgK,WAAahU,KAAKgK,SAASO,gBAC5D0J,EAAoBjR,KAAKE,IAAIlD,KAAK2F,UAAUsC,OAAQjF,KAAKiC,MAAMc,EAAWL,GAAcqO,IAa5F,GAXA/T,KAAKkU,YAAclR,KAAKmC,MAAMO,EAAauO,GAAaA,EACxDjU,KAAKmU,UAAYnR,KAAKiC,KAAKjF,KAAK8D,IAAM+P,GAEtC7T,KAAKgI,gBAEDhI,KAAKkU,aAAelU,KAAKmU,WAC5BnU,KAAKmU,YAGNnU,KAAKoU,WAAaH,IAEdjU,KAAKgU,YAAc,GAAvB,CAIAhU,KAAKkE,cAAgBlE,KAAK2F,UAAUsC,OAChCjI,KAAK2F,UAAUsC,QAAU,IAC5BjI,KAAKkE,cAAgB,GAGtBlE,KAAKuJ,iBAKL7D,EAAa0E,EAAA,IAAU,EAAGpK,KAAKkU,YAAclU,KAAKoU,YAClDrO,EAAWqE,EAAA,IAAUpK,KAAK2F,UAAUsC,OAAQjI,KAAKmU,UAAYnU,KAAKoU,YAIlE,IAFA,IAAIC,EAAY,EAEPd,EAAI,EAAGA,EAAI7N,EAAY6N,IAAK,EAChC7Q,EAAW1C,KAAK2F,UAAU4G,SAASgH,IAC9BnQ,YAAa,EAGdmQ,EAAIxN,EAAb,IAAK,IAAkBuO,EAAMtU,KAAK2F,UAAUsC,OAAQsL,EAAIe,EAAKf,IAAK,EAC7D7Q,EAAW1C,KAAK2F,UAAU4G,SAASgH,IAC9BnQ,YAAa,EAGvB,IAASmQ,EAAI7N,EAAY6N,EAAIxN,EAAUwN,IACtC,GAAIA,EAAIvT,KAAK2F,UAAUsC,OAAQ,CAC9B,IAAIvF,EAA8B1C,KAAK2F,UAAU4G,SAASgH,GAC1D,GAAIA,EAAIvT,KAAKoU,YAAcpR,KAAKC,MAAMsQ,EAAIvT,KAAKoU,YACXpU,KAAKgJ,UAAUuK,KAEjDvT,KAAK6J,eAAenH,GACpB1C,KAAK8J,oBAAoBpH,EAAU2R,IAGpCA,SAIArU,KAAK8J,oBAAoBpH,EAAU2R,GACnC3R,EAASU,YAAa,EAKzBpD,KAAK6J,eAAe7J,KAAK+S,eACzB/S,KAAK8J,oBAAoB9J,KAAK+S,cAAesB,EAAY,EAAGrU,KAAK2F,UAAUsC,QAE1DjI,KAAKwH,WAEXnB,KAAK,SAACqB,GAChB,IAAIY,EAA6BZ,EAAUY,mBACvCD,EAA2BX,EAAUW,iBAEzC,GAAI+B,EAAA,WAAkBvG,MAAOyE,EAAoBxE,IAAKuE,IAAsBxE,MAAO/D,EAAKoU,YAAapQ,IAAKhE,EAAKqU,YAK9G,IAHA,IAAII,EAAoBnK,EAAA,WAAiBpH,KAAKiC,KAAKnF,EAAKsU,WAAa1M,EAAUuC,WAAY,EAAG5B,EAAmBC,GAC7GkM,EAAY,EAEPC,EAAInM,EAAoBmM,GAAKpM,EAAkBoM,GAAQF,EAAW,CAC1E,IAAI7R,EAA8B5C,EAAK6F,UAAU4G,SAASkI,GAC1D3U,EAAK+J,eAAenH,GACpB5C,EAAKgK,oBAAoBpH,EAAU8R,GACnCA,OAKHxU,KAAK0U,iBACL1U,KAAK2U,qBAEL3U,KAAK4U,WAAW/T,aAChBb,KAAKgK,SAAS6K,qBAWRhC,EAAAvS,UAAAwJ,oBAAP,SAA2BpH,EAA6B2R,EAAoBjI,GAC3ExM,EAAAU,UAAMwJ,oBAAmB/J,KAAAC,KAAC0C,GAI1B,IAAIsH,EAAyBhK,KAAKgK,SAC7B/D,EAAA,SAAemG,KACnBA,EAAQpM,KAAKiS,gBAAgBvP,EAASsP,WAGvC,IAAIjM,EAAW/F,KAAKiS,gBAAgBvP,EAAS6P,aAExCtM,EAAA,SAAeF,KACnBA,EAAWqG,GAGZ,IAKI0I,EACAC,EACA/J,EAPAF,EAAmB9K,KAAK8R,gBAAgB1F,EAAO1J,EAAS4P,UAAUN,UAClE7J,EAAsBnI,KAAK8R,gBAAgB/L,EAAUrD,EAAS4P,UAAUC,aAE5E7P,EAASoI,SAAWA,EAMhBpI,EAASuI,UACZ6J,EAAe/O,EACfgP,EAAe/U,KAAK8R,gBAAgB1F,EAAO1J,EAAS4P,UAAUN,UAC9DhH,EAAkBhL,KAAK8R,gBAAgBgD,EAAcpS,EAAS4P,UAAUC,cAGzE7P,EAASoK,MAAQ9C,EAAS+C,gBAAgBjC,GAE1C,IAAII,EAAiBxI,EAASwI,KAC1BA,IAASA,EAAKC,UACjBnB,EAASoB,kBAAkBF,EAAMJ,EAAU3C,GAG5C,IAAIkD,EAAa3I,EAAS2I,KACtBA,IAASA,EAAKF,UACjBnB,EAASsB,kBAAkBD,EAAMP,EAAU3C,GAI5C,IAAIuD,EAAmBhJ,EAASgJ,MAC5BA,IAAUA,EAAMP,WAEdzI,EAASuI,cAAyBpD,GAAd6D,EAAM/B,OAC9BjH,EAASiH,KAAOjH,EAASiH,MAG1BK,EAAS6B,mBAAmBH,EAAOZ,EAAU3C,IAEzCzF,EAASgJ,MAAMsJ,cAAgBhV,KAAK4U,WAAWI,eAAiBtS,EAASgJ,MAAMuJ,eAAiBjV,KAAK4U,WAAWK,kBACnHjV,KAAK4U,WAAWjL,KAAOjH,EAASgJ,MAAMwJ,cAIxC,IAAI3J,EAAiB7I,EAASS,SAC1BoI,IAASA,EAAKJ,WAEZzI,EAASuI,UACb6J,EAAe1I,EAAQpM,KAAKoU,WAC5BW,EAAe/U,KAAK8R,gBAAgB1F,EAAOb,EAAKK,UAChDZ,EAAkBhL,KAAK8R,gBAAgBgD,EAAcvJ,EAAKK,WAG3D5B,EAASwB,kBAAkBD,EAAMwJ,EAAc/J,GAC1CtI,EAASuI,SACbjL,KAAKyC,SAASC,EAAU2R,IAK1B,IAAI5I,EAAiB/I,EAAS+I,KAC1BA,GACHzB,EAASwB,kBAAkBC,EAAMsJ,EAAc/J,IAW1C6H,EAAAvS,UAAA6U,gBAAP,SAAuBzS,EAA6B0S,GAEnDxV,EAAAU,UAAM6U,gBAAepV,KAAAC,KAAC0C,EAAU0S,GAEhC,IAAIC,EAAyCrV,KAAK8S,oBAAoB/L,OAAOrE,EAASsP,UAClFqD,GAAoBA,GAAoB3S,GAC3C1C,KAAK2F,UAAU2P,OAAOD,GAGvBrV,KAAK8S,oBAAoBvP,OAAOb,EAASsP,SAAUtP,IAa7CmQ,EAAAvS,UAAAwR,gBAAP,SAAuB1F,EAAeR,GAChC3F,EAAA,SAAe2F,KACnBA,EAAW,IAGZ,IAAIlG,EAAqB1F,KAAK0F,WAC1BK,EAAmB/F,KAAK+F,SAExBwI,EAAqBvO,KAAKuE,iBAAiBmB,EAAYK,GAEvDkG,EAAgBjM,KAAKiM,cAGzBsC,GAActC,EACdsC,GAAe,EAHGvO,KAAKmM,YAKvB,IAAI3E,EAAaxH,KAAKwH,WAiCtB,OA/BApC,EAAA,aAAmBoC,EAAWlC,WAAY,SAACoC,GAC1C,IAAI6N,EAA0B7N,EAAUY,mBACpCkN,EAAwB9N,EAAUW,iBAEtC,GAAI+D,EAAQ1G,EACX,OAAO,EAGR,GAAI0E,EAAA,WAAkBvG,MAAO0R,EAAiBzR,IAAK0R,IAAmB3R,MAAO6B,EAAY5B,IAAKiC,IAAa,CAC1GwP,EAAkBvS,KAAKgB,IAAI0B,EAAY6P,GACvCC,EAAgBxS,KAAKE,IAAI6C,EAAUyP,GAEnC,IAAIvL,EAAoBvC,EAAUuC,UAG9BmC,EAAQoJ,EACX9P,IAAe8P,EAAgBD,IAAoB,EAAItL,GAG/CmC,EAAQmJ,IAKhBnJ,EAAQmJ,GAAmBnJ,EAAQmJ,GAAmBtL,GAIxD,OAAO,IAGDG,EAAA,OAAagC,EAAQR,EAAWK,EAAgBvG,GAAc6I,EAAY,IAa3EsE,EAAAvS,UAAAmV,mBAAP,SAA0BzD,EAAkBpG,GAC3C,IAAIQ,EAAgBpM,KAAKiS,gBAAgBD,GACzC,OAAOhS,KAAK8R,gBAAgB1F,EAAOR,IAY7BiH,EAAAvS,UAAAoV,gBAAP,SAAuB1D,EAAkBpG,GACxC,IAAId,EAAW9K,KAAKyV,mBAAmBzD,EAAUpG,GAC7CkB,EAAQ9M,KAAKgK,SAAS+C,gBAAgBjC,GACtCkC,EAAQhN,KAAKgK,SAASiD,gBAAgBnC,GAC1C,OAASjF,EAAGiH,EAAMjH,EAAGqH,EAAGJ,EAAMI,EAAGF,MAAOA,IAazC6F,EAAAvS,UAAA6M,WAAA,SAAW6E,EAAkBpG,GAC5B,OAAO5L,KAAK0V,gBAAgB1D,EAAUpG,IAahCiH,EAAAvS,UAAAsM,cAAP,SAAqBoF,EAAkBpG,GACtC,OAAO5L,KAAKyV,mBAAmBzD,EAAUpG,IASnCiH,EAAAvS,UAAA2R,gBAAP,SAAuBD,GACtB,GAAI/L,EAAA,SAAe+L,GAAW,CAC7B,IAAItP,EAA8B1C,KAAK8S,oBAAoB/L,OAAOiL,GAClE,GAAItP,EACH,OAAOA,EAAS0J,QAWZyG,EAAAvS,UAAAqV,iBAAP,SAAwBC,EAAuBrD,GAC9CvS,KAAK6V,cAAc7V,KAAKiS,gBAAgB2D,GAAgB5V,KAAKiS,gBAAgBM,GAAe,IActFM,EAAAvS,UAAAwV,gBAAP,SAAuBjS,EAAeC,EAAamI,EAAkCE,GACpF,IAAI4J,EAAmB/V,KAAKyV,mBAAmB5R,EAAOoI,GAClD+J,EAAiBhW,KAAKyV,mBAAmB3R,EAAKqI,GAClD,OAAOnM,KAAKiW,qBAAqBF,EAAUC,IAWrCnD,EAAAvS,UAAAkP,cAAP,SAAqB1E,EAAkBc,GACtC,IAAIQ,EAAgBpM,KAAKsT,gBAAgBxI,GACzC,OAAO9K,KAAK8R,gBAAgB1F,EAAOR,IAS7BiH,EAAAvS,UAAAmT,uBAAP,SAA8BpO,EAAkB2M,GAE/C,IAAK,IAAIuB,EAAI,EAAGA,EAAIlO,EAAOM,UAAUsC,OAAQsL,IAAK,CACjD,IAAI7Q,EAAW2C,EAAOM,UAAU4G,SAASgH,GACzC,GAAIlO,EAAO4L,OAASjR,MACf0C,EAASwT,WAAalE,EACzB,OAAOtP,EAGT,GAAI2C,EAAO8L,OAASnR,MACf0C,EAASyT,WAAanE,EACzB,OAAOtP,IAYJmQ,EAAAvS,UAAAqT,sBAAP,SAA6BtO,EAAkB2M,GAE9C,IAAK,IAAIuB,EAAIlO,EAAOM,UAAUsC,OAAS,EAAGsL,GAAK,EAAGA,IAAK,CACtD,IAAI7Q,EAAW2C,EAAOM,UAAU4G,SAASgH,GACzC,GAAIlO,EAAO4L,OAASjR,MACf0C,EAASwT,WAAalE,EACzB,OAAOtP,EAGT,GAAI2C,EAAO8L,OAASnR,MACf0C,EAASyT,WAAanE,EACzB,OAAOtP,IAgBJmQ,EAAAvS,UAAAqP,kBAAP,SAAyBtK,EAAkByF,EAAkB8E,GAA7D,IAAA9P,EAAAE,KAEC,GAAIiG,EAAA,SAAe6E,GAAW,CAE7B,IAAIsL,EAAQpW,KAAKsT,gBAAgBxI,GAE7BpI,EAAW1C,KAAK2F,UAAU4G,SAAS6J,GAEvC,GAAI1T,EAAU,CACb,IACI2T,EADAC,EAAW5T,EAASsP,SAGpBuE,EAAiBlR,EAAOM,UAAU4G,SAAS6J,GAC/C,GAAGG,EAAe,CACjB,GAAIlR,EAAO4L,OAASjR,MACfuW,EAAeL,WAAaI,EAC/B,OAAOC,EAGT,GAAIlR,EAAO8L,OAASnR,MACfuW,EAAeJ,WAAaG,EAC/B,OAAOC,EAmCV,OA7BAlR,EAAOM,UAAUU,KAAK,SAAC3D,GAClB2C,EAAO4L,OAASnR,GACf4C,EAASwT,WAAaI,IACrBD,IACHA,EAAM3T,GAEJM,KAAKwL,IAAI4H,EAAQC,EAAIjK,OAASpJ,KAAKwL,IAAI4H,EAAQ1T,EAAS0J,SAC1DiK,EAAM3T,IAKL2C,EAAO8L,OAASrR,GACf4C,EAASyT,WAAaG,IACrBD,IACHA,EAAM3T,GAEJM,KAAKwL,IAAI4H,EAAQC,EAAIjK,OAASpJ,KAAKwL,IAAI4H,EAAQ1T,EAAS0J,SAC1DiK,EAAM3T,MAWH2T,KAeHxD,EAAAvS,UAAAiN,KAAP,SAAY7K,EAA4BuE,EAAc2E,GACrD,IAAId,EAIJ,OAHI7E,EAAA,SAAegB,KAClB6D,EAAW9K,KAAKyV,mBAAmB/S,EAAS8T,WAAWvP,GAAM2E,IAE1D3F,EAAA,MAAY6E,GACR9K,KAAKyW,UAAU5Q,EAGf7F,KAAKgK,SAAS+C,gBAAgBjC,GAAUjF,GAc1CgN,EAAAvS,UAAAoN,KAAP,SAAYhL,EAA4BuE,EAAc2E,GACrD,IAAId,EAIJ,OAHI7E,EAAA,SAAegB,KAClB6D,EAAW9K,KAAKyV,mBAAmB/S,EAAS8T,WAAWvP,GAAM2E,IAE1D3F,EAAA,MAAY6E,GACR9K,KAAKyW,UAAUvJ,EAGflN,KAAKgK,SAAS+C,gBAAgBjC,GAAUoC,GAe1C2F,EAAAvS,UAAAuN,SAAP,SAAgBnL,EAA4BuE,EAAa2E,EAAmBkC,GAC3E,OAAO9N,KAAKiN,gBAAgBjN,KAAKyV,mBAAmB/S,EAAS8T,WAAWvP,GAAM2E,KAYxEiH,EAAAvS,UAAAmP,qBAAP,SAA4B3E,GAC3B,OAAO9K,KAAKwP,cAAc1E,EAAU,IAY9B+H,EAAAvS,UAAAoP,mBAAP,SAA0B5E,GACzB,OAAO9K,KAAKwP,cAAc1E,EAAU,IAW9B+H,EAAAvS,UAAA4O,eAAP,SAAsBpE,GACrB,IAAIpI,EAA8B1C,KAAK2F,UAAU4G,SAASvM,KAAKsT,gBAAgBxI,IAC/E,GAAIpI,EACH,OAAO1C,KAAKsP,QAAQC,MAAM,iBAAkB7M,EAASsP,WAWhDa,EAAAvS,UAAAgT,gBAAP,SAAuBxI,IACtBA,EAAWV,EAAA,MAAYU,EAAU,KAClB,IACdA,EAAW,GAGZ,IAAIpF,EAAqB1F,KAAK0F,WAC1BK,EAAmB/F,KAAK+F,SACxBwI,EAAqBxI,EAAWL,EAEhC8B,EAAaxH,KAAKwH,WAElB4E,EAAgB,KA0CpB,OAvCAhH,EAAA,aAAmBoC,EAAWlC,WAAY,SAACoC,GAC1C,IAAIgP,EAA6BhP,EAAUU,cACvCuO,EAA2BjP,EAAUS,YAErCoN,EAA0B7N,EAAUY,mBACpCkN,EAAwB9N,EAAUW,iBAEtCkN,EAAkBnL,EAAA,IAAUmL,EAAiB7P,GAC7C8P,EAAgBpL,EAAA,IAAUoL,EAAezP,GAEzC,IAAIkE,EAAoBvC,EAAUuC,UAKlC,GAHAsE,IAAeiH,EAAgBD,IAAoB,EAAItL,GAGnDa,EAAW6L,EACdjR,IAAe8P,EAAgBD,IAAoB,EAAItL,QAGnD,KAAIa,EAAW4L,GAIf,CACJ,IAAIE,GAAiB9L,EAAW4L,IAAuBC,EAAmBD,GAE1E,OADAtK,EAAQmJ,EAAkBvS,KAAKC,MAAM2T,GAAiBpB,EAAgBD,KAC/D,EAGR,OAAO,IAGHtP,EAAA,SAAemG,KACnBA,EAAQpJ,KAAKmC,MAAM2F,EAAWyD,EAAa7I,IAExC0G,GAASrG,GACZqG,IAGMA,GAeDyG,EAAAvS,UAAA+O,iBAAP,SAAwBvE,GACvB,IAAIpI,EAA8B1C,KAAK2F,UAAU4G,SAASvM,KAAKsT,gBAAgBxI,IAC/E,GAAIpI,EACH,OAAOA,EAASsP,UAUlB5R,OAAAC,eAAWwS,EAAAvS,UAAA,iBAAX,WAGC,OAAON,KAAKgK,SAAS+C,gBAAgB,oCAQ/B8F,EAAAvS,UAAAyP,aAAP,WACCnQ,EAAAU,UAAMyP,aAAYhQ,KAAAC,MAEHA,KAAKgK,SACXkG,SAAS/E,UAAW,GAa9B/K,OAAAC,eAAWwS,EAAAvS,UAAA,iBAAX,WACC,OAAON,KAAKoU,4CAEdvB,EAl4BA,CAAyEF,EAAA,GA04BzE1R,EAAA,EAASC,kBAAgC,aAAI0R,EAC7C3R,EAAA,EAASC,kBAAwC,qBAAIiR,8ECvhCrD0E,EAAA,SAAAjX,GAsCC,SAAAkX,IAAA,IAAAhX,EACCF,EAAAG,KAAAC,OAAOA,YAEPF,EAAKG,UAAY,mBAEjBH,EAAKuB,OAAO0V,QAAWpJ,MAAO,GAC9B7N,EAAKuB,OAAO2V,QAAWrJ,MAAO,GAC9B7N,EAAKuB,OAAO4V,cACZnX,EAAKuB,OAAO6V,cAEZpX,EAAKuB,OAAO6P,SACZpR,EAAKuB,OAAO+P,SACZtR,EAAKuB,OAAO8V,aACZrX,EAAKuB,OAAO+V,aAEZtX,EAAKuX,YAAY,QAAS,GAAK,GAC/BvX,EAAKuX,YAAY,QAAS,GAAK,GAE/BvX,EAAKuX,YAAY,YAAa,GAAK,GACnCvX,EAAKuX,YAAY,YAAa,GAAK,GAEnCvX,EAAKI,eA8QP,OAzUsCC,EAAA,EAAA2W,EAAAlX,GAmErCQ,OAAAC,eAAWyW,EAAAxW,UAAA,cAOX,WACC,OAAON,KAAKqB,OAAO0V,OAAOvW,WAR3B,SAAkBA,GACjBR,KAAKsX,SAAS,SAAU9W,oCAezBJ,OAAAC,eAAWyW,EAAAxW,UAAA,cAOX,WACC,OAAON,KAAKqB,OAAO2V,OAAOxW,WAR3B,SAAkBA,GACjBR,KAAKsX,SAAS,SAAU9W,oCAezBJ,OAAAC,eAAWyW,EAAAxW,UAAA,aAOX,WACC,OAAON,KAAKmH,QAAQ,cARrB,SAAiB7F,GAChBtB,KAAKyB,QAAQ,QAASH,oCAevBlB,OAAAC,eAAWyW,EAAAxW,UAAA,aAOX,WACC,OAAON,KAAKmH,QAAQ,cARrB,SAAiB7F,GAChBtB,KAAKyB,QAAQ,QAASH,oCAevBlB,OAAAC,eAAWyW,EAAAxW,UAAA,iBAOX,WACC,OAAON,KAAKwW,WAAWN,eARxB,SAAqBlE,GACpBhS,KAAKuX,YAAY,YAAavF,oCAe/B5R,OAAAC,eAAWyW,EAAAxW,UAAA,iBAOX,WACC,OAAON,KAAKwW,WAAWL,eARxB,SAAqBnE,GACpBhS,KAAKuX,YAAY,YAAavF,oCAe/B5R,OAAAC,eAAWyW,EAAAxW,UAAA,kBAOX,WACC,OAAON,KAAKqB,OAAO4V,WAAWzW,WAR/B,SAAsBA,GACrBR,KAAKsX,SAAS,aAAc9W,oCAe7BJ,OAAAC,eAAWyW,EAAAxW,UAAA,kBAOX,WACC,OAAON,KAAKqB,OAAO6V,WAAW1W,WAR/B,SAAsBA,GACrBR,KAAKsX,SAAS,aAAc9W,oCAe7BJ,OAAAC,eAAWyW,EAAAxW,UAAA,iBAOX,WACC,OAAON,KAAKmH,QAAQ,kBARrB,SAAqB7F,GACpBtB,KAAKyB,QAAQ,YAAaH,oCAe3BlB,OAAAC,eAAWyW,EAAAxW,UAAA,iBAOX,WACC,OAAON,KAAKmH,QAAQ,kBARrB,SAAqB7F,GACpBtB,KAAKyB,QAAQ,YAAaH,oCAe3BlB,OAAAC,eAAWyW,EAAAxW,UAAA,qBAOX,WACC,OAAON,KAAKwW,WAAWgB,mBARxB,SAAyBxF,GACxBhS,KAAK0S,YAAY,gBAAiBV,oCAenC5R,OAAAC,eAAWyW,EAAAxW,UAAA,qBAOX,WACC,OAAON,KAAKwW,WAAWiB,mBARxB,SAAyBzF,GACxBhS,KAAK0S,YAAY,gBAAiBV,oCAmB5B8E,EAAAxW,UAAAoX,OAAP,SAAcC,EAAkBC,EAAmBC,GAAnD,IAEK3U,EAFLpD,EAAAE,KAwBC,OApBKiG,EAAA,SAAe4R,KACnBA,EAAa,GAGdC,EAAA,KAAYH,EAAQ,SAAClH,GACpB,IAAIjQ,EAGHA,EADGoX,EACK9X,EAAKiY,gBAAgBtH,GAGrB3Q,EAAK8N,SAAS6C,KAGvBjQ,GAASqX,GAEG3U,IAAQ+C,EAAA,SAAe/C,MAClCA,EAAM1C,KAGD0C,GAaD4T,EAAAxW,UAAA0X,OAAP,SAAcL,EAAkBC,EAAmBC,GAAnD,IAEK7T,EAFLlE,EAAAE,KAyBC,OArBKiG,EAAA,SAAe4R,KACnBA,EAAa,GAGdC,EAAA,KAAYH,EAAQ,SAAClH,GACpB,IAAIjQ,EAGHA,EADGoX,EACK9X,EAAKiY,gBAAgBtH,GAGrB3Q,EAAK8N,SAAS6C,KAGvBjQ,GAASqX,GAEG7T,IAAQiC,EAAA,SAAejC,MAClCA,EAAMxD,KAIDwD,GAIT8S,EAzUA,CAAsCmB,EAAA,GAsftCC,EAAA,SAAAtY,GA4IC,SAAAuY,IAAA,IAAArY,EACCF,EAAAG,KAAAC,OAAOA,YA/GEF,EAAAsY,OAAS,IAAIC,EAAA,EAKbvY,EAAAwY,OAAS,IAAID,EAAA,EAwEbvY,EAAAyY,iBAOAzY,EAAA0Y,iBAoBH1Y,EAAA6G,iBAQN7G,EAAKG,UAAY,WACjBH,EAAK2Y,YAAa,EAElB3Y,EAAK4Y,sBAAuB,EAE5B5Y,EAAK6Y,cAAclN,KAAO,IAAImN,EAAA,EAC9B9Y,EAAK6Y,cAAclN,KAAKoN,WAAW/Y,EAAKgZ,MAAMC,IAAI,SAElDjZ,EAAKkZ,SAAU,EACflZ,EAAKwC,aAAc,EAEnBxC,EAAKmZ,QAAQC,mBAAqB,aAElCpZ,EAAKmZ,QAAQE,OAAOC,GAAG,SAAU,WAChCtZ,EAAKuZ,iCACHxR,GAAW,GAEd/H,EAAKkT,WAAWxB,KAAK1R,EAAKsY,QAC1BtY,EAAKkT,WAAWxB,KAAK1R,EAAKwY,QAE1BxY,EAAKI,eAgvCP,OAl5C8BC,EAAA,EAAAgY,EAAAvY,GAyKnBuY,EAAA7X,UAAA+C,sBAAV,WACCzD,EAAAU,UAAM+C,sBAAqBtD,KAAAC,MACtBiG,EAAA,SAAejG,KAAKsZ,eACxBtZ,KAAKsZ,YAActZ,KAAKwD,SAASC,UAAU,gBAUnC0U,EAAA7X,UAAAoD,eAAV,WACC,OAAO,IAAImT,GAMLsB,EAAA7X,UAAAiZ,iBAAP,WACCvZ,KAAKwZ,MAAM/R,QACXzH,KAAKyZ,MAAMhS,QAEXzH,KAAK0Z,MAAMjS,QACXzH,KAAK2Z,MAAMlS,QAGPzH,KAAKiR,OACRjR,KAAKiR,MAAM1K,uBAAuBvG,MAG/BA,KAAKmR,OACRnR,KAAKmR,MAAM5K,uBAAuBvG,OAS7BmY,EAAA7X,UAAA0F,aAAP,WAWC,GAVAhG,KAAK4Z,eAED5Z,KAAK6Z,KAAK5R,OAAS,GACtBjI,KAAKuZ,mBAGN3Z,EAAAU,UAAM0F,aAAYjG,KAAAC,MAElBA,KAAK8Z,wBAEA7T,EAAA,SAAejG,KAAK+Z,WAAsC/Z,KAAKga,YAAc/T,EAAA,SAAejG,KAAK+Z,WAAsC/Z,KAAKia,UAChJ,MAAMC,MAAM,4BAA+Bla,KAAKma,KAAOna,KAAKma,KAAOna,KAAKsG,KAAO,gCAWvE6R,EAAA7X,UAAA6U,gBAAV,SAA0BzS,EAA6B0S,GAEtD,IACCxV,EAAAU,UAAM6U,gBAAepV,KAAAC,KAAC0C,EAAU0S,GAEhC1S,EAASyW,OAAOiB,UAChBpa,KAAKiR,MAAMhD,sBAAsBvL,EAAU,KAC3C1C,KAAKmR,MAAMlD,sBAAsBvL,EAAU,KAE3CA,EAASyW,OAAOkB,SAEhBra,KAAKsa,wBAAwB5X,GAE9B,MAAO6X,GACNva,KAAKwa,OAAOC,mBAAmBF,KAWvBpC,EAAA7X,UAAAga,wBAAV,SAAkC5X,KAO3ByV,EAAA7X,UAAAoa,YAAP,WAEC,GADA9a,EAAAU,UAAMoa,YAAW3a,KAAAC,MACbA,KAAKiR,MAAO,CACf,IAAI0J,EAAa3a,KAAK8G,gBAAgBC,OAAO/G,KAAKiR,MAAM3K,KACpDqU,GACHA,EAAWlT,QAGb,GAAIzH,KAAKmR,MAAO,CACf,IAAIyJ,EAAa5a,KAAK8G,gBAAgBC,OAAO/G,KAAKmR,MAAM7K,KACpDsU,GACHA,EAAWnT,UAUJ0Q,EAAA7X,UAAAsZ,aAAV,WACC,IAAI3I,EAAcjR,KAAKiR,MACnBE,EAAcnR,KAAKmR,MAEnB0J,EAAyB5J,EAAMzO,cAC/BsY,EAA8ED,EAAiB,IAC/FE,EAAkF,OAASC,EAAA,WAAkBH,GAAkB,IAE/HI,EAAyB9J,EAAM3O,cAC/B0Y,EAA8ED,EAAiB,IAC/FE,EAAkF,OAASH,EAAA,WAAkBC,GAAkB,IAEnIjb,KAAKga,QAAUc,EACf9a,KAAKia,QAAUiB,EAEXlb,KAAK+Z,WAAWgB,KACnB/a,KAAKob,YAAcL,GAGhB/a,KAAK+Z,WAAWoB,KACnBnb,KAAKqb,YAAcF,GAGfnb,KAAK+Z,WAAWoB,IAAenb,KAAKuF,UAAYvF,KAAKmR,QACzDnR,KAAKqb,YAAcH,GAGflb,KAAK+Z,WAAWgB,IAAe/a,KAAKuF,UAAYvF,KAAKiR,QACzDjR,KAAKob,YAAcN,GAGhB9a,KAAKgZ,SAAWhZ,KAAKuF,UAAYvF,KAAKiR,QACzCjR,KAAKob,YAAcN,GAGhB9a,KAAKgZ,SAAWhZ,KAAKuF,UAAYvF,KAAKmR,QACzCnR,KAAKqb,YAAcH,GAGflb,KAAKiR,iBAAiB2B,GAAkB5S,KAAKmR,iBAAiByB,IAC7D5S,KAAKqb,cACTrb,KAAKqb,YAAcH,IAIrBlb,KAAKuY,iBACLvY,KAAKwY,iBAELxY,KAAKsb,cAActb,KAAKiR,MAAYjR,KAAKuY,cAAoBvY,KAAKga,SAClEha,KAAKsb,cAActb,KAAKiR,MAAYjR,KAAKuY,cAAoBvY,KAAKob,aAElEpb,KAAKsb,cAActb,KAAKmR,MAAYnR,KAAKwY,cAAoBxY,KAAKia,SAClEja,KAAKsb,cAActb,KAAKmR,MAAYnR,KAAKwY,cAAoBxY,KAAKqb,cAWzDlD,EAAA7X,UAAAgb,cAAV,SAA+D1a,EAAY+W,EAAoBlH,GAC1F7P,aAAgBc,EAAA,GACfuE,EAAA,SAAejG,KAAK+Z,WAAWtJ,MAAqC,GAA1BkH,EAAO4D,QAAQ9K,IAC5DkH,EAAOnG,KAAKf,IAcL0H,EAAA7X,UAAAkb,qBAAV,SAAsE/K,EAAY7P,GAC5EqF,EAAA,SAAejG,KAAK+Z,WAAWtJ,MACnCzQ,KAAK+Z,WAAWtJ,GAAc7P,EAAKmZ,WAAW/H,WAatCmG,EAAA7X,UAAAmb,iBAAV,SAAkEhL,EAAY7P,GACxEqF,EAAA,SAAejG,KAAK+Z,WAAWtJ,MACnCzQ,KAAK+Z,WAAWtJ,GAAc7P,EAAKmZ,WAAWzY,OAOtC6W,EAAA7X,UAAAob,UAAV,WACC9b,EAAAU,UAAMob,UAAS3b,KAAAC,MACfA,KAAK2b,cAQCxD,EAAA7X,UAAAqb,WAAP,WAEC,GAAI3b,KAAK2Y,cAAclN,KAAM,CAC5B,IAAImQ,EAAe5b,KAAK6b,cAGxBzW,EAAA,KAAWpF,KAAK8b,WAAWxW,WAAY,SAACyW,GACnCA,EAAM5Y,SAAS6Y,WAClBD,EAAM5Y,SAASyQ,WACfgI,GAAQG,EAAM5Y,SAAS6Y,YAIzBhc,KAAK2Y,cAAclN,KAAKwQ,KAAOL,IASvBzD,EAAA7X,UAAAub,YAAV,WACC,OAAOK,EAAA,YACNrW,EAAG,EACHqH,EAAG,EACHiP,MAAOnc,KAAKiR,MAAM+C,WAClBoI,OAAQpc,KAAKmR,MAAM6C,cAUdmE,EAAA7X,UAAAmF,aAAP,SAAoB7E,GACnB,OAAIA,GAAQZ,KAAKiR,MACTjR,KAAK8a,OAETla,GAAQZ,KAAKmR,MACTnR,KAAKkb,YADb,GAUM/C,EAAA7X,UAAAsD,kBAAP,WAGC5D,KAAKiR,MAAMvC,qBACX1O,KAAKmR,MAAMzC,qBAEX9O,EAAAU,UAAMsD,kBAAiB7D,KAAAC,MAEvBA,KAAKiR,MAAMzK,6BACXxG,KAAKmR,MAAM3K,8BAQL2R,EAAA7X,UAAA2S,kBAAP,WACKjT,KAAKiR,MAAMoL,kBACdrc,KAAKiR,MAAMgC,oBAGRjT,KAAKmR,MAAMkL,kBACdrc,KAAKmR,MAAM8B,oBAGZrT,EAAAU,UAAM2S,kBAAiBlT,KAAAC,OAQjBmY,EAAA7X,UAAAsT,SAAP,WACK5T,KAAKiR,MAAM6C,SACd9T,KAAKiR,MAAM2C,WAGR5T,KAAKmR,MAAM2C,SACd9T,KAAKmR,MAAMyC,WAGZ5T,KAAKkN,EAAIlN,KAAKmR,MAAMmL,OACpBtc,KAAK6F,EAAI7F,KAAKiR,MAAMsL,OAGpBvc,KAAKwc,cAAe,EACpB,IAAIC,EAA4Bzc,KAAKyc,kBACjCxW,EAAA,SAAewW,IACdzc,KAAKuF,SAASyO,YAAchU,KAAK+F,SAAW/F,KAAK0F,YAAc+W,IAClEzc,KAAKwc,cAAe,GAItB5c,EAAAU,UAAMsT,SAAQ7T,KAAAC,OAQfI,OAAAC,eAAW8X,EAAA7X,UAAA,aAqBX,WACC,GAAIN,KAAK0R,MAAO,CACf,IAAK1R,KAAKoY,OAAOsE,MAAO,CACvB,IAAM9b,EAAOZ,KAAK0R,MAAMiL,MAAMpQ,SAAS,GAEvC,IAAK3L,EACJ,MAAMsZ,MAAM,iCAGbla,KAAKiR,MAAQrQ,EAEd,OAAOZ,KAAKoY,OAAOsE,YAhCrB,SAAiB9b,GAChB,IAAIgc,EAAU5c,KAAKoY,OAAOsE,MACtBE,GAAWhc,IACVgc,IACH5c,KAAK8G,gBAAgB+V,UAAUD,EAAQtW,KAEvCtG,KAAKoY,OAAO0E,UAEZF,EAAQvX,OAAO0X,YAAY/c,OAG5BA,KAAKoY,OAAO4E,IAAIpc,EAAMA,EAAKqc,eAAejd,OAE1CA,KAAK8G,gBAAgBvD,OAAO3C,EAAK0F,IAAK,IAAItE,EAAA,GAC1ChC,KAAK4O,mDA2BPxO,OAAAC,eAAW8X,EAAA7X,UAAA,aAqBX,WACC,GAAIN,KAAK0R,MAAO,CACf,IAAK1R,KAAKsY,OAAOoE,MAAO,CACvB,IAAM9b,EAAOZ,KAAK0R,MAAMwL,MAAM3Q,SAAS,GAEvC,IAAK3L,EACJ,MAAMsZ,MAAM,iCAGbla,KAAKmR,MAAQvQ,EAGd,OAAOZ,KAAKsY,OAAOoE,YAjCrB,SAAiB9b,GAChB,IAAIgc,EAAU5c,KAAKsY,OAAOoE,MACtBE,GAAWhc,IACVgc,IACH5c,KAAK8G,gBAAgB+V,UAAUD,EAAQtW,KAEvCtG,KAAKsY,OAAOwE,UAEZF,EAAQvX,OAAO0X,YAAY/c,OAG5BA,KAAKsY,OAAO0E,IAAIpc,EAAMA,EAAKqc,eAAejd,OAE1CA,KAAK8G,gBAAgBvD,OAAO3C,EAAK0F,IAAK,IAAItE,EAAA,GAC1ChC,KAAK4O,mDA+BPxO,OAAAC,eAAW8X,EAAA7X,UAAA,gBAUX,WAsBC,OArBKN,KAAKmd,YACLnd,KAAKmR,iBAAiBxP,IACzB3B,KAAKmd,UAAYnd,KAAKmR,OAGnBnR,KAAKiR,iBAAiBtP,IACzB3B,KAAKmd,UAAYnd,KAAKiR,OAGnBjR,KAAKmR,iBAAiByB,IACzB5S,KAAKmd,UAAYnd,KAAKmR,OAGnBnR,KAAKiR,iBAAiB2B,IACzB5S,KAAKmd,UAAYnd,KAAKiR,OAGlBjR,KAAKmd,YACTnd,KAAKmd,UAAYnd,KAAKiR,QAGjBjR,KAAKmd,eAhCb,SAAoB3c,GACfR,KAAKmd,WAAa3c,IACrBR,KAAKmd,UAAY3c,EACjBR,KAAKa,+CAsCAsX,EAAA7X,UAAA8c,cAAP,SAAqBxF,GAEpBhY,EAAAU,UAAM8c,cAAard,KAAAC,KAAC4X,GAEpB,IAAIjS,EAAY3F,KAAK2F,UAEjB0X,EAAOC,IACPC,GAASD,IAETE,EAAOF,IACPG,GAASH,IAET5X,EAAa1F,KAAK0F,WAClBK,EAAW/F,KAAK+F,SAEf6R,IACJlS,EAAa,EACbK,EAAW/F,KAAK2F,UAAUsC,QAG3B,IAAK,IAAIsL,EAAI7N,EAAY6N,EAAIxN,EAAUwN,IAAK,CAC3C,IAAI7Q,EAAWiD,EAAU4G,SAASgH,GAElCvT,KAAK0d,cAAchb,EAAUkV,GAE7B,IAAI+F,EAASjb,EAASkL,SAAS,SAAU,SACrCgQ,EAASlb,EAASkL,SAAS,SAAU,SAEzCyP,EAAOjT,EAAA,IAAU1H,EAASgV,OAAO1X,KAAKuY,cAAeX,EAAS+F,GAASN,GACvEG,EAAOpT,EAAA,IAAU1H,EAASgV,OAAO1X,KAAKwY,cAAeZ,EAASgG,GAASJ,GAEvED,EAAOnT,EAAA,IAAU1H,EAASsV,OAAOhY,KAAKuY,cAAeX,EAAS+F,GAASJ,GACvEE,EAAOrT,EAAA,IAAU1H,EAASsV,OAAOhY,KAAKwY,cAAeZ,EAASgG,GAASH,GAGnEzd,KAAKgZ,UACJhZ,KAAKuF,UAAYvF,KAAKiR,QACzBuM,EAAOpT,EAAA,IAAUoT,EAAMI,IAEpB5d,KAAKuF,UAAYvF,KAAKmR,QACzBkM,EAAOjT,EAAA,IAAUiT,EAAMM,KAM1B3d,KAAKiR,MAAM4M,yBACX7d,KAAKmR,MAAM0M,yBAEX,IAAIC,EAAkB9d,KAAKiR,MAAM3K,IAC7ByX,EAAkB/d,KAAKmR,MAAM7K,IAE5BsR,GACA5X,KAAKwZ,MAAMzS,OAAO+W,IAAYT,GAAQrd,KAAKyZ,MAAM1S,OAAO+W,IAAYP,GAAQvd,KAAKwZ,MAAMzS,OAAOgX,IAAYP,GAAQxd,KAAKyZ,MAAM1S,OAAOgX,IAAYN,IACnJzd,KAAKwZ,MAAMjW,OAAOua,EAAST,GAC3Brd,KAAKyZ,MAAMlW,OAAOua,EAASP,GAC3Bvd,KAAKwZ,MAAMjW,OAAOwa,EAASP,GAC3Bxd,KAAKyZ,MAAMlW,OAAOwa,EAASN,GAEvBzd,KAAKge,eACRhe,KAAKge,cAAcZ,eAAc,GAGlCpd,KAAKie,oBAAoB,oBAIvBje,KAAK0Z,MAAM3S,OAAO+W,IAAYT,GAAQrd,KAAK2Z,MAAM5S,OAAO+W,IAAYP,GAAQvd,KAAK0Z,MAAM3S,OAAOgX,IAAYP,GAAQxd,KAAK2Z,MAAM5S,OAAOgX,IAAYN,IACnJzd,KAAK0Z,MAAMnW,OAAOua,EAAST,GAC3Brd,KAAK2Z,MAAMpW,OAAOua,EAASP,GAC3Bvd,KAAK0Z,MAAMnW,OAAOwa,EAASP,GAC3Bxd,KAAK2Z,MAAMpW,OAAOwa,EAASN,IAEvBzd,KAAKke,UAA0B,GAAdle,KAAK6D,OAA0B,GAAZ7D,KAAK8D,MAC5C9D,KAAKie,oBAAoB,8BAUrB9F,EAAA7X,UAAAmR,YAAP,WACC7R,EAAAU,UAAMmR,YAAW1R,KAAAC,MACjBA,KAAKqZ,2BACLrZ,KAAKme,0BAAuBtW,GAUtBsQ,EAAA7X,UAAAsQ,sBAAP,SAA6BwN,EAAmBC,GAC/C,GAAIre,KAAK0Y,qBAAsB,CAC9B,IAAIhW,OAAQ,EAEZ,GAAI1C,KAAKse,UAAYte,KAAKue,WAAave,KAAKwe,UAAW,CAEtD,IAAIvN,EAAcjR,KAAKoY,OAAOsE,MAC1BvL,EAAcnR,KAAKsY,OAAOoE,MAE1BzL,GAASjR,KAAKuF,WACjB7C,EAA8BuO,EAAMtB,kBAAkB3P,KAAMiR,EAAMH,eAAesN,GAAYpe,KAAKsC,cAE/F6O,GAASnR,KAAKuF,WACjB7C,EAA8ByO,EAAMxB,kBAAkB3P,KAAMmR,EAAML,eAAeuN,GAAYre,KAAKsC,cAGnG,IAAIwK,EAAQ9M,KAAKuR,sBAAsB7O,GAEvC,GAAGoK,EACF,OAAOA,EAIR,IAAK9M,KAAKye,YACT,OAIFze,KAAKyR,gBAUA0G,EAAA7X,UAAAiR,sBAAP,SAA6B7O,GAE5B,GADA1C,KAAKqZ,yBAAyB3W,GAC1B1C,KAAK0Y,sBACJhW,GAAYA,EAAS4b,QAAS,CAEjCte,KAAK0e,kBAAkBhc,GACvB1C,KAAK2e,gBAAkBjc,EAGvB,IAAIkc,EAAgB5e,KAAK4e,cACrBC,EAAgB7e,KAAK6e,cAEzB,GAAI5Y,EAAA,SAAqBvD,EAAUkc,KAAmB3Y,EAAA,SAAqBvD,EAAUmc,IAAiB,CAErG,IAAIC,EAAe9e,KAAK+e,SAASrc,EAAUkc,EAAeC,EAAenc,EAAS4P,UAAUsM,GAAgBlc,EAAS4P,UAAUuM,IAE/H,GAAIC,EAAc,CAEjB9e,KAAKgf,SAAWF,EAAajZ,EAC7B7F,KAAKif,SAAWH,EAAa5R,EAEzBlN,KAAKme,sBAAwBzb,IAChC1C,KAAKie,oBAAoB,kBACxBiB,KAAM,iBACNC,OAAQnf,KACR0C,SAAUA,IAGX1C,KAAKme,qBAAuBzb,OAG7B,IAAc,IAAA0c,EAAAjf,EAAA,EAAAuC,EAAS2c,SAAOC,EAAAF,EAAAG,QAAAD,EAAAE,KAAAF,EAAAF,EAAAG,OAAA,CAApBD,EAAA9e,MACM,GACRif,SAAU,oGAGlB,OAAIzf,KAAK0f,cACD1E,EAAA,kBAA0BnV,EAAGiZ,EAAajZ,EAAGqH,EAAG4R,EAAa5R,GAAKlN,WAE1E,aAWKmY,EAAA7X,UAAA+Y,yBAAV,SAAmC3W,GAClC,GAAI1C,KAAKme,sBAAwBne,KAAKme,sBAAwBzb,MAC7D,IAAc,IAAA0c,EAAAjf,EAAA,EAAAH,KAAKme,qBAAqBkB,SAAOC,EAAAF,EAAAG,QAAAD,EAAAE,KAAAF,EAAAF,EAAAG,OAAA,CAA1C,IACAI,EADKL,EAAA9e,MACM,GACVmf,EAAOC,aAIX5f,KAAKme,0BAAuBtW,EAH5B8X,EAAOF,SAAU,6GAedtH,EAAA7X,UAAAuf,eAAP,SAAsBF,GACrB/f,EAAAU,UAAMuf,eAAc9f,KAAAC,KAAC2f,GAErB,IAAIjd,EAA+Cid,EAAOjd,SAGtDoY,EAAiB6E,EAAO7E,OACvB7U,EAAA,SAAe6U,KACnBA,EAAS9a,KAAK8a,QAGf,IAAII,EAAiByE,EAAOzE,OAK5B,GAJKjV,EAAA,SAAeiV,KACnBA,EAASlb,KAAKkb,QAGVlb,KAAKiR,iBAAiBvP,EAAA,IAAcgB,EAASod,UAAUhF,KAAc9a,KAAKmR,iBAAiBzP,EAAA,IAAcgB,EAASod,UAAU5E,IAChIyE,EAAOrB,SAAU,MAEb,CACJ,IAAIyB,EAA0B/f,KAAKggB,mBAAmBL,EAAQ7E,GAC1DmF,EAA0BjgB,KAAKkgB,mBAAmBP,EAAQzE,GAE1DpO,EAAQ9M,KAAK+e,SAASrc,EAAUoY,EAAQI,EAAQ6E,EAAiBE,GACrE,GAAInT,EAAO,CACV,IAAIjH,EAAYiH,EAAMjH,EAClBqH,EAAYJ,EAAMI,EAEtB,GAAIjH,EAAA,SAAe0Z,EAAOQ,YAAcngB,KAAK+a,YAAc/a,KAAK8a,OAE/DjV,IAASA,EADW7F,KAAKiR,MAAM1D,KAAK7K,EAAU1C,KAAK+a,aAC7B4E,EAAOQ,UAI9B,GAAIla,EAAA,SAAe0Z,EAAOS,YAAcpgB,KAAKmb,YAAcnb,KAAKkb,OAE/DhO,IAASA,EADWlN,KAAKmR,MAAMzD,KAAKhL,EAAU1C,KAAKmb,aAC7BwE,EAAOS,UAG9BT,EAAOU,QAASxa,EAAGA,EAAGqH,EAAGA,SAGzByS,EAAOrB,SAAU,IASVnG,EAAA7X,UAAA0f,mBAAV,SAA6BL,EAAgBlP,GAC5C,IAAI6P,EAAyBX,EAAOQ,UAChCzd,EAAWid,EAAOjd,SAItB,OAHKuD,EAAA,SAAeqa,KACnBA,EAAiB5d,EAASqL,iBAAiB0C,IAErC6P,GAQEnI,EAAA7X,UAAA4f,mBAAV,SAA6BP,EAAgBlP,GAC5C,IAAI6P,EAAyBX,EAAOS,UAChC1d,EAAWid,EAAOjd,SAItB,OAHKuD,EAAA,SAAeqa,KACnBA,EAAiB5d,EAASqL,iBAAiB0C,IAErC6P,GASRlgB,OAAAC,eAAW8X,EAAA7X,UAAA,eAOX,WACC,OAAON,KAAKO,iBAAiB,gBAR9B,SAAmByY,GAClBhZ,KAAKS,iBAAiB,UAAWuY,GAAS,oCAiB3C5Y,OAAAC,eAAW8X,EAAA7X,UAAA,mBAOX,WACC,OAAON,KAAKO,iBAAiB,oBAR9B,SAAuBC,GACtBR,KAAKS,iBAAiB,cAAeD,oCAiB/B2X,EAAA7X,UAAAigB,KAAP,SAAYlU,GAAZ,IAEKsL,EAFL7X,EAAAE,KAGKA,KAAKiR,iBAAiBvP,EAAA,GAAa1B,KAAKiR,OAASjR,KAAKuF,WACzDoS,EAAS3X,KAAKuY,eAGXvY,KAAKmR,iBAAiBzP,EAAA,GAAa1B,KAAKmR,OAASnR,KAAKuF,WACzDoS,EAAS3X,KAAKwY,eAGf,IASIgI,EATA9a,EAAqB1F,KAAK0F,WAC1BK,EAAmB/F,KAAK+F,SACxB0a,EAAgB,EAEhBC,EAAwB1gB,KAAK2gB,aAAaC,mBAC1C3a,EAAA,SAAeoG,KAClBqU,EAAwBrU,GAIzBjH,EAAA,KAAWA,EAAA,QAAcpF,KAAK2F,UAAUL,YAAa,SAACub,GACrD,IAAItN,EAAIsN,EAAE,GACNne,EAAWme,EAAE,GAEb/gB,EAAKghB,wBAA0BJ,EAAwB,IAC1DD,EAAQ3gB,EAAKihB,4BAA8BxN,EAAImN,GAAyBnN,EAAI7N,IAAeK,EAAWL,IAEvG8a,EAAO9d,EAAS6d,KAAKG,EAAuBD,EAAO9I,KAGpD,IAAIqJ,EAAYphB,EAAAU,UAAMigB,KAAIxgB,KAAAC,KAACqM,GAM3B,OAJImU,IAASA,EAAKS,eACjBD,EAAYR,GAGNQ,GASD7I,EAAA7X,UAAA4gB,KAAP,SAAY7U,GAAZ,IAEKsL,EACAnX,EAHLV,EAAAE,KAIKiR,EAAcjR,KAAKiR,MAEnBA,aAAiBvP,EAAA,GAAauP,GAASjR,KAAKuF,WAC/CoS,EAAS3X,KAAKuY,cAGb/X,EADGR,KAAKgZ,SAAY/H,EAAMkQ,UAAY,GAAKlQ,EAAMnL,UAAY,GAAM9F,KAAKge,cAChE,EAGA/M,EAAM/N,KAIhB,IAAIiO,EAAcnR,KAAKmR,MACnBA,aAAiBzP,EAAA,GAAayP,GAASnR,KAAKuF,WAC/CoS,EAAS3X,KAAKwY,cAGbhY,EADGR,KAAKgZ,SAAY7H,EAAMgQ,UAAY,GAAKhQ,EAAMrL,UAAY,GAAM9F,KAAKge,cAChE,EAGA7M,EAAMjO,KAKhB,IAAIwC,EAAqB1F,KAAK0F,WAC1BK,EAAmB/F,KAAK+F,SAExB2a,EAAwB1gB,KAAKohB,YAAYR,mBACzC3a,EAAA,SAAeoG,KAClBqU,EAAwBrU,GAGzB,IACImU,EADAC,EAAgB,EAGpBrb,EAAA,KAAWA,EAAA,QAAcpF,KAAK2F,UAAUL,YAAa,SAACub,GACrD,IAAItN,EAAIsN,EAAE,GACNne,EAAWme,EAAE,GAEY,GAAzBH,EACHhe,EAASwe,KAAK,EAAG,EAAG1gB,EAAOmX,IAGvB7X,EAAKghB,wBAA0BJ,EAAwB,IAC1DD,EAAQ3gB,EAAKihB,4BAA8BxN,EAAImN,GAAyBnN,EAAI7N,IAAeK,EAAWL,IAEvG8a,EAAO9d,EAASwe,KAAKR,EAAuBD,EAAOjgB,EAAOmX,MAI5D,IAAIqJ,EAAYphB,EAAAU,UAAM4gB,KAAInhB,KAAAC,KAAC0gB,GAY3B,OAXIM,IAAcA,EAAUC,cAC3BD,EAAUP,MAAMA,GAGbD,IAASA,EAAKS,eACjBD,EAAYR,GAIbxgB,KAAKqhB,uBAEEL,GAQD7I,EAAA7X,UAAAghB,iCAAP,SAAwC5e,EAA8ByX,GACrEva,EAAAU,UAAMghB,iCAAgCvhB,KAAAC,KAAC0C,EAAUyX,GAGjD,IAAIoH,EAA6CvhB,KAAKuF,SAASF,OAE/DD,EAAA,KAAWmc,EAAWjc,WAAY,SAACD,GAC9BA,EAAO2T,SACV3T,EAAOmc,6BAYHrJ,EAAA7X,UAAAod,cAAP,SAAqBhb,EAA6BkV,GAAlD,IAAA9X,EAAAE,KAIC,GAAKA,KAAKgZ,QAAV,CAKC,IAGIxT,EAHAkM,EAAiB1R,KAAK0R,MACtBtF,EAAgBsF,EAAMrM,OAAOkW,QAAQvb,MAIrCA,KAAKiR,OAASjR,KAAKuF,UAAYvF,KAAKiR,iBAAiBvP,EAAA,IACxD8D,EAAQxF,KAAK8a,QAEV9a,KAAKmR,OAASnR,KAAKuF,UAAYvF,KAAKmR,iBAAiBzP,EAAA,IACxD8D,EAAQxF,KAAKkb,QAIdxY,EAAS2E,mBAAmB7B,EAAO,EAAG,SAEtCJ,EAAA,aAAmBsM,EAAMrM,OAAO0W,MAAM,EAAG3P,GAAOqV,YAAYnc,WAAY,SAACoc,GAExE,GAAIA,EAAWzQ,OAASnR,EAAKmR,OAASyQ,EAAWvQ,OAASrR,EAAKqR,MAAO,CAErEuQ,EAAW1D,cAAgBle,EAE3B,IAAI6hB,EAAeD,EAAW/b,UAAU4G,SAAS7J,EAAS0J,OAE1D,GAAIuV,GAAgBA,EAAa7B,SAAShgB,EAAKyY,gBAAkBoJ,EAAa7B,SAAShgB,EAAK0Y,eAAgB,CAE3G,IAAIhY,EAAQkC,EAASkL,SAASpI,GAC1Boc,OAAS,EASb,GANCA,EADGhK,EACS+J,EAAa5J,gBAAgBvS,GAASmc,EAAa/T,SAASpI,EAAO,SAGnEmc,EAAa/T,SAASpI,GAASmc,EAAa/T,SAASpI,EAAO,SAGpEhF,GAAS,GAAKohB,GAAa,GAAOphB,EAAQ,GAAKohB,EAAY,EAI/D,OAFAlf,EAAS2E,mBAAmB7B,EAAOoc,EAAW,UAEvC,OAGJ,IAAKF,EAAW1I,QACpB,OAAO,EAIT,OAAO,MAYV5Y,OAAAC,eAAW8X,EAAA7X,UAAA,cAAX,WACC,OAAON,KAAKga,yCAUb5Z,OAAAC,eAAW8X,EAAA7X,UAAA,cAAX,WACC,OAAON,KAAKia,yCAUb7Z,OAAAC,eAAW8X,EAAA7X,UAAA,kBAAX,WACC,OAAON,KAAKob,6CAUbhb,OAAAC,eAAW8X,EAAA7X,UAAA,kBAAX,WACC,OAAON,KAAKqb,6CAUbjb,OAAAC,eAAW8X,EAAA7X,UAAA,qBASX,WACC,OAAIN,KAAK6hB,eACD7hB,KAAK6hB,eAEN7hB,KAAKga,aAbb,SAAyBxZ,GACxBR,KAAK6hB,eAAiBrhB,mCAsBvBJ,OAAAC,eAAW8X,EAAA7X,UAAA,qBASX,WACC,OAAIN,KAAK8hB,eACD9hB,KAAK8hB,eAEN9hB,KAAKia,aAbb,SAAyBzZ,GACxBR,KAAK8hB,eAAiBthB,mCAsBhB2X,EAAA7X,UAAA4C,IAAP,SAAWtC,GACV,OAAOZ,KAAKwZ,MAAMzS,OAAOnG,EAAK0F,MAUxB6R,EAAA7X,UAAA0D,IAAP,SAAWpD,GACV,OAAOZ,KAAKyZ,MAAM1S,OAAOnG,EAAK0F,MAWxB6R,EAAA7X,UAAAyhB,aAAP,SAAoBnhB,GACnB,IAAIJ,EAAQR,KAAK0Z,MAAM3S,OAAOnG,EAAK0F,KAInC,OAHKL,EAAA,SAAezF,KACnBA,EAAQR,KAAKkD,IAAItC,IAEXJ,GAWD2X,EAAA7X,UAAA0hB,aAAP,SAAoBphB,GACnB,IAAIJ,EAAQR,KAAK2Z,MAAM5S,OAAOnG,EAAK0F,KAInC,OAHKL,EAAA,SAAezF,KACnBA,EAAQR,KAAKgE,IAAIpD,IAEXJ,GASD2X,EAAA7X,UAAA2hB,cAAP,SAAqBC,GAEpB,GAAIA,EAAQ,CAuBX,GApBIjc,EAAA,SAAeic,EAAOjR,QAAUhL,EAAA,SAAeic,EAAOjR,SACrDjR,KAAKmiB,IAAI7e,OAAO4e,EAAOjR,OAC1BiR,EAAOjR,MAAQjR,KAAKmiB,IAAIpb,OAAOmb,EAAOjR,QAGtCjR,KAAKoiB,iBAAiB5Q,KAAK,eAAiBxR,KAAKma,MAAQ,WAAa,uBAA0B+H,EAAOjR,MAAQ,+BACxGiR,EAAOjR,QAGZhL,EAAA,SAAeic,EAAO/Q,QAAUlL,EAAA,SAAeic,EAAO/Q,SACrDnR,KAAKmiB,IAAI7e,OAAO4e,EAAO/Q,OAC1B+Q,EAAO/Q,MAAQnR,KAAKmiB,IAAIpb,OAAOmb,EAAO/Q,QAGtCnR,KAAKoiB,iBAAiB5Q,KAAK,eAAiBxR,KAAKma,MAAQ,WAAa,uBAA0B+H,EAAO/Q,MAAQ,+BACxG+Q,EAAO/Q,QAKZlL,EAAA,SAAeic,EAAOpG,aAAe7V,EAAA,QAAcic,EAAOpG,YAC7D,IAAK,IAAIvI,EAAI,EAAGe,EAAM4N,EAAOpG,WAAW7T,OAAQsL,EAAIe,EAAKf,IAAK,CAC7D,IAAIwI,EAAQmG,EAAOpG,WAAWvI,GACzBtN,EAAA,SAAe8V,EAAMmD,QACzBnD,EAAMmD,KAAO,gBAEVjZ,EAAA,SAAe8V,EAAMnb,OAASqF,EAAA,SAAe8V,EAAMnb,OAASZ,KAAKmiB,IAAI7e,OAAOyY,EAAMnb,MACrFmb,EAAMpZ,UAAY3C,KAAKmiB,IAAIpb,OAAOgV,EAAMnb,MAEhCqF,EAAA,SAAe8V,EAAMpZ,YAAcsD,EAAA,SAAe8V,EAAMpZ,YAAc3C,KAAKmiB,IAAI7e,OAAOyY,EAAMpZ,aACpGoZ,EAAMpZ,UAAY3C,KAAKmiB,IAAIpb,OAAOgV,EAAMpZ,YAMtCsD,EAAA,SAAeic,EAAOnI,aAAgB9T,EAAA,SAAeic,EAAOnI,aAChE/Z,KAAKoiB,iBAAiB5Q,KAAK,wCAA0CxR,KAAKma,MAAQ,WAAa,KAKjGva,EAAAU,UAAM2hB,cAAaliB,KAAAC,KAACkiB,IAgBX/J,EAAA7X,UAAAye,SAAV,SAAmBrc,EAA4B2f,EAAcC,EAAcnC,EAAoBC,EAAoBmC,EAAoBC,GACtI,IAAI3c,EAAY7F,KAAKiR,MAAM1D,KAAK7K,EAAU2f,EAAMlC,GAC5CjT,EAAYlN,KAAKmR,MAAMzD,KAAKhL,EAAU4f,EAAMlC,GAKhD,OAASva,EAHTA,EAAIuE,EAAA,WAAiBvE,GAAI,IAAO,KAGjBqH,EAFfA,EAAI9C,EAAA,WAAiB8C,GAAI,IAAO,OASvBiL,EAAA7X,UAAAwZ,qBAAV,WACC,IAAInQ,EAAO,GACX3C,EAAA,KAAahH,KAAK+Z,WAAY,SAAC9S,EAAKwb,GACnC9Y,GAAQ,IAAM1C,EAAM,OAErBjH,KAAK0iB,eAAiB/Y,GAiBvBvJ,OAAAC,eAAW8X,EAAA7X,UAAA,4BAOX,WACC,OAAON,KAAKO,iBAAiB,6BAR9B,SAAgCC,GAC/BR,KAAKS,iBAAiB,uBAAwBD,oCAUhD2X,EAl5CA,CAA8BF,EAAA,GA05C9BhX,EAAA,EAASC,kBAA4B,SAAIgX,EACzCjX,EAAA,EAASC,kBAAoC,iBAAI2V,0CC90DjD8L,EAAA,SAAA/iB,GA0FC,SAAAgjB,IAAA,IAAA9iB,EAGCF,EAAAG,KAAAC,OAAOA,KA7DDF,EAAAgN,OAAkBjH,EAAG,EAAGqH,EAAG,GAoCxBpN,EAAA+iB,OAAmC,OA0B5C/iB,EAAKG,UAAY,SAGjBH,EAAKqc,MAAQ/b,OAAA0iB,EAAA,EAAA1iB,CAAQ,KACrBN,EAAKsc,OAAShc,OAAA0iB,EAAA,EAAA1iB,CAAQ,KACtBN,EAAKijB,aAAc,EAEnBjjB,EAAKohB,KAAK,GAEVphB,EAAKkjB,WAAY,EACjBljB,EAAKmjB,WAAY,EAEjBnjB,EAAK2Y,YAAa,EAIlB,IAAMyK,EAAc9iB,OAAA+iB,EAAA,EAAA/iB,UACpBN,EAAKkT,WAAWxB,KAAK0R,EAAYE,KAAKjK,OAAOC,GAAG,OAAQtZ,EAAKujB,iBAAkBvjB,IAC/EA,EAAKkT,WAAWxB,KAAK0R,EAAYE,KAAKjK,OAAOC,GAAG,KAAMtZ,EAAKwjB,eAAgBxjB,IAC3EA,EAAKkT,WAAWxB,KAAK0R,EAAYE,KAAKjK,OAAOC,GAAG,QAAStZ,EAAKyjB,iBAAkBzjB,IAGhFA,EAAKI,eAsRP,OA1Y4BC,EAAA,EAAAyiB,EAAAhjB,GA8HpBgjB,EAAAtiB,UAAAijB,iBAAP,SAAwBC,GAEvB,GAAKxjB,KAAKyjB,oBAAV,CAGA,IAA+B,QAAzBzjB,KAAK0jB,kBAAuD,OAAzB1jB,KAAK0jB,mBAA+B1jB,KAAK2jB,WAAevjB,OAAA+iB,EAAA,EAAA/iB,GAAiBwjB,eAAeJ,EAAMK,QAAS7jB,KAAK8Y,MAAMgL,IAAK9jB,KAAKsG,KAArK,CAQA,IAAIuK,EAAgBmK,EAAA,sBAA6BwI,EAAMK,QAAQ/W,MAAO9M,MAatE,MAXmB,QAAfA,KAAK6iB,QAAoB7iB,KAAK+jB,cACjClT,EAAQ7Q,KAAK+jB,aAGK,QAAf/jB,KAAK6iB,QAAoB7iB,KAAK+jB,cAC5B/jB,KAAKgkB,aAAanT,KACtBA,EAAQ7Q,KAAK+jB,cAIf/jB,KAAKikB,YAAYpT,GACVA,EAnBD7Q,KAAKkkB,UAAalkB,KAAKue,UAC3Bve,KAAKkhB,SA6BE0B,EAAAtiB,UAAA6jB,SAAV,SAAmB9X,GAClB,GAAoB,QAAfrM,KAAK6iB,QAAmC,QAAf7iB,KAAK6iB,SAAqB7iB,KAAK+jB,YAG7D,OAAOnkB,EAAAU,UAAM6jB,SAAQpkB,KAAAC,KAACqM,IAsBhBuW,EAAAtiB,UAAA2jB,YAAP,SAAmBnX,EAAesX,GAEjCtX,EAAMjH,EAAIuE,EAAA,MAAY0C,EAAMjH,EAAG,GAC/BiH,EAAMI,EAAI9C,EAAA,MAAY0C,EAAMI,EAAG,GAE3BkX,IACHpkB,KAAK6iB,OAASuB,GAGF,QAATA,GAA4B,QAATA,IACtBpkB,KAAK+jB,YAAcjX,GAGpB9M,KAAKqkB,gBAAgBvX,IAQZ8V,EAAAtiB,UAAA+jB,gBAAV,SAA0BvX,GACrB9M,KAAK8M,MAAMjH,GAAKiH,EAAMjH,GAAK7F,KAAK8M,MAAMI,GAAKJ,EAAMI,IACpDlN,KAAK8M,MAAQA,EACb9M,KAAKskB,qBAEDtkB,KAAKgkB,aAAalX,GACrB9M,KAAKugB,KAAK,GAILvgB,KAAK2jB,WACT3jB,KAAKkhB,KAAK,GAIRlhB,KAAKse,UACRte,KAAKukB,eAELvkB,KAAKwkB,SAAS,4BAUV5B,EAAAtiB,UAAAmkB,YAAP,SAAmB3X,GAClB9M,KAAK0kB,gBAAgB5X,IAQZ8V,EAAAtiB,UAAAokB,gBAAV,SAA0B5X,GACzB,OAAQ9M,KAAK0jB,kBACZ,IAAK,OACJ1jB,KAAKie,oBAAoB,eACzB,MACD,IAAK,SACJje,KAAKie,oBAAoB,iBACzB,MACD,IAAK,MACJje,KAAKie,oBAAoB,cACzB7d,OAAA+iB,EAAA,EAAA/iB,GAAiBukB,eAAeC,EAAA,EAAiBC,YAU7CjC,EAAAtiB,UAAAwkB,UAAP,SAAiBhY,GAChB9M,KAAK+kB,cAAcjY,IAQV8V,EAAAtiB,UAAAykB,cAAV,SAAwBjY,GAEvB9M,KAAKglB,YAAYhlB,KAAKilB,SACtB,IAAI/B,EAAc9iB,OAAA+iB,EAAA,EAAA/iB,GAElB,GAAIgK,EAAA,YAAkBpK,KAAKklB,aAAcllB,KAAKmlB,gBAAkBjC,EAAYkC,aAAaplB,KAAKqlB,aAAc,gBAAiB,CAC5H,OAAQrlB,KAAK0jB,kBACZ,IAAK,OACJ1jB,KAAKie,oBAAoB,aACzB,MAED,IAAK,SACJje,KAAKie,oBAAoB,eACzB,MAED,IAAK,MACJje,KAAKie,oBAAoB,YACzBiF,EAAYyB,eAAeC,EAAA,EAAiBU,SAG9CtlB,KAAK2jB,eAAY9b,EACjB7H,KAAKulB,uBAGLvlB,KAAKie,oBAAoB,oBACzBiF,EAAYyB,eAAeC,EAAA,EAAiBU,SAC5CtlB,KAAK2jB,eAAY9b,GASZ+a,EAAAtiB,UAAAilB,gBAAP,aAMU3C,EAAAtiB,UAAAikB,aAAV,WAECvkB,KAAKoe,UAAYpe,KAAK8M,MAAMjH,EAAI7F,KAAKwlB,WACrCxlB,KAAKqe,UAAY,EAAIre,KAAK8M,MAAMI,EAAIlN,KAAKylB,aASnC7C,EAAAtiB,UAAA+iB,iBAAP,SAAwBG,GAEvB,GAAKxjB,KAAKyjB,qBAAwBrjB,OAAA+iB,EAAA,EAAA/iB,GAAiBwjB,eAAeJ,EAAMK,QAAS7jB,KAAK8Y,MAAMgL,IAAK9jB,KAAKsG,KAAtG,CAIA,IAAIuK,EAAgBmK,EAAA,sBAA6BwI,EAAMK,QAAQ/W,MAAO9M,MAEtEA,KAAKmlB,gBAAmBtf,EAAGgL,EAAMhL,EAAGqH,EAAG2D,EAAM3D,GAGzCsW,EAAMA,MAAMkC,YAAc1lB,KAAKgkB,aAAanT,IAC/C2S,EAAMA,MAAMmC,iBAIb3lB,KAAKikB,YAAYpT,GACjB7Q,KAAKykB,YAAY5T,KAOR+R,EAAAtiB,UAAA0kB,YAAV,SAAsBlY,KASf8V,EAAAtiB,UAAAgjB,eAAP,SAAsBE,GACrB,GAAKxjB,KAAKyjB,uBAGqB,QAAzBzjB,KAAK0jB,kBAAuD,OAAzB1jB,KAAK0jB,mBAA+B1jB,KAAK2jB,WAAevjB,OAAA+iB,EAAA,EAAA/iB,GAAiBwjB,eAAeJ,EAAMK,QAAS7jB,KAAK8Y,MAAMgL,IAAK9jB,KAAKsG,MAArK,CAGA,IAAIuK,EAAgBmK,EAAA,sBAA6BwI,EAAMK,QAAQ/W,MAAO9M,MACtEA,KAAKklB,cAAiBrf,EAAGgL,EAAMhL,EAAGqH,EAAG2D,EAAM3D,GAE3ClN,KAAKikB,YAAYpT,GACjB7Q,KAAK8kB,UAAUjU,KAQhBzQ,OAAAC,eAAWuiB,EAAAtiB,UAAA,aAUX,WACC,OAAON,KAAKwa,YAXb,SAAiBha,GAChBR,KAAKwa,OAASha,EACVyF,EAAA,SAAqBjG,KAAKwa,OAAQoL,gBACrCxlB,OAAA+iB,EAAA,EAAA/iB,GAAiBylB,YAAkB7lB,KAAKwa,OAAQoL,cAAcP,+CAUjEzC,EA1YA,CAA4BkD,EAAA,GAkZ5B7kB,EAAA,EAASC,kBAA0B,OAAIyhB,8BCnZvCoD,EAAA,SAAAnmB,GA8DC,SAAAomB,IAAA,IAAAlmB,EAGCF,EAAAG,KAAAC,OAAOA,KA7CEF,EAAAmmB,OAAS,IAAI5N,EAAA,EAKbvY,EAAAomB,OAAS,IAAI7N,EAAA,EAoBbvY,EAAAsY,OAAS,IAAIC,EAAA,EAKbvY,EAAAwY,OAAS,IAAID,EAAA,EAgBtBvY,EAAKG,UAAY,WAGjBH,EAAKqmB,SAAW,QAEhBrmB,EAAKsmB,UAAY,GAEjB,IAAIC,EAAkB,IAAIC,EAAA,EAGtBC,EAAoBzmB,EAAK0mB,YAAY5N,EAAA,GACzC2N,EAAUxD,aAAc,EACxBwD,EAAUE,YAAc,GACxBF,EAAUhb,KAAO8a,EAAgBK,OAAO,yBACxCH,EAAU9N,YAAa,EACvB8N,EAAU9C,qBAAsB,EAChC3jB,EAAKymB,UAAYA,EACjBzmB,EAAKkT,WAAWxB,KAAK1R,EAAKymB,WAG1B,IAAII,EAAgB7mB,EAAK0mB,YAAY5N,EAAA,GACrC+N,EAAM5D,aAAc,EACpB4D,EAAMC,OAASP,EAAgBK,OAAO,QACtCC,EAAMpb,KAAOnL,OAAAymB,EAAA,EAAAzmB,GACbumB,EAAMG,gBAAkB,MACxBH,EAAMlO,YAAa,EACnBkO,EAAMI,cAAgB,GACtBJ,EAAMlD,qBAAsB,EAC5BkD,EAAMzZ,EAAI,EACVpN,EAAK6mB,MAAQA,EACb7mB,EAAKkT,WAAWxB,KAAK1R,EAAK6mB,OAG1B,IAAIK,EAAgBlnB,EAAK0mB,YAAY5N,EAAA,UACrCoO,EAAMjE,aAAc,EACpBiE,EAAMJ,OAASP,EAAgBK,OAAO,QACtCM,EAAMzb,KAAOnL,OAAAymB,EAAA,EAAAzmB,GACb4mB,EAAMF,gBAAkB,MACxBE,EAAMvO,YAAa,EACnBuO,EAAMD,cAAgB,GACtBC,EAAMvD,qBAAsB,EAC5BuD,EAAMnhB,EAAI,EACV/F,EAAKknB,MAAQA,EACblnB,EAAKkT,WAAWxB,KAAK1R,EAAKknB,OAG1BlnB,EAAKqZ,OAAOC,GAAG,cAAetZ,EAAKmnB,WAAYnnB,GAAM,GAErDA,EAAKkT,WAAWxB,KAAK1R,EAAKmmB,QAC1BnmB,EAAKkT,WAAWxB,KAAK1R,EAAKomB,QAC1BpmB,EAAKkT,WAAWxB,KAAK1R,EAAKsY,QAC1BtY,EAAKkT,WAAWxB,KAAK1R,EAAKwY,QAE1BxY,EAAK2L,KAAO3L,EAGZA,EAAKI,eAsqBP,OAhyB8BC,EAAA,EAAA6lB,EAAApmB,GAmItBomB,EAAA1lB,UAAA2mB,WAAP,WACKjnB,KAAK2mB,QACR3mB,KAAK2mB,MAAM1K,KAAOC,EAAA,QAAerW,EAAG,EAAGqH,EAAG,IAAOgP,EAAA,QAAerW,EAAG,EAAGqH,EAAGlN,KAAKylB,eAE3EzlB,KAAKgnB,QACRhnB,KAAKgnB,MAAM/K,KAAOC,EAAA,QAAerW,EAAG,EAAGqH,EAAG,IAAOgP,EAAA,QAAerW,EAAG7F,KAAKwlB,WAAYtY,EAAG,MASlF8Y,EAAA1lB,UAAAilB,gBAAP,WACC,GAAIvlB,KAAKknB,eAAgB,CACxB,IAAIvD,EAAoB3jB,KAAK2jB,UAE7B,GAAIA,EAAW,CACd,IAAI7W,EAAgB9M,KAAK8M,MAErB9M,KAAK2mB,QACR7Z,EAAMjH,EAAI7F,KAAK2mB,MAAMpK,QAGlBvc,KAAKgnB,QACRla,EAAMI,EAAIlN,KAAKgnB,MAAM1K,QAGtB,IAAIiK,EAAoBvmB,KAAKumB,UAEzB1gB,EAAY7C,KAAKE,IAAI4J,EAAMjH,EAAG8d,EAAU9d,GACxCqH,EAAYlK,KAAKE,IAAI4J,EAAMI,EAAGyW,EAAUzW,GAExCia,EAAY/c,EAAA,MAAYpH,KAAKwL,IAAImV,EAAU9d,EAAIiH,EAAMjH,GAAI7F,KAAKonB,oBAC9DC,EAAYjd,EAAA,MAAYpH,KAAKwL,IAAImV,EAAUzW,EAAIJ,EAAMI,GAAIlN,KAAKonB,oBAElE,OAAQpnB,KAAKmmB,UACZ,IAAK,QACJjZ,EAAI,EACJma,EAAIrnB,KAAKsnB,YACT,MACD,IAAK,QACJzhB,EAAI,EACJshB,EAAInnB,KAAKunB,WACT,MACD,IAAK,UACJra,EAAI,EACJma,EAAIrnB,KAAKsnB,YACT,MACD,IAAK,UACJzhB,EAAI,EACJshB,EAAInnB,KAAKunB,WAIXhB,EAAU1gB,EAAIA,EACd0gB,EAAUrZ,EAAIA,EAEdqZ,EAAUtK,KAAOC,EAAA,UAAgBiL,EAAGE,GAEpCd,EAAUiB,wBAGVxnB,KAAKumB,UAAUrF,SAWR8E,EAAA1lB,UAAAmnB,SAAV,SAAmB3a,GAMlB,OALAA,EAAMjH,EAAI7C,KAAKgB,IAAI,EAAG8I,EAAMjH,GAC5BiH,EAAMI,EAAIlK,KAAKgB,IAAI,EAAG8I,EAAMI,GAC5BJ,EAAMjH,EAAI7C,KAAKE,IAAIlD,KAAKunB,WAAYza,EAAMjH,GAC1CiH,EAAMI,EAAIlK,KAAKE,IAAIlD,KAAKsnB,YAAaxa,EAAMI,GAEpCJ,GASEkZ,EAAA1lB,UAAA+jB,gBAAV,SAA0BvX,GACzBlN,EAAAU,UAAM+jB,gBAAetkB,KAAAC,KAAC8M,GAEjB9M,KAAK0nB,eAAiB1nB,KAAK0nB,aAAaxD,UAI5ClkB,KAAK2nB,oBAAoB7a,GAGtB9M,KAAK2jB,WAAavZ,EAAA,YAAkBpK,KAAK2jB,UAAW7W,GAAS,GACnC,OAAzB9M,KAAK0jB,mBACR1jB,KAAK4nB,mBACL5nB,KAAKwkB,SAAS,aASPwB,EAAA1lB,UAAAqnB,oBAAV,SAA8B7a,GAC7BA,EAAQ9M,KAAKynB,SAASznB,KAAK8M,OAEvB9M,KAAK2mB,OAAS3mB,KAAK2mB,MAAMrI,UAAYte,KAAKiR,QAC7CjR,KAAK2mB,MAAM9gB,EAAIiH,EAAMjH,GAElB7F,KAAKgnB,OAAShnB,KAAKgnB,MAAM1I,UAAYte,KAAKmR,QAC7CnR,KAAKgnB,MAAM9Z,EAAIJ,EAAMI,GAEtBlN,KAAKulB,mBAIIS,EAAA1lB,UAAAokB,gBAAV,SAA0B5X,GACzB,GAAI9M,KAAKse,UAAYte,KAAKue,SAEzB,GAAIve,KAAKgkB,aAAalX,GAAQ,CAC7B9M,KAAK2jB,WAAc9d,EAAGiH,EAAMjH,EAAGqH,EAAGJ,EAAMI,GAExClN,KAAKglB,YAAYlY,GAIjB9M,KAAK8M,MAAMjH,EAAI7F,KAAK2jB,UAAU9d,EAC9B7F,KAAK8M,MAAMI,EAAIlN,KAAK2jB,UAAUzW,EAE9B,IAAIqZ,EAAoBvmB,KAAKumB,UACzBsB,EAAqB7nB,KAAK2jB,UAAU9d,EACpCiiB,EAAqB9nB,KAAK2jB,UAAUzW,EAEpClN,KAAKknB,iBACRX,EAAU1gB,EAAIgiB,EACdtB,EAAUrZ,EAAI4a,EACdvB,EAAUtK,KAAO,GACjBsK,EAAUhG,QAEX3gB,EAAAU,UAAMokB,gBAAe3kB,KAAAC,KAAC8M,QAGtB9M,KAAK2jB,eAAY9b,OAIlB7H,KAAK2jB,eAAY9b,GAQTme,EAAA1lB,UAAA0kB,YAAV,SAAsBlY,GACjB9M,KAAK2mB,QACR7Z,EAAMjH,EAAI7F,KAAK2mB,MAAMpK,QAElBvc,KAAKgnB,QACRla,EAAMI,EAAIlN,KAAKgnB,MAAM1K,SAKb0J,EAAA1lB,UAAAykB,cAAV,SAAwBjY,GACnB1C,EAAA,YAAkBpK,KAAKklB,aAAcllB,KAAKmlB,gBAAkB/kB,OAAA+iB,EAAA,EAAA/iB,GAAiBglB,aAAaplB,KAAKqlB,aAAc,gBAC5GrlB,KAAK2jB,YACR3jB,KAAKilB,QAAUnY,EAEf9M,KAAKglB,YAAYhlB,KAAKilB,SAEtBjlB,KAAK+nB,YAEgB,WAAjB/nB,KAAKmmB,UAA0C,WAAjBnmB,KAAKmmB,UAA0C,YAAjBnmB,KAAKmmB,UAIpEnmB,KAAKumB,UAAUrF,OAEhBthB,EAAAU,UAAMykB,cAAahlB,KAAAC,KAAC8M,IAIrB9M,KAAKumB,UAAUrF,KAAK,GAErBlhB,KAAK2jB,eAAY9b,GASRme,EAAA1lB,UAAAsnB,iBAAV,WAEC,IAAII,EAAS5d,EAAA,MAAYpK,KAAK2jB,UAAU9d,EAAI7F,KAAKwlB,WAAY,GACzDyC,EAAS7d,EAAA,MAAYpK,KAAK2jB,UAAUzW,EAAIlN,KAAKylB,YAAa,GAK1DyC,EAASF,EAHE5d,EAAA,MAAYpK,KAAK8M,MAAMjH,EAAI7F,KAAKwlB,WAAY,GAIvD2C,GAAUF,EAHC7d,EAAA,MAAYpK,KAAK8M,MAAMI,EAAIlN,KAAKylB,YAAa,GAK5DzlB,KAAKooB,QAAWvkB,MAAOqkB,EAAQpkB,IAAK,EAAIokB,GACxCloB,KAAKqoB,QAAWxkB,MAAOskB,EAAQrkB,IAAK,EAAIqkB,GAEnB,QAAjBnoB,KAAKmmB,WACRnmB,KAAKqoB,OAAOxkB,MAAQ,EACpB7D,KAAKqoB,OAAOvkB,IAAM,GAEE,QAAjB9D,KAAKmmB,WACRnmB,KAAKooB,OAAOvkB,MAAQ,EACpB7D,KAAKooB,OAAOtkB,IAAM,IASVkiB,EAAA1lB,UAAAynB,UAAV,WACK/nB,KAAK2mB,QACR3mB,KAAKilB,QAAQpf,EAAI7F,KAAK2mB,MAAMpK,QAEzBvc,KAAKgnB,QACRhnB,KAAKilB,QAAQ/X,EAAIlN,KAAKgnB,MAAM1K,QAI7Btc,KAAKumB,UAEL,IAAIyB,EAAiB5d,EAAA,MAAYpK,KAAK2jB,UAAU9d,EAAI7F,KAAKwlB,WAAY,GACjE8C,EAAele,EAAA,MAAapK,KAAKilB,QAAS,EAAIjlB,KAAKwlB,WAAY,GAE/DyC,EAAiB7d,EAAA,MAAYpK,KAAK2jB,UAAUzW,EAAIlN,KAAKylB,YAAa,GAClE8C,EAAene,EAAA,MAAapK,KAAKilB,QAAS,EAAIjlB,KAAKylB,YAAa,GAEpEzlB,KAAKooB,QAAWvkB,MAAOuG,EAAA,IAAU4d,EAAQM,GAAOxkB,IAAKsG,EAAA,IAAU4d,EAAQM,IACvEtoB,KAAKqoB,QAAWxkB,MAAOuG,EAAA,IAAU6d,EAAQM,GAAOzkB,IAAKsG,EAAA,IAAU6d,EAAQM,KAsBxEnoB,OAAAC,eAAW2lB,EAAA1lB,UAAA,gBAsBX,WACC,OAAON,KAAKO,iBAAiB,iBAvB9B,SAAoBC,GACnBR,KAAKS,iBAAiB,WAAYD,GAAO,GAEzCR,KAAKknB,gBAAiB,GAEQ,GAA1B1mB,EAAM+a,QAAQ,UACjBvb,KAAK0jB,iBAAmB,OACxB1jB,KAAKknB,gBAAiB,IAES,GAA5B1mB,EAAM+a,QAAQ,YACjBvb,KAAK0jB,iBAAmB,SACxB1jB,KAAKknB,gBAAiB,IAEM,GAAzB1mB,EAAM+a,QAAQ,SACjBvb,KAAK0jB,iBAAmB,MACxB1jB,KAAKknB,gBAAiB,oCAoBxB9mB,OAAAC,eAAW2lB,EAAA1lB,UAAA,sBAOX,WACC,OAAON,KAAKO,iBAAiB,uBAR9B,SAA0BC,GACzBR,KAAKS,iBAAiB,iBAAkBD,oCAmBzCJ,OAAAC,eAAW2lB,EAAA1lB,UAAA,sBAOX,WACC,OAAON,KAAKO,iBAAiB,uBAR9B,SAA0BC,GACzBR,KAAKS,iBAAiB,iBAAkBD,oCAgBzCJ,OAAAC,eAAW2lB,EAAA1lB,UAAA,iBAOX,WACC,OAAON,KAAKO,iBAAiB,kBAR9B,SAAqBC,GACpBR,KAAKS,iBAAiB,YAAaD,oCAuBpCJ,OAAAC,eAAW2lB,EAAA1lB,UAAA,aAYX,WACC,OAAON,KAAKoY,OAAOsE,WAbpB,SAAiB9b,GACZZ,KAAKoY,OAAOsE,OAAS9b,GACxBZ,KAAKoY,OAAO4E,IAAIpc,EAAM,IAAIyX,EAAA,GACzBzX,EAAKqY,QAAQE,OAAOC,GAAG,kBAAmBpZ,KAAKwoB,uBAAwBxoB,MAAM,uCA0BhFI,OAAAC,eAAW2lB,EAAA1lB,UAAA,aAYX,WACC,OAAON,KAAKsY,OAAOoE,WAbpB,SAAiB9b,GACZZ,KAAKsY,OAAOoE,OAAS9b,GACxBZ,KAAKsY,OAAO0E,IAAIpc,EAAM,IAAIyX,EAAA,GACzBzX,EAAKqY,QAAQE,OAAOC,GAAG,kBAAmBpZ,KAAKyoB,uBAAwBzoB,MAAM,uCAmBtEgmB,EAAA1lB,UAAAkoB,uBAAV,SAAiChF,GAChC,IAAIvK,EAAmBjZ,KAAKiR,MAAMgI,QAC9BnM,EAAgBkO,EAAA,kBAA0BnV,EAAGoT,EAAQsD,OAAQrP,EAAG+L,EAAQqD,QAAUtc,MAClF6F,EAAYiH,EAAMjH,EAStB,GAPI7F,KAAK2mB,QACR3mB,KAAK2mB,MAAM9gB,EAAIA,EACV7F,KAAKgkB,aAAalX,IACtB9M,KAAKkhB,QAIHlhB,KAAKiR,OAASjR,KAAK0oB,eAAgB,CACtC,IAAIre,EAAqBrK,KAAKiR,MAAM0X,sBAChCre,EAAmBtK,KAAKiR,MAAM2X,oBAClC,GAAIve,GAAcC,EAAU,CAC3BtK,KAAK2mB,MAAM9gB,EAAIA,EACf,IAAIsW,EAAgB7R,EAASzE,EAAIwE,EAAWxE,EAC5C7F,KAAK2mB,MAAM1K,KAAOC,EAAA,UAAgBC,EAAOnc,KAAKylB,aAActJ,EAAQ,MAW7D6J,EAAA1lB,UAAAmoB,uBAAV,SAAiCjF,GAChC,IAAIvK,EAAmBjZ,KAAKmR,MAAM8H,QAC9BnM,EAAgBkO,EAAA,kBAA0BnV,EAAGoT,EAAQsD,OAAQrP,EAAG+L,EAAQqD,QAAUtc,MAClFkN,EAAYJ,EAAMI,EAUtB,GARIlN,KAAKgnB,QACRhnB,KAAKgnB,MAAM9Z,EAAIA,EAEVlN,KAAKgkB,aAAalX,IACtB9M,KAAKkhB,QAIHlhB,KAAKmR,OAASnR,KAAK6oB,eAAgB,CACtC,IAAIxe,EAAqBrK,KAAKmR,MAAMwX,sBAChCre,EAAmBtK,KAAKmR,MAAMyX,oBAClC,GAAIve,GAAcC,EAAU,CAC3BtK,KAAKgnB,MAAM9Z,EAAIA,EACf,IAAIkP,EAAiB9R,EAAS4C,EAAI7C,EAAW6C,EAC7ClN,KAAKgnB,MAAM/K,KAAOC,EAAA,UAAgBlc,KAAKwlB,WAAYpJ,EAAQ,GAAIA,EAAS,MAU3Ehc,OAAAC,eAAW2lB,EAAA1lB,UAAA,aAeX,WACC,OAAON,KAAKimB,OAAOvJ,WAhBpB,SAAiBiK,GACZA,GACHA,EAAM9N,WAAW7Y,KAAK8Y,MAAMC,IAAI,SAChC/Y,KAAKimB,OAAOjJ,IAAI2J,EAAOA,EAAMxN,OAAOC,GAAG,kBAAmBpZ,KAAKulB,gBAAiBvlB,MAAM,IACtF2mB,EAAMlD,qBAAsB,EAC5BkD,EAAMmC,OAAS9oB,MAGfA,KAAKimB,OAAO8C,yCAgBd3oB,OAAAC,eAAW2lB,EAAA1lB,UAAA,aAeX,WACC,OAAON,KAAKkmB,OAAOxJ,WAhBpB,SAAiBsK,GACZA,GACHA,EAAMnO,WAAW7Y,KAAK8Y,MAAMC,IAAI,SAChC/Y,KAAKkmB,OAAOlJ,IAAIgK,EAAOA,EAAM7N,OAAOC,GAAG,kBAAmBpZ,KAAKulB,gBAAiBvlB,MAAM,IACtFgnB,EAAM8B,OAAS9oB,KACfgnB,EAAMvD,qBAAsB,GAG5BzjB,KAAKkmB,OAAO6C,yCAgBd3oB,OAAAC,eAAW2lB,EAAA1lB,UAAA,iBAWX,WACC,OAAON,KAAKgpB,gBAZb,SAAqBzC,GACpBvmB,KAAKgpB,WAAazC,EACdA,IACHA,EAAU0C,QAAUjpB,KAAK8Y,MAAMC,IAAI,QACnCwN,EAAUuC,OAAS9oB,uCAoBdgmB,EAAA1lB,UAAA2hB,cAAP,SAAqBC,GAEhBA,IAGCjc,EAAA,SAAeic,EAAOjR,QAAUhL,EAAA,SAAeic,EAAOjR,SACrDjR,KAAKmiB,IAAI7e,OAAO4e,EAAOjR,OAC1BiR,EAAOjR,MAAQjR,KAAKmiB,IAAIpb,OAAOmb,EAAOjR,QAGtCjR,KAAKoiB,iBAAiB5Q,KAAK,+BAAkC0Q,EAAOjR,MAAQ,8BACrEiR,EAAOjR,QAGZhL,EAAA,SAAeic,EAAO/Q,QAAUlL,EAAA,SAAeic,EAAO/Q,SACrDnR,KAAKmiB,IAAI7e,OAAO4e,EAAO/Q,OAC1B+Q,EAAO/Q,MAAQnR,KAAKmiB,IAAIpb,OAAOmb,EAAO/Q,QAGtCnR,KAAKoiB,iBAAiB5Q,KAAK,+BAAkC0Q,EAAO/Q,MAAQ,8BACrE+Q,EAAO/Q,QAIZlL,EAAA,SAAeic,EAAOwF,eAAiBzhB,EAAA,SAAeic,EAAOwF,gBAC5D1nB,KAAKmiB,IAAI7e,OAAO4e,EAAOwF,cAC1BxF,EAAOwF,aAAe1nB,KAAKmiB,IAAIpb,OAAOmb,EAAOwF,eAG7C1nB,KAAKoiB,iBAAiB5Q,KAAK,iCAAoC0Q,EAAOwF,aAAe,+BAC9ExF,EAAOwF,gBAMjB9nB,EAAAU,UAAM2hB,cAAaliB,KAAAC,KAACkiB,IAWrB9hB,OAAAC,eAAW2lB,EAAA1lB,UAAA,oBAeX,WACC,OAAON,KAAKO,iBAAiB,qBAhB9B,SAAwB8E,GACnBrF,KAAKS,iBAAiB,eAAgB4E,KACrCrF,KAAKkpB,iBACRlpB,KAAKkpB,gBAAgBpM,UAGlBzX,IACHrF,KAAKkpB,gBAAkB7jB,EAAO8T,OAAOC,GAAG,iBAAkBpZ,KAAKmpB,WAAYnpB,MAAM,sCAkB7EgmB,EAAA1lB,UAAA6oB,WAAP,WAEC,IAAI9jB,EAASrF,KAAK0nB,aACdxa,EAAI7H,EAAO4Z,SACXpZ,EAAIR,EAAO2Z,SAEXhf,KAAKiR,OACJjR,KAAKiR,MAAMjH,SAASof,WACvBlc,GAAKlN,KAAKsnB,aAIZtnB,KAAK8M,OAAUjH,EAAGA,EAAGqH,EAAGA,GACxBlN,KAAKukB,eAEL,IAAI8E,EAAKxjB,EACLyjB,EAAKpc,EAETrH,GAAK7F,KAAKunB,WAENvnB,KAAKmR,OACJnR,KAAKmR,MAAMnH,SAASof,WACvBvjB,GAAK7F,KAAKunB,YAIZ,IAAItO,EAAU5T,EAAO4T,QACjB5M,EAAW4M,EAAQsQ,kBACnBC,EAASvQ,EAAQwQ,gBAEjBpkB,EAAOE,UAAYF,EAAO4L,OAC7B5L,EAAO8L,MAAMP,sBAAsB5Q,KAAKqe,WAGrChZ,EAAOE,UAAYF,EAAO8L,OAC7B9L,EAAO4L,MAAML,sBAAsB5Q,KAAKoe,WAGzCpe,KAAK2mB,MAAM+C,UAAWC,SAAU,IAAKC,GAAI1c,IAAMb,EAAUmd,GACzDxpB,KAAKgnB,MAAM0C,UAAWC,SAAU,IAAKC,GAAI/jB,IAAMwG,EAAUmd,GAEpDxpB,KAAKiR,OACTjR,KAAK2mB,MAAM+C,UAAWC,SAAU,IAAKC,GAAIP,IAAOhd,EAAUmd,GAEtDxpB,KAAKmR,OACTnR,KAAKgnB,MAAM0C,UAAWC,SAAU,IAAKC,GAAIN,IAAOjd,EAAUmd,IAG7DxD,EAhyBA,CAA8BrD,GAwyB9B1hB,EAAA,EAASC,kBAA4B,SAAI6kB,0CCr1BzC8D,EAAA,SAAAjqB,GA0CC,SAAAkqB,IAAA,IAAAhqB,EACCF,EAAAG,KAAAC,OAAOA,KAlBEF,EAAA0a,OAAS,IAAInC,EAAA,EAmBtBvY,EAAKG,UAAY,mBAEjB,IAAIomB,EAAkB,IAAIC,EAAA,EAC1BxmB,EAAKiqB,QAAQ,EAAG,EAAG,EAAG,GAEtB,IAAIC,EAA0BlqB,EAAK0mB,YAAYyD,GAC/CD,EAAejH,aAAc,EAC7BiH,EAAeE,OAAO,EAAG,EAAG,EAAG,GAC/BF,EAAeD,QAAQ,EAAG,EAAG,EAAG,GAChCC,EAAevG,qBAAsB,EAErC3jB,EAAKqqB,gBAAkBH,EACvBlqB,EAAKkT,WAAWxB,KAAK1R,EAAKqqB,iBAE1BrqB,EAAKsqB,UAAY,GACjBtqB,EAAKuqB,SAAW,GAEhB,IAAIC,EAA4BxqB,EAAK0mB,YAAY5N,EAAA,GACjD0R,EAAkBvH,aAAc,EAChCuH,EAAkBzR,WAAW/Y,EAAKgZ,MAAMC,IAAI,SAC5CuR,EAAkB/e,KAAO8a,EAAgBK,OAAO,cAChD4D,EAAkB7D,YAAc,GAChC6D,EAAkB7G,qBAAsB,EACxC6G,EAAkB7R,YAAa,EAC/B6R,EAAkBC,SAClBzqB,EAAK0qB,mBAAqBF,EAC1BxqB,EAAKkT,WAAWxB,KAAK1R,EAAK0qB,oBAE1BR,EAAeO,SAEfzqB,EAAK2qB,WAAWC,aAAa,EAAG,EAAG,EAAG,GAEtC,IAAIC,EAAkB7qB,EAAK8qB,MAAMH,WACjCE,EAAgBD,aAAa,EAAG,EAAG,EAAG,GACtCC,EAAgBlE,YAAc,EAC9BkE,EAAgBpf,KAAO8a,EAAgBK,OAAO,cAE9C,IAAImE,EAAaF,EAAgBG,OAAO/jB,OAAO,SAC3C8jB,IACHA,EAAWpY,WAAWgU,YAAc,IAGrC,IAAIsE,EAAYJ,EAAgBG,OAAO/jB,OAAO,eAC1CgkB,IACHA,EAAUtY,WAAWgU,YAAc,IAGpC3mB,EAAKkT,WAAWxB,KAAK1R,EAAK0a,QAE1B1a,EAAKI,eA0TP,OAvZsCC,EAAA,EAAA2pB,EAAAlqB,GAsGrCQ,OAAAC,eAAWypB,EAAAxpB,UAAA,cAAX,WAMC,OALKN,KAAKkT,UACTlT,KAAKkT,QAAU,IAAIpR,EAAA,EACnB9B,KAAKgT,WAAWxB,KAAKxR,KAAKkT,QAAQiG,OAAOC,GAAG,WAAYpZ,KAAKgrB,kBAAmBhrB,MAAM,IACtFA,KAAKgT,WAAWxB,KAAKxR,KAAKkT,QAAQiG,OAAOC,GAAG,UAAWpZ,KAAKirB,oBAAqBjrB,MAAM,KAEjFA,KAAKkT,yCAQH4W,EAAAxpB,UAAA0qB,kBAAV,SAA4BxH,GAC3B,IAAI0H,EAAyB1H,EAAM2H,SAC/BnB,EAA0BhqB,KAAKgqB,eACnCA,EAAeoB,cAAcjgB,UAAW,EAExCnL,KAAK0R,MAAQwZ,EAAaxZ,MAE1B,IAAI2Z,GAAoB,EACpBC,GAAoB,EAGxBlmB,EAAA,KAAWpF,KAAKqF,OAAOC,WAAY,SAACD,GAC/BA,GAAU6lB,IACT7lB,EAAO4L,OAASia,EAAaja,QAChCoa,GAAW,GAERhmB,EAAO8L,OAAS+Z,EAAa/Z,QAChCma,GAAW,MAKd,IAAIjF,EAAkB,IAAIC,EAAA,EAEtBjhB,EAA6B6lB,EAAaK,QAE9C,GAAIF,EAAU,CAEb,IAAIpa,EAAQia,EAAaja,MAAMsa,QAC/BvB,EAAerN,MAAMhS,UAAUsG,GAC/BA,EAAMua,MAAMrgB,UAAW,EACvB8F,EAAMwa,oBAAsB,EAC5Bxa,EAAMya,GAAKR,EAAa5kB,IACxB2K,EAAMua,MAAMrgB,UAAW,GAEnBnB,EAAWiH,EAAMjH,UACZgG,MAAMlB,SAAS3D,UAAW,EACnCnB,EAAS2hB,QAAS,EAClB3hB,EAAS4hB,KAAK7E,cAAgB,EAC9B/c,EAAS6hB,iBAAmB,IAC5B7hB,EAAS8hB,iBAAmB,IAC5B9hB,EAAS4hB,KAAKzgB,UAAW,EACzBnB,EAAS+hB,UAAUjd,SAAS3D,UAAW,EACvCnB,EAASkG,SAAS/E,UAAW,EAC7BnB,EAASqB,KAAKyD,SAASiY,cAAgB,IAElB/c,EAASiG,OAAOnB,SACtB2X,YAAc,GAE7BphB,EAAO4L,MAAQA,EAOhB,GAAIqa,EAAU,CACb,IAKIthB,EALAmH,EAAoB+Z,EAAa/Z,MAAMoa,QAC3CvB,EAAe9M,MAAMvS,UAAUwG,GAC/BA,EAAMqa,MAAMrgB,UAAW,EACvBgG,EAAMsa,oBAAsB,GAExBzhB,EAAWmH,EAAMnH,UACZgG,MAAMlB,SAAS3D,UAAW,EACnCnB,EAAS2hB,QAAS,EAClB3hB,EAAS4hB,KAAK7E,cAAgB,EAC9B/c,EAAS6hB,iBAAmB,IAC5B7hB,EAAS8hB,iBAAmB,IAC5B9hB,EAAS4hB,KAAKzgB,UAAW,EACzBnB,EAAS+hB,UAAUjd,SAAS3D,UAAW,EACvCnB,EAASqB,KAAKyD,SAAS8X,OAASP,EAAgBK,OAAO,cACvD1c,EAASkG,SAAS/E,UAAW,EAC7BnB,EAASqB,KAAKyD,SAASiY,cAAgB,IAElB/c,EAASiG,OAAOnB,SACtB2X,YAAc,GAE7BphB,EAAO8L,MAAQA,EAMhB9L,EAAOomB,oBAAsB,EAC7BpmB,EAAOqb,sBAAwB,EAC/Brb,EAAOsb,aAAaC,mBAAqB,EACzCvb,EAAO2mB,YAAa,EAEpBhsB,KAAKgT,WAAWxB,KAAKnM,EAAO8T,OAAOC,GAAG,YAAapZ,KAAKisB,YAAajsB,MAAM,IAG3EA,KAAKgT,WAAWxB,KAAK0Z,EAAa/R,OAAOC,GAAG,gBAAiB,WACxD/T,EAAOwU,MAAQqR,EAAarR,OAC/BxU,EAAOwU,KAAOqR,EAAarR,YAE1BhS,GAAW,IACdxC,EAAOsb,aAAalO,WAAW6L,SAAU,EAEzCjZ,EAAO6mB,QAAQ1a,KAAK,IAAI2a,EAAA,GACxBnC,EAAe3kB,OAAOmM,KAAKnM,GAE3BrF,KAAKosB,uBAMItC,EAAAxpB,UAAA8rB,oBAAV,eAAAtsB,EAAAE,KACKA,KAAKmqB,kBACR/kB,EAAA,KAAWpF,KAAKmqB,gBAAgBxN,MAAMrX,WAAY,SAAC2L,GAClD,IAAIjH,EAAWiH,EAAMjH,SACG,YAApBlK,EAAKusB,aACRriB,EAASqB,KAAKyD,SAAS3D,UAAW,EAClCnB,EAASiG,OAAOnB,SAAS3D,UAAW,EACpCnB,EAASO,gBAAkB,KAG3BP,EAASqB,KAAKyD,SAAS3D,UAAW,EAClCnB,EAASiG,OAAOnB,SAAS3D,UAAW,EACpCnB,EAASO,gBAAkB0G,EAAMqb,WAAWtiB,SAASO,mBAKvDnF,EAAA,KAAWpF,KAAKmqB,gBAAgBjN,MAAM5X,WAAY,SAAC6L,GAClD,IAAInH,EAAWmH,EAAMnH,SACG,cAApBlK,EAAKusB,aACRriB,EAASqB,KAAKyD,SAAS3D,UAAW,EAClCnB,EAASiG,OAAOnB,SAAS3D,UAAW,EACpCnB,EAASO,gBAAkB,KAG3BP,EAASqB,KAAKyD,SAAS3D,UAAW,EAClCnB,EAASiG,OAAOnB,SAAS3D,UAAW,EACpCnB,EAASO,gBAAkB4G,EAAMmb,WAAWtiB,SAASO,qBAa/Cuf,EAAAxpB,UAAA2qB,oBAAV,SAA8BzH,GACAA,EAAM+I,SACtBpT,OAAOqT,IAAI,YAAaxsB,KAAKisB,YAAajsB,OAcxDI,OAAAC,eAAWypB,EAAAxpB,UAAA,sBAAX,WACC,OAAON,KAAKmqB,iDAQb/pB,OAAAC,eAAWypB,EAAAxpB,UAAA,aAWX,WACC,OAAON,KAAKwa,OAAOkC,WAZpB,SAAiBhL,GACZ1R,KAAKwa,OAAOkC,QAAUhL,IACzB1R,KAAKwa,OAAOwC,IAAItL,EAAOA,EAAMyH,OAAOC,GAAG,gBAAiBpZ,KAAKysB,kBAAmBzsB,MAAM,IACtFA,KAAKysB,oBACLzsB,KAAKmqB,gBAAgBuC,aAAehb,oCAiB/BoY,EAAAxpB,UAAAmsB,kBAAP,WAEKzsB,KAAK0R,MAAMmI,MAAQ7Z,KAAKgqB,eAAenQ,OAC1C7Z,KAAKgqB,eAAenQ,KAAO7Z,KAAK0R,MAAMmI,OAO9BiQ,EAAAxpB,UAAA2rB,YAAV,WACC,IAAIjC,EAA0BhqB,KAAKgqB,eACnC5kB,EAAA,KAAW4kB,EAAerN,MAAMrX,WAAY,SAACO,GAC5CA,EAAE1B,MAAON,MAAO,EAAGC,IAAK,IAAK,GAAM,KAEpCsB,EAAA,KAAW4kB,EAAe9M,MAAM5X,WAAY,SAAC4H,GAC5CA,EAAE/I,MAAON,MAAO,EAAGC,IAAK,IAAK,GAAM,MAO3BgmB,EAAAxpB,UAAAqsB,YAAV,WAEC,GADA/sB,EAAAU,UAAMqsB,YAAW5sB,KAAAC,MACbA,KAAKwqB,mBAAoB,CAC5B,IAAII,EAAQ5qB,KAAK4qB,MACb/kB,EAAY+kB,EAAMrO,QAAU,EAC5BrP,EAAY0d,EAAMtO,QAAU,EAC5B6K,EAAYyD,EAAMrD,YAAc,EAChCF,EAAYuD,EAAMtD,aAAe,EAEjCrL,EAAe,GAEK,cAApBjc,KAAKqsB,aACRpQ,EAAOC,EAAA,YACNrW,GAAI,EACJqH,EAAG,EACHiP,MAAOtW,EACPuW,OAAQiL,IAGTpL,GAAQC,EAAA,YACPrW,EAAGA,EAAIshB,EACPja,EAAG,EACHiP,OAAQnc,KAAKunB,YAAc,GAAK1hB,EAAIshB,EACpC/K,OAAQiL,MAITpL,EAAOC,EAAA,YACNrW,EAAG,EACHqH,EAAG,EACHiP,MAAOgL,EACP/K,OAAQlP,IAGT+O,GAAQC,EAAA,YACPrW,EAAG,EACHqH,EAAGA,EAAIma,EACPlL,MAAOgL,EACP/K,QAASpc,KAAKsnB,aAAe,GAAKpa,EAAIma,KAIxCrnB,KAAKwqB,mBAAmBvO,KAAOA,IAU1B6N,EAAAxpB,UAAA2hB,cAAP,SAAqBC,GAEpB,GAAIA,GAECjc,EAAA,SAAeic,EAAO7c,SAAWY,EAAA,QAAcic,EAAO7c,QACzD,IAAK,IAAIkO,EAAI,EAAGe,EAAM4N,EAAO7c,OAAO4C,OAAQsL,EAAIe,EAAKf,IAAK,CACzD,IAAIlO,EAAS6c,EAAO7c,OAAOkO,GAC3B,GAAItN,EAAA,SAAeZ,IAAWY,EAAA,SAAeZ,GAAS,CACrD,IAAIrF,KAAKmiB,IAAI7e,OAAO+B,GAInB,MAAM6U,MAAM,2CAA6C7U,EAAS,qBAHlE6c,EAAO7c,OAAOkO,GAAKvT,KAAKmiB,IAAIpb,OAAO1B,IAWxCzF,EAAAU,UAAM2hB,cAAaliB,KAAAC,KAACkiB,IAGtB4H,EAvZA,CAAsC8C,EAAA,GA+ZtC3rB,EAAA,EAASC,kBAAoC,iBAAI2oB,kBC5ajDgD,EAAA,SAAAjtB,GAUC,SAAAktB,IAAA,IAAAhtB,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,kBACjBH,EAAKI,eAGP,OAhBqCC,EAAA,EAAA2sB,EAAAltB,GAgBrCktB,EAhBA,CAAqCC,EAAA,GA2MrC9C,EAAA,SAAArqB,GAiJC,SAAAotB,IAAA,IAAAltB,EAGCF,EAAAG,KAAAC,OAAOA,KA9CEF,EAAAmtB,eAAuCC,EAAA,EAKvCptB,EAAAqtB,eAAuCC,EAAA,EA2ChDttB,EAAKG,UAAY,UAIjBH,EAAKutB,aAAc,EACnBvtB,EAAKwtB,iBAAkB,EAGvB,IAAIC,EAAiBztB,EAAKytB,eAC1BA,EAAeC,OAAS,WACxB1tB,EAAKiqB,QAAQ,GAAI,GAAI,GAAI,IAGzB,IAAI0D,EAAcF,EAAe/G,YAAYV,EAAA,GAC7C2H,EAAY1K,aAAc,EAC1B0K,EAAYD,OAAS,WACrBC,EAAYtR,MAAQ/b,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAC5BqtB,EAAYC,OAAS,EACrB5tB,EAAK6tB,iBAAmBF,EAMxB,IAAIG,EAAmBL,EAAe/G,YAAYV,EAAA,GAClD8H,EAAiB7K,aAAc,EAC/B6K,EAAiBJ,OAAS,aAC1BI,EAAiBzR,MAAQ/b,OAAA0iB,EAAA,EAAA1iB,CAAQ,KACjCwtB,EAAiBxR,OAAShc,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAClCwtB,EAAiBF,OAAS,EAC1B5tB,EAAK+tB,sBAAwBD,EAG7B,IAAIE,EAAiBP,EAAe/G,YAAYV,EAAA,GAChDgI,EAAe/K,aAAc,EAC7B+K,EAAe3R,MAAQ/b,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAC/B0tB,EAAeN,OAAS,WACxBM,EAAeJ,OAAS,EACxB5tB,EAAKiuB,oBAAsBD,EAG3B,IAAIE,EAAeJ,EAAiBpH,YAAYV,EAAA,GAChDkI,EAAajL,aAAc,EAC3BiL,EAAaR,OAAS,aACtBQ,EAAa5R,OAAShc,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAC9B4tB,EAAaC,aAAe,QAC5BD,EAAa7U,OAAOC,GAAG,cAAetZ,EAAKouB,mBAAoBpuB,GAAM,GACrEkuB,EAAaN,OAAS,EACtB5tB,EAAKquB,kBAAoBH,EAGzB,IAAII,EAAWR,EAAiBpH,YAAYV,EAAA,GAC5CsI,EAASrL,aAAc,EACvBqL,EAAShS,OAAShc,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAC1BguB,EAASjS,MAAQ/b,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAGzBguB,EAAS3D,WAAWhE,YAAc,EAClC3mB,EAAK8lB,cAAgBwI,EAGrBtuB,EAAKuuB,mBAAqB,OAE1BvuB,EAAKwuB,iBAAmBF,EAGxB,IAAIG,EAAgBX,EAAiBpH,YAAYV,EAAA,GACjDyI,EAAcxL,aAAc,EAC5BwL,EAAcf,OAAS,aACvBe,EAAcnS,OAAShc,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAC/BmuB,EAAcb,OAAS,EACvBa,EAAcpV,OAAOC,GAAG,cAAetZ,EAAKouB,mBAAoBpuB,GAAM,GACtEA,EAAK0uB,mBAAqBD,EAE1BzuB,EAAK2uB,gBAAgB3F,OAASsF,EAC9BtuB,EAAK4uB,iBAAiB5F,OAASsF,EAE/B,IAAIhD,EAAgBgD,EAAS5H,YAAYmI,EAAA,UACzCvD,EAAcrI,aAAc,EAC5BqI,EAAcwD,MAAQ,QACtBxD,EAAcyD,OAAS,MACvBzD,EAAcsC,OAASvnB,OAAO2oB,iBAC9B1D,EAAc2D,UAAY,EAC1B3D,EAAc4D,YAAc,EAE5B5D,EAAclK,KAAK,GACnBphB,EAAKsrB,cAAgBA,EAErBtrB,EAAKmvB,YAAcnvB,EAAK8lB,cAGxB9lB,EAAKI,eA6+CP,OA9tD6BC,EAAA,EAAA6sB,EAAAptB,GAyPlBotB,EAAA1sB,UAAA+C,sBAAV,WAECzD,EAAAU,UAAM+C,sBAAqBtD,KAAAC,MAC3BA,KAAKorB,cAAc8D,YAAa,EAG3BjpB,EAAA,SAAejG,KAAKsZ,eACxBtZ,KAAKsZ,YAActZ,KAAKwD,SAASC,UAAU,eAUtCupB,EAAA1sB,UAAA6uB,KAAP,WACCvvB,EAAAU,UAAM6uB,KAAIpvB,KAAAC,MAEVA,KAAKyuB,gBAAgBW,UACrBpvB,KAAK0uB,iBAAiBU,UAElBpvB,KAAKqtB,cACRrtB,KAAK0uB,iBAAiBjjB,KAAOzL,KAAKivB,aAGnCjvB,KAAKqvB,sBAQCrC,EAAA1sB,UAAAgvB,mBAAP,WACClqB,EAAA,KAAWpF,KAAKqF,OAAOC,WAAY,SAACD,GACnCA,EAAOxE,gBAUFmsB,EAAA1sB,UAAA0F,aAAP,WAG4B,GAAvBhG,KAAKuvB,iBACRnqB,EAAA,KAAWpF,KAAK2c,MAAMrX,WAAY,SAAC1E,GAClCA,EAAK2Y,qBAGNnU,EAAA,KAAWpF,KAAKkd,MAAM5X,WAAY,SAAC1E,GAClCA,EAAK2Y,qBAGNnU,EAAA,KAAWpF,KAAKqF,OAAOC,WAAY,SAACD,GACnCA,EAAOkU,sBAIT3Z,EAAAU,UAAM0F,aAAYjG,KAAAC,OAQTgtB,EAAA1sB,UAAA4tB,mBAAV,WAEC,IAAIsB,EAAgBxvB,KAAKmuB,kBAAkBnZ,cACvCya,EAAiBzvB,KAAKwuB,mBAAmBxZ,cACzC8Y,EAAiB9tB,KAAK+tB,oBAEtBD,EAAe4B,aAAeF,GAAiB1B,EAAe6B,cAAgBF,IACjF3B,EAAe4B,YAAcF,EAC7B1B,EAAe6B,aAAeF,GAG/B,IAAIhC,EAAcztB,KAAK2tB,iBAEnBF,EAAYiC,aAAeF,GAAiB/B,EAAYkC,cAAgBF,IAC3EhC,EAAYiC,YAAcF,EAC1B/B,EAAYkC,aAAeF,IAWtBzC,EAAA1sB,UAAAsvB,kBAAP,SAAyBpM,GACxBxjB,KAAK6vB,YAAYrM,EAAMrE,SAUjB6N,EAAA1sB,UAAAwvB,kBAAP,SAAyBtM,GACxBxjB,KAAK+vB,YAAYvM,EAAMrE,SASjB6N,EAAA1sB,UAAA0vB,aAAP,SAAoBxM,GAEnB,IAAI5iB,EAAa4iB,EAAM2H,SACvBvqB,EAAK8Q,MAAQ1R,KAEbY,EAAKoJ,SAAW,IAAIhK,KAAKitB,eACzBrsB,EAAKsN,WAAa,IAElBtN,EAAKoJ,SAASimB,SAAS,WAAY,SAAU,WAAY,mBAAoBjwB,KAAK4vB,kBAAmB5vB,MACrGY,EAAKuY,OAAOC,GAAG,eAAgBpZ,KAAKkwB,uBAAwBlwB,MAAM,GAClEY,EAAKuY,OAAOC,GAAG,aAAcpZ,KAAKkwB,uBAAwBlwB,MAAM,GAKhEY,EAAK8rB,aAAe1sB,KAEpBA,KAAK6vB,YAAYjvB,EAAKoJ,UACtBhK,KAAKmwB,YAAYvvB,IAUXosB,EAAA1sB,UAAA8vB,aAAP,SAAoB5M,GAEnB,IAAI5iB,EAAa4iB,EAAM2H,SACvBvqB,EAAK8Q,MAAQ1R,KAEbY,EAAKoJ,SAAW,IAAIhK,KAAKmtB,eACzBvsB,EAAKsN,WAAa,IAElBtN,EAAKoJ,SAASimB,SAAS,WAAY,SAAU,WAAY,mBAAoBjwB,KAAK8vB,kBAAmB9vB,MACrGY,EAAKuY,OAAOC,GAAG,eAAgBpZ,KAAKqwB,uBAAwBrwB,MAAM,GAClEY,EAAKuY,OAAOC,GAAG,aAAcpZ,KAAKqwB,uBAAwBrwB,MAAM,GAKhEY,EAAK8rB,aAAe1sB,KAEpBA,KAAK+vB,YAAYnvB,EAAKoJ,UACtBhK,KAAKmwB,YAAYvvB,IAORosB,EAAA1sB,UAAA4vB,uBAAV,WACC,IAAInU,EAAgB/b,KAAKswB,mBAAmBtwB,KAAK2c,OAC7C3c,KAAKuwB,YACRvwB,KAAKwwB,SAASxwB,KAAK2c,MAAOZ,GAAO,GAElC/b,KAAKywB,sBACLzwB,KAAK0wB,gBAAgB1wB,KAAKuwB,WAAYxU,IAO7BiR,EAAA1sB,UAAAmwB,oBAAV,WACC,GAAIzwB,KAAKorB,cAAe,CACvB,IAAIuF,GAAO,EAEXvrB,EAAA,aAAmBpF,KAAK2c,MAAMrX,WAAY,SAAC1E,GAC1C,OAAkC,GAA9BwJ,EAAA,MAAYxJ,EAAKiD,MAAO,IAAuC,GAA5BuG,EAAA,MAAYxJ,EAAKkD,IAAK,KAC5D6sB,GAAO,GACA,KAITvrB,EAAA,aAAmBpF,KAAKkd,MAAM5X,WAAY,SAAC1E,GAC1C,OAAkC,GAA9BwJ,EAAA,MAAYxJ,EAAKiD,MAAO,IAAuC,GAA5BuG,EAAA,MAAYxJ,EAAKkD,IAAK,KAC5D6sB,GAAO,GACA,KAKJ3wB,KAAK4wB,iBACTD,GAAO,GAGJA,EACH3wB,KAAKorB,cAAc7K,OAGnBvgB,KAAKorB,cAAclK,SASZ8L,EAAA1sB,UAAAswB,eAAV,WACC,IAAI1S,GAAoB,EAOxB,OANA9Y,EAAA,KAAWpF,KAAKqF,OAAOC,WAAY,SAACD,GACnC,IAAKA,EAAO6Y,SAEX,OADAA,GAAW,GACJ,IAGFA,GAOE8O,EAAA1sB,UAAA+vB,uBAAV,WACC,IAAItU,EAAgB/b,KAAKswB,mBAAmBtwB,KAAKkd,OAE7Cld,KAAK6wB,YACR7wB,KAAKwwB,SAASxwB,KAAKkd,MAAOnB,GAAO,GAElC/b,KAAKywB,sBACLzwB,KAAK0wB,gBAAgB1wB,KAAK6wB,WAAY9U,IAS7BiR,EAAA1sB,UAAAowB,gBAAV,SAA0BI,EAAsB/U,GAC3C+U,IACHA,EAAUC,kBACVD,EAAUjtB,MAAQkY,EAAMlY,MACxBitB,EAAUhtB,IAAMiY,EAAMjY,MAajBkpB,EAAA1sB,UAAAgwB,mBAAP,SAA0BU,GACzB,IAAIntB,EACAC,EAmBJ,OAjBAsB,EAAA,KAAW4rB,EAAK1rB,WAAY,SAAC1E,GAC5B,IAAIqwB,EAAYrwB,EAAKiD,MACjBqtB,EAAUtwB,EAAKkD,IAEflD,EAAKoJ,SAASmnB,WACjBF,EAAY,EAAIrwB,EAAKkD,IACrBotB,EAAU,EAAItwB,EAAKiD,SAGfoC,EAAA,SAAepC,IAAWotB,EAAYptB,KAC1CA,EAAQotB,KAEJhrB,EAAA,SAAenC,IAASotB,EAAUptB,KACtCA,EAAMotB,MAICrtB,MAAOA,EAAOC,IAAKA,IAStBkpB,EAAA1sB,UAAAuvB,YAAP,SAAmB7lB,GAClB,IAAIpJ,EAAOoJ,EAASpJ,KAChBoJ,EAASof,UACZxoB,EAAKkoB,OAAS9oB,KAAK2tB,iBACnB/sB,EAAKwuB,YAGLxuB,EAAKkoB,OAAS9oB,KAAK+tB,oBACnBntB,EAAK2pB,UAEF3pB,EAAKoJ,UACRpJ,EAAKoJ,SAASonB,mBAUTpE,EAAA1sB,UAAAyvB,YAAP,SAAmB/lB,GAClB,IAAIpJ,EAAOoJ,EAASpJ,KAChBoJ,EAASof,UACZxoB,EAAKkoB,OAAS9oB,KAAKwuB,mBACnB5tB,EAAK2pB,WAGL3pB,EAAKkoB,OAAS9oB,KAAKmuB,kBACnBvtB,EAAKwuB,WAEFxuB,EAAKoJ,UACRpJ,EAAKoJ,SAASonB,mBAUNpE,EAAA1sB,UAAA6vB,YAAV,SAAsBvvB,GAAtB,IAAAd,EAAAE,KAEKY,aAAgBgS,GACnB5S,KAAKqxB,WAAW1mB,UAAU/J,GAG3B,IAAIoJ,EAAyBpJ,EAAKoJ,SAElCA,EAASsnB,cAAcxI,OAAS9oB,KAAK4lB,cACrC5b,EAASsnB,cAAc/G,SAEvBvgB,EAASunB,eAAezI,OAAS9oB,KAAK4lB,cACtC5b,EAASunB,eAAenC,UACxBplB,EAASunB,eAAe7D,OAAS,GAEjC9sB,EAAK4wB,YAAY,IAAInZ,EAAA,EAAS,WAC7BvY,EAAK2xB,UAAU1U,YAAYnc,MAG5BZ,KAAK4lB,cAAczM,OAAOC,GAAG,iBAAkB,WAC1CtZ,EAAK4xB,QACR9wB,EAAKmR,uBAEJnR,GAAM,IAQVR,OAAAC,eAAW2sB,EAAA1sB,UAAA,aAAX,WAOC,OANKN,KAAK2xB,SACT3xB,KAAK2xB,OAAS,IAAI7vB,EAAA,EAClB9B,KAAK2xB,OAAOxY,OAAOC,GAAG,WAAYpZ,KAAKgwB,aAAchwB,MAAM,GAC3DA,KAAK2xB,OAAOxY,OAAOC,GAAG,UAAWpZ,KAAK4xB,kBAAmB5xB,MAAM,IAGzDA,KAAK2xB,wCAMH3E,EAAA1sB,UAAAsxB,kBAAV,SAA4BpO,GAC3B,IAAI5iB,EAAO4iB,EAAM+I,SACjBvsB,KAAKyxB,UAAU1U,YAAYnc,GACvBA,EAAKixB,aACRjxB,EAAKkc,WASP1c,OAAAC,eAAW2sB,EAAA1sB,UAAA,aAAX,WAOC,OANKN,KAAK8xB,SACT9xB,KAAK8xB,OAAS,IAAIhwB,EAAA,EAClB9B,KAAK8xB,OAAO3Y,OAAOC,GAAG,WAAYpZ,KAAKowB,aAAcpwB,MAAM,GAC3DA,KAAK8xB,OAAO3Y,OAAOC,GAAG,UAAWpZ,KAAK4xB,kBAAmB5xB,MAAM,IAGzDA,KAAK8xB,wCAUN9E,EAAA1sB,UAAA0qB,kBAAP,SAAyBxH,GACxB,IACC5jB,EAAAU,UAAM0qB,kBAAiBjrB,KAAAC,KAACwjB,GACxB,IAAIne,EAAmBme,EAAM2H,SAEL,GAArBnrB,KAAK2c,MAAM1U,QAAoC,GAArBjI,KAAKkd,MAAMjV,SACvChH,EAAA,EAAS8wB,4BAA4B1sB,GACrCA,EAAO2sB,aAAc,GAGtB3sB,EAAO4L,MACP5L,EAAO8L,WAEYtJ,GAAfxC,EAAOkG,OACVlG,EAAOkG,KAAOvL,KAAKiyB,OAAO1S,aAGN1X,GAAjBxC,EAAOuhB,SACVvhB,EAAOuhB,OAASvhB,EAAOkG,MAGzB,MAAOgP,GACNva,KAAKya,mBAAmBF,KAS1Bna,OAAAC,eAAW2sB,EAAA1sB,UAAA,cA6BX,WACC,OAAON,KAAKkyB,aA9Bb,SAAkBC,GACbnyB,KAAKkyB,SAAWC,IACfnyB,KAAKkyB,SACRlyB,KAAKoyB,cAAcpyB,KAAKkyB,SAGzBlyB,KAAKkyB,QAAUC,EAEXA,IAEHnyB,KAAKgT,WAAWxB,KAAK2gB,GACrBA,EAAOzgB,MAAQ1R,KACfmyB,EAAOrJ,OAAS9oB,KAAKsuB,iBACrB6D,EAAOhZ,OAAOC,GAAG,wBAAyBpZ,KAAKqyB,2BAA4BryB,MAAM,GACjFmyB,EAAOhZ,OAAOC,GAAG,cAAepZ,KAAKsyB,sBAAuBtyB,MAAM,GAClEmyB,EAAOhZ,OAAOC,GAAG,YAAapZ,KAAKuyB,oBAAqBvyB,MAAM,GAC9DmyB,EAAOhZ,OAAOC,GAAG,aAAcpZ,KAAKwyB,qBAAsBxyB,MAAM,GAChEmyB,EAAOhZ,OAAOC,GAAG,UAAWpZ,KAAKyyB,oBAAqBzyB,MAAM,GAC5DmyB,EAAOhZ,OAAOC,GAAG,WAAYpZ,KAAK0yB,mBAAoB1yB,MAAM,GAC5DmyB,EAAOhZ,OAAOC,GAAG,mBAAoBpZ,KAAK2yB,qBAAsB3yB,MAAM,GACtEmyB,EAAOhZ,OAAOC,GAAG,SAAUpZ,KAAK4yB,iBAAkB5yB,MAAM,GACxDmyB,EAAOzE,OAASvnB,OAAO2oB,iBAAmB,qCAiBnC9B,EAAA1sB,UAAAuyB,aAAV,WACC,OAAO,IAAI9M,GASLiH,EAAA1sB,UAAA+xB,2BAAP,WAEC,IAAIF,EAASnyB,KAAKmyB,OAElB,GAAIA,EAAO7T,UAAY6T,EAAO5T,SAAU,CACvC,IAAIH,EAAoBpe,KAAKmyB,OAAO/T,UAChCC,EAAoBre,KAAKmyB,OAAO9T,UAEpCre,KAAK8yB,mBACJjtB,EAAGuY,EACHlR,EAAGmR,IAGJ,IAAI0U,OAAU,EACVrL,EAAeyK,EAAOzK,aACtBA,IACCA,EAAaniB,UAAYmiB,EAAazW,QACzC8hB,EAAarL,EAAavW,OAEvBuW,EAAaniB,UAAYmiB,EAAavW,QACzC4hB,EAAarL,EAAazW,QAI5BjR,KAAKgzB,gBAAgBhzB,KAAK2c,MAAOyB,EAAW2U,GAC5C/yB,KAAKgzB,gBAAgBhzB,KAAKkd,MAAOmB,EAAW0U,KASvC/F,EAAA1sB,UAAAsyB,iBAAP,WACC5yB,KAAKizB,kBAAkBjzB,KAAK2c,OAC5B3c,KAAKizB,kBAAkBjzB,KAAKkd,OAC5Bld,KAAKizB,kBAAkBjzB,KAAKqF,QAE5BrF,KAAKqvB,sBAQCrC,EAAA1sB,UAAA+uB,mBAAP,WACCjqB,EAAA,KAAWpF,KAAKqF,OAAOC,WAAY,SAACD,GACnCA,EAAOqZ,uBAUFsO,EAAA1sB,UAAA2yB,kBAAP,SAAyBC,GACxB9tB,EAAA,KAAW8tB,EAAQ5tB,WAAY,SAAC6tB,GAC/BA,EAAO1hB,YAAY,MAcdub,EAAA1sB,UAAAwyB,kBAAP,SAAyBhoB,GAAzB,IAAAhL,EAAAE,KAEC,GAAK8K,EAAL,CAOA,IAAIsoB,KAEJpzB,KAAKqF,OAAOgB,KAAK,SAAChB,GAGjB,GAAKA,EAAO4L,iBAAiBtP,GAAY0D,EAAO4L,MAAM3O,aAAiB+C,EAAO8L,iBAAiBxP,GAAY0D,EAAO8L,MAAM7O,iBAGnH,CACJ,IAAIwK,EAAQzH,EAAOuL,sBAAsB9F,EAASjF,EAAGiF,EAASoC,GAC1DJ,IACHzH,EAAO4T,QAAQoa,WAAYxtB,EAAG,EAAGqH,EAAG,EAAGiP,MAAOrc,EAAKynB,WAAYnL,OAAQtc,EAAKwnB,cAC5E8L,EAAa5hB,MAAOnM,OAAQA,EAAQyH,MAAOA,QAO1C9M,KAAKstB,iBACRttB,KAAK2R,mBAAmByhB,QA1BxBpzB,KAAKqF,OAAOgB,KAAK,SAAChB,GACjBA,EAAOoM,iBAiCHub,EAAA1sB,UAAAqR,mBAAP,SAA0ByhB,GAEzB,IAAIE,EAAUtY,EAAA,kBAA0BnV,GAAI,GAAKqH,GAAI,IAAOlN,KAAK4lB,eAC7D2N,EAAcvY,EAAA,kBAA0BnV,EAAG7F,KAAK4lB,cAAc2B,WAAa,GAAKra,EAAGlN,KAAK4lB,cAAc0B,YAAc,IAAOtnB,KAAK4lB,eAEhI4N,EAAM,EACNC,KACJ3b,EAAA,KAAYsb,EAAc,SAACM,GAC1B,IAAI5mB,EAAQ4mB,EAAY5mB,MACpBA,GAAS1C,EAAA,cAAoB0C,GAASjH,EAAGytB,EAAQztB,EAAGqH,EAAGomB,EAAQpmB,EAAGiP,MAAOoX,EAAY1tB,EAAIytB,EAAQztB,EAAGuW,OAAQmX,EAAYrmB,EAAIomB,EAAQpmB,MACvIumB,EAAqBjiB,MAAO1E,MAAOA,EAAOzH,OAAQquB,EAAYruB,SAC9DmuB,GAAO1mB,EAAMI,MAIfkmB,EAAeK,GAEFE,KAAK,SAAC9S,EAAGpM,GACrB,OAAIoM,EAAE/T,MAAMI,EAAIuH,EAAE3H,MAAMI,EAChB,EAEC2T,EAAE/T,MAAMI,EAAIuH,EAAE3H,MAAMI,GACpB,EAGD,IAIT,IAAI0mB,EAAWJ,EAAMJ,EAAanrB,OAC9BwV,EAAOzC,EAAA,oBAA4BnV,EAAG,EAAGqH,EAAG,GAAKlN,KAAK6zB,aAAaC,cAAc5mB,EAErF,GAAIkmB,EAAanrB,OAAS,EAAG,CAE5B,IAAI8rB,EAAMT,EAAQpmB,EACd8mB,EAAST,EAAYrmB,EAGzB8N,EAAA,uBAA+BnV,EAAG,EAAGqH,EAAG6mB,GAAO/zB,MAE/C,IAAIi0B,GAAU,EAEd,GAAIL,EAAWG,GAAOC,EAASD,GAAO,EAErC,IADA,IAAIG,EAAaF,EACRzgB,EAAI6f,EAAanrB,OAAS,EAAGsL,GAAK,EAAGA,IAAK,CAClD,IACI0F,GADA5T,EAAS+tB,EAAa7f,GAAGlO,QACR4T,QACjBkb,EAASf,EAAa7f,GAAGzG,MAAMI,EAWnC,GATA+L,EAAQoa,WAAYxtB,EAAG,EAAGqH,GAAIuQ,EAAMtB,MAAOnc,KAAKunB,WAAYnL,OAAQ8X,EAAazW,IAE7ExE,EAAQnF,SACXmF,EAAQrF,WAGTqF,EAAQsR,UACR2J,EAAalZ,EAAA,kBAA0BnV,EAAG,EAAGqH,EAAG+L,EAAQvN,MAAM4Q,OAASrD,EAAQqD,OAAS6X,EAASlb,EAAQmb,gBAAkBnb,GAAS/L,IAElHuQ,EAAM,CACvBwW,GAAU,EACV,OAKH,GAAIL,GAAYG,GAAOC,EAASD,GAAO,GAAKE,EAE3C,IADA,IAAII,EAAQN,EACIzf,GAAPf,EAAI,EAAS6f,EAAanrB,QAAQsL,EAAIe,EAAKf,IAAK,CACxD,IAAIlO,EAAS+tB,EAAa7f,GAAGlO,OACzB8uB,EAASf,EAAa7f,GAAGzG,MAAMI,GAC/B+L,EAAU5T,EAAO4T,SACboa,WAAYxtB,EAAG,EAAGqH,EAAGmnB,EAAOlY,MAAOnc,KAAKunB,WAAYnL,OAAQ4X,IAEhE/a,EAAQnF,SACXmF,EAAQrF,WAGTqF,EAAQsR,SAER8J,EAAQrZ,EAAA,kBAA0BnV,EAAG,EAAGqH,EAAG+L,EAAQvN,MAAM4Q,OAASrD,EAAQvN,MAAMuJ,eAAiBgE,EAAQqD,OAAS6X,EAASlb,EAAQqb,mBAAqBrb,GAAS/L,KAgB9J8f,EAAA1sB,UAAA0yB,gBAAP,SAAuBhC,EAAkBlmB,EAAkBypB,GAA3D,IAAAz0B,EAAAE,KACCoF,EAAA,KAAW4rB,EAAK1rB,WAAY,SAAC1E,GACxBA,GAAQ2zB,IACPz0B,EAAK6F,UAAUsC,OAAS,GAAKrH,EAAK+E,UAAUsC,OAAS,IACxDrH,EAAKgQ,sBAAsB9F,MAaxBkiB,EAAA1sB,UAAAk0B,gBAAP,SAAuB5zB,EAAwCmb,GAE9D,GAAKnb,EAAL,CAIA,IAAIiD,EACAC,EACAqtB,EAAWvwB,EAAKoJ,SAASmnB,SAEzBvwB,EAAKoJ,oBAAoBojB,EAAA,IAC5BrR,EAAQ3R,EAAA,YAAkB2R,IAGvBoV,GACH/mB,EAAA,YAAkB2R,GAElBlY,EAAQ,EAAIjD,EAAKkD,IACjBA,EAAM,EAAIlD,EAAKiD,QAGfA,EAAQjD,EAAKiD,MACbC,EAAMlD,EAAKkD,KAGZ,IAAIyK,EAAqBzK,EAAMD,EAE/B,OACCA,MAAOA,EAAQkY,EAAMlY,MAAQ0K,EAC7BzK,IAAKD,EAAQkY,EAAMjY,IAAMyK,KAUjBye,EAAA1sB,UAAAiyB,oBAAV,SAA8B/O,GAC7B,IAAI2O,EAAmBnyB,KAAKmyB,OACxBhM,EAAWgM,EAAOhM,SACtB,GAAgB,SAAZA,GAAmC,UAAZA,EAAsB,CAChD,IAAIiC,EAAiB+J,EAAO/J,OACxBA,GAAUpoB,KAAK2c,MAAM1U,OAAS,KACjCmgB,EAASpoB,KAAKw0B,gBAAgBx0B,KAAK2c,MAAMpQ,SAAS,GAAI6b,IAC/CqM,SAAW,QAClBz0B,KAAKwwB,SAASxwB,KAAK2c,MAAOyL,IAI5B,GAAgB,SAAZjC,GAAmC,UAAZA,EAAsB,CAChD,IAAIkC,EAAiB8J,EAAO9J,OACxBA,GAAUroB,KAAKkd,MAAMjV,OAAS,KACjCogB,EAASroB,KAAKw0B,gBAAgBx0B,KAAKkd,MAAM3Q,SAAS,GAAI8b,IAC/CoM,SAAW,QAClBz0B,KAAKwwB,SAASxwB,KAAKkd,MAAOmL,IAI5BroB,KAAK4yB,oBASI5F,EAAA1sB,UAAAkyB,qBAAV,SAA+BhP,GAC9B,IAAIvS,EAAQjR,KAAK2c,MAAMpQ,SAAS,GAC5B0E,IACHjR,KAAK00B,iBAAoB7wB,MAAOoN,EAAMpN,MAAOC,IAAKmN,EAAMnN,MAGzD,IAAIqN,EAAQnR,KAAKkd,MAAM3Q,SAAS,GAC5B4E,IACHnR,KAAK20B,iBAAoB9wB,MAAOsN,EAAMtN,MAAOC,IAAKqN,EAAMrN,OAShDkpB,EAAA1sB,UAAAoyB,mBAAV,SAA6BlP,GAC5B,IACI2C,EADmBnmB,KAAKmyB,OACNhM,SAEtB,GAAInmB,KAAK40B,gBAA8B,QAAZzO,GAAkC,SAAZA,GAAsB,CACtE,IACI0O,EAAQ,GADRC,EAAc90B,KAAK40B,eAEP/wB,MAAQ,IACvBgxB,EAAQC,EAAYjxB,OAEjBixB,EAAYhxB,IAAM,IACrB+wB,EAAQC,EAAYhxB,IAAM,GAE3B9D,KAAKwwB,SAASxwB,KAAK2c,OAAS9Y,MAAOixB,EAAYjxB,MAAQgxB,EAAO/wB,IAAKgxB,EAAYhxB,IAAM+wB,IAAS,GAAO,GACrG70B,KAAK40B,mBAAgB/sB,EACrB7H,KAAK00B,qBAAkB7sB,EAExB,GAAI7H,KAAK+0B,gBAA8B,QAAZ5O,GAAkC,SAAZA,GAAsB,CACtE,IAAI2O,EAEAD,EAAQ,GAFRC,EAAc90B,KAAK+0B,eAGPlxB,MAAQ,IACvBgxB,EAAQC,EAAYjxB,OAEjBixB,EAAYhxB,IAAM,IACrB+wB,EAAQC,EAAYhxB,IAAM,GAG3B9D,KAAKwwB,SAASxwB,KAAKkd,OAASrZ,MAAOixB,EAAYjxB,MAAQgxB,EAAO/wB,IAAKgxB,EAAYhxB,IAAM+wB,IAAS,GAAO,GACrG70B,KAAK+0B,mBAAgBltB,EACrB7H,KAAK20B,qBAAkB9sB,IAIfmlB,EAAA1sB,UAAAqyB,qBAAV,WACC3yB,KAAK40B,mBAAgB/sB,EACrB7H,KAAK00B,qBAAkB7sB,GAQdmlB,EAAA1sB,UAAAmyB,oBAAV,SAA8BjP,GAC7B,IAAI2O,EAAmBnyB,KAAKmyB,OACxBhM,EAAWgM,EAAOhM,SAClBC,EAAY+L,EAAO/L,UACvB,GAAIpmB,KAAK00B,kBAAgC,QAAZvO,GAAkC,SAAZA,GAAsB,CACxE,IAAI6O,EAAgBh1B,KAAK00B,gBACrB3Y,EAAQoW,EAAO/J,OAEf6M,EAAYj1B,KAAKswB,mBAAmBtwB,KAAK2c,OAEzCpO,EAAcymB,EAAclxB,IAAMkxB,EAAcnxB,MAChDgxB,EAAQ9Y,EAAMlY,OAASoxB,EAAUnxB,IAAMmxB,EAAUpxB,OAEjDqxB,EAAWlyB,KAAKgB,KAAKoiB,EAAWyO,EAAQG,EAAcnxB,OACtDsxB,EAASnyB,KAAKE,IAAI2xB,EAAQG,EAAclxB,IAAK,EAAIsiB,GAEjD8O,GAAY,IACfC,EAASD,EAAW3mB,GAGjB4mB,GAAU,IACbD,EAAWC,EAAS5mB,GAGrB,IAAI6mB,GACHvxB,MAAOqxB,EACPpxB,IAAKqxB,GAENn1B,KAAK40B,cAAgBQ,EAErBp1B,KAAKwwB,SAASxwB,KAAK2c,MAAOyY,GAAU,GAAO,EAAOjD,EAAO/L,WAG1D,GAAIpmB,KAAK20B,kBAAgC,QAAZxO,GAAkC,SAAZA,GAAsB,CACpE6O,EAAgBh1B,KAAK20B,gBACrB5Y,EAAQoW,EAAO9J,OAEf4M,EAAYj1B,KAAKswB,mBAAmBtwB,KAAKkd,OAEzC3O,EAAaymB,EAAclxB,IAAMkxB,EAAcnxB,MAC/CgxB,EAAQ9Y,EAAMlY,OAASoxB,EAAUnxB,IAAMmxB,EAAUpxB,OAEjDqxB,EAAWlyB,KAAKgB,KAAKoiB,EAAWyO,EAAQG,EAAcnxB,OACtDsxB,EAASnyB,KAAKE,IAAI2xB,EAAQG,EAAclxB,IAAK,EAAIsiB,GAEjD8O,GAAY,IACfC,EAASD,EAAW3mB,GAGjB4mB,GAAU,IACbD,EAAWC,EAAS5mB,GAGjB6mB,GACHvxB,MAAOqxB,EACPpxB,IAAKqxB,GAENn1B,KAAK+0B,cAAgBK,EACrBp1B,KAAKwwB,SAASxwB,KAAKkd,MAAOkY,GAAU,GAAO,EAAOjD,EAAO/L,WAG1DpmB,KAAK4yB,oBASI5F,EAAA1sB,UAAAgyB,sBAAV,SAAgC9O,KAahCpjB,OAAAC,eAAW2sB,EAAA1sB,UAAA,kBA4BX,WACC,OAAON,KAAKq1B,iBA7Bb,SAAsBvE,GAAtB,IAAAhxB,EAAAE,KACKA,KAAKq1B,aACRr1B,KAAKoyB,cAAcpyB,KAAKq1B,aAEzBr1B,KAAKq1B,YAAcvE,EAEfA,IACH9wB,KAAKgT,WAAWxB,KAAKsf,GACrBA,EAAUhI,OAAS9oB,KAAK2tB,iBACxBmD,EAAUwE,UAAUpG,YAAa,EACjC4B,EAAUyE,QAAQrG,YAAa,EAC/B4B,EAAUvG,SACVuG,EAAUzE,YAAc,aACxByE,EAAU3X,OAAOC,GAAG,eAAgBpZ,KAAKw1B,uBAAwBx1B,MAAM,GAEvE8wB,EAAUxhB,QAAQyJ,IAAI,gBAAiB,SAAC0c,GACvC,IAAIxkB,EAAQnR,EAAK6c,MAAMpQ,SAAS,GAIhC,OAHI0E,IACHwkB,EAAIj1B,MAAQyQ,EAAM5B,iBAAiBomB,EAAI3qB,WAEjC2qB,sCAiBVr1B,OAAAC,eAAW2sB,EAAA1sB,UAAA,kBA4BX,WACC,OAAON,KAAK01B,iBA7Bb,SAAsB5E,GAAtB,IAAAhxB,EAAAE,KACKA,KAAK01B,aACR11B,KAAKoyB,cAAcpyB,KAAK01B,aAEzB11B,KAAK01B,YAAc5E,EAEfA,IACH9wB,KAAKgT,WAAWxB,KAAKsf,GACrBA,EAAUhI,OAAS9oB,KAAKwuB,mBACxBsC,EAAUwE,UAAUpG,YAAa,EACjC4B,EAAUyE,QAAQrG,YAAa,EAC/B4B,EAAU1B,UACV0B,EAAUzE,YAAc,WACxByE,EAAU3X,OAAOC,GAAG,eAAgBpZ,KAAK21B,uBAAwB31B,MAAM,GAEvE8wB,EAAUxhB,QAAQyJ,IAAI,gBAAiB,SAAC0c,GACvC,IAAItkB,EAAQrR,EAAKod,MAAM3Q,SAAS,GAIhC,OAHI4E,IACHskB,EAAIj1B,MAAQ2Q,EAAM9B,iBAAiBomB,EAAI3qB,WAEjC2qB,sCAkBAzI,EAAA1sB,UAAAk1B,uBAAV,SAAiChS,GAChC,GAAIxjB,KAAK0xB,OAAQ,CAChB,IAAIZ,EAAuBtN,EAAMrE,OAC7BpD,EAAQ+U,EAAU/U,MACL,GAAbA,EAAMjY,MACTiY,EAAM0Y,SAAW,OAEC,GAAf1Y,EAAMlY,QACTkY,EAAM0Y,SAAW,SAElB1Y,EAAQ/b,KAAKwwB,SAASxwB,KAAK2c,MAAOZ,GAClC+U,EAAU8E,SAAS7Z,KAUXiR,EAAA1sB,UAAAq1B,uBAAV,SAAiCnS,GAChC,GAAIxjB,KAAK0xB,OAAQ,CAChB,IAAIZ,EAAuBtN,EAAMrE,OAC7BpD,EAAQ+U,EAAU/U,MACL,GAAbA,EAAMjY,MACTiY,EAAM0Y,SAAW,OAEC,GAAf1Y,EAAMlY,QACTkY,EAAM0Y,SAAW,SAElB1Y,EAAQ/b,KAAKwwB,SAASxwB,KAAKkd,MAAOnB,GAClC+U,EAAU8E,SAAS7Z,KAaXiR,EAAA1sB,UAAAkwB,SAAV,SAAmBQ,EAA8CjV,EAAe1L,EAAqBpN,EAAiB4yB,GACrH,IAAIC,GAAsBjyB,MAAO,EAAGC,IAAK,GA2BzC,OAzBA9D,KAAK8yB,oBAEA9yB,KAAKgyB,aACT5sB,EAAA,KAAW4rB,EAAK1rB,WAAY,SAAC1E,GAO5B,GANIA,EAAKoJ,SAASmnB,WACjBpV,EAAQ3R,EAAA,YAAkB2R,IAG3Bnb,EAAK6Q,YAAY,GAEbxO,EAAO,CACV,IAAI8yB,EAAOha,EAAMjY,IAAMiY,EAAMlY,MAC7BkY,EAAMlY,MAAQjD,EAAK4O,cAAcuM,EAAMlY,MAAQ,KAAQ,GACvDkY,EAAMjY,IAAMiY,EAAMlY,MAAQkyB,EAG3B,IAAId,EAAoBr0B,EAAKuD,KAAK4X,EAAO1L,EAAWA,EAAWwlB,GAE3Dj1B,EAAKoJ,SAASmnB,WACjB8D,EAAY7qB,EAAA,YAAkB6qB,IAG/Ba,EAAYb,IAGPa,GAYR11B,OAAAC,eAAW2sB,EAAA1sB,UAAA,mBAOX,WACC,OAAON,KAAKO,iBAAiB,oBAR9B,SAAuBC,GACtBR,KAAKS,iBAAiB,cAAeD,GAAO,oCAwB7CJ,OAAAC,eAAW2sB,EAAA1sB,UAAA,uBAOX,WACC,OAAON,KAAKO,iBAAiB,wBAR9B,SAA2BC,GAC1BR,KAAKS,iBAAiB,kBAAmBD,GAAO,oCAgBvCwsB,EAAA1sB,UAAA01B,YAAV,SAAsBxS,GACrB,IAAIoC,EAAgB5lB,KAAK4lB,cACrBqQ,EAAmBjb,EAAA,mBAA0BwI,EAAM1W,MAAO9M,KAAKk2B,cAAel2B,KAAK6zB,aAAasC,UAChGC,EAAYpb,EAAA,iBAAwBib,EAAUrQ,GAC9CyQ,EAAQ7S,EAAM6S,MAAMnpB,EAEpBopB,EAAiBt2B,KAAKswB,mBAAmBtwB,KAAK2c,OAC9C4Z,EAAiBv2B,KAAKswB,mBAAmBtwB,KAAKkd,OAM9CmR,EAAqBruB,KAAKquB,mBAE9B,GAA0B,QAAtBA,GAAsD,SAAtBA,EAA+B,CAElE,IAAImI,EAAcF,EAAOxyB,IAAMwyB,EAAOzyB,MAElC4yB,EAAYzzB,KAAKgB,KARN,EAQsBsyB,EAAOzyB,MAV7B,IAUiDwyB,EAAQ,KACpEK,EAAU1zB,KAAKE,IAAIozB,EAAOxyB,IAXf,IAWiCuyB,EAAQ,IAAK,GAEzDI,GAAa,IAChBC,EAAUD,EAAYD,GAGnBE,GAAW,IACdD,EAAYC,EAAUF,GAGvBx2B,KAAKwwB,SAASxwB,KAAK2c,OAAS9Y,MAAO4yB,EAAW3yB,IAAK4yB,IAGpD,GAA0B,QAAtBrI,GAAsD,SAAtBA,EAA+B,CAClEgI,IAAU,EACV,IAAIM,EAAcJ,EAAOzyB,IAAMyyB,EAAO1yB,MAElC+yB,EAAY5zB,KAAKgB,KA1BN,EA0BsBuyB,EAAO1yB,MA5B7B,IA4BiDwyB,EAAQ,KACpEQ,EAAU7zB,KAAKE,IAAIqzB,EAAOzyB,IA7Bf,IA6BiCuyB,EAAQ,IAAK,GAEzDO,GAAa,IAChBC,EAAUD,EAAYD,GAGnBE,GAAW,IACdD,EAAYC,EAAUF,GAGvB32B,KAAKwwB,SAASxwB,KAAKkd,OAASrZ,MAAO+yB,EAAW9yB,IAAK+yB,IAGpD,GAA0B,SAAtBxI,GAAuD,UAAtBA,EAAgC,CACpE,IAAIlO,EAAYiW,EAAUvwB,EAAI+f,EAAckR,SAExCL,EAAYzzB,KAAKgB,KA3CN,EA2CsBsyB,EAAOzyB,MA7C7B,IA6CiDwyB,EAAQ,IAAMlW,GAC9EsW,EAAYzzB,KAAKE,IAAIuzB,EAAWtW,GAE5BuW,EAAU1zB,KAAKE,IAAIozB,EAAOxyB,IAhDf,IAgDiCuyB,EAAQ,KAAO,EAAIlW,GAAY,GAC/EuW,EAAU1zB,KAAKgB,IAAI0yB,EAASvW,GAE5BngB,KAAKwwB,SAASxwB,KAAK2c,OAAS9Y,MAAO4yB,EAAW3yB,IAAK4yB,IAGpD,GAA0B,SAAtBrI,GAAuD,UAAtBA,EAAgC,CACpE,IAAIjO,EAAYgW,EAAUlpB,EAAI0Y,EAAcmR,UAExCH,EAAY5zB,KAAKgB,KAvDN,EAuDsBuyB,EAAO1yB,MAzD7B,IAyDiDwyB,EAAQ,KAAO,EAAIjW,IACnFwW,EAAY5zB,KAAKE,IAAI0zB,EAAWxW,GAE5ByW,EAAU7zB,KAAKE,IAAIqzB,EAAOzyB,IA5Df,IA4DiCuyB,EAAQ,IAAMjW,EAAW,GACzEyW,EAAU7zB,KAAKgB,IAAI6yB,EAASzW,GAE5BpgB,KAAKwwB,SAASxwB,KAAKkd,OAASrZ,MAAO+yB,EAAW9yB,IAAK+yB,MAYrDz2B,OAAAC,eAAW2sB,EAAA1sB,UAAA,0BAoBX,WACC,OAAON,KAAKO,iBAAiB,2BArB9B,SAA8BC,GAEzBR,KAAKS,iBAAiB,qBAAsBD,KAClC,QAATA,GACHR,KAAKg3B,oBAAsBh3B,KAAK4lB,cAAczM,OAAOC,GAAG,QAASpZ,KAAKg2B,YAAah2B,MAAM,GACzFA,KAAKgT,WAAWxB,KAAKxR,KAAKg3B,sBAGtBh3B,KAAKg3B,sBACRh3B,KAAK4lB,cAAcqR,WAAY,EAC/Bj3B,KAAK4lB,cAAcsR,WAAY,EAC/Bl3B,KAAKg3B,oBAAoBla,6CAqBnBkQ,EAAA1sB,UAAA62B,qBAAV,SAA+Bxf,GAA/B,IAAA7X,EAAAE,KAaC,OAXA2X,EAAS/X,EAAAU,UAAM62B,qBAAoBp3B,KAAAC,KAAC2X,GAGpCvS,EAAA,KAAWpF,KAAKqF,OAAOC,WAAY,SAACD,GACnCsS,EAAS7X,EAAKs3B,yBACbzf,EACKtS,EAAO0U,YACX,QAAS,QAAS,YAAa,gBAI3BpC,GAWEqV,EAAA1sB,UAAA+2B,uBAAV,SAAiC1f,GAAjC,IAAA7X,EAAAE,KAYC,OAXA2X,EAAS/X,EAAAU,UAAM62B,qBAAoBp3B,KAAAC,KAAC2X,GAGpCvS,EAAA,KAAWpF,KAAKqF,OAAOC,WAAY,SAACD,GACnCsS,EAAS7X,EAAKs3B,yBACbzf,EACKtS,EAAO0U,YACX,SAAU,SAAU,aAAc,iBAI9BpC,GASDqV,EAAA1sB,UAAA2hB,cAAP,SAAqBC,GAEpB,GAAIA,EAAQ,CAGX,IAAIvF,KACAO,KAGJ,GAAIjX,EAAA,SAAeic,EAAOvF,QAAU1W,EAAA,QAAcic,EAAOvF,OACxD,IAAK,IAAIpJ,EAAI,EAAGe,EAAM4N,EAAOvF,MAAM1U,OAAQsL,EAAIe,EAAKf,IAAK,CACxD,IAAK2O,EAAOvF,MAAMpJ,GAAG2L,KACpB,MAAMhF,MAAM,yCAA2C3G,EAAI,MAEnDtN,EAAA,SAAeic,EAAOvF,MAAMpJ,GAAe,cACnDoJ,EAAMnL,MACLsK,WAAYoG,EAAOvF,MAAMpJ,GAAe,WACxCnH,MAAOmH,WAEA2O,EAAOvF,MAAMpJ,GAAgB,YAIxC,GAAItN,EAAA,SAAeic,EAAOhF,QAAUjX,EAAA,QAAcic,EAAOhF,OACxD,IAAS3J,EAAI,EAAGe,EAAM4N,EAAOhF,MAAMjV,OAAQsL,EAAIe,EAAKf,IAAK,CACxD,IAAK2O,EAAOhF,MAAM3J,GAAG2L,KACpB,MAAMhF,MAAM,yCAA2C3G,EAAI,MAEnDtN,EAAA,SAAeic,EAAOhF,MAAM3J,GAAe,cACnD2J,EAAM1L,MACLsK,WAAYoG,EAAOhF,MAAM3J,GAAe,WACxCnH,MAAOmH,WAEA2O,EAAOhF,MAAM3J,GAAgB,YAMxC,GAAItN,EAAA,SAAeic,EAAO7c,SAAWY,EAAA,QAAcic,EAAO7c,QACzD,IAASkO,EAAI,EAAGe,EAAM4N,EAAO7c,OAAO4C,OAAQsL,EAAIe,EAAKf,IACpD2O,EAAO7c,OAAOkO,GAAG2L,KAAOgD,EAAO7c,OAAOkO,GAAG2L,MAAQ,aAwBnD,GAnBIjZ,EAAA,SAAeic,EAAOiQ,UAAYlsB,EAAA,SAAeic,EAAOiQ,OAAOjT,QAClEgD,EAAOiQ,OAAOjT,KAAO,YAIlBjZ,EAAA,SAAeic,EAAOqO,cAAgBtqB,EAAA,SAAeic,EAAOqO,WAAWrR,QAC1EgD,EAAOqO,WAAWrR,KAAO,aAGtBjZ,EAAA,SAAeic,EAAO2O,cAAgB5qB,EAAA,SAAeic,EAAO2O,WAAW3R,QAC1EgD,EAAO2O,WAAW3R,KAAO,aAG1Btf,EAAAU,UAAM2hB,cAAaliB,KAAAC,KAACkiB,GAMhBhF,EAAMjV,OACT,IAASsL,EAAI,EAAGe,EAAM4I,EAAMjV,OAAQsL,EAAIe,EAAKf,IAC5CvT,KAAKkd,MAAM3Q,SAAS2Q,EAAM3J,GAAGnH,OAAO8V,QACnCpG,WAAYoB,EAAM3J,GAAGuI,YAIxB,GAAIa,EAAM1U,OACT,IAASsL,EAAI,EAAGe,EAAMqI,EAAM1U,OAAQsL,EAAIe,EAAKf,IAC5CvT,KAAK2c,MAAMpQ,SAASoQ,EAAMpJ,GAAGnH,OAAO8V,QACnCpG,WAAYa,EAAMpJ,GAAGuI,cAkBhBkR,EAAA1sB,UAAAg3B,YAAV,SAAsBzW,EAAWpM,GAChC,OAAIoM,GAAKpM,EACD,EAGM,cAALoM,EACD,EAEM,cAALpM,GACA,EAEK,cAALoM,EACD,EAEM,cAALpM,GACA,EAEK,UAALoM,EACD,EAEM,UAALpM,GACA,EAEK,UAALoM,EACD,EAEM,UAALpM,GACA,EAGD7U,EAAAU,UAAMg3B,YAAWv3B,KAAAC,KAAC6gB,EAAGpM,IASpBuY,EAAA1sB,UAAAi3B,aAAV,WACC,OAAO,IAAIrf,GAWZ9X,OAAAC,eAAW2sB,EAAA1sB,UAAA,qBAaX,WACC,OAAON,KAAKw3B,oBAdb,SAAyBC,GAAzB,IAAA33B,EAAAE,KACCA,KAAKw3B,eAAiBC,EAClBA,GACHA,EAAOte,OAAOC,GAAG,MAAO,WACvBtZ,EAAK0wB,SAAS1wB,EAAK6c,OAAS9Y,MAAO,EAAGC,IAAK,IAC3ChE,EAAK0wB,SAAS1wB,EAAKod,OAASrZ,MAAO,EAAGC,IAAK,UACzC+D,GAAW,oCAiBTmlB,EAAA1sB,UAAAoQ,SAAP,SAAgBC,GACf/Q,EAAAU,UAAMoQ,SAAQ3Q,KAAAC,KAAC2Q,GACf3Q,KAAK2c,MAAMjM,SAASC,EAAOgM,OAC3B3c,KAAKkd,MAAMxM,SAASC,EAAOuM,OAE3Bld,KAAKorB,cAAc1a,SAASC,EAAOya,gBAO7B4B,EAAA1sB,UAAAoa,YAAP,WACC9a,EAAAU,UAAMoa,YAAW3a,KAAAC,MAEjB,IAAIuwB,EAAavwB,KAAKuwB,WAClBA,GAAcA,aAAsB1G,GACvC0G,EAAWvG,eAAetP,cAG3B,IAAImW,EAAa7wB,KAAK6wB,WAClBA,GAAcA,aAAsBhH,GACvCgH,EAAW7G,eAAetP,cAG3B1a,KAAK2c,MAAMtW,KAAK,SAACzF,GAChBA,EAAK8Z,gBAGN1a,KAAKkd,MAAM7W,KAAK,SAACzF,GAChBA,EAAK8Z,iBASAsS,EAAA1sB,UAAAo3B,QAAP,SAAeC,EAAgCC,GAC9Ch4B,EAAAU,UAAMo3B,QAAO33B,KAAAC,KAAC23B,EAAaC,GACvB53B,KAAKuwB,sBAAsB1G,GAC9B7pB,KAAKuwB,WAAWvG,eAAe0N,QAAQC,EAAaC,GAEjD53B,KAAK6wB,sBAAsBhH,GAC9B7pB,KAAK6wB,WAAW7G,eAAe0N,QAAQC,EAAaC,IAGvD5K,EA9tDA,CAA6BD,EAAA,GAsuD7B9rB,EAAA,EAASC,kBAA2B,QAAI+oB,EASxC4N,EAAA,EAAarmB,MACZsmB,SAAUD,EAAA,EAAsBE,QAChCC,MAAO,SAAS7Y,EAAQ8Y,GACvB,GAAI9Y,aAAkB8K,GAAW9K,EAAOoR,WAAY,CACnD,IAAIyH,EAAQ7Y,EAAO2L,OAAOhjB,OAAOmwB,GAGjC,OAFc9Y,EAAOoR,WAAWzF,OAAOhjB,OAAOmwB,GACtCxlB,WAAWtH,UAAW,EACvB6sB,EAGR,OAAO,QAOTH,EAAA,EAAarmB,MACZsmB,SAAUD,EAAA,EAAsBE,QAChCC,MAAO,SAAS7Y,EAAQ8Y,GACvB,GAAI9Y,aAAkB8K,GAAW9K,EAAO0R,WAAY,CACnD,IAAImH,EAAQ7Y,EAAO2L,OAAOhjB,OAAOmwB,GAGjC,OAFc9Y,EAAO0R,WAAW/F,OAAOhjB,OAAOmwB,GACtCxlB,WAAWtH,UAAW,EACvB6sB,EAGR,OAAO,wBC98DTE,EAAA,SAAAt4B,GA8BC,SAAAu4B,IAAA,IAAAr4B,EAGCF,EAAAG,KAAAC,OAAOA,KACPF,EAAKG,UAAY,oBAGjBH,EAAK2Y,YAAa,EAClB3Y,EAAK2jB,qBAAsB,EAC3B3jB,EAAK0tB,OAAS,OAGd,IAAI4K,EAAat4B,EAAK0mB,YAAY5N,EAAA,GAClC9Y,EAAKs4B,WAAaA,EAClBA,EAAWrV,aAAc,EACzBqV,EAAWvf,WAAW/Y,EAAKgZ,MAAMC,IAAI,SACrCqf,EAAW3f,YAAa,EACxB3Y,EAAKkT,WAAWxB,KAAK4mB,GAIrB,IAAIC,EAAev4B,EAAK0mB,YAAY5N,EAAA,UACpC9Y,EAAKu4B,aAAeA,EACpBA,EAAatV,aAAc,EAC3BsV,EAAaxf,WAAW/Y,EAAKgZ,MAAMC,IAAI,SACvCsf,EAAa5f,YAAa,EAC1B3Y,EAAKkT,WAAWxB,KAAK6mB,KAwDvB,OAhHuCl4B,EAAA,EAAAg4B,EAAAv4B,GAoE/Bu4B,EAAA73B,UAAAg4B,YAAP,SAAmBC,EAAkBC,EAAuBC,EAAqBC,GAChF,IAAK14B,KAAKmL,SACT,GAAIotB,EAAOtwB,OAAS,GAAKuwB,EAAYvwB,OAAS,EAAG,CAEhD,IAAIgU,EAAeC,EAAA,QAAerW,EAAG0yB,EAAO,GAAG1yB,EAAI,GAAKqH,EAAGqrB,EAAO,GAAGrrB,EAAI,KAASgP,EAAA,OAAaqc,EAAO,IAAM,IAAII,EAAA,EAAmBF,EAAaC,GAAaE,OAAOL,GAE1I,GAAtBv4B,KAAK+mB,eAAyD,GAAnC/mB,KAAKq4B,aAAatR,gBAIhD/mB,KAAKq4B,aAAapc,KAAOA,IAGtBjc,KAAKymB,YAAc,GAAKzmB,KAAKo4B,WAAW3R,YAAc,KACzDxK,GAAQC,EAAA,OAAasc,EAAY,IAAM,IAAIG,EAAA,EAAmBF,EAAaC,GAAaE,OAAOJ,GAC/Fvc,GAAQC,EAAA,OAAaqc,EAAO,IAC5Btc,GAAQC,EAAA,YAERlc,KAAKo4B,WAAWnc,KAAOA,QAIxBjc,KAAKo4B,WAAWnc,KAAO,GACvBjc,KAAKq4B,aAAapc,KAAO,IAUrBkc,EAAA73B,UAAAoQ,SAAP,SAAgBC,GACf/Q,EAAAU,UAAMoQ,SAAQ3Q,KAAAC,KAAC2Q,GAEf,IAAIkoB,EAAc74B,KAAKq4B,aACvBrxB,EAAA,eAAuB2J,EAAQkoB,EAAYpmB,WAAYmG,EAAA,GACvDigB,EAAYpS,YAAc,EAE1B,IAAIqS,EAAc94B,KAAKo4B,WACvBpxB,EAAA,eAAuB2J,EAAQmoB,EAAYrmB,WAAYmG,EAAA,GACvDkgB,EAAY/R,cAAgB,GAE9BoR,EAhHA,CAAuCrS,EAAA,GAwHvC7kB,EAAA,EAASC,kBAAqC,kBAAIg3B,2CC7IlDa,GAAA,SAAAn5B,GAoBC,SAAAo5B,IAAA,IAAAl5B,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,uBAKnB,OA3BwCE,EAAA,EAAA64B,EAAAp5B,GA2BxCo5B,EA3BA,CAAwCniB,GAsGxCoiB,GAAA,SAAAr5B,GAsEC,SAAAs5B,IAAA,IAAAp5B,EACCF,EAAAG,KAAAC,OAAOA,YAbDF,EAAAq5B,YAAsB,GAe5Br5B,EAAKs5B,SAAW,IAAIt3B,EAAA,EAAgChC,EAAKu5B,iBACzDv5B,EAAKs5B,SAAStqB,SAASwqB,eAAgB,EAEvCx5B,EAAKkT,WAAWxB,KAAK,IAAI1P,EAAA,EAAahC,EAAKs5B,WAC3Ct5B,EAAKkT,WAAWxB,KAAK1R,EAAKs5B,SAAStqB,UAEnChP,EAAKy5B,kBAAoB,IAAIn0B,EAAA,aAAsCtF,EAAKs5B,SAAU,WAAM,OAAAt5B,EAAKs5B,SAAStxB,WACtGhI,EAAKy5B,kBAAkBC,gBAAiB,EAExC15B,EAAKG,UAAY,aAEjBH,EAAKinB,cAAgB,EACrBjnB,EAAK2mB,YAAc,EAEnB3mB,EAAK25B,SAAU,EAEf35B,EAAK45B,SAAW,EAChB55B,EAAK65B,SAAW,EAEhB75B,EAAK85B,kBAAoB95B,EAAK6Y,cAAc6N,YAAYV,EAAA,GACxDhmB,EAAK85B,kBAAkBnhB,YAAa,EAMpC3Y,EAAK4uB,iBAAiBU,UAEtBtvB,EAAKI,eAolBP,OAzrBgCC,EAAA,EAAA+4B,EAAAt5B,GA4GrBs5B,EAAA54B,UAAA+C,sBAAV,WACCzD,EAAAU,UAAM+C,sBAAqBtD,KAAAC,MACtBiG,EAAA,SAAejG,KAAKsZ,eACxBtZ,KAAKsZ,YAActZ,KAAKwD,SAASC,UAAU,iBAOnCy1B,EAAA54B,UAAA+4B,cAAV,WACC,OAAO,IAAInB,GASFgB,EAAA54B,UAAAoD,eAAV,WACC,OAAO,IAAIq1B,IAUFG,EAAA54B,UAAAga,wBAAV,SAAkC5X,GAGjC,GAAI1C,KAAKke,UAAYle,KAAKse,QAAS,CAElC,IAAInN,EAAcnR,KAAKsY,OAAOoE,MAC1BzL,EAAcjR,KAAKoY,OAAOsE,MAE1Bmd,EAAqC75B,KAAK2F,UAAU4G,SAAS7J,EAAS0J,MAAQ,GAIlF,GAFA1J,EAASC,UAAY3C,KAEjBA,KAAKuF,UAAY0L,GAChBE,aAAiBzP,EAAA,EAAW,CAC/B,IAAIo4B,EAAmB3oB,EAAMgQ,UACzB0Y,IACHC,EAAWD,EAAiBx4B,OAAe,OAAE04B,cAI9Cr3B,EAASs3B,gBAAgB,SAAUF,EAAU,GAC7Cp3B,EAASs3B,gBAAgB,SAAUt3B,EAASrB,OAAO2V,OAAOxW,OAEtDyQ,aAAiBtP,IACpBe,EAASu3B,mBAAmB,SAAU,GAAK,GAC3Cv3B,EAASu3B,mBAAmB,QAAS,KAIxC,GAAIj6B,KAAKuF,UAAY4L,GAChBF,aAAiBvP,EAAA,EAAW,CAC/B,IAAIw4B,EAAmBjpB,EAAMkQ,UACzB0Y,IACHK,EAAWL,EAAiBx4B,OAAe,OAAE04B,cAG9Cr3B,EAASs3B,gBAAgB,SAAUE,EAAU,GAC7Cx3B,EAASs3B,gBAAgB,SAAUt3B,EAASrB,OAAO0V,OAAOvW,OAEtD2Q,aAAiBxP,IACpBe,EAASu3B,mBAAmB,SAAU,GAAK,GAC3Cv3B,EAASu3B,mBAAmB,QAAS,QAcnCf,EAAA54B,UAAAoe,kBAAP,SAAyBhc,GACxB9C,EAAAU,UAAMoe,kBAAiB3e,KAAAC,KAAC0C,GAEpBA,GAAYA,EAASy3B,UACxBn6B,KAAKo6B,mBAAqB13B,EAASy3B,UAS9BjB,EAAA54B,UAAAsT,SAAP,eAAA9T,EAAAE,KAECJ,EAAAU,UAAMsT,SAAQ7T,KAAAC,MAEdA,KAAKu5B,kBAAkBxQ,QAEvB/oB,KAAKq6B,mBAAmBr6B,KAAKs6B,qBAE7Bl1B,EAAA,KAAWpF,KAAK8b,WAAWxW,WAAY,SAACyW,GACvCjc,EAAKu6B,mBAAmBv6B,EAAKw6B,oBAAqBve,KAGnD3W,EAAA,KAAWpF,KAAKu5B,kBAAkBj0B,WAAY,SAAC60B,GAC9CA,EAAQ/2B,YAAa,KASb81B,EAAA54B,UAAAi6B,UAAV,WAOC,IANA,IAAI70B,EAAqB1F,KAAK0F,WAC1BK,EAAmB/F,KAAK+F,SAKnBwN,EAAIvT,KAAK0F,WAAa,EAAG6N,GAAK,EAAGA,IAAK,CAE9C,IADI7Q,EAAW1C,KAAK2F,UAAU4G,SAASgH,KACvB7Q,EAASod,SAAS9f,KAAKuY,gBAAkB7V,EAASod,SAAS9f,KAAKwY,eAAgB,CAC/F9S,EAAa6N,EACb,OAGFvT,KAAKs6B,oBAAsBt6B,KAAKw6B,kBAAkB90B,GAAa,SAAU,cAAe,kBAAmB,gBAAiB,OAAQ,cAAe,YAI1I6N,EAAIvT,KAAK+F,SAAlB,IAAK,IAAuBuO,EAAMtU,KAAK2F,UAAUsC,OAAQsL,EAAIe,EAAKf,IAAK,CACtE,IAAI7Q,EACJ,IADIA,EAAW1C,KAAK2F,UAAU4G,SAASgH,KACvB7Q,EAASod,SAAS9f,KAAKuY,gBAAkB7V,EAASod,SAAS9f,KAAKwY,eAAgB,CAC/FzS,EAAWwN,EAAI,EACf,OAIFvT,KAAKy6B,mBAAqB/0B,EAC1B1F,KAAK06B,iBAAmB30B,GAMfmzB,EAAA54B,UAAAk6B,kBAAV,SAA4BG,EAAuBloB,GAAnD,IAAA3S,EAAAE,KACK46B,EAAsB56B,KAAK46B,eAC3Bl1B,EAAai1B,EAcjB,OAbA7iB,EAAA,KAAYrF,EAAY,SAACkX,GACxB,GAAI1jB,EAAA,SAAe20B,EAAejR,IACjC,IAAK,IAAIpW,EAAI7N,EAAY6N,GAAK,EAAGA,IAAK,CACrC,IAAI7Q,EAAW5C,EAAK6F,UAAU4G,SAASgH,GACvC,GAAItN,EAAA,SAAevD,EAAS+P,WAAWkX,IAAY,CAC9CgR,EAAgBpnB,IACnBonB,EAAgBpnB,GAEjB,UAKGonB,GAUEzB,EAAA54B,UAAA+5B,mBAAV,SAA6BQ,EAAmB5F,GAC/C,IAAI6F,GACH1uB,MAASyuB,EACT5F,UAAaA,GAEd,GACC6F,EAAS96B,KAAK+6B,YAAYD,EAAO1uB,MAAO0uB,EAAO7F,iBACvC6F,IAUA5B,EAAA54B,UAAAy6B,YAAV,SAAsBF,EAAmB5F,GACxC,IAAIsD,KACJsC,EAAY73B,KAAKE,IAAI23B,EAAW76B,KAAK2F,UAAUsC,QAC/C,IAEI+yB,EAFAj1B,EAAmB/C,KAAKE,IAAIlD,KAAK06B,iBAAkB16B,KAAK2F,UAAUsC,QAGlEgzB,GAA6B,EAE7Bd,EAA6Bn6B,KAAKu5B,kBAAkB2B,WACxDf,EAAQ/2B,YAAa,EAEjB6xB,GACHkF,EAAQrR,OAASmM,EAAUkG,SAC3Bn0B,EAAA,eAAuBiuB,EAAUkG,SAAUhB,EAASvhB,EAAA,KAGpD5R,EAAA,eAAuBhH,KAAMm6B,EAASvhB,EAAA,GACtCuhB,EAAQjO,QAAQzkB,QAChB0yB,EAAQrR,OAAS9oB,KAAK45B,mBAGvB,IAAK,IAAIrmB,EAAYsnB,EAAWtnB,EAAIxN,EAAUwN,IAAK,CAElD,IAAI7Q,EAA8B1C,KAAK2F,UAAU4G,SAASgH,GAc1D,GAbA7Q,EAASy3B,QAAUA,EAEfz3B,EAAS04B,gBAER7nB,GAAKsnB,EACR76B,KAAKq7B,wBAAwB34B,EAAS+P,WAAY0nB,GAIlDc,EAAoBj7B,KAAKq7B,wBAAwB34B,EAAS+P,WAAY0nB,GAAS,IAI7Ez3B,EAASod,SAAS9f,KAAKuY,gBAAkB7V,EAASod,SAAS9f,KAAKwY,eACnExY,KAAKs7B,UAAU/C,EAAQ71B,EAAU1C,KAAK8a,OAAQ9a,KAAKkb,YAE/C,CAEJ,GAAI3H,GAAKsnB,EACR,SAOA,IAJuB76B,KAAKy5B,QAId,CACbuB,EAAaznB,EACb,OAOH,GAFAynB,EAAaznB,EAET0nB,EACH,MAGF,OAAOj7B,KAAKu7B,aAAapB,EAAS5B,EAAQsC,EAAWG,EAAY/F,IAaxDiE,EAAA54B,UAAAg7B,UAAV,SAAoB/C,EAAkB71B,EAA6BoY,EAAgBI,EAAgBuG,GAClG,IAAI3U,EAAQ9M,KAAK+e,SAASrc,EAAUoY,EAAQI,EAAQxY,EAASqL,iBAAiB+M,GAASpY,EAASqL,iBAAiBmN,IAC5GuG,IACJ/e,EAASoK,MAAQA,GAElByrB,EAAO/mB,KAAK1E,IAaHosB,EAAA54B,UAAAi7B,aAAV,SAAuBpB,EAA4B5B,EAAkBsC,EAAmBG,EAAoB/F,GAE3G,IAAIuD,KAEJ,GAAIx4B,KAAK+Z,WAAsC/Z,KAAKob,cACnDpb,KAAK+Z,WAAsC/Z,KAAKqb,cAChDrb,KAAKgZ,QACL,IAAK,IAAIzF,EAAYynB,EAAYznB,GAAKsnB,EAAWtnB,IAAK,CACrD,IAAI7Q,EAA8B1C,KAAK2F,UAAU4G,SAASgH,GACtD7Q,EAASod,SAAS9f,KAAKuY,gBAAkB7V,EAASod,SAAS9f,KAAKwY,gBACnExY,KAAKs7B,UAAU9C,EAAa91B,EAAU1C,KAAK+a,WAAY/a,KAAKmb,YAAY,OAItE,CACJ,IAAI5V,EAAiBvF,KAAKuF,SACtBnD,EAAgBm2B,EAAOtwB,OACvBgJ,EAAcjR,KAAKiR,MACnBE,EAAcnR,KAAKmR,MACnB/O,EAAQ,IACPmD,GAAY0L,GACfunB,EAAYhnB,MAAO3L,EAAG0yB,EAAOn2B,EAAQ,GAAGyD,EAAGqH,EAAGiE,EAAMsF,UAAUvJ,IAC9DsrB,EAAYhnB,MAAO3L,EAAG0yB,EAAO,GAAG1yB,EAAGqH,EAAGiE,EAAMsF,UAAUvJ,MAGtDsrB,EAAYhnB,MAAO3L,EAAGoL,EAAMwF,UAAU5Q,EAAGqH,EAAGqrB,EAAOn2B,EAAQ,GAAG8K,IAC9DsrB,EAAYhnB,MAAO3L,EAAGoL,EAAMwF,UAAU5Q,EAAGqH,EAAGqrB,EAAO,GAAGrrB,MAOzD,OAFAlN,KAAKs4B,YAAY6B,EAAS5B,EAAQC,GAE9BwC,EAAah7B,KAAK06B,iBAAmB,GAC/BtuB,MAAS4uB,EAAY/F,UAAaA,GAEpC,MAWCiE,EAAA54B,UAAAg4B,YAAV,SAAsB6B,EAA4B5B,EAAkBC,GACnE2B,EAAQ7B,YAAYC,EAAQC,EAAax4B,KAAK05B,SAAU15B,KAAK25B,WAepDT,EAAA54B,UAAA+6B,wBAAV,SAAkCG,EAA0CrB,EAA4BsB,GACvG,IAAIC,GAAmB,EAyCvB,OAvCA10B,EAAA,KAAaw0B,EAAgB,SAACG,EAAcn7B,GAE3C,GAAIyF,EAAA,SAAezF,GAAQ,CAC1B,IAAIo7B,EAAqBzB,EAASwB,GAC9BE,OAAe,EAGfD,IAEFC,EADGD,EAAat0B,SACEs0B,EAAat0B,WAGbs0B,GAIpB,IAAIE,OAAQ,EAERt7B,IAEFs7B,EADGt7B,EAAM8G,SACE9G,EAAM8G,WAGN9G,GAITo7B,GAAgBp7B,QAA6BqH,GAAnBg0B,QAA4Ch0B,GAAZi0B,GAAyBD,GAAmBC,IAIpGL,IACEtB,EAASwB,GAAgBn7B,GAEhCk7B,GAAU,MAKNA,GAiBRt7B,OAAAC,eAAW64B,EAAA54B,UAAA,eASX,WACC,OAAON,KAAKO,iBAAiB,gBAV9B,SAAmBC,GACdR,KAAKS,iBAAiB,UAAWD,IACpCR,KAAKa,8CAgCPT,OAAAC,eAAW64B,EAAA54B,UAAA,gBAOX,WACC,OAAON,KAAKO,iBAAiB,iBAR9B,SAAoBC,GACnBR,KAAKS,iBAAiB,WAAYD,GAAO,oCA+B1CJ,OAAAC,eAAW64B,EAAA54B,UAAA,gBAOX,WACC,OAAON,KAAKO,iBAAiB,iBAR9B,SAAoBC,GACnBR,KAAKS,iBAAiB,WAAYD,GAAO,oCA4BnC04B,EAAA54B,UAAAy7B,mBAAP,SAA0BC,GAA1B,IAAAl8B,EAAAE,KAEKmnB,EAAY6U,EAAOzU,WACnBF,EAAY2U,EAAO1U,YAEvB0U,EAAOC,kBAEP,IAAIrQ,EAAaoQ,EAAOxV,YAAY0V,EAAA,GASpC,GARAtQ,EAAK7I,aAAc,EAEnB/b,EAAA,eAAuBhH,KAAM4rB,EAAMhT,EAAA,GAEnCgT,EAAKuQ,GAAKhV,EACVyE,EAAK1e,EAAIma,EAAI,EACbuE,EAAKtN,SAAU,EAEXte,KAAKymB,YAAc,EAAG,CACzB,IAAIlb,EAAkBywB,EAAOxV,YAAY4V,GAAA,GAEzCp1B,EAAA,eAAuBhH,KAAMuL,EAAMqN,EAAA,GACnCrN,EAAK4Q,MAAQgL,EACb5b,EAAK6Q,OAASiL,EACd9b,EAAK2B,EAAI,EACT3B,EAAKwb,cAAgB,EACrBxb,EAAK+S,SAAU,EAEfsN,EAAK1e,EAAI,EAGV,IAAImvB,EAAiCL,EAAOt5B,SAC5C25B,EAAeC,MAAQt8B,KAAK4mB,OAC5ByV,EAAeE,UAAYv8B,KAAKuL,KAEhCnG,EAAA,aAAmBpF,KAAKqf,QAAQ/Z,WAAY,SAACqa,GAC5C,GAAIA,EAAO6c,mBAAoB,CAG9B,IAAIC,GAAqB,EAQzB,GAPAr3B,EAAA,KAAWua,EAAO+c,SAASp3B,WAAY,SAACq3B,GACvC,GAAIA,aAAiBC,EAAA,EAEpB,OADAH,GAAY,GACL,KAIJA,EAAW,CACf,IAAIlR,EAAwB5L,EAAO4L,QAsBnC,OArBAA,EAAMzC,OAASkT,EACfzQ,EAAM9S,YAAa,EACnB8S,EAAM9M,iBAAc5W,EACpB0jB,EAAM1lB,EAAIshB,EAAI,EACVrnB,EAAK2mB,YAAc,EACtB8E,EAAMre,EAAI,EAGVqe,EAAMre,EAAIma,EAAI,EAEfkE,EAAMjN,SAAU,EAGXrY,EAAA,SAAeslB,EAAMhgB,QACzBggB,EAAMhgB,KAAOzL,EAAKyL,MAGdtF,EAAA,SAAeslB,EAAM3E,UACzB2E,EAAM3E,OAAS9mB,EAAK8mB,SAGd,OASJsS,EAAA54B,UAAAoa,YAAP,WACC9a,EAAAU,UAAMoa,YAAW3a,KAAAC,MACjBA,KAAKo5B,SAAS3xB,SAEhByxB,EAzrBA,CAAgChhB,GAisBhCjX,EAAA,EAASC,kBAA8B,WAAI+3B,GAC3Ch4B,EAAA,EAASC,kBAAsC,mBAAI63B,GChzBnD,IAAA8D,GAAA,SAAAj9B,GAUC,SAAAk9B,IAAA,IAAAh9B,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,sBAEjBH,EAAKuX,YAAY,QAAS,EAAG,GAC7BvX,EAAKuX,YAAY,QAAS,EAAG,GAE7BvX,EAAKuX,YAAY,YAAa,EAAG,GACjCvX,EAAKuX,YAAY,YAAa,EAAG,GAEjCvX,EAAKI,eAGP,OAvByCC,EAAA,EAAA28B,EAAAl9B,GAuBzCk9B,EAvBA,CAAyC/D,IAiFzCgE,GAAA,SAAAn9B,GAmCC,SAAAo9B,IAAA,IAAAl9B,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,cACjBH,EAAKm9B,aAAc,EACnBn9B,EAAKI,eA+IP,OAtLiCC,EAAA,EAAA68B,EAAAp9B,GA+CzBo9B,EAAA18B,UAAAsT,SAAP,WAGK5T,KAAK0R,MAAMoC,SACd9T,KAAK0R,MAAMkC,WAGZhU,EAAAU,UAAMsT,SAAQ7T,KAAAC,OASLg9B,EAAA18B,UAAAoD,eAAV,WACC,OAAO,IAAIm5B,IAeFG,EAAA18B,UAAAye,SAAV,SAAmBrc,EAA+B2f,EAAcC,EAAcnC,EAAoBC,EAAoBmC,EAAoBC,GACpID,IACJA,EAAY,UAERC,IACJA,EAAY,UAGb,IAAI3c,EAAY7F,KAAKmR,MAAM5D,KAAK7K,EAAU4f,EAAMlC,EAAWoC,GACvDtV,EAAYlN,KAAKmR,MAAMzD,KAAKhL,EAAU4f,EAAMlC,EAAWoC,GAEvD0a,EAAiB9yB,EAAA,aAAoBvE,EAAGA,EAAGqH,EAAGA,IAGrC,GAAVgwB,IACFA,EAAS,MAGV,IAAIlwB,EAAgBhN,KAAKiR,MAAMpD,SAASnL,EAAU2f,EAAMlC,EAAWoC,GAE/D4a,EAAan9B,KAAK0R,MAAMyrB,WACxBC,EAAWp9B,KAAK0R,MAAM0rB,SAG1B,OAAIpwB,EAAQmwB,GAAcnwB,EAAQowB,OACjC,GAGSv3B,EAAGq3B,EAAS9yB,EAAA,IAAU4C,GAAQE,EAAGgwB,EAAS9yB,EAAA,IAAU4C,KAerDgwB,EAAA18B,UAAAg7B,UAAV,SAAoB/C,EAAkB71B,EAA6BoY,EAAgBI,EAAgBuG,GAClG,IAAI3U,EAAQ9M,KAAK+e,SAASrc,EAAUoY,EAAQI,EAAQxY,EAAS4P,UAAUwI,GAASpY,EAAS4P,UAAU4I,IAC/FpO,GACHyrB,EAAO/mB,KAAK1E,IASJkwB,EAAA18B,UAAAub,YAAV,WACC,IAAI7R,EAAmDhK,KAAKmR,MAAMnH,SAClE,OAAOkS,EAAA,IAAUlS,EAASmzB,WAAYnzB,EAASozB,SAAWpzB,EAASmzB,WAAYnzB,EAASqzB,YAAarzB,EAASszB,mBAWrGN,EAAA18B,UAAAg4B,YAAV,SAAsB6B,EAA4B5B,EAAkBC,GACnE,IACIxuB,EADahK,KAAKmR,MACsCnH,SAExDhK,KAAKi9B,aAAoE,KAArDj6B,KAAKwL,IAAIxE,EAASozB,SAAWpzB,EAASmzB,cAEzDn9B,KAAK+Z,WAAsC/Z,KAAKob,cACnDpb,KAAK+Z,WAAsC/Z,KAAKqb,cAChDrb,KAAKgZ,WACLuf,EAAO/mB,KAAK+mB,EAAO,IACfC,EAAYvwB,OAAS,GACxBuwB,EAAY+E,QAAQ/E,EAAYA,EAAYvwB,OAAS,KAIxDrI,EAAAU,UAAMg4B,YAAWv4B,KAAAC,KAACm6B,EAAS5B,EAAQC,IAUpCp4B,OAAAC,eAAW28B,EAAA18B,UAAA,mBAOX,WACC,OAAON,KAAKO,iBAAiB,oBAR9B,SAAuBC,GACtBR,KAAKS,iBAAiB,cAAeD,GAAO,oCAS9Cw8B,EAtLA,CAAiC/D,IA8LjCh4B,EAAA,EAASC,kBAA+B,YAAI67B,GAC5C97B,EAAA,EAASC,kBAAuC,oBAAI27B,oBChOpDW,GAAA,SAAA59B,GA4BC,SAAA69B,IAAA,IAAA39B,EAGCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,cACjBH,EAAKo9B,OAAS98B,OAAA0iB,EAAA,EAAA1iB,CAAQ,KACtBN,EAAK49B,YAAct9B,OAAA0iB,EAAA,EAAA1iB,CAAQ,GAG3BN,EAAKI,aAELJ,EAAK2L,UAAO5D,IAubd,OA9diC1H,EAAA,EAAAs9B,EAAA79B,GAiDzB69B,EAAAn9B,UAAA0jB,aAAP,SAAoBlX,GACnB,IAAIowB,EAAS9yB,EAAA,YAAkB0C,GAK/B,OAAIowB,EAASl9B,KAAK29B,gBAAkB,GAAKT,EAASl9B,KAAKs9B,iBAAmB,GAW3El9B,OAAAC,eAAWo9B,EAAAn9B,UAAA,kBAOX,WACC,OAAON,KAAKO,iBAAiB,mBAR9B,SAAsBC,GACrBR,KAAKS,iBAAiB,aAAcD,GAAO,oCAe5CJ,OAAAC,eAAWo9B,EAAAn9B,UAAA,gBAOX,WACC,OAAON,KAAKO,iBAAiB,iBAR9B,SAAoBC,GACnBR,KAAKS,iBAAiB,WAAYD,GAAO,oCAWhCi9B,EAAAn9B,UAAA+jB,gBAAV,SAA0BvX,GAEpB9M,KAAKiR,SAAUjR,KAAKiR,OAAWjR,KAAKiR,MAAMyH,uBAAwB1Y,KAAKiR,MAAMgI,QAAQ9N,WACzFnL,KAAK49B,YAAY59B,KAAK8M,OAElB9M,KAAKmR,SAAUnR,KAAKmR,OAAWnR,KAAKmR,MAAMuH,uBAAwB1Y,KAAKmR,MAAM8H,QAAQ9N,WACzFnL,KAAK69B,YAAY79B,KAAK8M,OAGvB9M,KAAKulB,kBACL3lB,EAAAU,UAAM+jB,gBAAetkB,KAAAC,KAAC8M,IAQb2wB,EAAAn9B,UAAAs9B,YAAV,SAAsB9wB,GAErB,IAAIowB,EAAiBl9B,KAAKq9B,YACtBF,EAAqBn9B,KAAKm9B,WAC1BC,EAAmBp9B,KAAKo9B,SACxBM,EAAsB19B,KAAKs9B,iBAE/B,GAAIJ,EAAS,GAAKj3B,EAAA,SAAek3B,IAAel3B,EAAA,SAAem3B,IAAan3B,EAAA,SAAey3B,GAAc,CACxG,IAAI1wB,EAAgB5C,EAAA,gBAAsBA,EAAA,SAAe0C,GAAQqwB,EAAYC,GACzEnhB,OAAI,EAER,GAAIjc,KAAK2mB,OAAS3mB,KAAK2mB,MAAMrI,QAAS,CAKrC,GAHAte,KAAK2mB,MAAMtG,QAASxa,EAAG,EAAGqH,EAAG,IAGzBlN,KAAKiR,OAASjR,KAAK0oB,eAAgB,CAEtC,IAAIre,EAAqBrK,KAAKiR,MAAM0X,sBAChCre,EAAmBtK,KAAKiR,MAAM2X,oBAElC,GAAIve,GAAcC,EAAU,CAC3B,IAAIwzB,EAAyB1zB,EAAA,gBAAsBA,EAAA,SAAeC,GAAa8yB,EAAYC,GAGvFW,EAFuB3zB,EAAA,gBAAsBA,EAAA,SAAeE,GAAW6yB,EAAYC,GAEtDU,EAI7BX,EAAaC,EACZW,EAAM,IACTA,GAAO,KAKJA,EAAM,IACTA,GAAO,KAIT/wB,GAAS+wB,EAAM,EAEf9hB,EAAOC,EAAA,QAAerW,EAAG63B,EAActzB,EAAA,IAAU4C,GAAQE,EAAGwwB,EAActzB,EAAA,IAAU4C,KACjFkP,EAAA,QAAerW,EAAGq3B,EAAS9yB,EAAA,IAAU4C,GAAQE,EAAGgwB,EAAS9yB,EAAA,IAAU4C,KACnEkP,EAAA,MAAYlP,EAAO+wB,EAAKb,GACxBhhB,EAAA,QAAerW,EAAG63B,EAActzB,EAAA,IAAU4C,EAAQ+wB,GAAM7wB,EAAGwwB,EAActzB,EAAA,IAAU4C,EAAQ+wB,KAC3F7hB,EAAA,MAAYlP,EAAQ+wB,GAAMA,EAAKL,IAK/BzhB,IACJA,EAAOC,EAAA,QAAerW,EAAG63B,EAActzB,EAAA,IAAU4C,GAAQE,EAAGwwB,EAActzB,EAAA,IAAU4C,KAAYkP,EAAA,QAAerW,EAAGq3B,EAAS9yB,EAAA,IAAU4C,GAAQE,EAAGgwB,EAAS9yB,EAAA,IAAU4C,MAGpKhN,KAAK2mB,MAAM1K,KAAOA,KAUXwhB,EAAAn9B,UAAAu9B,YAAV,SAAsB/wB,GACrB,GAAI9M,KAAKgnB,OAAShnB,KAAKgnB,MAAM1I,QAAS,CACrC,IAAI6e,EAAan9B,KAAKm9B,WAClBC,EAAWp9B,KAAKo9B,SAChBO,EAAkB39B,KAAK29B,gBACvBT,EAAS9yB,EAAA,WAAiBA,EAAA,YAAkB0C,GAAQ,EAAG9M,KAAK29B,iBAChE,GAAI13B,EAAA,SAAei3B,IAAWj3B,EAAA,SAAek3B,GAAa,CACzDn9B,KAAKgnB,MAAM3G,QAASxa,EAAG,EAAGqH,EAAG,IAE7B,IAAI+O,OAAI,EACJ8hB,EAAcX,EAAWD,EAE7B,GAAIn9B,KAAKmR,OAASnR,KAAK6oB,eAAgB,CAEtC,IAAIxe,EAAqBrK,KAAKmR,MAAMwX,sBAChCre,EAAmBtK,KAAKmR,MAAMyX,oBAElC,GAAIve,GAAcC,EAAU,CAC3B,IAAIozB,EAAsBtzB,EAAA,WAAiBA,EAAA,YAAkBC,GAAa,EAAGszB,GAC7ET,EAAS9yB,EAAA,WAAiBA,EAAA,YAAkBE,GAAW,EAAGqzB,GAE1D1hB,EAAOC,EAAA,QAAerW,EAAGq3B,EAAS9yB,EAAA,IAAU+yB,GAAajwB,EAAGgwB,EAAS9yB,EAAA,IAAU+yB,KAAiBjhB,EAAA,MAAYihB,EAAYY,EAAKb,GAC7HjhB,GAAQC,EAAA,QAAerW,EAAG63B,EAActzB,EAAA,IAAUgzB,GAAWlwB,EAAGwwB,EAActzB,EAAA,IAAUgzB,KAAelhB,EAAA,MAAYkhB,GAAWW,EAAKL,IAIhIzhB,IACJA,EAAOC,EAAA,QAAerW,EAAGq3B,EAAS9yB,EAAA,IAAU+yB,GAAajwB,EAAGgwB,EAAS9yB,EAAA,IAAU+yB,KAAiBjhB,EAAA,MAAYihB,EAAYC,EAAWD,EAAYD,IAGhJl9B,KAAKgnB,MAAM/K,KAAOA,KAUdwhB,EAAAn9B,UAAAilB,gBAAP,WACC,GAAIvlB,KAAKknB,eAAgB,CACxB,IAAIvD,EAAoB3jB,KAAK2jB,UAE7B,GAAIA,EAAW,CAEd,IAAI7W,EAAgB9M,KAAK8M,MAErBowB,EAAiBl9B,KAAKq9B,YACtBM,EAA0B39B,KAAK29B,gBAC/BD,EAAsB19B,KAAKs9B,iBAE3BH,EAAqBn6B,KAAKE,IAAIlD,KAAKm9B,WAAYn9B,KAAKo9B,UACpDA,EAAmBp6B,KAAKgB,IAAIhE,KAAKm9B,WAAYn9B,KAAKo9B,UAElDY,EAAoB5zB,EAAA,gBAAsBA,EAAA,SAAeuZ,GAAYwZ,EAAYC,GACjFpwB,EAAgB5C,EAAA,gBAAsBA,EAAA,SAAe0C,GAAQqwB,EAAYC,GAEzEa,EAAqB7zB,EAAA,YAAkBuZ,GAC3C,GAAIsa,EAAaN,EAAiB,CAEjC,IAAIO,EAAgB9zB,EAAA,WAAiBA,EAAA,YAAkB0C,GAAQ,EAAG6wB,GAElE39B,KAAKm+B,WAAanxB,EAElB,IAAIiP,EAAeC,EAAA,QAAerW,EAAG,EAAGqH,EAAG,IAEvCkxB,EAAkBh0B,EAAA,IAAU4zB,GAC5BK,EAAkBj0B,EAAA,IAAU4zB,GAE5BM,EAAcl0B,EAAA,IAAU4C,GACxBuxB,EAAcn0B,EAAA,IAAU4C,GAExBmZ,EAAWnmB,KAAKmmB,SACJ,SAAZA,GAAmC,WAAZA,EAC1BlK,GAAQC,EAAA,QAAerW,EAAGq3B,EAASmB,EAASnxB,EAAGgwB,EAASkB,IAAaliB,EAAA,MAAY8hB,EAAWhxB,EAAQgxB,EAAWd,GAAUhhB,EAAA,QAAerW,EAAG63B,EAAca,EAAKrxB,EAAGwwB,EAAcY,IAASpiB,EAAA,MAAYlP,EAAOgxB,EAAYhxB,EAAO0wB,GAE1M,SAAZvX,GAAmC,WAAZA,EAC/BlK,EAAOC,EAAA,QAAerW,EAAGq4B,EAAgB9zB,EAAA,IAAU+yB,GAAajwB,EAAGgxB,EAAgB9zB,EAAA,IAAU+yB,KAAiBjhB,EAAA,MAAYihB,EAAYC,EAAWD,EAAYe,GAAiBhiB,EAAA,QAAerW,EAAGo4B,EAAa7zB,EAAA,IAAUgzB,GAAWlwB,EAAG+wB,EAAa7zB,EAAA,IAAUgzB,KAAelhB,EAAA,MAAYkhB,EAAUD,EAAaC,EAAUa,GAAc/hB,EAAA,YAElT,UAAZiK,IACRlK,EAAOC,EAAA,QAAerW,EAAGq4B,EAAgB9zB,EAAA,IAAU4zB,GAAY9wB,EAAGgxB,EAAgB9zB,EAAA,IAAU4zB,KAAgB9hB,EAAA,MAAY8hB,EAAWhxB,EAAQgxB,EAAWE,GAAiBhiB,EAAA,QAAerW,EAAGo4B,EAAa7zB,EAAA,IAAU4C,GAAQE,EAAG+wB,EAAa7zB,EAAA,IAAU4C,KAAYkP,EAAA,MAAYlP,EAAOgxB,EAAYhxB,EAAOixB,GAAc/hB,EAAA,aAGnTlc,KAAKumB,UAAUtK,KAAOA,EAEvBjc,KAAKumB,UAAUlG,QAASxa,EAAG,EAAGqH,EAAG,OAQ1BuwB,EAAAn9B,UAAAikB,aAAV,WAGC,GADwBvkB,KAAK0R,MAClB,CACV,IAAIgsB,EAAc19B,KAAKs9B,iBACnBJ,EAAiBl9B,KAAK29B,gBAAkBD,EAExCP,EAAqBn9B,KAAKm9B,WAC1BC,EAAmBp9B,KAAKo9B,SAGxBhf,GADgBhU,EAAA,gBAAsBA,EAAA,SAAepK,KAAK8M,OAAQqwB,EAAYC,GACxDD,IAAeC,EAAWD,GACpDn9B,KAAKoe,UAAYA,EAEjBpe,KAAKqe,UAAYjU,EAAA,YAAkBA,EAAA,YAAkBpK,KAAK8M,OAAS4wB,GAAeR,EAAQ,EAAG,KASrFO,EAAAn9B,UAAA0kB,YAAV,SAAsBlY,KASZ2wB,EAAAn9B,UAAAkoB,uBAAV,SAAiChF,GAChC,GAAIxjB,KAAKiR,MAAMyH,qBAAsB,CACpC,IAAIO,EAAmBjZ,KAAKiR,MAAMgI,QAClCjZ,KAAK49B,YAAY5iB,EAAA,kBAA0BnV,EAAGoT,EAAQsD,OAAQrP,EAAG+L,EAAQqD,QAAUtc,SAU3Ey9B,EAAAn9B,UAAAmoB,uBAAV,SAAiCjF,GAChC,GAAIxjB,KAAKmR,MAAMuH,qBAAsB,CACpC,IAAIO,EAAmBjZ,KAAKmR,MAAM8H,QAClCjZ,KAAK69B,YAAY7iB,EAAA,kBAA0BnV,EAAGoT,EAAQsD,OAAQrP,EAAG+L,EAAQqD,QAAUtc,SAQ3Ey9B,EAAAn9B,UAAAqnB,oBAAV,SAA8B7a,KAUpB2wB,EAAAn9B,UAAAynB,UAAV,WACC,IAAIpE,EAAY3jB,KAAK2jB,UACrB,GAAIA,EAAW,CACd,IAAIsB,EAAkBjlB,KAAKilB,QAG3B,GADwBjlB,KAAK0R,MAClB,CACV,IAAIwrB,EAAiBl9B,KAAKq9B,YACtBF,EAAqBn9B,KAAKm9B,WAC1BC,EAAmBp9B,KAAKo9B,SAExBY,EAAoB5zB,EAAA,gBAAsBA,EAAA,SAAeuZ,GAAY3jB,KAAKm9B,WAAYn9B,KAAKo9B,UAC3FoB,EAAkBp0B,EAAA,gBAAsBA,EAAA,SAAe6a,GAAUjlB,KAAKm9B,WAAYn9B,KAAKo9B,UAEvFa,EAAa7zB,EAAA,WAAiBA,EAAA,YAAkBuZ,GAAY,EAAGuZ,GAC/DuB,EAAWr0B,EAAA,WAAiBA,EAAA,YAAkB6a,GAAU,EAAGiY,GAE3DlV,EAAiB,EACjBM,EAAe,EAEfL,EAAiB,EACjBM,EAAe,EAEfpC,EAAWnmB,KAAKmmB,SACpB,GAAgB,SAAZA,GAAmC,WAAZA,GAAqC,UAAZA,GAAoC,YAAZA,EAAwB,CACnG,IAAI4X,EAAcX,EAAWD,EAC7BnV,EAAS5d,EAAA,OAAa4zB,EAAYb,GAAcY,EAAK,GACrDzV,EAAOle,EAAA,OAAao0B,EAAUrB,GAAcY,EAAK,GAGlC,SAAZ5X,GAAmC,WAAZA,GAAqC,UAAZA,GAAoC,YAAZA,IAC3E8B,EAAS7d,EAAA,MAAY6zB,EAAaf,EAAQ,GAC1C3U,EAAOne,EAAA,MAAYq0B,EAAWvB,EAAQ,IAGvCl9B,KAAKooB,QAAWvkB,MAAOb,KAAKE,IAAI8kB,EAAQM,GAAOxkB,IAAKd,KAAKgB,IAAIgkB,EAAQM,IACrEtoB,KAAKqoB,QAAWxkB,MAAOb,KAAKE,IAAI+kB,EAAQM,GAAOzkB,IAAKd,KAAKgB,IAAIikB,EAAQM,IAEhD,WAAjBvoB,KAAKmmB,UAA0C,WAAjBnmB,KAAKmmB,UAA0C,YAAjBnmB,KAAKmmB,UAIpEnmB,KAAKumB,UAAUrF,UAcZuc,EAAAn9B,UAAA2mB,WAAP,aAQA7mB,OAAAC,eAAWo9B,EAAAn9B,UAAA,cAOX,WACC,OAAON,KAAKO,iBAAiB,eAR9B,SAAkBC,GACjBR,KAAK0+B,mBAAmB,SAAUl+B,GAAO,GAAO,EAAO,IAAI,oCAgB5DJ,OAAAC,eAAWo9B,EAAAn9B,UAAA,mBAAX,WACC,OAAO0a,EAAA,sBAA6Bhb,KAAKk9B,OAAQl9B,KAAK29B,kDAUvDv9B,OAAAC,eAAWo9B,EAAAn9B,UAAA,uBAAX,WACC,OAAO0a,EAAA,gBAAuB5a,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAAMgK,EAAA,IAAUpK,KAAKwlB,WAAa,EAAGxlB,KAAKylB,YAAc,qCAS/FrlB,OAAAC,eAAWo9B,EAAAn9B,UAAA,mBAOX,WACC,OAAON,KAAKO,iBAAiB,oBAR9B,SAAuBC,GACtBR,KAAK0+B,mBAAmB,cAAel+B,GAAO,GAAO,EAAO,IAAI,oCAgBjEJ,OAAAC,eAAWo9B,EAAAn9B,UAAA,wBAAX,WAEC,IAAIo9B,EAAc19B,KAAK09B,YAMvB,OAJIA,aAAuB5a,EAAA,IAC1B4a,EAAct9B,OAAA0iB,EAAA,EAAA1iB,CAAQ,IAAMs9B,EAAYl9B,MAAQR,KAAK0R,MAAMitB,sBAGrD3jB,EAAA,sBAA6B0iB,EAAa19B,KAAK29B,kBAAoB,mCASjEF,EAAAn9B,UAAAmnB,SAAV,SAAmB3a,GAElB,OAAOA,GAET2wB,EA9dA,CAAiC1X,GAsejC9kB,EAAA,EAASC,kBAA+B,YAAIs8B,iCClf5CoB,GAAA,SAAAh/B,GA8BC,SAAAi/B,EAAYj+B,GAAZ,IAAAd,EACCF,EAAAG,KAAAC,KAAMY,IAAKZ,YAEXF,EAAKG,UAAY,mBAEjBH,EAAKmpB,QAAUnpB,EAAKgZ,MAAMC,IAAI,QAE9BjZ,EAAKo9B,OAAS98B,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAEtBN,EAAKI,eAiEP,OAxGsCC,EAAA,EAAA0+B,EAAAj/B,GA+C9Bi/B,EAAAv+B,UAAA6uB,KAAP,WAEC,GADAvvB,EAAAU,UAAM6uB,KAAIpvB,KAAAC,MACNA,KAAKY,KAAM,CACd,IAAIoJ,EAAuDhK,KAAKY,KAAKoJ,SACrEhK,KAAKgc,SAAWhS,EAASiM,qBAAqBjW,KAAKoI,cAAepI,KAAKmI,YAAanI,KAAKk9B,OAAQj3B,EAAA,SAAejG,KAAK09B,aAAe19B,KAAK09B,YAAc1zB,EAAS0zB,YAAa19B,KAAK0qB,cAClL1qB,KAAKic,KAAOjc,KAAKgc,WASnB5b,OAAAC,eAAWw+B,EAAAv+B,UAAA,mBAOX,WACC,OAAON,KAAKO,iBAAiB,oBAR9B,SAAuBC,GACtBR,KAAK0+B,mBAAmB,cAAel+B,GAAO,GAAM,EAAO,IAAI,oCAehEJ,OAAAC,eAAWw+B,EAAAv+B,UAAA,cAOX,WACC,OAAON,KAAKO,iBAAiB,eAR9B,SAAkBC,GACjBR,KAAK0+B,mBAAmB,SAAUl+B,GAAO,GAAM,EAAO,IAAI,oCAe3DJ,OAAAC,eAAWw+B,EAAAv+B,UAAA,oBAOX,WACC,OAAON,KAAKO,iBAAiB,qBAR9B,SAAwBC,GACvBR,KAAKS,iBAAiB,eAAgBD,GAAO,oCAU/Cq+B,EAxGA,CAAsCC,GAAA,GAgHtC79B,EAAA,EAASC,kBAAoC,iBAAI09B,oBCnHjDG,GAAA,SAAAn/B,GAoBC,SAAAo/B,IAAA,IAAAl/B,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,eACjBH,EAAKm/B,cAAe,EACpBn/B,EAAKI,eAmCP,OA3DkCC,EAAA,EAAA6+B,EAAAp/B,GAgCjCQ,OAAAC,eAAW2+B,EAAA1+B,UAAA,mBAOX,WACC,OAAON,KAAKO,iBAAiB,oBAR9B,SAAuBC,GACtBR,KAAK0+B,mBAAmB,cAAel+B,GAAO,GAAM,EAAO,IAAI,oCAehEJ,OAAAC,eAAW2+B,EAAA1+B,UAAA,cAOX,WACC,OAAON,KAAKO,iBAAiB,eAR9B,SAAkBC,GACjBR,KAAK0+B,mBAAmB,SAAUl+B,GAAO,GAAM,EAAO,IAAI,oCAU5Dw+B,EA3DA,CAAkCE,GAAA,GAoElCj+B,EAAA,EAASC,kBAAgC,aAAI69B,oBC5C7CI,GAAA,SAAAv/B,GA0CC,SAAAw/B,IAAA,IAAAt/B,EAGCF,EAAAG,KAAAC,OAAOA,YAVDF,EAAAu/B,gBAA0B,EAahCv/B,EAAK0tB,OAAS,OAEd1tB,EAAKG,UAAY,uBACjBH,EAAK2Y,YAAa,EAClB3Y,EAAKq9B,YAAc,GACnBr9B,EAAKs9B,SAAW,IAEhBt9B,EAAKw/B,gBAAiB,EACtBx/B,EAAKo9B,OAAS98B,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAEtBN,EAAK2Y,YAAa,EAElB3Y,EAAKuL,KAAKyD,SAASlD,SAAW,EAE9B9L,EAAKmQ,OAAOnB,SAASlD,SAAW,EAChC9L,EAAKmQ,OAAOnB,SAASouB,OAAS,GAE9Bp9B,EAAKkQ,MAAMlB,SAASlD,SAAW,EAC/B9L,EAAKkQ,MAAMlB,SAASmwB,cAAe,EACnCn/B,EAAKy/B,gBAAkB,EAEvBz/B,EAAK8rB,KAAK7E,cAAgB,EAE1BjnB,EAAKI,eAgYP,OAvc0CC,EAAA,EAAAi/B,EAAAx/B,GA6ElCw/B,EAAA9+B,UAAAk/B,QAAP,SAAe5+B,GAAf,IAAAd,EAAAE,KACCJ,EAAAU,UAAMk/B,QAAOz/B,KAAAC,KAACY,GACdA,EAAK6X,YAAa,EAGlB,IAAIQ,EAAUrY,EAAKqY,QAEnBA,EAAQ3J,QAAQyJ,IAAI,KAAM,SAAClT,EAAGsZ,GAC7B,IAAIrS,EAAgBkO,EAAA,kBAA0BnV,EAAGsZ,EAAO5C,OAAQrP,EAAGiS,EAAO7C,QAAUxc,GACpF,OAAOA,EAAKu9B,YAAcr6B,KAAKu7B,IAAIv7B,KAAKy8B,MAAM3yB,EAAMI,EAAGJ,EAAMjH,IAAMiH,EAAMjH,IAG1EoT,EAAQ3J,QAAQyJ,IAAI,KAAM,SAAC7L,EAAGiS,GAC7B,IAAIrS,EAAgBkO,EAAA,kBAA0BnV,EAAGsZ,EAAO5C,OAAQrP,EAAGiS,EAAO7C,QAAUxc,GACpF,OAAOA,EAAKu9B,YAAcr6B,KAAKs7B,IAAIt7B,KAAKy8B,MAAM3yB,EAAMI,EAAGJ,EAAMjH,IAAMiH,EAAMI,KASpEkyB,EAAA9+B,UAAAsT,SAAP,WAEK5T,KAAK0R,OAAS1R,KAAK0R,MAAMoC,SAC5B9T,KAAK0R,MAAMkC,WAGZhU,EAAAU,UAAMsT,SAAQ7T,KAAAC,OAQfI,OAAAC,eAAW++B,EAAA9+B,UAAA,kBAAX,WACC,OAAO,EAAI0C,KAAK08B,GAAK1/B,KAAKq9B,6CAU3Bj9B,OAAAC,eAAW++B,EAAA9+B,UAAA,cAWX,WACC,OAAON,KAAKO,iBAAiB,eAZ9B,SAAkBC,GACbR,KAAK0+B,mBAAmB,SAAUl+B,GAAO,GAAO,EAAO,IAAI,IAC1DR,KAAKY,MACRZ,KAAKY,KAAKC,8CAiBbT,OAAAC,eAAW++B,EAAA9+B,UAAA,mBAAX,WACC,OAAO0a,EAAA,sBAA6Bhb,KAAKk9B,OAAQl9B,KAAKq/B,kBAAoB,mCAU3Ej/B,OAAAC,eAAW++B,EAAA9+B,UAAA,mBAWX,WACC,OAAON,KAAKO,iBAAiB,oBAZ9B,SAAuBC,GAClBR,KAAK0+B,mBAAmB,cAAel+B,GAAO,GAAO,EAAO,IAAI,IAC/DR,KAAKY,MACRZ,KAAKY,KAAKC,8CAmBbT,OAAAC,eAAW++B,EAAA9+B,UAAA,sBAOX,WACC,OAAON,KAAKO,iBAAiB,uBAR9B,SAA0BC,GACzBR,KAAKS,iBAAiB,iBAAkBD,oCAezCJ,OAAAC,eAAW++B,EAAA9+B,UAAA,wBAAX,WACC,OAAO0a,EAAA,sBAA6Bhb,KAAK09B,YAAa19B,KAAKq/B,kBAAoB,mCASzED,EAAA9+B,UAAAyM,gBAAP,SAAuBjC,GACtB,IAAI60B,EAAqB3/B,KAAK4/B,qBAAqB90B,GAC/CkC,EAAgBhN,KAAKm9B,YAAcn9B,KAAKo9B,SAAWp9B,KAAKm9B,YAAcwC,EAAa3/B,KAAKgU,WAC5F,OAASnO,EAAG7F,KAAKq9B,YAAcjzB,EAAA,IAAU4C,GAAQE,EAAGlN,KAAKq9B,YAAcjzB,EAAA,IAAU4C,KAS3EoyB,EAAA9+B,UAAA2M,gBAAP,SAAuBnC,GACtB,IAIIkC,EAJApM,EAAaZ,KAAKY,KAElBm9B,GAAe/9B,KAAKo9B,SAAWp9B,KAAKm9B,aAAev8B,EAAKkD,IAAMlD,EAAKiD,OAWvE,OANCmJ,EADGpM,EAAKoJ,SAASmnB,SACTnxB,KAAKm9B,YAAcv8B,EAAKkD,IAAMgH,GAAYizB,EAG1C/9B,KAAKm9B,YAAcryB,EAAWlK,EAAKiD,OAASk6B,EAG9C3zB,EAAA,MAAY4C,EAAO,IAQpBoyB,EAAA9+B,UAAAu/B,eAAP,WACC,IAAI3C,EAAiBl9B,KAAKq9B,YACtBF,EAAqBn9B,KAAKm9B,WAG1BY,EAFmB/9B,KAAKo9B,SAECD,EAC7Bn9B,KAAK4rB,KAAK3P,KAAOC,EAAA,QAAerW,EAAGq3B,EAAS9yB,EAAA,IAAU+yB,GAAajwB,EAAGgwB,EAAS9yB,EAAA,IAAU+yB,KAAiBjhB,EAAA,MAAYihB,EAAYY,EAAKb,EAAQA,IAWzIkC,EAAA9+B,UAAAgL,kBAAP,SAAyBD,EAAoBP,EAAkB3C,GAC9D2C,IAAuB3C,EAAc2C,GAAYO,EAAKO,SAEtD,IAAIkB,EAAgB9M,KAAK+M,gBAAgBjC,GACzC,GAAIO,EAAK4d,QAAS,CACjB,IAAIjc,EAAgB5C,EAAA,QAAgBpH,KAAKy8B,MAAM3yB,EAAMI,EAAGJ,EAAMjH,GAC1Dq3B,EAAiBliB,EAAA,sBAA6B/U,EAAA,SAAeoF,EAAK6xB,QAAU7xB,EAAK6xB,OAAS98B,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAAMJ,KAAKq9B,aAE7GyC,EAAkB9kB,EAAA,sBAA6B3P,EAAKqyB,YAAa19B,KAAKq9B,aAC1EhyB,EAAKqiB,OAAS,EAEd,IAAIgQ,EAAsB1iB,EAAA,sBAA6B/U,EAAA,SAAe65B,GAAmBA,EAAkB9/B,KAAK09B,YAAa19B,KAAKq9B,aAAa,GAC/IhyB,EAAK4Q,KAAOC,EAAA,QAAerW,EAAG63B,EAActzB,EAAA,IAAU4C,GAAQE,EAAGwwB,EAActzB,EAAA,IAAU4C,KAAYkP,EAAA,QAAerW,EAAGq3B,EAAS9yB,EAAA,IAAU4C,GAAQE,EAAGgwB,EAAS9yB,EAAA,IAAU4C,KAEzKhN,KAAK+/B,iBAAiB10B,EAAMP,EAAU,EAAG,IAWnCs0B,EAAA9+B,UAAA8K,kBAAP,SAAyBF,EAAgBJ,EAAkB3C,GAE1D2C,IAAuB3C,EAAc2C,GAAYI,EAAKU,SAEtD,IAAIkB,EAAgB9M,KAAK+M,gBAAgBjC,GAEzC,GAAII,EAAK+d,QAAS,CACjB,IAAIiU,EAAiBl9B,KAAKq9B,YACtBrwB,EAAgB5C,EAAA,QAAgBpH,KAAKy8B,MAAM3yB,EAAMI,EAAGJ,EAAMjH,GAC1Dm6B,EAAqB90B,EAAKjD,OAC1BiD,EAAKygB,SACRqU,GAAcA,GAEf90B,EAAKwiB,OAAS,EACdxiB,EAAK+Q,KAAOC,EAAA,QAAerW,EAAGq3B,EAAS9yB,EAAA,IAAU4C,GAAQE,EAAGgwB,EAAS9yB,EAAA,IAAU4C,KAAYkP,EAAA,QAAerW,GAAIq3B,EAAS8C,GAAc51B,EAAA,IAAU4C,GAAQE,GAAIgwB,EAAS8C,GAAc51B,EAAA,IAAU4C,KAG7LhN,KAAK+/B,iBAAiB70B,EAAMJ,EAAU,EAAG,IAWnCs0B,EAAA9+B,UAAAuL,mBAAP,SAA0BH,EAA2BZ,EAAkB3C,EAAqByD,GAEtF3F,EAAA,SAAe2F,KACnBA,EAAWF,EAAME,UAGlBd,IAAuB3C,EAAc2C,GAAYc,EAEjDF,EAAMu0B,YAAYjgC,KAAKiN,gBAAgBnC,GAAW9K,KAAKq9B,aACvD3xB,EAAMgiB,OAAS,EAEf1tB,KAAK+/B,iBAAiBr0B,EAAOZ,EAAU9K,KAAK6rB,iBAAkB7rB,KAAK8rB,mBAU7DsT,EAAA9+B,UAAA0jB,aAAP,SAAoBlX,GACnB,OAAO,GAQR1M,OAAAC,eAAW++B,EAAA9+B,UAAA,kBAaX,WACC,OAAON,KAAKO,iBAAiB,mBAd9B,SAAsBC,GAEjBR,KAAKS,iBAAiB,aAAcD,KACvCR,KAAKkgC,sBACDlgC,KAAKY,MACRZ,KAAKY,KAAKE,qDAiBbV,OAAAC,eAAW++B,EAAA9+B,UAAA,gBAaX,WACC,OAAON,KAAKO,iBAAiB,iBAd9B,SAAoBC,GAEfR,KAAKS,iBAAiB,WAAYD,KACrCR,KAAKkgC,sBACDlgC,KAAKY,MACRZ,KAAKY,KAAKE,qDAsBNs+B,EAAA9+B,UAAA2V,qBAAP,SAA4B7N,EAAuBD,EAAqB+0B,EAA2BQ,EAAgChT,GAClI,IAAIzO,EAAe,GACnB,GAAIhW,EAAA,SAAemC,IAAkBnC,EAAA,SAAekC,GAAc,CAE5DlC,EAAA,SAAei3B,KACnBA,EAASl9B,KAAKk9B,QAGf90B,EAAgBgC,EAAA,IAAUhC,EAAepI,KAAKY,KAAKiD,QACnDsE,EAAciC,EAAA,IAAUjC,EAAanI,KAAKY,KAAKkD,MAE7BsE,IACjBD,EAAcC,GAGf,IAAIi1B,EAAsBriB,EAAA,sBAA6BkiB,EAAQl9B,KAAKq9B,aAChEC,EAA2BtiB,EAAA,sBAA6B0iB,EAAa19B,KAAKq9B,aAAa,GAEvFF,EAAqBn9B,KAAKiN,gBAAgB7E,GAG1C21B,EAFmB/9B,KAAKiN,gBAAgB9E,GAEfg1B,EAE7BlhB,EAAOC,EAAA,IAAUihB,EAAYY,EAAKV,EAAaC,EAAkBD,EAAa3S,GAG/E,OAAOzO,GAQDmjB,EAAA9+B,UAAA6/B,WAAP,WACC,OAAO,IAAIpB,IAQLK,EAAA9+B,UAAA8/B,WAAP,SAAkBx/B,GACjB,OAAO,IAAIg+B,GAAiBh+B,IAQtBw+B,EAAA9+B,UAAA+/B,YAAP,WACC,OAAO,IAAIC,GAAA,GAWLlB,EAAA9+B,UAAAigC,gBAAP,SAAuBzzB,GACtB,IAAIE,EAAQ5C,EAAA,gBAAsBA,EAAA,SAAe0C,GAAQ9M,KAAKm9B,WAAYn9B,KAAKo9B,UAC/E,OAAOp9B,KAAKwgC,sBAAsBxzB,EAAQhN,KAAKm9B,YAAc,IAAMn9B,KAAKgU,aAE1EorB,EAvcA,CAA0CqB,GAAA,GA+c1Cx/B,EAAA,EAASC,kBAAwC,qBAAIi+B,oBClcrDuB,GAAA,SAAA9gC,GAgCC,SAAA+gC,IAAA,IAAA7gC,EAGCF,EAAAG,KAAAC,OAAOA,YAfEF,EAAA0a,OAAS,IAAInC,EAAA,EAKhBvY,EAAAu/B,gBAA0B,EAWhCv/B,EAAKG,UAAY,qBACjBH,EAAK2Y,YAAa,EAClB3Y,EAAKq9B,YAAc,GACnBr9B,EAAKs9B,SAAW,IAChBt9B,EAAKyK,gBAAkB,GACvBzK,EAAK8gC,SAAW,UAChB9gC,EAAK+gC,WAAa,GAClB/gC,EAAK2Y,YAAa,EAClB3Y,EAAK0tB,OAAS,OAEd1tB,EAAKo9B,OAAS98B,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAEtBN,EAAK8rB,KAAK7E,cAAgB,EAE1BjnB,EAAKmQ,OAAOnB,SAASgyB,iBAAmB,SAExChhC,EAAKkT,WAAWxB,KAAK1R,EAAK0a,QAE1B1a,EAAKI,eA4eP,OAliBwCC,EAAA,EAAAwgC,EAAA/gC,GA8DhC+gC,EAAArgC,UAAAsT,SAAP,WAEK5T,KAAK0R,OAAS1R,KAAK0R,MAAMoC,SAC5B9T,KAAK0R,MAAMkC,WAGZhU,EAAAU,UAAMsT,SAAQ7T,KAAAC,OAQfI,OAAAC,eAAWsgC,EAAArgC,UAAA,kBAAX,WACC,OAAON,KAAKq9B,YAAcr9B,KAAKs9B,kDAUhCl9B,OAAAC,eAAWsgC,EAAArgC,UAAA,cAOX,WACC,OAAON,KAAKO,iBAAiB,eAR9B,SAAkBC,GACjBR,KAAK0+B,mBAAmB,SAAUl+B,GAAO,GAAO,EAAO,IAAI,oCAe5DJ,OAAAC,eAAWsgC,EAAArgC,UAAA,mBAAX,WACC,OAAO0a,EAAA,sBAA6Bhb,KAAKk9B,OAAQl9B,KAAKq/B,kBAAoB,mCAU3Ej/B,OAAAC,eAAWsgC,EAAArgC,UAAA,mBAOX,WACC,OAAON,KAAKO,iBAAiB,oBAR9B,SAAuBC,GACtBR,KAAK0+B,mBAAmB,cAAel+B,GAAO,GAAO,EAAO,IAAI,oCAejEJ,OAAAC,eAAWsgC,EAAArgC,UAAA,wBAAX,WACC,OAAO0a,EAAA,sBAA6Bhb,KAAK09B,YAAa19B,KAAKq/B,kBAAoB,mCAShFj/B,OAAAC,eAAWsgC,EAAArgC,UAAA,aAQX,WACC,OAAON,KAAKwa,OAAOkC,WATpB,SAAiBhL,GAChB1R,KAAKwa,OAAOwC,IAAItL,EAAO,uCAiBjBivB,EAAArgC,UAAAyM,gBAAP,SAAuBjC,GACtB,IAAIoyB,EAAiB9yB,EAAA,WAAiBpK,KAAK4/B,qBAAqB90B,GAAW,EAAGwS,KAC9E,OAASzX,EAAGq3B,EAAS9yB,EAAA,IAAUpK,KAAK6gC,WAAY3zB,EAAGgwB,EAAS9yB,EAAA,IAAUpK,KAAK6gC,aAQrEF,EAAArgC,UAAAu/B,eAAP,WACC7/B,KAAK4rB,KAAK3P,KAAOC,EAAA,QAAerW,EAAG7F,KAAKs9B,iBAAmBlzB,EAAA,IAAUpK,KAAK6gC,WAAY3zB,EAAGlN,KAAKs9B,iBAAmBlzB,EAAA,IAAUpK,KAAK6gC,aAAgB3kB,EAAA,QAAerW,EAAG7F,KAAKq9B,YAAcjzB,EAAA,IAAUpK,KAAK6gC,WAAY3zB,EAAGlN,KAAKq9B,YAAcjzB,EAAA,IAAUpK,KAAK6gC,aAErP,IAAIrV,EAAQxrB,KAAKY,KAAK4qB,MACtBA,EAAMqD,OAAS,OACfrD,EAAMsV,iBAAmB,SACzBtV,EAAMuV,eAAiB,SACvBvV,EAAMte,GAAMlN,KAAKgU,WAAa,EAC9B,IAAIgtB,EAAmB,GACnBhhC,KAAKopB,SACHppB,KAAK2rB,SACTqV,GAAY,IAIThhC,KAAK2rB,SACRqV,GAAY,IAGdxV,EAAMwV,SAAWA,GAWXL,EAAArgC,UAAAgL,kBAAP,SAAyBD,EAAYP,EAAkB3C,GACtD2C,IAAuB3C,EAAc2C,GAAYO,EAAKO,SACtD,IACIqQ,EADAnP,EAAgB9M,KAAK+M,gBAAgBjC,GAErCoyB,EAAiB9yB,EAAA,YAAkB0C,GACnCqwB,EAAqBn9B,KAAKm9B,WAC1BC,EAAmBp9B,KAAKo9B,SAE5B,GAAIn3B,EAAA,SAAei3B,IAAW7xB,EAAK4d,QAAS,CAC3C,IAAIvX,EAAQ1R,KAAK0R,MACbT,EAAQS,EAAMiL,MAAMpQ,SAAS,GAC7BnK,EAAQsP,EAAM/L,UAAUsC,OACxB5C,EAASqM,EAAMrM,OAAOkH,SAAS,GAInC,GAAqB,YAAjBvM,KAAK4gC,UAA0Bx+B,EAAQ,GAAKiD,GAAU4L,GAASA,aAAiB2B,EAAc,CACjG,IAAIquB,EAAehwB,EAAMjH,SAASqB,KAAKyD,SAASlD,SAE5CoB,EAAgBiE,EAAMpD,SAASxI,EAAOM,UAAU4G,SAAS,GAAI,YAAa00B,GAC9EhlB,EAAOC,EAAA,QAAerW,EAAGq3B,EAAS9yB,EAAA,IAAU4C,GAAQE,EAAGgwB,EAAS9yB,EAAA,IAAU4C,KAG1E,IAFA,IAAIk0B,EAAgBxvB,EAAM/L,UAAUsC,OAE3BsL,EAAI,EAAGA,EAAI2tB,EAAO3tB,IAC1BvG,EAAQiE,EAAMpD,SAASxI,EAAOM,UAAU4G,SAASgH,GAAI,YAAa0tB,GAClEhlB,GAAQC,EAAA,QAAerW,EAAGq3B,EAAS9yB,EAAA,IAAU4C,GAAQE,EAAGgwB,EAAS9yB,EAAA,IAAU4C,KAG5EA,EAAQiE,EAAMpD,SAASxI,EAAOM,UAAU4G,SAAS20B,EAAQ,GAAI,YAAajwB,EAAMjH,SAASm3B,iBACzFllB,GAAQC,EAAA,QAAerW,EAAGq3B,EAAS9yB,EAAA,IAAU4C,GAAQE,EAAGgwB,EAAS9yB,EAAA,IAAU4C,UAG3EiP,EAAOC,EAAA,QAAerW,EAAGq3B,EAAS9yB,EAAA,IAAU+yB,GAAajwB,EAAGgwB,EAAS9yB,EAAA,IAAU+yB,KAAiBjhB,EAAA,MAAYihB,EAAYC,EAAWD,EAAYD,EAAQA,GAExJ7xB,EAAK4Q,KAAOA,EAGbjc,KAAK+/B,iBAAiB10B,EAAMP,EAAU,EAAG,IAWnC61B,EAAArgC,UAAAuL,mBAAP,SAA0BH,EAA2BZ,EAAkB3C,EAAqByD,GAEtF3F,EAAA,SAAe2F,KACnBA,EAAWF,EAAME,UAGlBd,IAAuB3C,EAAc2C,GAAYc,EAEjD,IAAIkB,EAAgB9M,KAAK+M,gBAAgBjC,GAEzC9K,KAAKohC,aAAa11B,EAAOoB,GACzB9M,KAAK+/B,iBAAiBr0B,EAAOZ,EAAU9K,KAAK6rB,iBAAkB7rB,KAAK8rB,mBAQ7D6U,EAAArgC,UAAA+gC,sBAAP,aAWOV,EAAArgC,UAAA0jB,aAAP,SAAoBlX,GACnB,OAAO,GAQR1M,OAAAC,eAAWsgC,EAAArgC,UAAA,kBAUX,WACC,OAAON,KAAKO,iBAAiB,mBAX9B,SAAsBC,GAEjBR,KAAKS,iBAAiB,aAAcD,IACvCR,KAAKkgC,uDAgBP9/B,OAAAC,eAAWsgC,EAAArgC,UAAA,gBAUX,WACC,OAAON,KAAKO,iBAAiB,iBAX9B,SAAoBC,GAEfR,KAAKS,iBAAiB,WAAYD,IACrCR,KAAKkgC,uDAgBP9/B,OAAAC,eAAWsgC,EAAArgC,UAAA,iBAQX,WACC,OAAON,KAAKO,iBAAiB,kBAT9B,SAAqBC,GACpBR,KAAKS,iBAAiB,YAAa2J,EAAA,eAAqB5J,IACxDR,KAAKkgC,uDAsBN9/B,OAAAC,eAAWsgC,EAAArgC,UAAA,gBAOX,WAEC,OADiBN,KAAK0R,MAAMiL,MAAMpQ,SAAS,aACvBqG,EACZ5S,KAAKO,iBAAiB,YAGtB,eAbT,SAAoBC,GACnBR,KAAKS,iBAAiB,WAAYD,GAAO,oCA0BnCmgC,EAAArgC,UAAA2V,qBAAP,SAA4B7N,EAAuBD,GAClD,IAUI8T,EAVAqhB,EAAmBt9B,KAAKs9B,iBACxBD,EAAcr9B,KAAKgU,WAAaspB,EAChCI,EAAsBtzB,EAAA,WAAiBpK,KAAK4/B,qBAAqBx3B,GAAgBk1B,EAAkBD,GACnGH,EAAiB9yB,EAAA,WAAiBpK,KAAK4/B,qBAAqBz3B,GAAcm1B,EAAkBD,GAG5FF,EAAqBn9B,KAAKm9B,WAE1BY,EADmB/9B,KAAKo9B,SACCD,EAIzBzrB,EAAQ1R,KAAK0R,MACbT,EAAQS,EAAMiL,MAAMpQ,SAAS,GAC7BnK,EAAQsP,EAAM/L,UAAUsC,OACxB5C,EAASqM,EAAMrM,OAAOkH,SAAS,GAInC,GAAqB,YAAjBvM,KAAK4gC,UAA0Bx+B,EAAQ,GAAKiD,GAAU4L,GAASA,aAAiB2B,EAAc,CACjG,IAAIquB,EAAehwB,EAAMjH,SAASqB,KAAKyD,SAASlD,SAE5CoB,EAAgBiE,EAAMpD,SAASxI,EAAOM,UAAU4G,SAAS,GAAI,YAAa00B,GAC9EhlB,EAAOC,EAAA,QAAerW,EAAGq3B,EAAS9yB,EAAA,IAAU4C,GAAQE,EAAGgwB,EAAS9yB,EAAA,IAAU4C,KAG1E,IAFA,IAAIs0B,EAAgB5vB,EAAM/L,UAAUsC,OAE3BsL,EAAI,EAAGA,EAAI+tB,EAAO/tB,IAC1BvG,EAAQiE,EAAMpD,SAASxI,EAAOM,UAAU4G,SAASgH,GAAI,YAAa0tB,GAClEhlB,GAAQC,EAAA,QAAerW,EAAGq3B,EAAS9yB,EAAA,IAAU4C,GAAQE,EAAGgwB,EAAS9yB,EAAA,IAAU4C,KAG5EA,EAAQiE,EAAMpD,SAASxI,EAAOM,UAAU4G,SAAS+0B,EAAQ,GAAI,YAAarwB,EAAMjH,SAASm3B,iBACzFllB,GAAQC,EAAA,QAAerW,EAAGq3B,EAAS9yB,EAAA,IAAU4C,GAAQE,EAAGgwB,EAAS9yB,EAAA,IAAU4C,KAE3EiP,GAAQC,EAAA,QAAerW,EAAG63B,EAActzB,EAAA,IAAU4C,GAAQE,EAAGwwB,EAActzB,EAAA,IAAU4C,KAErF,IAASuG,EAAI+tB,EAAQ,EAAG/tB,GAAK,EAAGA,IAC/BvG,EAAQiE,EAAMpD,SAASxI,EAAOM,UAAU4G,SAASgH,GAAI,YAAa0tB,GAClEhlB,GAAQC,EAAA,QAAerW,EAAG63B,EAActzB,EAAA,IAAU4C,GAAQE,EAAGwwB,EAActzB,EAAA,IAAU4C,UAItFiP,EAAOC,EAAA,IAAUihB,EAAYY,EAAKb,EAAQQ,GAE3C,OAAOzhB,GASD0kB,EAAArgC,UAAAihC,mBAAP,SAA0B75B,GAGzB,IAAIqH,EAAsCrH,EAAUqH,UAChDC,EAAoCtH,EAAUsH,QAC9CC,EAAsCvH,EAAUuH,UAEhD5E,EAAqB3C,EAAU2C,WAC/BC,EAAmB5C,EAAU4C,SAEjCyE,EAAUmuB,OAASl6B,KAAKwL,IAAInE,EAAW6C,GACvC8B,EAAQkuB,OAASl6B,KAAKwL,IAAIlE,EAAS4C,GACnC+B,EAAUiuB,OAASl6B,KAAKwL,IAAIlE,EAAS4C,GACrC+B,EAAUyuB,YAAc16B,KAAKwL,IAAInE,EAAW6C,IAStCyzB,EAAArgC,UAAAkhC,mBAAP,SAA0B95B,GACzBA,EAAUqH,UAAY,IAAI0yB,GAAA,EAC1B/5B,EAAUsH,QAAU,IAAIyyB,GAAA,EACxB/5B,EAAUuH,UAAY,IAAIwyB,GAAA,GAUpBd,EAAArgC,UAAAohC,cAAP,WAEC,GADiB1hC,KAAKY,KACZ,CAET,IAKIigC,EAAoB7gC,KAAK6gC,UACzBA,EAAY,IACfA,GAAa,KAEd,IAAIc,EAAyC,YACxCd,EAAY,IAAMA,EAAY,KAASA,EAAY,KAAOA,EAAY,OAC1Ec,EAAqB,cAEtB3hC,KAAKY,KAAK8gC,cAAcC,GAAsB97B,GAZ3B,IAYmCqH,GAXnC,IAW2CiP,MAV5CylB,IAUwDxlB,OATxDwlB,QAoBbjB,EAAArgC,UAAA8K,kBAAP,SAAyBF,EAAgBJ,GACxC,IAAIgC,EAAgB9M,KAAK+M,gBAAgBjC,GACzC,GAAII,EAAK+d,QAAS,CACjB,IAAIjc,EAAgB5C,EAAA,eAAqBpK,KAAK6gC,UAAY,IACtD7zB,EAAQ,IAAMhK,KAAKC,MAAM+J,EAAQ,IACpC9B,EAAK+zB,cAAe,EAGpB/zB,EAAK+zB,cAAe,EAErB,IAAIe,GAAc90B,EAAKjD,OACnBiD,EAAKygB,SACRqU,IAAe,GAEhB90B,EAAK+Q,KAAOC,EAAA,QAAerW,EAAG,EAAGqH,EAAG,IAAOgP,EAAA,QAAerW,EAAGm6B,EAAa51B,EAAA,IAAU4C,GAAQE,EAAG8yB,EAAa51B,EAAA,IAAU4C,KAEvHhN,KAAKohC,aAAal2B,EAAM4B,GAExB9M,KAAK+/B,iBAAiB70B,EAAMJ,EAAU,EAAG,IAUnC61B,EAAArgC,UAAAs/B,qBAAP,SAA4B90B,GAC3B,IAAI60B,EACA/+B,EAAaZ,KAAKY,KAClBihC,EAAiBjhC,EAAKihC,eACtBnE,EAAc19B,KAAKs9B,iBASvB,OANCqC,EADG/+B,EAAKoJ,SAASmnB,UACHvwB,EAAKkD,IAAMgH,GAAY+2B,EAAiBnE,GAGxC5yB,EAAWlK,EAAKiD,OAASg+B,EAAiBnE,EAGlDtzB,EAAA,MAAYu1B,EAAY,IAUzBgB,EAAArgC,UAAAigC,gBAAP,SAAuBzzB,GACtB,IAAI6yB,EAAcv1B,EAAA,YAAkB0C,GAAS9M,KAAKs9B,iBAClD,OAAOt9B,KAAKwgC,qBAAqBb,IAEnCgB,EAliBA,CAAwCvT,EAAA,GA0iBxCnsB,EAAA,EAASC,kBAAsC,mBAAIw/B,GCvmBnD,IAAAoB,GAAA,SAAAliC,GAUC,SAAAmiC,IAAA,IAAAjiC,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,qBACjBH,EAAKI,eAGP,OAhBwCC,EAAA,EAAA4hC,EAAAniC,GAgBxCmiC,EAhBA,CAAwClV,GA4FxCmV,GAAA,SAAApiC,GA6EC,SAAAqiC,IAAA,IAAAniC,EAGCF,EAAAG,KAAAC,OAAOA,KAxCEF,EAAAmtB,eAA8CkS,GAK9Cr/B,EAAAqtB,eAA4CuT,GA0B/C5gC,EAAA6+B,oBAA8B,EAUpC7+B,EAAKG,UAAY,aAEjBH,EAAKq9B,YAAc,GACnBr9B,EAAKs9B,SAAW,IAEhBt9B,EAAKo9B,OAAS98B,OAAA0iB,EAAA,EAAA1iB,CAAQ,IACtBN,EAAK49B,YAAc,EAEnB,IAAIwE,EAAiBpiC,EAAK8lB,cAAcY,YAAYV,EAAA,UACpDoc,EAAenf,aAAc,EAC7Bmf,EAAe1U,OAAS,WACxB0U,EAAetT,MAAQ,SACvBsT,EAAerT,OAAS,SAExB/uB,EAAK2uB,gBAAgB3F,OAASoZ,EAC9BpiC,EAAKoiC,eAAiBA,EACtBpiC,EAAK4uB,iBAAiB5F,OAASoZ,EAE/BpiC,EAAKwuB,iBAAmB4T,EAExBpiC,EAAKmvB,YAAciT,EAAe1b,YAAY2b,GAAA,GAC9CriC,EAAKmvB,YAAYlM,aAAc,EAC/BjjB,EAAKmvB,YAAYhG,QAAUnpB,EAAKgZ,MAAMC,IAAI,QAC1CjZ,EAAKmvB,YAAYmT,QAAU,EAG3BtiC,EAAKI,eAsUP,OAjbgCC,EAAA,EAAA8hC,EAAAriC,GAkHrBqiC,EAAA3hC,UAAA+C,sBAAV,WAECzD,EAAAU,UAAM+C,sBAAqBtD,KAAAC,MAItBiG,EAAA,SAAejG,KAAKsZ,eACxBtZ,KAAKsZ,YAActZ,KAAKwD,SAASC,UAAU,iBAUnCw+B,EAAA3hC,UAAA6vB,YAAV,SAAsBvvB,GACrBhB,EAAAU,UAAM6vB,YAAWpwB,KAAAC,KAACY,GAClB,IAAIoJ,EAAyBpJ,EAAKoJ,SAClCA,EAASsnB,cAAcxI,OAAS9e,EAChCA,EAASunB,eAAezI,OAAS9e,EACjCpJ,EAAKkoB,OAAS9oB,KAAKkiC,eACnBl4B,EAASugB,UAMA0X,EAAA3hC,UAAA4vB,uBAAV,WACCtwB,EAAAU,UAAM4vB,uBAAsBnwB,KAAAC,MAC5BoF,EAAA,KAAWpF,KAAKkd,MAAM5X,WAAY,SAAC1E,GAClCA,EAAKC,gBAOGohC,EAAA3hC,UAAA+vB,uBAAV,WACCzwB,EAAAU,UAAM+vB,uBAAsBtwB,KAAAC,MAC5BoF,EAAA,KAAWpF,KAAK2c,MAAMrX,WAAY,SAAC1E,GAClCA,EAAKC,gBASGohC,EAAA3hC,UAAAuyB,aAAV,WACC,OAAO,IAAI2K,IASLyE,EAAA3hC,UAAA2hB,cAAP,SAAqBC,GAEpB,GAAIA,IAGCjc,EAAA,SAAeic,EAAOiQ,UAAYlsB,EAAA,SAAeic,EAAOiQ,OAAOjT,QAClEgD,EAAOiQ,OAAOjT,KAAO,eAIlBjZ,EAAA,SAAeic,EAAO7c,SAAWY,EAAA,QAAcic,EAAO7c,SACzD,IAAK,IAAIkO,EAAI,EAAGe,EAAM4N,EAAO7c,OAAO4C,OAAQsL,EAAIe,EAAKf,IACpD2O,EAAO7c,OAAOkO,GAAG2L,KAAOgD,EAAO7c,OAAOkO,GAAG2L,MAAQ,cAkBpDtf,EAAAU,UAAM2hB,cAAaliB,KAAAC,KAACkiB,IAMX+f,EAAA3hC,UAAA+hC,WAAV,WACCziC,EAAAU,UAAM+hC,WAAUtiC,KAAAC,MAEhB,IAAI4lB,EAAgB5lB,KAAK4lB,cAErB0c,EAAOl4B,EAAA,WAAiBpK,KAAKm9B,WAAYn9B,KAAKo9B,SAAU,GACxDmF,GAA0B18B,EAAG,EAAGqH,EAAG,EAAGiP,MAAO,EAAGC,OAAQ,GAExDomB,EAAK5c,EAAcJ,WAAa8c,EAAKnmB,MACrCsmB,EAAK7c,EAAcH,YAAc6c,EAAKlmB,OAEtCshB,EAAc19B,KAAK09B,YAEvB,GAAIA,aAAuB5a,EAAA,EAAS,CACnC,IAAItiB,EAAQk9B,EAAYl9B,MACpBkiC,EAAK1/B,KAAKE,IAAIs/B,EAAIC,GACtBjiC,EAAQwC,KAAKgB,IAAI0+B,EAAKliC,EAAOkiC,EAAK1/B,KAAKE,IAAI0iB,EAAcH,YAAaG,EAAcJ,aAAekd,EACnGH,EAAYn4B,EAAA,WAAiBpK,KAAKm9B,WAAYn9B,KAAKo9B,SAAU58B,GAE7DR,KAAK2+B,oBAAsBn+B,EAAQk9B,EAAYl9B,MAC/Ck9B,EAAct9B,OAAA0iB,EAAA,EAAA1iB,CAAgB,IAARI,GAGvB8hC,EAAOl4B,EAAA,oBAA0Bk4B,EAAMC,IAEvC,IAAII,EAAY3/B,KAAKE,IAAI0iB,EAAcJ,WAAa8c,EAAKnmB,MAAOyJ,EAAcH,YAAc6c,EAAKlmB,QAE7FwmB,EAAkE,EAAvD5nB,EAAA,sBAA6Bhb,KAAKk9B,OAAQyF,IAAkB,EACvEzF,EAAS0F,EAAW,EACpBzF,EAAan9B,KAAKm9B,WAClBC,EAAWp9B,KAAKo9B,SAEpBp9B,KAAK6iC,kBAAoB7nB,EAAA,sBAA6B0iB,EAAaR,GAEnEl9B,KAAKivB,YAAYhT,KAAOC,EAAA,IAAUihB,EAAYC,EAAWD,EAAYD,EAAQl9B,KAAK6iC,mBAElFz9B,EAAA,KAAWpF,KAAK2c,MAAMrX,WAAY,SAAC1E,GAC/BA,EAAKoJ,SAASs1B,iBAChB1+B,EAAKoJ,SAASmzB,WAAaA,EAC3Bv8B,EAAKoJ,SAASozB,SAAWA,GAG1Bx8B,EAAKub,MAAQymB,EACbhiC,EAAKwb,OAASwmB,EAGdhiC,EAAKoJ,SAASq1B,gBAAkBnC,EAChCt8B,EAAKoJ,SAAS0zB,YAAcA,IAG7Bt4B,EAAA,KAAWpF,KAAKkd,MAAM5X,WAAY,SAAC1E,GAClCA,EAAKoJ,SAASmzB,WAAaA,EAC3Bv8B,EAAKoJ,SAASozB,SAAWA,EAEzBx8B,EAAKub,MAAQymB,EACbhiC,EAAKwb,OAASwmB,EAGdhiC,EAAKoJ,SAASq1B,gBAAkBnC,EAChCt8B,EAAKoJ,SAAS0zB,YAAcA,IAG7B,IAAIvL,EAASnyB,KAAKmyB,OACdA,IACHA,EAAOhW,MAAQymB,EACfzQ,EAAO/V,OAASwmB,EAChBzQ,EAAOgL,WAAaA,EACpBhL,EAAOiL,SAAWA,GAGnBp9B,KAAKkiC,eAAeY,aAAgBj9B,EAAGq3B,EAASoF,EAAKz8B,EAAGqH,EAAGgwB,EAASoF,EAAKp1B,EAAGiP,MAAO+gB,EAASoF,EAAKnmB,MAAOC,OAAQ8gB,EAASoF,EAAKlmB,QAC9Hpc,KAAKkiC,eAAe1a,oBAQXya,EAAA3hC,UAAAi3B,aAAV,WACC,OAAO,IAAIwF,IA0BZ38B,OAAAC,eAAW4hC,EAAA3hC,UAAA,kBAOX,WACC,OAAON,KAAKO,iBAAiB,mBAR9B,SAAsBC,GACrBR,KAAKS,iBAAiB,aAAcD,GAAO,oCAiC5CJ,OAAAC,eAAW4hC,EAAA3hC,UAAA,gBAOX,WACC,OAAON,KAAKO,iBAAiB,iBAR9B,SAAoBC,GACnBR,KAAKS,iBAAiB,WAAYD,GAAO,oCAiB1CJ,OAAAC,eAAW4hC,EAAA3hC,UAAA,cAOX,WACC,OAAON,KAAKO,iBAAiB,eAR9B,SAAkBC,GACjBR,KAAK0+B,mBAAmB,SAAUl+B,GAAO,GAAM,EAAO,IAAI,oCAa3DJ,OAAAC,eAAW4hC,EAAA3hC,UAAA,wBAAX,WACC,OAAON,KAAK6iC,mDAYbziC,OAAAC,eAAW4hC,EAAA3hC,UAAA,mBAOX,WACC,OAAON,KAAKO,iBAAiB,oBAR9B,SAAuBC,GACtBR,KAAK0+B,mBAAmB,cAAel+B,GAAO,GAAM,EAAO,IAAI,oCAgBzDyhC,EAAA3hC,UAAAuvB,YAAP,SAAmB7lB,GAEdA,GACHA,EAASonB,mBAUJ6Q,EAAA3hC,UAAAyvB,YAAP,SAAmB/lB,GAEdA,GACHA,EAASonB,mBAIZ6Q,EAjbA,CAAgChY,GAybhChpB,EAAA,EAASC,kBAA8B,WAAI8gC,oBCvd3Ce,GAAA,SAAAnjC,GAyCC,SAAAojC,IAAA,IAAAljC,EAGCF,EAAAG,KAAAC,OAAOA,KAdEF,EAAAmjC,MAAoC,IAAI5qB,EAAA,EAejDvY,EAAKG,UAAY,YAEjB,IAAIomB,EAAkB,IAAIC,EAAA,EAE1BxmB,EAAKyL,KAAO8a,EAAgBK,OAAO,yBACnC5mB,EAAK8mB,OAAS9mB,EAAKyL,KAEnB,IAAI23B,EAAc,IAAIf,GAAA,EACtBe,EAAIhG,OAAS,EACbp9B,EAAKojC,IAAMA,EACXpjC,EAAK2Y,YAAa,EAElB3Y,EAAKqjC,WAAa,EAClBrjC,EAAKsjC,SAAW,EAEhBtjC,EAAKqc,MAAQ/b,OAAA0iB,EAAA,EAAA1iB,CAAQ,KACrBN,EAAKsc,OAAShc,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAEtBN,EAAKo9B,OAAS98B,OAAA0iB,EAAA,EAAA1iB,CAAQ,KACtBN,EAAK49B,YAAct9B,OAAA0iB,EAAA,EAAA1iB,CAAQ,GAE3B,IAAIijC,EAAkB,IAAIC,GAAA,SAC1BxjC,EAAKujC,KAAOA,EAEZvjC,EAAKkT,WAAWxB,KAAK1R,EAAKmjC,OAG1BnjC,EAAKI,eAkSP,OA1W+BC,EAAA,EAAA6iC,EAAApjC,GAgFvBojC,EAAA1iC,UAAAsT,SAAP,WACChU,EAAAU,UAAMsT,SAAQ7T,KAAAC,MACd,IAAIqjC,EAAOrjC,KAAKqjC,KAChBA,EAAKlnB,MAAQnc,KAAKunB,WAClB,IAAIF,EAAYrkB,KAAKgB,IAAIhE,KAAKmjC,WAAYnjC,KAAKojC,UAK/C,GAJAC,EAAKjnB,OAASiL,EACdgc,EAAKE,SAAWnjC,OAAA0iB,EAAA,EAAA1iB,CAAQJ,KAAKmjC,WAAa9b,EAAI,KAC9Cgc,EAAKG,UAAYpjC,OAAA0iB,EAAA,EAAA1iB,CAAQJ,KAAKojC,SAAW/b,EAAI,KAEzCrnB,KAAKY,KAAM,CACd,IAAIoJ,EAAuDhK,KAAKY,KAAKoJ,SAEjEy5B,EAAazoB,EAAA,sBAA6Bhb,KAAK09B,YAAa1zB,EAASqzB,aACrEqG,EAAa1oB,EAAA,sBAA6Bhb,KAAKk9B,OAAQlzB,EAASqzB,aAEpEgG,EAAKx9B,EAAI49B,EACTJ,EAAKn2B,GAAMma,EAAI,EAEfgc,EAAKlnB,MAAQunB,EAAKD,IASpBrjC,OAAAC,eAAW2iC,EAAA1iC,UAAA,WAcX,WACC,OAAON,KAAK2jC,UAfb,SAAeT,GACVljC,KAAK2jC,MACR3jC,KAAKoyB,cAAcpyB,KAAK2jC,MAErBT,IACHljC,KAAK2jC,KAAOT,EACZA,EAAIpa,OAAS9oB,KACbA,KAAKgT,WAAWxB,KAAK0xB,qCAqBvB9iC,OAAAC,eAAW2iC,EAAA1iC,UAAA,YAcX,WACC,OAAON,KAAK4jC,WAfb,SAAgBP,GACXrjC,KAAK4jC,OACR5jC,KAAKoyB,cAAcpyB,KAAK4jC,OAErBP,IACHrjC,KAAK4jC,MAAQP,EACbA,EAAKva,OAAS9oB,KACdA,KAAKgT,WAAWxB,KAAK6xB,qCAmBvBjjC,OAAAC,eAAW2iC,EAAA1iC,UAAA,cAOX,WACC,OAAON,KAAKO,iBAAiB,eAR9B,SAAkBC,GACjBR,KAAK0+B,mBAAmB,SAAUl+B,GAAO,GAAM,EAAO,IAAI,oCAkB3DJ,OAAAC,eAAW2iC,EAAA1iC,UAAA,mBAOX,WACC,OAAON,KAAKO,iBAAiB,oBAR9B,SAAuBC,GACtBR,KAAK0+B,mBAAmB,cAAel+B,GAAO,GAAM,EAAO,IAAI,oCAgBhEJ,OAAAC,eAAW2iC,EAAA1iC,UAAA,kBAOX,WACC,OAAON,KAAKO,iBAAiB,mBAR9B,SAAsBC,GACrBR,KAAKS,iBAAiB,aAAcD,GAAO,oCAgB5CJ,OAAAC,eAAW2iC,EAAA1iC,UAAA,gBAOX,WACC,OAAON,KAAKO,iBAAiB,iBAR9B,SAAoBC,GACnBR,KAAKS,iBAAiB,WAAYD,GAAO,oCAiB1CJ,OAAAC,eAAW2iC,EAAA1iC,UAAA,yBAOX,WACC,OAAON,KAAKO,iBAAiB,0BAR9B,SAA6BC,GAC5BR,KAAKS,iBAAiB,oBAAqBD,oCAsBrCwiC,EAAA1iC,UAAAujC,UAAP,SAAiBrjC,EAAY6L,EAAmBmd,GAE/C,GADAxpB,KAAK8jC,OAAStjC,OACDqH,GAATrH,IACEyF,EAAA,SAAeoG,KACnBA,EAAW,GAGRrM,KAAKY,MAAM,CACd,IACImjC,EADiC/jC,KAAKY,KAAKoJ,SACvBiD,gBAAgBjN,KAAKY,KAAKgM,cAAcpM,IAC5DwjC,EAAehkC,KAAKghC,SAEM,aAA1BhhC,KAAKikC,mBACJF,EAAWC,IACdhkC,KAAKghC,SAAWgD,EAAe,KAGH,oBAA1BhkC,KAAKikC,mBACJF,EAAWC,IACdhkC,KAAKghC,SAAWgD,EAAe,KAIjChkC,KAAK0pB,SAAUC,SAAU,WAAYC,GAAIma,GAAY13B,EAAUmd,KAUlEppB,OAAAC,eAAW2iC,EAAA1iC,UAAA,aAOX,WACC,OAAON,KAAK8jC,YARb,SAAiBtjC,GAChBR,KAAK6jC,UAAUrjC,oCAiBhBJ,OAAAC,eAAW2iC,EAAA1iC,UAAA,YAsBX,WACC,OAAON,KAAKijC,MAAMvmB,WAvBnB,SAAgB9b,GASf,GARIZ,KAAKY,MAAQA,GAChBZ,KAAKijC,MAAMjmB,IAAIpc,EAAM,IAAIyX,EAAA,GACxBzX,EAAKuY,OAAOC,GAAG,gBAAiBpZ,KAAKkkC,YAAalkC,MAAM,GACxDY,EAAKuY,OAAOC,GAAG,mBAAoBpZ,KAAKkkC,YAAalkC,MAAM,GAC3DY,EAAKuY,OAAOC,GAAG,qBAAsBpZ,KAAKkkC,YAAalkC,MAAM,GAC7DY,EAAKuY,OAAOC,GAAG,kBAAmBpZ,KAAKa,WAAYb,MAAM,MAGvDY,EAAM,CACT,IAAI8Q,EAAgC9Q,EAAK8Q,MACrCA,IACH1R,KAAKghC,SAAWtvB,EAAMyrB,YAGxBn9B,KAAK8oB,OAASloB,EAAKoJ,SACnBhK,KAAK0tB,OAAS,mCAgBLsV,EAAA1iC,UAAA4jC,YAAV,WACClkC,KAAKQ,MAAQR,KAAKQ,OASZwiC,EAAA1iC,UAAA2hB,cAAP,SAAqBC,GAEhBA,GAGCjc,EAAA,SAAeic,EAAOthB,OAASqF,EAAA,SAAeic,EAAOthB,OAASZ,KAAKmiB,IAAI7e,OAAO4e,EAAOthB,QACxFshB,EAAOthB,KAAOZ,KAAKmiB,IAAIpb,OAAOmb,EAAOthB,OAKvChB,EAAAU,UAAM2hB,cAAaliB,KAAAC,KAACkiB,IAGtB8gB,EA1WA,CAA+Bld,EAAA,GAkX/B7kB,EAAA,EAASC,kBAA6B,UAAI6hC,GC9b1C,IAAAoB,GAAA,SAAAvkC,GAUC,SAAAwkC,IAAA,IAAAtkC,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,qBACjBH,EAAKI,eAGP,OAhBwCC,EAAA,EAAAikC,EAAAxkC,GAgBxCwkC,EAhBA,CAAwCtC,IAgExCuC,GAAA,SAAAzkC,GA8BC,SAAA0kC,IAAA,IAAAxkC,EAGCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,aAEjBH,EAAKq9B,WAAa,IAClBr9B,EAAKs9B,SAAW,IAEhBt9B,EAAKykC,MAAQ,IAAIziC,EAAA,EAAwB,IAAIihC,IAC7CjjC,EAAKykC,MAAMprB,OAAOC,GAAG,WAAYtZ,EAAK0kC,YAAa1kC,GAAM,GAEzDA,EAAKkT,WAAWxB,KAAK,IAAI1P,EAAA,EAAahC,EAAKykC,QAC3CzkC,EAAKkT,WAAWxB,KAAK1R,EAAKykC,MAAMz1B,UAGhChP,EAAKI,eA+BP,OA7EgCC,EAAA,EAAAmkC,EAAA1kC,GAqDrB0kC,EAAAhkC,UAAA+C,sBAAV,WAECzD,EAAAU,UAAM+C,sBAAqBtD,KAAAC,MAItBiG,EAAA,SAAejG,KAAKsZ,eACxBtZ,KAAKsZ,YAActZ,KAAKwD,SAASC,UAAU,iBAUnC6gC,EAAAhkC,UAAAkkC,YAAV,SAAsBhhB,GACrB,IAAI6f,EAAkB7f,EAAM2H,SACvBkY,EAAKziC,OACTyiC,EAAKziC,KAAOZ,KAAK2c,MAAMpQ,SAAS,KAInC+3B,EA7EA,CAAgCtC,IAqFhC/gC,EAAA,EAASC,kBAA8B,WAAImjC,8CCvJ3CI,GAAA,SAAA7kC,GAqBC,SAAA8kC,IAAA,IAAA5kC,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,sBAEjBH,EAAKuB,OAAOsjC,cAEZ7kC,EAAKI,eAmBP,OA9CyCC,EAAA,EAAAukC,EAAA9kC,GAmCxCQ,OAAAC,eAAWqkC,EAAApkC,UAAA,kBAOX,WACC,OAAON,KAAKqB,OAAmB,WAAEb,WARlC,SAAsBA,GACrBR,KAAKsX,SAAS,aAAc9W,oCAU9BkkC,EA9CA,CAAyCE,GAAA,GAiHzCC,GAAA,SAAAjlC,GAqCC,SAAAklC,IAAA,IAAAhlC,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,cACjBH,EAAKI,eA0HP,OAlKiCC,EAAA,EAAA2kC,EAAAllC,GAgDtBklC,EAAAxkC,UAAAoD,eAAV,WACC,OAAO,IAAI+gC,IAMFK,EAAAxkC,UAAAykC,YAAV,WACC,OAAO,IAAIC,GAAA,GASLF,EAAAxkC,UAAAwJ,oBAAP,SAA2BpH,GAE1B,IAAIuiC,EAA0BviC,EAASuiC,MAEnCC,EAAgBllC,KAAKklC,MACpBj/B,EAAA,SAAei/B,KACnBA,EAAQllC,KAAK0R,MAAMwzB,OAGpB,IAAIC,EAAuBziC,EAASrB,OAAOsjC,WAAWS,QACjDn/B,EAAA,SAAek/B,KACnBA,EAAe,KAGhBF,EAAMC,MAAQC,EAAeD,EAAQ,IAErC,IAAIl4B,EAAgBhN,KAAKgN,MACpB/G,EAAA,SAAe+G,KACnBA,EAAQhN,KAAK0R,MAAM1E,OAGpBi4B,EAAMj4B,MAAQA,EAEdpN,EAAAU,UAAMwJ,oBAAmB/J,KAAAC,KAAC0C,IAQpBoiC,EAAAxkC,UAAAsT,SAAP,WACChU,EAAAU,UAAMsT,SAAQ7T,KAAAC,MAEd,IAAK,IAAIuT,EAAIvT,KAAKy6B,mBAAoBlnB,EAAIvT,KAAK06B,iBAAkBnnB,IAAK,CACrE,IACI0xB,EADWjlC,KAAK2F,UAAU4G,SAASgH,GACT0xB,MAE1B9H,EAAa8H,EAAM9H,WAGlBA,IAAe,IAAMA,EAAa,GACtC8H,EAAM7V,UAGG+N,GAAc,IACvB8H,EAAM1a,WAUTnqB,OAAAC,eAAWykC,EAAAxkC,UAAA,aAOX,WACC,OAAON,KAAKO,iBAAiB,cAR9B,SAAiBC,GAChBR,KAAKS,iBAAiB,QAASD,GAAO,oCAevCJ,OAAAC,eAAWykC,EAAAxkC,UAAA,aAOX,WACC,OAAON,KAAKO,iBAAiB,cAR9B,SAAiBC,GAChBR,KAAKS,iBAAiB,QAASD,oCAgBzBskC,EAAAxkC,UAAAuf,eAAP,SAAsBF,GACrB/f,EAAAU,UAAMuf,eAAc9f,KAAAC,KAAC2f,GAErB,IACIslB,EADiDtlB,EAAOjd,SACvCuiC,MAErBtlB,EAAOzS,EAAIyS,EAAOrD,OAAS2oB,EAAMC,OAEnCJ,EAlKA,CAAiCF,GAAA,GA0KjC3jC,EAAA,EAASC,kBAA+B,YAAI2jC,GAC5C5jC,EAAA,EAASC,kBAAuC,oBAAIujC,GCzRpD,IAAAY,GAAA,SAAAzlC,GAUC,SAAA0lC,IAAA,IAAAxlC,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,qBACjBH,EAAKI,eAGP,OAhBwCC,EAAA,EAAAmlC,EAAA1lC,GAgBxC0lC,EAhBA,CAAwCC,GAAA,GAwJxCC,GAAA,SAAA5lC,GA8BC,SAAA6lC,IAAA,IAAA3lC,EAGCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,aAEjBH,EAAKolC,MAAQ,GACbplC,EAAKkN,MAAQ,GAGblN,EAAKI,eAsDP,OA9FgCC,EAAA,EAAAslC,EAAA7lC,GAoD/BQ,OAAAC,eAAWolC,EAAAnlC,UAAA,aASX,WACC,OAAON,KAAKO,iBAAiB,cAV9B,SAAiBC,GACZR,KAAKS,iBAAiB,QAASD,IAClCR,KAAK0lC,uDAiBPtlC,OAAAC,eAAWolC,EAAAnlC,UAAA,aAUX,WACC,OAAON,KAAKO,iBAAiB,cAX9B,SAAiBC,GAChBA,EAAQ4J,EAAA,WAAiB5J,EAAO,EAAG,IAC/BR,KAAKS,iBAAiB,QAASD,IAClCR,KAAK0lC,uDAgBGD,EAAAnlC,UAAAi3B,aAAV,WACC,OAAO,IAAIsN,IAGbY,EA9FA,CAAgCF,GAAA,GAsGhCtkC,EAAA,EAASC,kBAA8B,WAAIskC,oBChQ3CG,GAAA,SAAA/lC,GAUC,SAAAgmC,IAAA,IAAA9lC,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,sBACjBH,EAAKI,eAGP,OAhByCC,EAAA,EAAAylC,EAAAhmC,GAgBzCgmC,EAhBA,CAAyCC,GAAA,GAgEzCC,GAAA,SAAAlmC,GA8BC,SAAAmmC,IAAA,IAAAjmC,EAGCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,cAEjBH,EAAK2uB,gBAAgBjB,OAAS,aAE9B1tB,EAAKiqB,QAAQ,GAAI,GAAI,GAAI,IAGzBjqB,EAAKI,eA0BP,OAnEiCC,EAAA,EAAA4lC,EAAAnmC,GAgDtBmmC,EAAAzlC,UAAA+C,sBAAV,WAECzD,EAAAU,UAAM+C,sBAAqBtD,KAAAC,MAItBiG,EAAA,SAAejG,KAAKsZ,eACxBtZ,KAAKsZ,YAActZ,KAAKwD,SAASC,UAAU,kBAStCsiC,EAAAzlC,UAAAsT,SAAP,WACChU,EAAAU,UAAMsT,SAAQ7T,KAAAC,OAEhB+lC,EAnEA,CAAiCF,GAAA,GA2EjC5kC,EAAA,EAASC,kBAA+B,YAAI4kC,GAC5C7kC,EAAA,EAASC,kBAAuC,oBAAIykC,wECrGpDK,GAAA,SAAApmC,GA6EC,SAAAqmC,IAAA,IAAAnmC,EACCF,EAAAG,KAAAC,OAAOA,KACPF,EAAKG,UAAY,YAEjBH,EAAK4L,MAAQ5L,EAAK0mB,YAAY8Z,GAAA,GAC9BxgC,EAAK4L,MAAME,SAAW,GACtB9L,EAAK4L,MAAMwxB,OAAS,EACpBp9B,EAAK4L,MAAM/B,KAAO,SAClB7J,EAAK4L,MAAMgiB,OAAS,EACpB5tB,EAAK4L,MAAMqX,aAAc,EAEzBjjB,EAAK0tB,OAAS,OAEd1tB,EAAKqZ,OAAOC,GAAG,kBAAmBtZ,EAAKomC,eAAgBpmC,GAAM,GAE7DA,EAAK2Y,YAAa,EAClB3Y,EAAKmlC,MAAQnlC,EAAK0mB,YAAY2f,GAAA,GAC9BrmC,EAAKmlC,MAAMxsB,YAAa,EAExB,IAAI2I,EAActhB,EAAKshB,mBACvBA,EAAY3O,WAAWlH,MAAO,IAAI+a,EAAA,GAAoBI,OAAO,sBAC7DtF,EAAY3O,WAAW2vB,QAAU,GACjChhB,EAAY3O,WAAW6L,SAAU,EAEjCxe,EAAKsmC,oBAAqB,EAE1BtmC,EAAKmlC,MAAM7jB,YAAY3O,WAAW6L,SAAU,EAE5Cxe,EAAKwP,QAAQyJ,IAAI,WAAY,SAACiG,EAAUG,GACpC,OAAOA,EAAO8lB,MAAMoB,IAAMlnB,EAAO8lB,MAAM/H,QAAU/d,EAAO8lB,MAAM/H,OAAS/d,EAAO8lB,MAAM3H,kBAAoB,KAG5Gx9B,EAAKwP,QAAQyJ,IAAI,WAAY,SAACkG,EAAUE,GACpC,OAAOA,EAAO8lB,MAAMqB,IAAMnnB,EAAO8lB,MAAM/H,QAAU/d,EAAO8lB,MAAM/H,OAAS/d,EAAO8lB,MAAM3H,kBAAoB,OA4J9G,OA1Q+Bn9B,EAAA,EAAA8lC,EAAArmC,GAwHvBqmC,EAAA3lC,UAAAimC,gBAAP,eAAAzmC,EAAAE,KACCJ,EAAAU,UAAMimC,gBAAexmC,KAAAC,MAErB,IAAI0L,EAAQ1L,KAAK0L,MACbu5B,EAAQjlC,KAAKilC,MACbvzB,EAAQ1R,KAAK0R,MACjB,GAAIA,GAASuzB,EAAO,CAEnB,IAAIzR,EAAMxzB,KAAKwmC,MACXC,EAAMxB,EAAMlH,IACZ2I,EAAkBzB,EAAM9H,WAE5Bn9B,KAAK08B,SAASr2B,KAAK,SAACs2B,GACnB,GAAIA,aAAiBgK,GAAA,EAAQ,CAC5B,IAAIxmB,EAAYwc,EAAMxc,UACjBla,EAAA,SAAeka,KACnBA,EAAY,IAEb,IAAIC,EAAYuc,EAAMvc,UACjBna,EAAA,SAAema,KACnBA,EAAY,GAGb,IAAIwmB,EAAaF,EAAkBD,EAAMtmB,EACrC0mB,EAAczmB,EAAY6kB,EAAM/H,OAEpCP,EAAM92B,EAAIghC,EAAcz8B,EAAA,IAAUw8B,GAClCjK,EAAMzvB,EAAI25B,EAAcz8B,EAAA,IAAUw8B,MAKpC,IAAIE,EAAaJ,EAAkBD,EAAM/6B,EAAME,SAC3CuxB,EAAauJ,GAAmB,EAAIlT,EAAMxzB,KAAK+mC,eAAiBN,EAAM,GAEtExgC,EAAA,MAAYk3B,KACfA,EAAauJ,GAGdh7B,EAAMu0B,YAAY6G,EAAY7B,EAAM/H,QAEpCl9B,KAAKgnC,UAAY7J,EAEbn9B,KAAKinC,iBAER7hC,EAAA,KAAWpF,KAAKinC,gBAAiB,SAACvkC,GACjC,IAAIwkC,EAAOxkC,EAASwkC,KACpBA,EAAKpe,OAAShpB,EAAK4R,MAAMy1B,eACzB,IAAI3mC,EAAQkC,EAASqV,gBAAgB,SAErC,GAAI9R,EAAA,SAAezF,GAAQ,CAE1B,GAAIkR,EAAM01B,UAAW,CACpB,IAAIC,EAAeH,EAAKG,aACnBphC,EAAA,SAAeohC,KACnBA,EAAe,GAEhBA,GAA8B,IAE9BH,EAAK/J,WAAauJ,EAAkBD,EAAM,EAAIA,EAAM,EAAIY,EACxDH,EAAKnJ,IAAM0I,EAAMY,OAGjBH,EAAKnJ,IAAMv9B,EAAQkR,EAAM41B,WACzBJ,EAAK/J,WAAar9B,EAAKknC,UACvBlnC,EAAKknC,WAAaE,EAAKnJ,IAGnBr7B,EAAS6kC,SACbL,EAAK9J,SAAW8J,EAAK/J,YAGtB+J,EAAKhK,OAAS+H,EAAM3H,oBAOnBt9B,KAAKwnC,iBACRpiC,EAAA,KAAWpF,KAAKwnC,gBAAiB,SAAC9kC,GACjC,IAAIwkC,EAAOxkC,EAASwkC,KAIpB,GAFAA,EAAKhK,OAAS+H,EAAM3H,iBAEhB5rB,EAAM01B,UAAW,CACpB,IAAIC,EAAeH,EAAKG,aACnBphC,EAAA,SAAeohC,KACnBA,EAAe,GAGhBA,GAA8B,IAE9BH,EAAK9J,SAAWsJ,EAAkBD,EAAM,EAAIA,EAAM,EAAIY,EACtDH,EAAKnJ,IAAM0I,EAAMY,MAEb,CACJH,EAAK9J,SAAWt9B,EAAKknC,UACrB,IAAIxmC,EAAQkC,EAASqV,gBAAgB,SACjC9R,EAAA,SAAezF,KAClB0mC,EAAKnJ,IAAMv9B,EAAQkR,EAAM41B,WACzBxnC,EAAKknC,WAAaE,EAAKnJ,KAIpBr7B,EAAS+kC,WACbP,EAAK/J,WAAa+J,EAAK9J,cAalB6I,EAAA3lC,UAAA4lC,eAAV,WACC,IAAIjB,EAAQjlC,KAAKilC,MACbyC,EAAS1nC,KAAK2nC,eAAiB1C,EAAMlH,IAAM,EAC3Cb,EAAS+H,EAAM/H,OAEf0K,EAAK1K,EAAS9yB,EAAA,IAAUs9B,GACxBG,EAAK3K,EAAS9yB,EAAA,IAAUs9B,GAExB16B,EAAQ5C,EAAA,UAAiBvE,EAAG+hC,EAAK5nC,KAAKuc,OAAQrP,EAAG26B,EAAK7nC,KAAKsc,SAE/D2oB,EAAM9H,WAAan9B,KAAK2nC,gBAAkB36B,EAAQ06B,GAElD1nC,KAAK8nC,IAAO9nC,KAAKuc,OACjBvc,KAAK+nC,IAAO/nC,KAAKsc,QASX2pB,EAAA3lC,UAAAoQ,SAAP,SAAgBC,GACf/Q,EAAAU,UAAMoQ,SAAQ3Q,KAAAC,KAAC2Q,GACf3Q,KAAK0L,MAAMgF,SAASC,EAAOjF,OAC3B1L,KAAKilC,MAAMv0B,SAASC,EAAOs0B,QAE7BgB,EA1QA,CAA+B+B,GAAA,GAkR/B/mC,EAAA,EAASC,kBAA6B,UAAI8kC,oBCnR1CiC,GAAA,SAAAroC,GAoBC,SAAAsoC,IAAA,IAAApoC,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,iBACjBH,EAAKmpB,QAAUnpB,EAAKgZ,MAAMC,IAAI,QAC9BjZ,EAAKm/B,cAAe,EAEpBn/B,EAAKyL,KAAOnL,OAAAymB,EAAA,EAAAzmB,GAEZN,EAAKI,eAsEP,OAlGoCC,EAAA,EAAA+nC,EAAAtoC,GAoC5BsoC,EAAA5nC,UAAA6uB,KAAP,WAEC,GAAGlpB,EAAA,SAAejG,KAAK0jC,GAAK1jC,KAAKm8B,GAAKn8B,KAAKmoC,GAAKnoC,KAAKooC,GAAKpoC,KAAKqoC,IAAMroC,KAAKsoC,KAAM,CAE/E,IAAIC,GAAe1iC,EAAG7F,KAAK0jC,GAAIx2B,EAAGlN,KAAKmoC,IACnCK,GAAe3iC,EAAG7F,KAAKm8B,GAAIjvB,EAAGlN,KAAKooC,IACnCK,GAAe5iC,EAAG7F,KAAKqoC,IAAKn7B,EAAGlN,KAAKsoC,KAEpCI,EAAYxsB,EAAA,OAAaqsB,GAAMrsB,EAAA,iBAAuBssB,EAAIC,GAE9DzoC,KAAKic,KAAOysB,IASdtoC,OAAAC,eAAW6nC,EAAA5nC,UAAA,WAOX,WACC,OAAON,KAAKO,iBAAiB,YAR9B,SAAeC,GACdR,KAAKS,iBAAiB,MAAOD,GAAO,oCAerCJ,OAAAC,eAAW6nC,EAAA5nC,UAAA,WAOX,WACC,OAAON,KAAKO,iBAAiB,YAR9B,SAAeC,GACdR,KAAKS,iBAAiB,MAAOD,GAAO,oCAgB9B0nC,EAAA5nC,UAAAyM,gBAAP,SAAuBjC,GACtB,IAAIy9B,GAAM1iC,EAAE7F,KAAK0jC,GAAIx2B,EAAElN,KAAKmoC,IACxBM,GAAM5iC,EAAE7F,KAAKqoC,IAAKn7B,EAAElN,KAAKsoC,KACzBE,GAAM3iC,EAAE7F,KAAKm8B,GAAIjvB,EAAElN,KAAKooC,IAExBO,EAASv+B,EAAA,yBAA+Bm+B,EAAIC,EAAIC,EAAI39B,GACpD89B,EAASx+B,EAAA,yBAA+Bm+B,EAAIC,EAAIC,EAAI39B,EAAW,MAEnE,OAAQjF,EAAE8iC,EAAO9iC,EAAGqH,EAAEy7B,EAAOz7B,EAAGF,MAAM5C,EAAA,SAAeu+B,EAAQC,KAE/DV,EAlGA,CAAoChM,EAAA,GCSpC2M,GAAA,SAAAjpC,GA8BC,SAAAkpC,IAAA,IAAAhpC,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,YAEjBH,EAAKipC,WAAajpC,EAAK0mB,YAAYyhB,IACnCnoC,EAAKipC,WAAWhmB,aAAc,EAC9BjjB,EAAKipC,WAAWhiB,cAAgB,EAEhCjnB,EAAKI,eA0HP,OAhK+BC,EAAA,EAAA2oC,EAAAlpC,GA8CvBkpC,EAAAxoC,UAAAsT,SAAP,WAGC,GAFAhU,EAAAU,UAAMsT,SAAQ7T,KAAAC,OAETA,KAAKgpC,WAAY,CACrB,IAAI7L,EAAan9B,KAAKm9B,WAClBC,EAAWp9B,KAAKo9B,SAEhBW,EAAM/9B,KAAK+9B,IACXb,EAASl9B,KAAKk9B,OAEduK,EAAWznC,KAAK0C,SAAS+kC,SACzBF,EAASvnC,KAAK0C,SAAS6kC,OAEvB0B,EAAQ,EACRC,EAAQ,EAERzB,IACHwB,EAAQxB,EAASlrB,OAASkrB,EAASK,GACnCoB,EAAQzB,EAASnrB,OAASmrB,EAASM,IAGpC,IAAIoB,EAAM,EACNC,EAAM,EAOV,GALI7B,IACH4B,EAAM5B,EAAOhrB,OAASgrB,EAAOO,GAC7BsB,EAAM7B,EAAOjrB,OAASirB,EAAOQ,IAG1B7K,EAAS,EAAG,CACf,IAAIwG,EAAKxG,EAAS9yB,EAAA,IAAU+yB,GAAc8L,EACtCd,EAAKjL,EAAS9yB,EAAA,IAAU+yB,GAAc+L,EACtC/M,EAAKe,EAAS9yB,EAAA,IAAUgzB,GAAY+L,EACpCf,EAAKlL,EAAS9yB,EAAA,IAAUgzB,GAAYgM,EAQpCX,GAAO5iC,EAAG,EAAGqH,EAAG,GAChB+O,EAAOC,EAAA,QAAerW,EAAG69B,EAAIx2B,EAAGi7B,IAEpClsB,GAAQC,EAAA,MAAYihB,EAAYY,EAAKb,GACrCjhB,GAAQC,EAAA,kBAAyBrW,EAAGs2B,EAAIjvB,EAAGk7B,GAAMK,GACjDxsB,GAAQC,EAAA,MAAYkhB,EAAUW,EAAKb,GACnCjhB,GAAQC,EAAA,kBAAyBrW,EAAG69B,EAAIx2B,EAAGi7B,GAAMM,GAGhDzoC,KAAKknC,KAAKjrB,KADP8hB,EAAM,EACQ9hB,EAGA,GAGdjc,KAAKqtB,cACRrtB,KAAKqpC,YAAYptB,KAAOA,EACxBjc,KAAK0uB,iBAAiBjjB,KAAOzL,KAAKqpC,aAGnC,IAAIC,EAAUnM,EAAaY,EAAM,EAC7BwL,EAAUnM,EAAWW,EAAM,EAE3BgL,EAAa/oC,KAAK+oC,WAEtBA,EAAWrF,GAAKxG,EAAS9yB,EAAA,IAAUk/B,GAAWL,EAC9CF,EAAWZ,GAAKjL,EAAS9yB,EAAA,IAAUk/B,GAAWJ,EAC9CH,EAAW5M,GAAKe,EAAS9yB,EAAA,IAAUm/B,GAAWJ,EAC9CJ,EAAWX,GAAKlL,EAAS9yB,EAAA,IAAUm/B,GAAWH,EAE9CL,EAAWV,IAAM,EACjBU,EAAWT,IAAM,EAEjBS,EAAWniB,OAAS5mB,KAAKuL,KAEzBvL,KAAKwpC,qBAURppC,OAAAC,eAAWyoC,EAAAxoC,UAAA,cAOX,WACC,OAAON,KAAKO,iBAAiB,eAR9B,SAAkBC,GACjBR,KAAKS,iBAAiB,SAAUD,GAAO,oCAgBxCJ,OAAAC,eAAWyoC,EAAAxoC,UAAA,WAOX,WACC,OAAON,KAAKO,iBAAiB,YAR9B,SAAeC,GACdR,KAAKS,iBAAiB,MAAOD,GAAO,oCAUtCsoC,EAhKA,CAA+BW,GAAA,GAwK/BxoC,EAAA,EAASC,kBAA6B,UAAI2nC,GC7M1C,IAAAa,GAAA,SAAA9pC,GAyBC,SAAA+pC,IAAA,IAAA7pC,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,uBACjBH,EAAKI,eAEP,OA9B0CC,EAAA,EAAAwpC,EAAA/pC,GA8B1C+pC,EA9BA,CAA0CC,GAAA,GAmI1CC,GAAA,SAAAjqC,GAmEC,SAAAkqC,IAAA,IAAAhqC,EAGCF,EAAAG,KAAAC,OAAOA,KAlBDF,EAAAwnC,WAAqB,EAmB3BxnC,EAAKG,UAAY,eAEjBH,EAAKq9B,YAAc,GACnBr9B,EAAKs9B,SAAW,IAEhBt9B,EAAKo9B,OAAS98B,OAAA0iB,EAAA,EAAA1iB,CAAQ,IAEtBN,EAAK49B,aAAgB,GAErB59B,EAAKiqC,YAAc,EAEnB,IAAIC,EAAiBlqC,EAAKytB,eAAe/G,YAAYV,EAAA,UACrDkkB,EAAepb,MAAQ,SACvBob,EAAenb,OAAS,SACxBmb,EAAejnB,aAAc,EAC7BinB,EAAexc,OAAS,WACxB1tB,EAAKkqC,eAAiBA,EAEtBlqC,EAAKmqC,eAAenhB,OAASkhB,EAC7BlqC,EAAKqnC,eAAere,OAASkhB,EAE7BlqC,EAAKytB,eAAepU,OAAOC,GAAG,iBAAkBtZ,EAAKe,WAAYf,GAAM,GAGvEA,EAAKI,eAyPP,OAxVkCC,EAAA,EAAA2pC,EAAAlqC,GAuG1BkqC,EAAAxpC,UAAAsT,SAAP,eAAA9T,EAAAE,KACKutB,EAAiBvtB,KAAKutB,eAEtB6P,EAAWp9B,KAAKo9B,SAChBD,EAAan9B,KAAKm9B,WAAan9B,KAAK+pC,YAAc,EAElDzH,EAAOl4B,EAAA,WAAiBpK,KAAKm9B,WAAYn9B,KAAKo9B,SAAU,GAG5DkF,EAAOl4B,EAAA,oBAA0Bk4B,GAFHz8B,EAAG,EAAGqH,EAAG,EAAGiP,MAAO,EAAGC,OAAQ,KAI5D,IAAIumB,EAAY3/B,KAAKE,IAAIqqB,EAAe/H,WAAa8c,EAAKnmB,MAAOoR,EAAe9H,YAAc6c,EAAKlmB,QAE/FnW,EAAA,SAAe08B,KAClBA,EAAY,GAGb,IAAIzF,EAASliB,EAAA,sBAA6Bhb,KAAKk9B,OAAQyF,GACnDrF,EAAmBtiB,EAAA,sBAA6Bhb,KAAK09B,YAAaR,GAAQ,GAE1EsJ,EAAQxmC,KAAK0C,SAASrB,OAAOb,MAAMgzB,IACnCpxB,EAAQ,EAER8nC,EAAW,EACf9kC,EAAA,KAAWpF,KAAKmqC,QAAS,SAACC,GACzB,IAAIC,EAAOD,EAAQ,GACnBtqC,EAAKwqC,aAAaD,GAClBjoC,IACA,IAAI5B,EAAQ6pC,EAAK7D,MACd6D,EAAK7D,MAAQA,EAAQ1mC,EAAKyqC,cAC5B/pC,EAAQgmC,EAAQ1mC,EAAKyqC,aAEtBL,GAAY1pC,IAGbR,KAAKsnC,YAAclK,EAAWp9B,KAAKm9B,WAAan9B,KAAK+pC,YAAc3nC,GAAS8nC,EAE5E9kC,EAAA,KAAWpF,KAAKmqC,QAAS,SAACC,GACzB,IAAIC,EAAOD,EAAQ,GACfnF,EAAQoF,EAAKpF,MAEjBA,EAAM/H,OAASA,EACf+H,EAAMvH,YAAcJ,EAEpB,IAQIS,EARAv9B,EAAQ6pC,EAAK7D,MAEd6D,EAAK7D,MAAQA,EAAQ1mC,EAAKyqC,cAC5B/pC,EAAQgmC,EAAQ1mC,EAAKyqC,aAGtBF,EAAKtD,cAAgBvmC,EAIpBu9B,EADGj+B,EAAKsnC,WACDhK,EAAWt9B,EAAKq9B,YAAc/6B,EAAQtC,EAAKiqC,YAG5CjqC,EAAKwnC,WAAa9mC,EAGzBykC,EAAMlH,IAAMA,EACZkH,EAAM9H,WAAaA,EACnBkN,EAAK1C,eAAiBxK,EACtBkN,EAAKvhB,OAAShpB,EAAKmqC,eACnBI,EAAKz2B,WACLupB,GAAcY,EAAMj+B,EAAKiqC,cAG1B/pC,KAAKgqC,eAAelH,aAAgBj9B,EAAGq3B,EAASoF,EAAKz8B,EAAGqH,EAAGgwB,EAASoF,EAAKp1B,EAAGiP,MAAO+gB,EAASoF,EAAKnmB,MAAOC,OAAQ8gB,EAASoF,EAAKlmB,QAC9Hpc,KAAKgqC,eAAen1B,mBAEpBjV,EAAAU,UAAMsT,SAAQ7T,KAAAC,OAOL8pC,EAAAxpC,UAAA+C,sBAAV,WAECzD,EAAAU,UAAM+C,sBAAqBtD,KAAAC,MAItBiG,EAAA,SAAejG,KAAKsZ,eACxBtZ,KAAKsZ,YAActZ,KAAKwD,SAASC,UAAU,mBASnCqmC,EAAAxpC,UAAAoD,eAAV,WACC,OAAO,IAAIgmC,IA0BZtpC,OAAAC,eAAWypC,EAAAxpC,UAAA,kBAOX,WACC,OAAON,KAAKO,iBAAiB,mBAR9B,SAAsBC,GACrBR,KAAKS,iBAAiB,aAAcD,GAAO,oCAiC5CJ,OAAAC,eAAWypC,EAAAxpC,UAAA,gBAOX,WACC,OAAON,KAAKO,iBAAiB,iBAR9B,SAAoBC,GACnBR,KAAKS,iBAAiB,WAAYD,GAAO,oCAiB1CJ,OAAAC,eAAWypC,EAAAxpC,UAAA,cAOX,WACC,OAAON,KAAKO,iBAAiB,eAR9B,SAAkBC,GACjBR,KAAK0+B,mBAAmB,SAAUl+B,GAAO,GAAM,EAAO,IAAI,oCAiB3DJ,OAAAC,eAAWypC,EAAAxpC,UAAA,mBAOX,WACC,OAAON,KAAKO,iBAAiB,oBAR9B,SAAuBC,GACtBR,KAAK0+B,mBAAmB,cAAel+B,GAAO,GAAM,EAAO,IAAI,oCAkBhEJ,OAAAC,eAAWypC,EAAAxpC,UAAA,iBASX,WACC,OAAON,KAAKO,iBAAiB,kBAV9B,SAAqBC,GACpBR,KAAKS,iBAAiB,YAAaD,GAAO,GAC1CR,KAAKwqC,MAAM17B,SAASi6B,WAAWhiB,cAAgB,EAC/C/mB,KAAKwqC,MAAM17B,SAASo4B,KAAKzgB,YAAc,mCAajCqjB,EAAAxpC,UAAAmqC,WAAP,WACC,IAAIJ,EAAO,IAAIrE,GAEf,OADAhmC,KAAKgT,WAAWxB,KAAK64B,GACdA,GAMDP,EAAAxpC,UAAAoqC,WAAP,WACC,IAAIxD,EAAO,IAAI2B,GAEf,OADA7oC,KAAKgT,WAAWxB,KAAK01B,GACdA,GAGT4C,EAxVA,CAAkCF,GAAA,GAgWlC3oC,EAAA,EAASC,kBAAgC,aAAI2oC,iCC7d7Cc,GAAA,SAAA/qC,GAgCC,SAAAgrC,IAAA,IAAA9qC,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,uBAEjBH,EAAKwS,UAAiB,MAAI,GAC1BxS,EAAKwS,UAAiB,MAAI,GAE1BxS,EAAKwS,UAAqB,UAAI,GAC9BxS,EAAKwS,UAAqB,UAAI,GAE9BxS,EAAKI,eAqDP,OA/F0CC,EAAA,EAAAyqC,EAAAhrC,GAkDzCQ,OAAAC,eAAWuqC,EAAAtqC,UAAA,cAOX,WACC,OAAON,KAAK6qC,aARb,SAAkBC,GACjB9qC,KAAK+qC,UAAUD,oCAUNF,EAAAtqC,UAAAyqC,UAAV,SAAoBD,GAApB,IAAAhrC,EAAAE,KAMC,GALIA,KAAK6qC,SAAWC,GAAU9qC,KAAK6qC,SAClC/yB,EAAA,OAAc9X,KAAKkzB,QAASlzB,KAAK6qC,SAElC7qC,KAAK6qC,QAAUC,EAEXA,EAAQ,CACX,IAAInpB,EAA0CmpB,EAAOpoC,SACjDif,GAAgBA,GAAgB3hB,OACnC2hB,EAAampB,YAASjjC,GAEvB7H,KAAKgrC,UAAUF,GAEf9qC,KAAKgT,WAAWxB,KAAK,IAAI6G,EAAA,EAAS,WAG7BvY,EAAK6C,WACR7C,EAAK6C,UAAUsoC,QAAQluB,YAAY+tB,QAUvC1qC,OAAAC,eAAWuqC,EAAAtqC,UAAA,qBAAX,WAIC,OAHKN,KAAKkrC,iBACTlrC,KAAKkrC,eAAiB,IAAIlpC,EAAA,GAEpBhC,KAAKkrC,gDAGdN,EA/FA,CAA0C/zB,GA0J1Cs0B,GAAA,SAAAvrC,GA8EC,SAAAwrC,IAAA,IAAAtrC,EACCF,EAAAG,KAAAC,OAAOA,KAnCEF,EAAAurC,eAAyB,EAKzBvrC,EAAAwrC,aAAuB,EA+BhCxrC,EAAKG,UAAY,eAEjBH,EAAKqc,MAAQ/b,OAAA0iB,EAAA,EAAA1iB,CAAQ,KACrBN,EAAKsc,OAAShc,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAEtBN,EAAKinB,cAAgB,EACrBjnB,EAAK2mB,YAAc,EAEnB3mB,EAAKyrC,WAAY,EAEjB,IAAIC,EAAmB1rC,EAAK6Y,cAAc6N,YAAYV,EAAA,UACtD0lB,EAAiBzoB,aAAc,EAC/ByoB,EAAiB/yB,YAAa,EAC9B+yB,EAAiBhe,OAAS,OAC1B1tB,EAAK2rC,kBAAoBD,EAEzB1rC,EAAKmrC,QACLnrC,EAAKmrC,QAAQn8B,SAASmwB,cAAe,EAErCn/B,EAAKs6B,mBAAqBt6B,EAAKmrC,QAAQn8B,SAEvChP,EAAKI,eA2xBP,OAh4BkCC,EAAA,EAAAirC,EAAAxrC,GA6GjCQ,OAAAC,eAAW+qC,EAAA9qC,UAAA,wBAAX,WACC,OAAON,KAAKyrC,mDAOHL,EAAA9qC,UAAA+C,sBAAV,WACCzD,EAAAU,UAAM+C,sBAAqBtD,KAAAC,MACtBiG,EAAA,SAAejG,KAAKsZ,eACxBtZ,KAAKsZ,YAActZ,KAAKwD,SAASC,UAAU,mBAUnC2nC,EAAA9qC,UAAAoD,eAAV,WACC,OAAO,IAAIinC,IAQLS,EAAA9qC,UAAAsT,SAAP,eAAA9T,EAAAE,KAIK0rC,EAAiB1rC,KAAK0R,MAAMrM,OAC5BsmC,EAAuB,EACvBv/B,EAAgB,EAEpBhH,EAAA,KAAWsmC,EAAepmC,WAAY,SAACD,GAClCA,aAAkB+lC,GACjBtrC,EAAKyF,UAAYF,EAAOE,aACrBF,EAAO2T,SAAW3T,EAAOkmC,WAA+B,IAAjBI,IAC5CA,IAGGtmC,GAAUvF,IACbsM,EAAQu/B,EAAe,MAM3B,IAAI3hC,EAAWhK,KAAKuF,SAASyE,SAEzB4hC,EAA4B5hC,EAAS4hC,kBACrCzK,EAA0Bn3B,EAASm3B,gBAEvCnhC,KAAKqrC,eAAiBO,EAAqBx/B,EAAQu/B,GAAiBxK,EAAkByK,GACtF5rC,KAAKsrC,aAAeM,GAAqBx/B,EAAQ,GAAKu/B,GAAgBxK,EAAkByK,GAExFhsC,EAAAU,UAAMsT,SAAQ7T,KAAAC,MAEd,IAAK,IAAIuT,EAAI,EAAGA,EAAIvT,KAAK0F,WAAY6N,IAAK,CACzC,IAAI7Q,EAAW1C,KAAK2F,UAAU4G,SAASgH,GACvCvT,KAAK6rC,qBAAqBnpC,GAG3B,IAAS6Q,EAAIvT,KAAK2F,UAAUsC,OAAS,EAAGsL,EAAIvT,KAAK+F,SAAUwN,IAAK,CAC3D7Q,EAAW1C,KAAK2F,UAAU4G,SAASgH,GACvCvT,KAAK6rC,qBAAqBnpC,KAUrB0oC,EAAA9qC,UAAAwJ,oBAAP,SAA2BpH,GAE1B1C,KAAK8rC,wBAAwBppC,GAC7B9C,EAAAU,UAAMwJ,oBAAmB/J,KAAAC,KAAC0C,IASjB0oC,EAAA9qC,UAAAyrC,iBAAV,SAA2BrpC,GAC1B,IAAIuJ,EAAgBjM,KAAKqrC,eAQzB,OANIrrC,KAAKuF,UAAYvF,KAAKiR,MACzBhF,GAAiBvJ,EAAS4P,UAAUtS,KAAK+a,YAAc,GAGvD9O,GAAiBvJ,EAAS4P,UAAUtS,KAAKmb,YAAc,GAEjDlP,GAQDm/B,EAAA9qC,UAAAghB,iCAAP,SAAwC5e,EAA8ByX,GACjEna,KAAKgsC,qBACRhsC,KAAK8J,oBAAoBpH,GAGzB9C,EAAAU,UAAMghB,iCAAgCvhB,KAAAC,KAAC0C,EAAUyX,IAUzCixB,EAAA9qC,UAAA2rC,eAAV,SAAyBvpC,GACxB,IAAIyJ,EAAcnM,KAAKsrC,aAQvB,OANItrC,KAAKuF,UAAYvF,KAAKiR,MACzB9E,GAAezJ,EAAS4P,UAAUtS,KAAK8a,QAAU,GAGjD3O,GAAezJ,EAAS4P,UAAUtS,KAAKkb,QAAU,GAE3C/O,GASDi/B,EAAA9qC,UAAAwrC,wBAAP,SAA+BppC,GAA/B,IAEKwpC,EACAC,EACAC,EACA33B,EALL3U,EAAAE,KAOKiM,EAAgBjM,KAAK+rC,iBAAiBrpC,GACtCyJ,EAAcnM,KAAKisC,eAAevpC,GAElCoY,EAAS9a,KAAK8a,OACdC,EAAa/a,KAAK+a,WAClBG,EAASlb,KAAKkb,OACdC,EAAanb,KAAKmb,WAElBrM,EAAmB9O,KAAKirC,QAAQn8B,SAEhCu4B,EAAuBv4B,EAASu4B,aAChCgF,EAAwBv9B,EAASu9B,cAEjC9kB,EAAqBzY,EAASyY,WAC9BD,EAAsBxY,EAASwY,YAE/BwP,EAAmBhoB,EAASgoB,SAC5BC,EAAoBjoB,EAASioB,UAE7BrH,EAAsB5gB,EAASw9B,iBAC/B3c,EAAuB7gB,EAASy9B,kBAChCC,EAAqB19B,EAAS29B,gBAC9BC,EAAwB59B,EAAS69B,mBAEjCC,GAAuB,EAG3B,GAAK5sC,KAAKiR,iBAAiB2B,GAAkB5S,KAAKmR,iBAAiByB,EAAe,CAEjF,IAAKlQ,EAASod,SAAS9f,KAAKuY,iBAAmB7V,EAASod,SAAS9f,KAAKwY,eACrE,OAKD,GAFAvM,EAAgB,EAChBE,EAAc,GACTlG,EAAA,MAAYohC,GAEhBp7B,GADI4gC,EAAiBziC,EAAA,OAAa+B,EAAcF,IAAkB,EAAIo7B,EAAe,KAAO,EAAG,GAE/Fl7B,GAAe0gC,EAOhB,GAJAX,EAAIlsC,KAAKiR,MAAM1D,KAAK7K,EAAUqY,EAAY9O,GAC1CkgC,EAAInsC,KAAKiR,MAAM1D,KAAK7K,EAAUoY,EAAQ3O,GAGlClG,EAAA,MAAYohC,GAEf6E,GADIW,GAAmBV,EAAID,EAAK3kB,GAAc,EAE9C4kB,GAAKU,EAIN,IAAK5mC,EAAA,MAAY6wB,GAEhBoV,GADIW,GAAmBV,EAAID,EAAKpV,GAAY,EAE5CqV,GAAKU,EAMN,GAHA5gC,EAAgB,EAChBE,EAAc,GAETlG,EAAA,MAAYomC,GAEhBpgC,GADI4gC,EAAiBziC,EAAA,OAAa,EAAIiiC,EAAgB,KAAO,EAAG,GAEhElgC,GAAe0gC,EAOhB,GAJAT,EAAIpsC,KAAKmR,MAAMzD,KAAKhL,EAAUyY,EAAYlP,GAC1CwI,EAAIzU,KAAKmR,MAAMzD,KAAKhL,EAAUwY,EAAQ/O,GAGlClG,EAAA,MAAYomC,GAEf53B,GADIo4B,GAAmBp4B,EAAI23B,EAAK9kB,GAAe,EAE/C8kB,GAAKS,EAIN,IAAK5mC,EAAA,MAAY8wB,GAEhBtiB,GADIo4B,GAAmBp4B,EAAI23B,EAAKrV,GAAa,EAE7CqV,GAAKS,EAGNV,EAAInsC,KAAK8sC,wBAAwBX,GACjCD,EAAIlsC,KAAK8sC,wBAAwBZ,GACjCE,EAAIpsC,KAAK+sC,sBAAsBX,GAC/B33B,EAAIzU,KAAK+sC,sBAAsBt4B,QAE3B,GAAIzU,KAAKuF,UAAYvF,KAAKiR,MAAO,CAErC,IAAKvO,EAASod,SAAS9f,KAAKwY,eAC3B,OAID,IAAKvS,EAAA,MAAYohC,GAEhBp7B,GADI4gC,EAAiBziC,EAAA,OAAa+B,EAAcF,IAAkB,EAAIo7B,EAAe,KAAO,EAAG,GAE/Fl7B,GAAe0gC,EAOhB,GAJAX,EAAIlsC,KAAKiR,MAAM1D,KAAK7K,EAAUqY,EAAY9O,GAC1CkgC,EAAInsC,KAAKiR,MAAM1D,KAAK7K,EAAUoY,EAAQ3O,GAGlClG,EAAA,MAAYohC,GAEf6E,GADIW,GAAmBV,EAAID,EAAK3kB,GAAc,EAE9C4kB,GAAKU,EAIN,IAAK5mC,EAAA,MAAY6wB,GAEhBoV,GADIW,GAAmBV,EAAID,EAAKpV,GAAY,EAE5CqV,GAAKU,EAGN,IAAIG,EAAiBtqC,EAAS4P,UAAU6I,GACpC8xB,EAAcvqC,EAAS4P,UAAU4I,GAEjClb,KAAKmR,iBAAiBzP,EAAA,IACzBsrC,EAAiB,EACjBC,EAAc,GAGfx4B,EAAIzU,KAAKmR,MAAMzD,KAAKhL,EAAUyY,EAAY6xB,GAC1CZ,EAAIpsC,KAAKmR,MAAMzD,KAAKhL,EAAUwY,EAAQ+xB,GAKtC,IAAIC,EAAaltC,KAAKmR,MAAM6C,YAEvBo4B,EAAI,GAAK33B,EAAI,GAAO23B,EAAIc,GAAcz4B,EAAIy4B,KAC9CN,GAAc,GAGfR,EAAIpsC,KAAK+sC,sBAAsBX,GAC/B33B,EAAIzU,KAAK+sC,sBAAsBt4B,GAE3BzR,KAAKwL,IAAI29B,EAAID,GAAKxc,EAAcC,GAAgB,IACnDid,GAAc,OAIX,CACJ,IAAKlqC,EAASod,SAAS9f,KAAKuY,eAC3B,OAIA,IAiBIs0B,EAlBL,IAAK5mC,EAAA,MAAYomC,GAEhBpgC,GADI4gC,EAAiBziC,EAAA,OAAa+B,EAAcF,IAAkB,EAAIogC,EAAgB,KAAO,EAAG,GAEhGlgC,GAAe0gC,EAOhB,GAJAT,EAAIpsC,KAAKmR,MAAMzD,KAAKhL,EAAUyY,EAAYlP,GAC1CwI,EAAIzU,KAAKmR,MAAMzD,KAAKhL,EAAUwY,EAAQ/O,GAGlClG,EAAA,MAAYomC,GAEf53B,GADIo4B,GAAmBp4B,EAAI23B,EAAK9kB,GAAe,EAE/C8kB,GAAKS,EAIN,IAAK5mC,EAAA,MAAY8wB,GAEhBtiB,GADIo4B,GAAmBp4B,EAAI23B,EAAKrV,GAAa,EAE7CqV,GAAKS,EAGN,IAAIM,EAAgBzqC,EAAS4P,UAAUwI,GACnCsyB,EAAe1qC,EAAS4P,UAAUyI,GAElC/a,KAAKiR,iBAAiBvP,EAAA,IACzByrC,EAAgB,EAChBC,EAAe,GAGhBjB,EAAInsC,KAAKiR,MAAM1D,KAAK7K,EAAUoY,EAAQqyB,GACtCjB,EAAIlsC,KAAKiR,MAAM1D,KAAK7K,EAAUqY,EAAYqyB,GAItCF,EAAaltC,KAAKiR,MAAM+C,YAEvBm4B,EAAI,GAAKD,EAAI,GAAOC,EAAIe,GAAchB,EAAIgB,KAC9CN,GAAc,GAGfT,EAAInsC,KAAK8sC,wBAAwBX,GACjCD,EAAIlsC,KAAK8sC,wBAAwBZ,GAE7BlpC,KAAKwL,IAAI49B,EAAI33B,GAAK+3B,EAAaE,GAAiB,IACnDE,GAAc,GAIhB,IAOKS,EAPDlmB,EAAYnkB,KAAKwL,IAAI29B,EAAID,GACzB7kB,EAAYrkB,KAAKwL,IAAIiG,EAAI23B,GAEzBvmC,EAAY7C,KAAKE,IAAIgpC,EAAGC,GACxBj/B,EAAYlK,KAAKE,IAAIkpC,EAAG33B,GAEvBm4B,EAgGJ5sC,KAAK6rC,qBAAqBnpC,IA9FrBA,EAASooC,OAqCbuC,EAAS3qC,EAASooC,QApClBuC,EAASrtC,KAAKirC,QAAQnjC,SAEtBd,EAAA,eAAuBhH,KAAMqtC,EAAQz0B,EAAA,GACrC5R,EAAA,eAAuBhH,KAAKirC,QAAQn8B,SAAUu+B,EAAQz0B,EAAA,GACtDlW,EAASsoC,UAAUqC,GAEnB3qC,EAASooC,OAASuC,EAGdrtC,KAAKstC,kBACRD,EAAOE,KAAO,WACdF,EAAOG,WAAY,IAGnBH,EAAOE,KAAO,WACdF,EAAOG,WAAY,GAGhBH,EAAOG,YACVH,EAAOl0B,OAAOs0B,KAAK,QAAS,SAACC,GAC5BL,EAAO/zB,YAAcxZ,EAAK6tC,eAAe7tC,EAAK4iB,eAAgBhgB,SAC5DmF,GAAW,GACdwlC,EAAOl0B,OAAOs0B,KAAK,OAAQ,SAACC,GAC3BL,EAAO/zB,YAAc,SACnBzR,GAAW,IAEXwlC,EAAOnW,YACVmW,EAAOl0B,OAAOs0B,KAAK,OAAQ,SAACC,GAC3BL,EAAO/zB,YAAcxZ,EAAK6tC,eAAe7tC,EAAK4iB,eAAgBhgB,SAC5DmF,GAAW,GACdwlC,EAAOl0B,OAAOs0B,KAAK,MAAO,SAACC,GAC1BL,EAAO/zB,YAAc,SACnBzR,GAAW,KAOhBwlC,EAAOlxB,MAAQgL,EACfkmB,EAAOjxB,OAASiL,EAEhBgmB,EAAOxnC,EAAIA,EACXwnC,EAAOngC,EAAIA,EAEXmgC,EAAOO,MAAQ1B,EACfmB,EAAOQ,MAAQzB,EAEfiB,EAAOS,UAAY3B,EAAID,EACvBmB,EAAOU,WAAat5B,EAAI23B,EAExBiB,EAAOvkB,OAAS9oB,KAAKwrC,iBACrB6B,EAAOW,cAAgBhuC,KAEvBA,KAAKiuC,gBAAgBZ,GAEjBA,EAAOv5B,SACVu5B,EAAOz5B,WAGRy5B,EAAOjqC,YAAa,EAGpBgC,EAAA,KAAWpF,KAAK8b,WAAWxW,WAAY,SAAC2vB,GACvC,IAAIiZ,EAA+BxrC,EAASyrC,cAAcpnC,OAAOkuB,EAAU3uB,KACtE4nC,IACJA,EAAcpuC,EAAKmrC,QAAQnjC,SAG3Bd,EAAA,eAAuBiuB,EAAUkG,SAAU+S,EAAat1B,EAAA,GAExDlW,EAASsoC,UAAUkD,GACnBxrC,EAASyrC,cAAc5qC,OAAO0xB,EAAU3uB,IAAa4nC,IAGtDA,EAAYplB,OAASmM,EAAUkG,SAE/B+S,EAAY/xB,MAAQgL,EACpB+mB,EAAY9xB,OAASiL,EACrB6mB,EAAYroC,EAAIA,EAChBqoC,EAAYhhC,EAAIA,EAEhBpN,EAAKmuC,gBAAgBC,GAEjBA,EAAYp6B,SACfo6B,EAAYt6B,WAGbs6B,EAAY9qC,YAAa,KAQ3BV,EAAS0rC,UAAYjnB,EACrBzkB,EAAS2rC,WAAahnB,GAIvB+jB,EAAA9qC,UAAAurC,qBAAA,SAAqBnpC,GAChBA,IACCA,EAASooC,SAEZpoC,EAASooC,OAAO3uB,MAAQ,EACxBzZ,EAASooC,OAAO1uB,OAAS,EACzB1Z,EAASooC,OAAO1nC,YAAa,GAG9BgC,EAAA,KAAWpF,KAAK8b,WAAWxW,WAAY,SAAC2vB,GACvC,IAAIiZ,EAAsBxrC,EAASyrC,cAAcpnC,OAAOkuB,EAAU3uB,KAC9D4nC,IAEHA,EAAY/xB,MAAQ,EACpB+xB,EAAY9xB,OAAS,EACrB8xB,EAAY9qC,YAAa,OAanBgoC,EAAA9qC,UAAA2tC,gBAAV,SAA0B9a,GAEzB,IAAIzwB,EAAiDywB,EAAOzwB,SAE5D,GAAI1C,KAAKiR,iBAAiBvP,EAAA,GAAa1B,KAAKmR,iBAAiBzP,EAAA,EAAW,CACvE,IAAI4sC,EACA9tC,OAAK,EACL+tC,OAAM,EAENvuC,KAAKuF,UAAYvF,KAAKmR,MACrBnR,KAAK+a,YAAc/a,KAAK8a,SAC3BwzB,EAAO5rC,EAASkL,SAAS5N,KAAK+a,YAC9Bva,EAAQkC,EAASkL,SAAS5N,KAAK8a,QAC/ByzB,EAAS7rC,EAASkL,SAAS5N,KAAKiR,MAAMzO,cAAgB,IAAK,mBAIxDxC,KAAKmb,YAAcnb,KAAKkb,SAC3BozB,EAAO5rC,EAASkL,SAAS5N,KAAKmb,YAC9B3a,EAAQkC,EAASkL,SAAS5N,KAAKkb,QAC/BqzB,EAAS7rC,EAASkL,SAAS5N,KAAKmR,MAAM3O,cAAgB,IAAK,mBAIzDhC,EAAQ8tC,GACX5rC,EAAS8rC,iBAAkB,EAC3Brb,EAAOxS,aAAajQ,SAAS1Q,KAAKyuC,oBAClCtb,EAAOub,SAAS1uC,KAAKyuC,mBAAoB,KAGzC/rC,EAAS8rC,iBAAkB,EAC3Brb,EAAOxS,aAAajQ,SAAS1Q,KAAK2uC,oBAClCxb,EAAOub,SAAS1uC,KAAK2uC,mBAAoB,IAGtCJ,EAAS,GACZ7rC,EAASksC,qBAAsB,EAC/Bzb,EAAOxS,aAAajQ,SAAS1Q,KAAK6uC,wBAClC1b,EAAOub,SAAU1uC,KAA2B,uBAAG,KAG/C0C,EAASksC,qBAAsB,EAC/Bzb,EAAOxS,aAAajQ,SAAS1Q,KAAK8uC,wBAClC3b,EAAOub,SAAU1uC,KAA2B,uBAAG,MAUlDI,OAAAC,eAAW+qC,EAAA9qC,UAAA,eAAX,WAMC,OALKN,KAAK+uC,WACT/uC,KAAK+uC,SAAW,IAAIjtC,EAAA,EAA8B9B,KAAKgvC,wBACvDhvC,KAAKgT,WAAWxB,KAAK,IAAI1P,EAAA,EAAa9B,KAAK+uC,WAC3C/uC,KAAKgT,WAAWxB,KAAKxR,KAAK+uC,SAASjgC,WAE7B9O,KAAK+uC,0CAQH3D,EAAA9qC,UAAA0uC,qBAAV,WACC,OAAO,IAAIC,GAAA,GAWZ7uC,OAAAC,eAAW+qC,EAAA9qC,UAAA,iBAOX,WACC,OAAON,KAAKO,iBAAiB,kBAR9B,SAAqBC,GACpBR,KAAKS,iBAAiB,YAAaD,GAAO,oCAoB3CJ,OAAAC,eAAW+qC,EAAA9qC,UAAA,yBAAX,WAIC,OAHKN,KAAKyuC,qBACTzuC,KAAKyuC,mBAAqBzuC,KAAK8qB,OAAOhjB,OAAO,sBAEvC9H,KAAKyuC,oDAYbruC,OAAAC,eAAW+qC,EAAA9qC,UAAA,6BAAX,WAIC,OAHKN,KAAK6uC,yBACT7uC,KAAK6uC,uBAAyB7uC,KAAK8qB,OAAOhjB,OAAO,0BAE3C9H,KAAK6uC,wDAcbzuC,OAAAC,eAAW+qC,EAAA9qC,UAAA,yBAAX,WAIC,OAHKN,KAAK2uC,qBACT3uC,KAAK2uC,mBAAqB3uC,KAAK8qB,OAAOhjB,OAAO,sBAEvC9H,KAAK2uC,oDAYbvuC,OAAAC,eAAW+qC,EAAA9qC,UAAA,6BAAX,WAIC,OAHKN,KAAK8uC,yBACT9uC,KAAK8uC,uBAAyB9uC,KAAK8qB,OAAOhjB,OAAO,0BAE3C9H,KAAK8uC,wDASN1D,EAAA9qC,UAAAoe,kBAAP,SAAyBhc,GAAzB,IAAA5C,EAAAE,KAGC,GAFAJ,EAAAU,UAAMoe,kBAAiB3e,KAAAC,KAAC0C,GAEpB1C,KAAKq8B,eAAgB,CACxB,IACI6S,EACAC,EAFAnT,EAAoBh8B,KAAKq8B,eAAeL,OAIxCt5B,IAEFwsC,EADGxsC,EAAS8rC,gBACIxuC,KAAKyuC,mBAGLzuC,KAAK2uC,mBAIrBQ,EADGzsC,EAASksC,oBACQ5uC,KAAK6uC,uBAGL7uC,KAAK8uC,wBAI3B1pC,EAAA,KAAW42B,EAAOU,SAASp3B,WAAY,SAACq3B,GACnCj6B,GACHi6B,EAAM+R,SAASS,GACfxS,EAAM+R,SAASQ,KAIfvS,EAAM+R,SAAS5uC,EAAKgvC,wBACpBnS,EAAM+R,SAAS5uC,EAAK6uC,yBAajBvD,EAAA9qC,UAAAy7B,mBAAP,SAA0BC,GACzB,IAAI7U,EAAY6U,EAAOzU,WACnBF,EAAY2U,EAAO1U,YAEvB0U,EAAOoT,iBAEP,IAAItE,EAA2B9O,EAAOxV,YAAY6oB,GAAA,GAClDvE,EAAO/nB,aAAc,EACrB/b,EAAA,eAAuBhH,KAAM8qC,EAAQlyB,EAAA,GAErCkyB,EAAOp6B,SAAc1Q,KAAKirC,QAAQn8B,UAClCg8B,EAAO/gB,QAAQ,EAAG,EAAG,EAAG,GACxB+gB,EAAO3uB,MAAQgL,EACf2jB,EAAO1uB,OAASiL,EAEhB,IAAIgV,EAAiCL,EAAOt5B,SAC5C25B,EAAeC,MAAQt8B,KAAKuL,KAC5B8wB,EAAeE,UAAYv8B,KAAKuL,MAQ1B6/B,EAAA9qC,UAAAoQ,SAAP,SAAgBC,GACf/Q,EAAAU,UAAMoQ,SAAQ3Q,KAAAC,KAAC2Q,GACf3Q,KAAKirC,QAAQn8B,SAAS4B,SAASC,EAAOs6B,QAAQn8B,WAQrCs8B,EAAA9qC,UAAA0f,mBAAV,SAA6BL,EAAgBlP,GAC5C,OAAIzQ,KAAKuF,UAAYvF,KAAKiR,OACjBjR,KAAKqrC,eAAiBrrC,KAAKsrC,cAAgB,EAG5C1rC,EAAAU,UAAM0f,mBAAkBjgB,KAAAC,KAAC2f,EAAQlP,IAShC26B,EAAA9qC,UAAA4f,mBAAV,SAA6BP,EAAgBlP,GAC5C,OAAIzQ,KAAKuF,UAAYvF,KAAKmR,OACjBnR,KAAKqrC,eAAiBrrC,KAAKsrC,cAAgB,EAG5C1rC,EAAAU,UAAM4f,mBAAkBngB,KAAAC,KAAC2f,EAAQlP,IAOhC26B,EAAA9qC,UAAAysC,sBAAV,SAAgCpN,GAC/B,IAAI+M,EAAgB1sC,KAAKirC,QAAQn8B,SAAS69B,mBAGtCnvB,GAFaxd,KAAKirC,QAAQn8B,SAAS29B,gBAGnChvB,EAAezd,KAAKmR,MAAM6C,WAAa04B,EAE3C,OAAOtiC,EAAA,WAAiBu1B,EAAYniB,EAAMC,IAMjC2tB,EAAA9qC,UAAAwsC,wBAAV,SAAkCnN,GACjC,IAAIjQ,EAAc1vB,KAAKirC,QAAQn8B,SAASw9B,iBACpC3c,EAAe3vB,KAAKirC,QAAQn8B,SAASy9B,kBAErClvB,GAAgBqS,EAChBnS,EAAevd,KAAKiR,MAAM+C,WAAa2b,EAE3C,OAAOvlB,EAAA,WAAiBu1B,EAAYtiB,EAAME,IAMpC6tB,EAAA9qC,UAAAoa,YAAP,WACC9a,EAAAU,UAAMoa,YAAW3a,KAAAC,MACjBA,KAAKirC,QAAQxjC,SAEf2jC,EAh4BA,CAAkClzB,GAw4BlCjX,EAAA,EAASC,kBAAgC,aAAIiqC,GAC7ClqC,EAAA,EAASC,kBAAwC,qBAAIypC,GC5iCrD,IAAA2E,GAAA,SAAA1vC,GAUC,SAAA2vC,IAAA,IAAAzvC,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,wBAEjBH,EAAKI,eAwDP,OAtE2CC,EAAA,EAAAovC,EAAA3vC,GA4C1CQ,OAAAC,eAAWkvC,EAAAjvC,UAAA,kBAAX,WACC,IAAIkvC,EAAkBxvC,KAAKwvC,gBAC3B,GAAIA,GAAmBA,EAAgB1mB,OACtC,OAAO0mB,EAAgB1mB,OAAO3O,sCAUhC/Z,OAAAC,eAAWkvC,EAAAjvC,UAAA,aAAX,WACC,OAAON,KAAKwvC,gBAAgBhvC,uCAS7BJ,OAAAC,eAAWkvC,EAAAjvC,UAAA,uBAAX,WACC,OAAwBN,KAAKyvC,8CAE/BF,EAtEA,CAA2C5E,IA6H3C+E,GAAA,SAAA9vC,GA6CC,SAAA+vC,IAAA,IAAA7vC,EACCF,EAAAG,KAAAC,OAAOA,KAEPF,EAAKG,UAAY,gBACjBH,EAAKI,aAELJ,EAAK2mB,YAAc,EACnB3mB,EAAKinB,cAAgB,EACrBjnB,EAAK2c,kBAAoB,EACzB3c,EAAKmrC,QAAQn8B,SAAS2P,YAAc,+BACpC3e,EAAKmrC,QAAQn8B,SAAS8gC,YAAc,SAEpC,IAAIvpB,EAAkB,IAAIC,EAAA,SAE1BxmB,EAAK8mB,OAASP,EAAgBK,OAAO,cACrC5mB,EAAKia,WAAW9C,WAAa,KAC7BnX,EAAKia,WAAWhD,OAAS,KACzBjX,EAAKia,WAAW7C,WAAa,KAC7BpX,EAAKia,WAAW/C,OAAS,KAEzBlX,EAAKghB,wBAAyB,EAE9BhhB,EAAKksB,YAAa,EAGlBlsB,EAAKmrC,QAAQn8B,SAASmwB,cAAe,IAoIvC,OA1MmC9+B,EAAA,EAAAwvC,EAAA/vC,GAgFxB+vC,EAAArvC,UAAA6U,gBAAV,SAA0BzS,EAA6B0S,GACpCA,EAAamB,eAAiB7T,EAChD9C,EAAAU,UAAM6U,gBAAepV,KAAAC,KAAC0C,EAAU0S,IASvBu6B,EAAArvC,UAAAoD,eAAV,WACC,OAAO,IAAI4rC,IASLK,EAAArvC,UAAAigB,KAAP,SAAYlU,GAEX,IAAIqU,EAAwB1gB,KAAK2gB,aAAaC,mBAS9C,OARG3a,EAAA,SAAeoG,KACjBqU,EAAwBrU,GAGzBrM,KAAK2F,UAAUU,KAAK,SAAC3D,GACpBA,EAAS8sC,gBAAgBxV,gBAAgB,QAASt3B,EAAS8sC,gBAAgBnuC,OAAOb,MAAMA,SAGlFZ,EAAAU,UAAMuvC,SAAQ9vC,KAAAC,KAAC0gB,IAShBivB,EAAArvC,UAAA4gB,KAAP,SAAY7U,GAEX,IAAIqU,EAAwB1gB,KAAK2gB,aAAaC,mBAC3C3a,EAAA,SAAeoG,KACjBqU,EAAwBrU,GAGzB,IAAI2U,EAAYphB,EAAAU,UAAM6jB,SAAQpkB,KAAAC,KAAC0gB,GAK/B,OAHA1gB,KAAK2F,UAAUU,KAAK,SAAC3D,GACpBA,EAAS8sC,gBAAgBxV,gBAAgB,QAAS,KAE5ChZ,GAQD2uB,EAAArvC,UAAA8c,cAAP,aAUOuyB,EAAArvC,UAAAiZ,iBAAP,aAUOo2B,EAAArvC,UAAA2hB,cAAP,SAAqBC,GAEhBA,IAIEjc,EAAA,SAAeic,EAAOnI,aAAgB9T,EAAA,SAAeic,EAAOnI,cAChEmI,EAAOnI,gBAKTna,EAAAU,UAAM2hB,cAAaliB,KAAAC,KAACkiB,IAUdytB,EAAArvC,UAAAy7B,mBAAP,SAA0BC,GACzB,IAAI7U,EAAY6U,EAAOzU,WACnBF,EAAY2U,EAAO1U,YAEvB0U,EAAOoT,iBAEP,IAAItE,EAA2B9O,EAAOxV,YAAY6oB,GAAA,GAClDvE,EAAO/nB,aAAc,EACrB/b,EAAA,eAAuBhH,KAAM8qC,EAAQlyB,EAAA,GAGrCkyB,EAAO/gB,QAAQ,EAAG,EAAG,EAAG,GACxB+gB,EAAO3uB,MAAQgL,EACf2jB,EAAO1uB,OAASiL,EAEhB,IAAIgV,EAAiCL,EAAOt5B,SAC5C25B,EAAeC,MAAQwO,EAAOv/B,KAC9B8wB,EAAeE,UAAYuO,EAAOv/B,MAEpCokC,EA1MA,CAAmCxE,IAkNnClqC,EAAA,EAASC,kBAAiC,cAAIwuC,GAC9CzuC,EAAA,EAASC,kBAAyC,sBAAIouC,oBC1UtDQ,GAAA,SAAAlwC,GA8CC,SAAAmwC,IAAA,IAAAjwC,EACCF,EAAAG,KAAAC,OAAOA,YApBDF,EAAAkwC,QAqBNlwC,EAAKG,UAAY,kBAEjBH,EAAKuB,OAAOb,SAEZV,EAAKuB,OAAOoiC,MAEZ3jC,EAAKuB,OAAO4uC,MAEZnwC,EAAKuB,OAAOqiC,MAEZ5jC,EAAKuB,OAAO8mC,MAEZroC,EAAKowC,YAAYxT,UAAW,EAE5B58B,EAAKI,eAuPP,OArTqCC,EAAA,EAAA4vC,EAAAnwC,GA2E7BmwC,EAAAzvC,UAAA6vC,YAAP,WACC,OAAO,GAQR/vC,OAAAC,eAAW0vC,EAAAzvC,UAAA,aAOX,WAEC,IAAIE,EAAQ,EAeZ,OAdKR,KAAK08B,UAAoC,GAAxB18B,KAAK08B,SAASz0B,OAKnC7C,EAAA,KAAWpF,KAAK08B,SAASp3B,WAAY,SAACq3B,GACrC,IAAIyT,EAAazT,EAAMn8B,MACnByF,EAAA,SAAemqC,KAClB5vC,GAAS4vC,KAPX5vC,EAAQR,KAAKqB,OAAc,MAAE04B,aAavBv5B,OAxBR,SAAiBA,GAChBR,KAAKsX,SAAS,QAAS9W,oCAwCxBJ,OAAAC,eAAW0vC,EAAAzvC,UAAA,eAAX,WACC,OAAIN,KAAK8oB,OACD9oB,KAAKQ,MAAQR,KAAK8oB,OAAOtoB,MAAQ,IAElC,qCAURJ,OAAAC,eAAW0vC,EAAAzvC,UAAA,UAOX,WACC,OAAON,KAAKqB,OAAOoiC,GAAGjjC,WARvB,SAAcA,GACbR,KAAKsX,SAAS,KAAM9W,oCAiBrBJ,OAAAC,eAAW0vC,EAAAzvC,UAAA,UAOX,WACC,OAAON,KAAKqB,OAAOqiC,GAAGljC,WARvB,SAAcA,GACbR,KAAKsX,SAAS,KAAM9W,oCAiBrBJ,OAAAC,eAAW0vC,EAAAzvC,UAAA,UAOX,WACC,OAAON,KAAKqB,OAAO4uC,GAAGzvC,WARvB,SAAcA,GACbR,KAAKsX,SAAS,KAAM9W,oCAiBrBJ,OAAAC,eAAW0vC,EAAAzvC,UAAA,UAOX,WACC,OAAON,KAAKqB,OAAO8mC,GAAG3nC,WARvB,SAAcA,GACbR,KAAKsX,SAAS,KAAM9W,oCAerBJ,OAAAC,eAAW0vC,EAAAzvC,UAAA,YAOX,WACC,OAAON,KAAKyS,WAAW0H,UARxB,SAAgBA,GACfna,KAAK0S,YAAY,OAAQyH,oCAqB1B/Z,OAAAC,eAAW0vC,EAAAzvC,UAAA,gBAOX,WACC,OAAON,KAAKyS,WAAWiqB,cARxB,SAAoBA,GACnB18B,KAAK0S,YAAY,WAAYgqB,oCAmB9Bt8B,OAAAC,eAAW0vC,EAAAzvC,UAAA,aAAX,WACC,OAAKN,KAAK8oB,OAIF9oB,KAAK8oB,OAAOunB,MAAQ,EAHpB,mCAeTjwC,OAAAC,eAAW0vC,EAAAzvC,UAAA,aAOX,WACC,IAAIg8B,EAAQt8B,KAAKyS,WAAW6pB,MAY5B,YAVaz0B,GAATy0B,GACCt8B,KAAK8oB,SACRwT,EAAQt8B,KAAK8oB,OAAOwT,YAGTz0B,GAATy0B,GACCt8B,KAAK2C,YACR25B,EAAQt8B,KAAK2C,UAAUsvB,OAAO1lB,SAASvM,KAAK2C,UAAUsvB,OAAOlmB,KAAO/L,KAAKoM,QAGpEkwB,OApBR,SAAiB97B,GAChBR,KAAK0S,YAAY,QAASlS,oCA0B3BJ,OAAAC,eAAW0vC,EAAAzvC,UAAA,cAWX,WACC,OAAON,KAAKkT,aAZb,SAAkB7N,GACbA,GAAUrF,KAAKkT,UACdlT,KAAKkT,UACRlT,KAAK2C,UAAU0C,OAAO0X,YAAY/c,KAAKkT,SACvClT,KAAKkT,QAAQ4J,WAEd9c,KAAKkT,QAAU7N,EACfrF,KAAKgT,WAAWxB,KAAKnM,qCAOxB0qC,EArTA,CAAqCljB,GAkZrCyjB,GAAA,SAAA1wC,GA2IC,SAAA2wC,IAAA,IAAAzwC,EAGCF,EAAAG,KAAAC,OAAOA,KAzEDF,EAAA0wC,gBAAqD1wC,EAAK2wC,SAoD1D3wC,EAAA4wC,UAAoB,EAsB1B5wC,EAAKG,UAAY,UAEjBH,EAAK6wC,UAAY,EACjB7wC,EAAK8wC,aAAe,EAEpB9wC,EAAKmyB,OAAS,IAAI4e,GAAA,EAClB/wC,EAAKgxC,QAAU,aAGf,IAAI7/B,EAAQnR,EAAK6c,MAAMnL,KAAK,IAAI9P,EAAA,GAChCuP,EAAMua,MAAMrgB,UAAW,EACvB8F,EAAM8/B,cAAe,EAErB,IAAIC,EAAY//B,EAAMjH,SACtBgnC,EAAUrlB,QAAS,EACnBqlB,EAAU/gC,OAAOnB,SAAS3D,UAAW,EACrC6lC,EAAUhhC,MAAMlB,SAAS3D,UAAW,EACpC6lC,EAAU3lC,KAAKyD,SAAS3D,UAAW,EACnC6lC,EAAUjlB,UAAUjd,SAAS3D,UAAW,EACxC6lC,EAAUzmC,gBAAkB,IAC5BymC,EAAUplB,KAAKzgB,UAAW,EAC1B6lC,EAAU9gC,SAAS/E,UAAW,EAG9B,IAAIgG,EAAQrR,EAAKod,MAAM1L,KAAK,IAAI9P,EAAA,GAChCyP,EAAMqa,MAAMrgB,UAAW,EACvBgG,EAAM4/B,cAAe,EAErB,IAAIE,EAAY9/B,EAAMnH,SACtBinC,EAAUtlB,QAAS,EACnBslB,EAAUhhC,OAAOnB,SAAS3D,UAAW,EACrC8lC,EAAUjhC,MAAMlB,SAAS3D,UAAW,EACpC8lC,EAAU5lC,KAAKyD,SAAS3D,UAAW,EACnC8lC,EAAUllB,UAAUjd,SAAS3D,UAAW,EACxC8lC,EAAU1mC,gBAAkB,IAC5B0mC,EAAUrlB,KAAKzgB,UAAW,EAC1B8lC,EAAU/gC,SAAS/E,UAAW,EAC9B8lC,EAAU9f,UAAW,EAGrBrxB,EAAKmR,MAAQA,EACbnR,EAAKqR,MAAQA,EAEb,IAAMrC,EAAW,IAAI4gC,UACrB5vC,EAAKoxC,gBAAkB,IAAIlvC,EAAA,EAAgD8M,GAC3EhP,EAAKkT,WAAWxB,KAAK,IAAIxP,EAAA,EAAmBlC,EAAKoxC,kBACjDpxC,EAAKkT,WAAWxB,KAAK1C,GAErBhP,EAAKsrB,cAAcjS,OAAOC,GAAG,MAAO,WACnCtZ,EAAKqxC,oBAAoBrxC,EAAKsxC,qBAC5BvpC,GAAW,GAEd/H,EAAKoxC,gBAAgB/3B,OAAOC,GAAG,YAAa,SAACoK,GAC5CA,EAAM2H,SAAS6d,YAAa,QAC1BnhC,GAAW,GAGd/H,EAAKI,eA4xBP,OAp+B6BC,EAAA,EAAAowC,EAAA3wC,GA+M5BQ,OAAAC,eAAWkwC,EAAAjwC,UAAA,qBAkBX,WACC,OAAON,KAAKqxC,oBAnBb,SAAyBC,GAAzB,IAAAxxC,EAAAE,KACKA,KAAKqxC,gBAAkBC,IAC1BtxC,KAAKqxC,eAAiBC,EACtBA,EAAcxoB,OAAS9oB,KACvBsxC,EAAc/mB,SACd+mB,EAAc9G,MAAM17B,SAASqK,OAAOC,GAAG,MAAO,SAACoK,GAC9C,IAAI9gB,EAA4B8gB,EAAMrE,OAAOzc,SAAS0S,YACtDtV,EAAKqxC,oBAAoBzuC,GACzB5C,EAAKyxC,iBAAiB7uC,SACpBmF,GAAW,GAEd7H,KAAKgT,WAAWxB,KAAK8/B,qCAiBhBf,EAAAjwC,UAAA0F,aAAP,WAEChG,KAAKqF,OAAOoC,QAEZ7H,EAAAU,UAAM0F,aAAYjG,KAAAC,MAEdA,KAAKoxC,eACRpxC,KAAKoxC,cAAct0B,UAGpB,IAAI00B,EAAexxC,KAAK2F,UAAUmJ,SAASyc,QAE3CvrB,KAAKoxC,cAAgBI,EAErBpsC,EAAA,KAAWpF,KAAK2F,UAAUL,WAAY,SAAC5C,GACtCA,EAASomB,OAAS0oB,IAGnBA,EAAa9U,SAAW18B,KAAK2F,UAE7B6rC,EAAa/N,GAAK,EAClB+N,EAAavB,GAAK,EAClBuB,EAAar3B,KAAOna,KAAKyxC,UAEzB,IACIh0B,EADO,IACQzd,KAAKsnB,YAActnB,KAAKunB,YAAe,IAE1DiqB,EAAa9N,GAHF,IAIX8N,EAAarJ,GAAK1qB,EAElBzd,KAAKiR,MAAM/N,IAAM,EACjBlD,KAAKiR,MAAMjN,IAPA,IASXhE,KAAKmR,MAAMjO,IAAM,EACjBlD,KAAKmR,MAAMnN,IAAMyZ,EAEjBzd,KAAK0xC,YAAYF,GAEjBxxC,KAAKuxC,iBAAiBC,IAUhBjB,EAAAjwC,UAAAoxC,YAAP,SAAmB5oB,EAAyBgoB,GAC3C,GAAIhoB,EAAQ,CACX,IAAI4T,EAAW5T,EAAO4T,SAEjBoU,IACJA,EAAU9wC,KAAK8wC,SAGD,aAAXA,GACHpU,EAASr7B,OAAOsyB,KAAK,SAAC9S,EAAGpM,GACxB,OAAOoM,EAAErgB,MAAQiU,EAAEjU,QAGN,cAAXswC,GACHpU,EAASr7B,OAAOsyB,KAAK,SAAC9S,EAAGpM,GACxB,OAAOA,EAAEjU,MAAQqgB,EAAErgB,QAIrBR,KAAK2xC,uBAAuB,GAE5B3xC,KAAKwwC,gBAAgB1nB,GAErB,IAAK,IAAIvV,EAAI,EAAGe,EAAMooB,EAASz0B,OAAQsL,EAAIe,EAAKf,IAAK,CAEpD,IAAI82B,EAAO3N,EAASnwB,SAASgH,GAEzB82B,EAAK3N,UACR18B,KAAK0xC,YAAYrH,MAaXkG,EAAAjwC,UAAAixC,iBAAV,SAA2B7uC,GAA3B,IAAA5C,EAAAE,KACCA,KAAK4xC,eAML,IAJA,IAAIC,GAAkBnvC,GAGlBovC,EAAiBpvC,EAASomB,YACLjhB,GAAlBiqC,GACN9xC,KAAK+xC,WAAWD,GAChBD,EAAergC,KAAKsgC,GACpBA,EAAiBA,EAAehpB,OAGjC+oB,EAAeG,UAEXhyC,KAAKsxC,gBACRtxC,KAAKsxC,cAAcz3B,KAAOg4B,GAI3B7xC,KAAKiyC,qBAAqBvvC,GAG1BoV,EAAA,KAAY9X,KAAK4xC,YAAa,SAACvsC,IACM,GAAhCvF,EAAKuF,OAAOkW,QAAQlW,IACvBvF,EAAKuF,OAAOmM,KAAKnM,GAElBA,EAAOqoB,OAASroB,EAAOgrC,SAUfE,EAAAjwC,UAAA2xC,qBAAV,SAA+BvvC,GAC9B,GAAIA,EAASg6B,UACAh6B,EAAS2tC,MAETrwC,KAAK4wC,aAAe5wC,KAAK2wC,UAAW,CAE/C3wC,KAAK+xC,WAAWrvC,GAEhB,IAAK,IAAI6Q,EAAI,EAAGA,EAAI7Q,EAASg6B,SAASz0B,OAAQsL,IAAK,CAClD,IAAIopB,EAAQj6B,EAASg6B,SAASnwB,SAASgH,GACnCopB,EAAMD,UACT18B,KAAKiyC,qBAAqBtV,MAYrB4T,EAAAjwC,UAAAswB,eAAV,WACC,OAAO,GAUE2f,EAAAjwC,UAAAyxC,WAAV,SAAqBrvC,GAArB,IAAA5C,EAAAE,KACC,IAAK0C,EAAS2C,OAAQ,CACrB,IAAIA,OAAM,EAENyJ,EAAW9O,KAAKkxC,gBAAgBnqC,OAAOrE,EAAS2tC,MAAM/oC,aAEzDjC,EADGyJ,EACMA,EAASyc,QAGTvrB,KAAKqF,OAAOyC,UAGfqS,KAAOzX,EAASyX,KACvB9U,EAAOysC,eAAiBpvC,EACxBA,EAAS2C,OAASA,EAElB,IAAIgrC,EAAQ3tC,EAAS2tC,MACrBhrC,EAAOgrC,MAAQA,EAEf,IAAIj7B,EAAmB1S,EAAS0S,YAC5BA,IACH/P,EAAO6c,OAAS9M,EAAY8M,QAG7BliB,KAAKyxB,UAAU1U,YAAY1X,GAC3BA,EAAOwU,KAAOnX,EAASg6B,SAASr7B,OAChCgE,EAAOkG,KAAO7I,EAAS45B,MAEvBj3B,EAAOmmC,iBAAiBtqB,KAAK,GAC7B7b,EAAOqpB,iBAAiBxN,KAAK,GAE7B7b,EAAO4lC,QAAQn8B,SAASQ,QAAQyJ,IAAI,OAAQ,SAACxN,EAAM4T,GAClD,IAAIzc,EAAkCyc,EAAOzc,SAC7C,GAAIA,EAAU,CACb,IAAI8sC,EAAkB9sC,EAAS8sC,gBAC/B,GAAIA,EAGH,OAFArwB,EAAO5T,KAAOikC,EAAgBlT,MAC9Bnd,EAAO7P,QAAQgG,OAAO,QACfk6B,EAAgBlT,SAKtBt8B,KAAK0wC,WAAahuC,EAAS2tC,MAAQrwC,KAAK4wC,cAAiBluC,EAASg6B,UAAYh6B,EAASg6B,SAASz0B,OAAS,KAC5G5C,EAAO4lC,QAAQn8B,SAASojC,gBAAkBttB,EAAA,EAAiBf,QACvD7jB,KAAK0wC,UACRrrC,EAAO4lC,QAAQn8B,SAASqK,OAAOC,GAAG,MAAO,SAACoK,GACzC,IAAIjN,EAAwCiN,EAAMrE,OAAOzc,SAErDA,EAAS2tC,MAAQvwC,EAAK8wC,aACzB9wC,EAAKqxC,oBAAoB56B,EAAei5B,gBAAgB1mB,QAGxDhpB,EAAKqyC,qBAAqB57B,IAGzBvW,UAAM6H,IAKZ7H,KAAK4xC,YAAYpgC,KAAK9O,EAAS2C,SAStBkrC,EAAAjwC,UAAA8xC,cAAV,SAAwB/lC,GAAxB,IAAAvM,EAAAE,KAECoF,EAAA,KAAWpF,KAAKqF,OAAOC,WAAY,SAACD,IACO,GAAtCvF,EAAK8xC,YAAYr2B,QAAQlW,IAE5BA,EAAOmmC,iBAAiBtqB,OACxB7b,EAAOqpB,iBAAiBxN,KAAK7U,KAI7BhH,EAAOmmC,iBAAiBjrB,OACxBlb,EAAOqpB,iBAAiBnO,KAAKlU,GAEzBhH,EAAOgrC,MAAQvwC,EAAK8wC,cACvBvrC,EAAOqpB,iBAAiBxN,KAAK7U,OAW1BkkC,EAAAjwC,UAAA6xC,qBAAP,SAA4BzvC,GAC3B1C,KAAKmxC,oBAAoBzuC,EAAS8sC,kBAS5Be,EAAAjwC,UAAA6wC,oBAAP,SAA2BzuC,GAA3B,IAAA5C,EAAAE,KACC,GAAI0C,GAAYA,EAASg6B,SAAU,CAClC18B,KAAKiR,MAAMV,aAAa7N,EAAS+gC,GAAI/gC,EAASghC,IAC9C1jC,KAAKmR,MAAMZ,aAAa7N,EAASutC,GAAIvtC,EAASylC,IAE9CnoC,KAAK4wC,aAAeluC,EAAS2tC,MAC7BrwC,KAAKqyC,gBAAkB3vC,EAEvB1C,KAAKuxC,iBAAiB7uC,GAEtB,IAAI4vC,EAAuBtyC,KAAKiR,MAAMqhC,sBAAwBtyC,KAAKmR,MAAMmhC,qBAErEA,IAAyBA,EAAqBrxB,cACjDjhB,KAAKuyC,eAAe/gC,KAAK8gC,GACzBA,EAAqBn5B,OAAOs0B,KAAK,iBAAkB,WAClD3tC,EAAKsyC,mBAINpyC,KAAKoyC,kBASE7B,EAAAjwC,UAAA+C,sBAAV,WAECzD,EAAAU,UAAM+C,sBAAqBtD,KAAAC,MAItBiG,EAAA,SAAejG,KAAKsZ,eACxBtZ,KAAKsZ,YAActZ,KAAKwD,SAASC,UAAU,mBAWnC8sC,EAAAjwC,UAAAoD,eAAV,WACC,OAAO,IAAIosC,IAaZ1vC,OAAAC,eAAWkwC,EAAAjwC,UAAA,iBAOX,WACC,OAAON,KAAKO,iBAAiB,kBAR9B,SAAqBC,GACpBR,KAAKS,iBAAiB,YAAaD,GAAO,oCAe3CJ,OAAAC,eAAWkwC,EAAAjwC,UAAA,oBAOX,WACC,OAAON,KAAKO,iBAAiB,qBAR9B,SAAwBC,GACvBR,KAAKS,iBAAiB,eAAgBD,GAAO,oCAkB9CJ,OAAAC,eAAWkwC,EAAAjwC,UAAA,eAIX,WACC,OAAON,KAAKO,iBAAiB,gBAL9B,SAAmBC,GAClBR,KAAKS,iBAAiB,UAAWD,GAAO,oCAY/B+vC,EAAAjwC,UAAAi3B,aAAV,WACC,OAAO,IAAImY,IASZtvC,OAAAC,eAAWkwC,EAAAjwC,UAAA,gBAUX,WACC,OAAON,KAAKyxC,eAXb,SAAoBjxC,GACnBR,KAAKyxC,UAAYjxC,EACbR,KAAKoxC,gBACRpxC,KAAKoxC,cAAcj3B,KAAOna,KAAKyxC,4CAiB1BlB,EAAAjwC,UAAA2hB,cAAP,SAAqBC,GAEpB,GAAIA,EAAQ,CAGX,GAAIjc,EAAA,SAAeic,EAAwB,kBAAMjc,EAAA,SAAeic,EAAwB,iBACvF,OAAQA,EAAwB,iBAC/B,IAAK,WACJA,EAAwB,gBAAIliB,KAAKywC,SACjC,MACD,IAAK,aACJvuB,EAAwB,gBAAIliB,KAAKwyC,WACjC,MACD,IAAK,QACJtwB,EAAwB,gBAAIliB,KAAKilC,MACjC,MACD,IAAK,OACJ/iB,EAAwB,gBAAIliB,KAAKyyC,KACjC,MACD,IAAK,YACJvwB,EAAwB,gBAAIliB,KAAK0yC,UACjC,MACD,eACQxwB,EAAwB,gBAO9Bjc,EAAA,SAAeic,EAAOovB,iBAAmBrrC,EAAA,SAAeic,EAAOovB,cAAcpyB,QAChFgD,EAAOovB,cAAcpyB,KAAO,iBAG7Btf,EAAAU,UAAM2hB,cAAaliB,KAAAC,KAACkiB,KAWfquB,EAAAjwC,UAAAqyC,eAAP,WACC/yC,EAAAU,UAAMqyC,eAAc5yC,KAAAC,MACpBA,KAAK0xC,YAAY1xC,KAAKqyC,kBAQhB9B,EAAAjwC,UAAAsD,kBAAP,WACChE,EAAAU,UAAMsD,kBAAiB7D,KAAAC,MACvBA,KAAK0xC,YAAY1xC,KAAKoxC,eAEtBhsC,EAAA,KAAWpF,KAAKqF,OAAOC,WAAY,SAACD,GACnCA,EAAOutC,oBAGR5yC,KAAKmxC,oBAAoBnxC,KAAKoxC,gBAoDxBb,EAAAjwC,UAAAkyC,WAAP,SAAkB1pB,GACjB,IACCvV,EACAigB,EAFGqf,EAAQ/pB,EAAO4T,SACfoW,EAAID,EAAM5qC,OACR8qC,EAAO,IAAIC,MAAMF,EAAI,GAE3B,IAAKC,EAAK,GAAKvf,EAAMjgB,EAAI,EAAGA,EAAIu/B,IAAKv/B,EACpCw/B,EAAKx/B,EAAI,GAAKigB,GAAOqf,EAAMtmC,SAASgH,GAAG/S,OAKxC,SAAAyyC,EAAmB1/B,EAAW2/B,EAAW1yC,EAAeijC,EAAYwM,EAAYvM,EAAYyE,GAC3F,GAAI50B,GAAK2/B,EAAI,EAAG,CACf,IAAI7I,EAAOwI,EAAMtmC,SAASgH,GAG1B,OAFA82B,EAAK5G,GAAKA,EAAI4G,EAAK4F,GAAKA,EACxB5F,EAAK3G,GAAKA,OAAI2G,EAAKlC,GAAKA,GAIzB,IAAIgL,EAAcJ,EAAKx/B,GACtB6/B,EAAe5yC,EAAQ,EAAK2yC,EAC5BE,EAAI9/B,EAAI,EACR+/B,EAAKJ,EAAI,EAEV,KAAOG,EAAIC,GAAI,CACd,IAAIC,EAAMF,EAAIC,IAAO,EACjBP,EAAKQ,GAAOH,EAAaC,EAAIE,EAAM,EAClCD,EAAKC,EAGNH,EAAcL,EAAKM,EAAI,GAAON,EAAKM,GAAKD,GAAgB7/B,EAAI,EAAI8/B,KAAIA,EAEzE,IAAIG,EAAYT,EAAKM,GAAKF,EACzBM,EAAajzC,EAAQgzC,EAEtB,GAAK9P,EAAKD,EAAO0E,EAAK8H,EAAK,CAC1B,IAAIyD,GAAMjQ,EAAKgQ,EAAa/P,EAAK8P,GAAahzC,EAC9CyyC,EAAU1/B,EAAG8/B,EAAGG,EAAW/P,EAAIwM,EAAIyD,EAAIvL,GACvC8K,EAAUI,EAAGH,EAAGO,EAAYC,EAAIzD,EAAIvM,EAAIyE,OAClC,CACN,IAAIwL,GAAM1D,EAAKwD,EAAatL,EAAKqL,GAAahzC,EAC9CyyC,EAAU1/B,EAAG8/B,EAAGG,EAAW/P,EAAIwM,EAAIvM,EAAIiQ,GACvCV,EAAUI,EAAGH,EAAGO,EAAYhQ,EAAIkQ,EAAIjQ,EAAIyE,IAjC1C8K,CAAU,EAAGH,EAAGhqB,EAAOtoB,MAAOsoB,EAAO2a,GAAI3a,EAAOmnB,GAAInnB,EAAO4a,GAAI5a,EAAOqf,KA4ChEoI,EAAAjwC,UAAA2kC,MAAP,SAAanc,GAYZ,IAXA,IAMCuhB,EANG5G,EAAK3a,EAAO2a,GACZC,EAAK5a,EAAO4a,GACZuM,EAAKnnB,EAAOmnB,GACZ9H,EAAKrf,EAAOqf,GAEZ0K,EAAQ/pB,EAAO4T,SAElBnpB,GAAK,EACLu/B,EAAID,EAAM5qC,OACVorC,EAAIvqB,EAAOtoB,QAAU2nC,EAAK8H,GAAMnnB,EAAOtoB,QAE/B+S,EAAIu/B,IACZzI,EAAOwI,EAAMtmC,SAASgH,IAASkwB,GAAKA,EAAI4G,EAAK3G,GAAKA,EAClD2G,EAAK4F,GAAKA,EAAI5F,EAAKlC,GAAK8H,GAAM5F,EAAK7pC,MAAQ6yC,GAUtC9C,EAAAjwC,UAAAmyC,KAAP,SAAY3pB,GAYX,IAXA,IAMCuhB,EANG5G,EAAK3a,EAAO2a,GACZC,EAAK5a,EAAO4a,GACZuM,EAAKnnB,EAAOmnB,GACZ9H,EAAKrf,EAAOqf,GAEZ0K,EAAQ/pB,EAAO4T,SAElBnpB,GAAK,EACLu/B,EAAID,EAAM5qC,OACVorC,EAAIvqB,EAAOtoB,QAAUkjC,EAAKD,GAAM3a,EAAOtoB,QAE/B+S,EAAIu/B,IACZzI,EAAOwI,EAAMtmC,SAASgH,IAAS08B,GAAKA,EAAI5F,EAAKlC,GAAKA,EAClDkC,EAAK5G,GAAKA,EAAI4G,EAAK3G,GAAKD,GAAM4G,EAAK7pC,MAAQ6yC,GAUtC9C,EAAAjwC,UAAAoyC,UAAP,SAAiB5pB,GACD,EAAfA,EAAOunB,MAAYrwC,KAAKilC,MAAMnc,GAAU9oB,KAAKyyC,KAAK3pB,IAS5CynB,EAAAjwC,UAAAmwC,SAAP,SAAgB3nB,GAwBf,IAvBA,IAQI8qB,EAIA9L,EACAC,EAEA8L,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EArBAC,GAAS,EAAIpxC,KAAKqxC,KAAK,IAAM,EAE7B5Q,EAAK3a,EAAO2a,GACZC,EAAK5a,EAAO4a,GACZuM,EAAKnnB,EAAOmnB,GACZ9H,EAAKrf,EAAOqf,GAEZ0K,EAAQ/pB,EAAO4T,SAEf4X,EAAK,EACLC,EAAK,EACLzB,EAAID,EAAM5qC,OAGVzH,EAAQsoB,EAAOtoB,MASZ8zC,EAAKxB,GAAG,CACdhL,EAAKpE,EAAKD,EAAIsE,EAAKI,EAAK8H,EAGxB,GAAG4D,EAAWhB,EAAMtmC,SAASgoC,KAAM/zC,aAAeqzC,GAAYU,EAAKzB,GAOnE,IANAgB,EAAWC,EAAWF,EAEtBM,EAAON,EAAWA,GADlBK,EAAQlxC,KAAKgB,IAAI+jC,EAAKD,EAAIA,EAAKC,IAAOvnC,EAAQ4zC,IAE9CH,EAAWjxC,KAAKgB,IAAI+vC,EAAWI,EAAMA,EAAOL,GAGrCS,EAAKzB,IAAKyB,EAAI,CAUpB,GATAV,GAAYD,EAAYf,EAAMtmC,SAASgoC,GAAI/zC,MACvCozC,EAAYE,IACfA,EAAWF,GAERA,EAAYG,IACfA,EAAWH,GAEZO,EAAON,EAAWA,EAAWK,GAC7BF,EAAWhxC,KAAKgB,IAAI+vC,EAAWI,EAAMA,EAAOL,IAC7BG,EAAU,CACxBJ,GAAYD,EAAW,MAExBK,EAAWD,EAIZ,IAAIQ,EAAMx0C,KAAK2F,UAAUmJ,SAASyc,QAClCipB,EAAIh0C,MAAQqzC,EACZW,EAAI/B,KAAO3K,EAAKC,EAChByM,EAAI9X,SAAWmW,EAAM5N,MAAMqP,EAAIC,GAC/BC,EAAI/Q,GAAKA,EACT+Q,EAAIvE,GAAKA,EACTuE,EAAI9Q,GAAKA,EACT8Q,EAAIrM,GAAKA,EAELqM,EAAI/B,MACP+B,EAAIrM,GAAK3nC,EAAQyvC,GAAMlI,EAAK8L,EAAWrzC,EAAQ2nC,EAC/CnoC,KAAKyyC,KAAK+B,KAGVA,EAAI9Q,GAAKljC,EAAQijC,GAAMqE,EAAK+L,EAAWrzC,EAAQkjC,EAC/C1jC,KAAKilC,MAAMuP,IAEZh0C,GAASqzC,EAAUS,EAAKC,IAUnBhE,EAAAjwC,UAAAm0C,0BAAP,SAAiC/xC,EAA8ByX,GAClD,SAARA,GACHna,KAAK+R,uBAIAw+B,EAAAjwC,UAAAghB,iCAAP,SAAwC5e,EAA8ByX,GACzD,SAARA,GACHna,KAAK+R,uBAQAw+B,EAAAjwC,UAAAo0C,WAAP,WACC,IAAIC,EAAS30C,KAAK20C,OAClB,GAAIA,EAAQ,CACX,IAAIC,KAEJxvC,EAAA,KAAWpF,KAAKqF,OAAOC,WAAY,SAACD,GACf,GAAhBA,EAAOgrC,QACLhrC,EAAOwvC,gBACXD,EAAWpjC,KAAKnM,MAKnBsvC,EAAO56B,WAAWI,KAAO,OACzBw6B,EAAO96B,KAAO+6B,IAOTrE,EAAAjwC,UAAAoa,YAAP,WAEC9a,EAAAU,UAAMoa,YAAW3a,KAAAC,MAEjBA,KAAKoxC,mBAAgBvpC,EAErB7H,KAAKqF,OAAOoC,QAERzH,KAAKsxC,eACRtxC,KAAKsxC,cAAc52B,cAGpB1a,KAAKiR,MAAMyJ,cACX1a,KAAKmR,MAAMuJ,eAGb61B,EAp+BA,CAA6BtmB,GA4+B7BhpB,EAAA,EAASC,kBAA2B,QAAIovC,GC52CxC,IAAAwE,GAAA,SAAAl1C,GA6BC,SAAAm1C,IAAA,IAAAj1C,EACCF,EAAAG,KAAAC,OAAOA,YAREF,EAAA0a,OAAS,IAAInC,EAAA,EAStBvY,EAAKG,UAAY,kBAEjBH,EAAKkT,WAAWxB,KAAK1R,EAAK0a,QAE1B1a,EAAKI,eA0EP,OA7GqCC,EAAA,EAAA40C,EAAAn1C,GA8C7Bm1C,EAAAz0C,UAAAgL,kBAAP,SAAyBD,EAAYP,EAAkB3C,GACtD2C,IAAuB3C,EAAc2C,GAAYO,EAAKO,SACtD,IAAIkB,EAAgB9M,KAAK+M,gBAAgBjC,GAEzC,GAAIO,EAAK4d,QAAS,CAEjB,IAAI6e,EAAa9nC,KAAK0R,MAAMsjC,KACxBjN,EAAa/nC,KAAK0R,MAAMujC,KAExB5tB,EAAYrnB,KAAKk1C,YAErB7pC,EAAK4Q,KAAOC,EAAA,QAAerW,EAAGiiC,EAAI56B,EAAG66B,IAAQ7rB,EAAA,QAAerW,EAAGiiC,EAAI56B,EAAGma,EAAI0gB,IAAQ7rB,EAAA,QAAerW,EAAG,EAAGqH,EAAGma,IAE3GrnB,KAAKohC,aAAa/1B,EAAMyB,GAExB9M,KAAK+/B,iBAAiB10B,EAAMP,EAAU,EAAG,IAQnCiqC,EAAAz0C,UAAA+gC,sBAAP,WACCzhC,EAAAU,UAAM+gC,sBAAqBthC,KAAAC,MAE3B,IAAIqnB,EAAIrnB,KAAKk1C,YACTpN,EAAK9nC,KAAK0R,MAAMsjC,KAChBjN,EAAK/nC,KAAK0R,MAAMujC,KACpBj1C,KAAKkQ,SAAS+L,KAAOC,EAAA,QAAerW,EAAGiiC,EAAI56B,EAAG66B,IAAQ7rB,EAAA,QAAerW,EAAGiiC,EAAI56B,EAAGma,EAAI0gB,IAAQ7rB,EAAA,QAAerW,EAAG,EAAGqH,EAAGma,KASpHjnB,OAAAC,eAAW00C,EAAAz0C,UAAA,aAUX,WACC,OAAON,KAAKwa,OAAOkC,WAXpB,SAAiBhL,GACZA,GACH1R,KAAKwa,OAAOwC,IAAItL,EAAOA,EAAMyH,OAAOC,GAAG,kBAAmBpZ,KAAKm1C,gBAAiBn1C,MAAM,qCAiB9E+0C,EAAAz0C,UAAA60C,gBAAV,SAA0B3xB,GACH,SAAlBA,EAAMmG,UAAyC,SAAlBnG,EAAMmG,UACtC3pB,KAAKa,cAIRk0C,EA7GA,CAAqC7nB,EAAA,GAqHrCjsB,EAAA,EAASC,kBAAmC,gBAAI4zC,GCtHhD,IAAAM,GAAA,SAAAx1C,GA6BC,SAAAy1C,IAAA,IAAAv1C,EACCF,EAAAG,KAAAC,OAAOA,YAREF,EAAA0a,OAAS,IAAInC,EAAA,EAStBvY,EAAKG,UAAY,kBACjBH,EAAKkT,WAAWxB,KAAK1R,EAAK0a,QAC1B1a,EAAKI,eA0EP,OA3GqCC,EAAA,EAAAk1C,EAAAz1C,GA4C7By1C,EAAA/0C,UAAAgL,kBAAP,SAAyBD,EAAYP,EAAkB3C,GACtD2C,IAAuB3C,EAAc2C,GAAYO,EAAKO,SAEtD,IAAIkB,EAAgB9M,KAAK+M,gBAAgBjC,GACzC,GAAIO,EAAK4d,QAAS,CAEjB,IAAI6e,EAAa9nC,KAAK0R,MAAMsjC,KACxBjN,EAAa/nC,KAAK0R,MAAMujC,KAExB9tB,EAAYnnB,KAAKs1C,WAErBjqC,EAAK4Q,KAAOC,EAAA,QAAerW,EAAG,EAAGqH,EAAG,IAAOgP,EAAA,QAAerW,EAAGiiC,EAAI56B,EAAG66B,IAAQ7rB,EAAA,QAAerW,EAAGshB,EAAI2gB,EAAI56B,EAAG66B,IAE1G/nC,KAAKohC,aAAa/1B,EAAMyB,GAExB9M,KAAK+/B,iBAAiB10B,EAAMP,EAAU,EAAG,IAQnCuqC,EAAA/0C,UAAA+gC,sBAAP,WACCzhC,EAAAU,UAAM+gC,sBAAqBthC,KAAAC,MAE3B,IAAImnB,EAAYnnB,KAAKs1C,WACrBt1C,KAAKkQ,SAAS+L,KAAOC,EAAA,QAAerW,EAAG,EAAGqH,EAAG,IACzCgP,EAAA,QAAerW,EAAGshB,EAAGja,EAAG,IACxBgP,EAAA,QAAerW,EAAGshB,EAAInnB,KAAK0R,MAAMsjC,KAAM9nC,EAAGlN,KAAK0R,MAAMujC,QAS1D70C,OAAAC,eAAWg1C,EAAA/0C,UAAA,aAUX,WACC,OAAON,KAAKwa,OAAOkC,WAXpB,SAAiBhL,GACZA,GACH1R,KAAKwa,OAAOwC,IAAItL,EAAOA,EAAMyH,OAAOC,GAAG,kBAAmBpZ,KAAKm1C,gBAAiBn1C,MAAM,qCAiB9Eq1C,EAAA/0C,UAAA60C,gBAAV,SAA0B3xB,GACH,SAAlBA,EAAMmG,UAAyC,SAAlBnG,EAAMmG,UACtC3pB,KAAKa,cAIRw0C,EA3GA,CAAqCjoB,EAAA,gBCjCrCmoB,GAAA,SAAA31C,GAUC,SAAA41C,IAAA,IAAA11C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,yBACjBH,EAAKI,eAGP,OAhB4CC,EAAA,EAAAq1C,EAAA51C,GAgB5C41C,EAhBA,CAA4C7K,IAgF5C8K,GAAA,SAAA71C,GA+CC,SAAA81C,IAAA,IAAA51C,EACCF,EAAAG,KAAAC,OAAOA,YAEPF,EAAKG,UAAY,iBAEjBH,EAAKmrC,QAAQn8B,SAAS6mC,SAASrc,eAAgB,EAC/Cx5B,EAAKmrC,QAAQn8B,SAASsS,YAAY3O,WAAW6L,SAAU,EAEvDxe,EAAKI,eA4FP,OAnJoCC,EAAA,EAAAu1C,EAAA91C,GA6DnCQ,OAAAC,eAAWq1C,EAAAp1C,UAAA,wBAAX,WACC,OAAIN,KAAK0R,OAAS1R,KAAK0R,MAAM85B,iBACrBxrC,KAAK0R,MAAM85B,iBAGXxrC,KAAKyrC,mDAUPiK,EAAAp1C,UAAAwrC,wBAAP,SAA+BppC,GAC9B9C,EAAAU,UAAMwrC,wBAAuB/rC,KAAAC,KAAC0C,GAC3BA,EAASooC,SACXpoC,EAASooC,OAAOhD,GAAK9nC,KAAK8nC,GAC1BplC,EAASooC,OAAO/C,GAAK/nC,KAAK+nC,KAUrB2N,EAAAp1C,UAAA+gB,qBAAP,WACCzhB,EAAAU,UAAM+gB,qBAAoBthB,KAAAC,MACvBA,KAAK0R,OACP1R,KAAK0R,MAAMmD,oBASH6gC,EAAAp1C,UAAA0uC,qBAAV,WACC,OAAO,IAAI4G,GAAA,GAWZx1C,OAAAC,eAAWq1C,EAAAp1C,UAAA,aAUX,WACC,OAAON,KAAKO,iBAAiB,cAX9B,SAAiBC,GAChBR,KAAKS,iBAAiB,QAASD,GAAO,GACvBR,KAAKirC,QAAQn8B,SACnB6mC,SAASzQ,MAAQ1kC,mCAiB3BJ,OAAAC,eAAWq1C,EAAAp1C,UAAA,aAUX,WACC,OAAON,KAAKO,iBAAiB,cAX9B,SAAiBC,GAChBR,KAAKS,iBAAiB,QAASD,GAChBR,KAAKirC,QAAQn8B,SACnB6mC,SAAS3oC,MAAQxM,mCAU5Bk1C,EAnJA,CAAoCvK,IA2JpClqC,EAAA,EAASC,kBAAkC,eAAIu0C,GAC/Cx0C,EAAA,EAASC,kBAA0C,uBAAIq0C,GClOvD,IAAAM,GAAA,SAAAj2C,GAEC,SAAAk2C,IAAA,IAAAh2C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,oBACjBH,EAAKI,eAGP,OARuCC,EAAA,EAAA21C,EAAAl2C,GAQvCk2C,EARA,CAAuCjpB,GAoEvCkpB,GAAA,SAAAn2C,GA0CC,SAAAo2C,IAAA,IAAAl2C,EAGCF,EAAAG,KAAAC,OAAOA,KApBEF,EAAAmtB,eAAyC6nB,GAKzCh1C,EAAAqtB,eAAyCioB,GAgBlDt1C,EAAKG,UAAY,YAGjBH,EAAKolC,MAAQ,GACbplC,EAAKkN,MAAQ,GAGb,IAAIw+B,EAAmB1rC,EAAK2uB,gBAAgBjI,YAAYV,EAAA,UACxD0lB,EAAiBzoB,aAAc,EAC/ByoB,EAAiB/yB,YAAa,EAC9B+yB,EAAiBhe,OAAS,OAC1B1tB,EAAK0rC,iBAAmBA,EAExB1rC,EAAK0rC,iBAAiB//B,KAAO3L,EAAK0mB,YAAY5N,EAAA,GAG9C9Y,EAAKI,eA6KP,OA3O+BC,EAAA,EAAA61C,EAAAp2C,GAuE9BQ,OAAAC,eAAW21C,EAAA11C,UAAA,aASX,WACC,OAAON,KAAKO,iBAAiB,cAV9B,SAAiBC,GAChBR,KAAKS,iBAAiB,QAASD,GAC/BR,KAAKi2C,YACLj2C,KAAK0lC,uDAgBNtlC,OAAAC,eAAW21C,EAAA11C,UAAA,aASX,WACC,OAAON,KAAKO,iBAAiB,cAV9B,SAAiBC,GAChBR,KAAKS,iBAAiB,QAASD,GAC/BR,KAAKi2C,YACLj2C,KAAK0lC,uDAgBNtlC,OAAAC,eAAW21C,EAAA11C,UAAA,YAAX,WACC,OAAO8J,EAAA,IAAUpK,KAAKgN,OAAShN,KAAKklC,uCASrC9kC,OAAAC,eAAW21C,EAAA11C,UAAA,YAAX,WACC,OAAQ8J,EAAA,IAAUpK,KAAKgN,OAAShN,KAAKklC,uCAQ/B8Q,EAAA11C,UAAAqyC,eAAP,WACC/yC,EAAAU,UAAMqyC,eAAc5yC,KAAAC,MACpBA,KAAKk2C,cAOIF,EAAA11C,UAAA21C,UAAV,WAECj2C,KAAKutB,eAAewB,WAAa/uB,KAAKi1C,KACtCj1C,KAAKutB,eAAeoC,aAAe3vB,KAAKg1C,KAEpCh1C,KAAKuwB,aACRvwB,KAAKuwB,WAAWwX,GAAK/nC,KAAKi1C,KAC1Bj1C,KAAKuwB,WAAWuX,GAAK9nC,KAAKg1C,MAGvBh1C,KAAK6wB,aACR7wB,KAAK6wB,WAAWkX,GAAK/nC,KAAKi1C,KAC1Bj1C,KAAK6wB,WAAWiX,GAAK9nC,KAAKg1C,MAG3Bh1C,KAAKk2C,aAELt2C,EAAAU,UAAM21C,UAASl2C,KAAAC,OAONg2C,EAAA11C,UAAA41C,WAAV,eAAAp2C,EAAAE,KACKoC,EAAgB,EAChBmR,EAAI,EACRnO,EAAA,KAAWpF,KAAKqF,OAAOC,WAAY,SAACD,GAC/BA,aAAkBowC,MAEhBpwC,EAAOkmC,WAAah4B,EAAI,GAC5BnR,IAGDiD,EAAO8wC,WAAa/zC,EAAQ,EAC5BmR,OAIF,IAAI6iC,EAAY,EAEhBhxC,EAAA,KAAWpF,KAAKqF,OAAOC,WAAY,SAACD,GACnC,GAAIA,aAAkBowC,GAAgB,CAErCpwC,EAAO6/B,MAAQplC,EAAKolC,MAAQ,EAC5B7/B,EAAO2H,MAAQlN,EAAKkN,MACpB3H,EAAOyiC,GAAKhoC,EAAKolC,MAAQ,EAAU96B,EAAA,IAAUtK,EAAKkN,OAAU3H,EAAiB,WAC7EA,EAAO0iC,IAAMjoC,EAAKolC,MAAQ,EAAU96B,EAAA,IAAUtK,EAAKkN,OAAU3H,EAAiB,WAE9E,IAAIgxC,EAAY,EAChBhxC,EAAO4lC,QAAQ5kC,KAAK,SAACykC,GACpBA,EAAOpd,OAAS,IAAO2oB,EAAID,EAAwB,IAApB/wC,EAAO8wC,WACtCE,MAGDD,OAGFp2C,KAAKs2C,eASCN,EAAA11C,UAAA2hB,cAAP,SAAqBC,GAEpB,GAAIA,GAGCjc,EAAA,SAAeic,EAAO7c,SAAWY,EAAA,QAAcic,EAAO7c,QACzD,IAAK,IAAIkO,EAAI,EAAGe,EAAM4N,EAAO7c,OAAO4C,OAAQsL,EAAIe,EAAKf,IACpD2O,EAAO7c,OAAOkO,GAAG2L,KAAOgD,EAAO7c,OAAOkO,GAAG2L,MAAQ,iBAMpDtf,EAAAU,UAAM2hB,cAAaliB,KAAAC,KAACkiB,IAIX8zB,EAAA11C,UAAAg2C,YAAV,WACC,IAAInvB,EAAYnnB,KAAK4lB,cAAc2B,WAC/BF,EAAYrnB,KAAK4lB,cAAc0B,YAE/BwgB,EAAa9nC,KAAKg1C,KAClBjN,EAAa/nC,KAAKi1C,KAElBh5B,EAAOC,EAAA,QAAerW,EAAG,EAAGqH,EAAG,IAAOgP,EAAA,QAAerW,EAAGiiC,EAAI56B,EAAG66B,IAAQ7rB,EAAA,QAAerW,EAAGshB,EAAI2gB,EAAI56B,EAAG66B,IAAQ7rB,EAAA,QAAerW,EAAGshB,EAAI2gB,EAAI56B,EAAGma,EAAI0gB,IAAQ7rB,EAAA,QAAerW,EAAGshB,EAAGja,EAAGma,IAAOnL,EAAA,QAAerW,EAAGshB,EAAGja,EAAGma,IAAOnL,EAAA,QAAerW,EAAG,EAAGqH,EAAGma,IAAOnL,EAAA,YAElPsvB,EAAmBxrC,KAAKwrC,iBACxBA,GAAoBA,EAAiB//B,OACxC+/B,EAAiB//B,KAAKwQ,KAAOA,IAGhC+5B,EA3OA,CAA+B/rB,GAmP/BhpB,EAAA,EAASC,kBAA6B,UAAI60C,8CClS1CQ,GAAA,SAAA32C,GA8BC,SAAA42C,IAAA,IAAA12C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,cACjBH,EAAK0tB,OAAS,SA+BhB,OAhEiCrtB,EAAA,EAAAq2C,EAAA52C,GAuCtB42C,EAAAl2C,UAAAm2C,aAAV,WACC72C,EAAAU,UAAMm2C,aAAY12C,KAAAC,MAElBA,KAAK02C,QAAU12C,KAAKwmB,YAAY0V,EAAA,GAChCl8B,KAAK02C,QAAQ3zB,aAAc,EAE3B/iB,KAAK22C,SAAW32C,KAAKwmB,YAAY0V,EAAA,GACjCl8B,KAAK22C,SAAS5zB,aAAc,GAQtByzB,EAAAl2C,UAAAoQ,SAAP,SAAgBC,GACf/Q,EAAAU,UAAMoQ,SAAQ3Q,KAAAC,KAAC2Q,GACX3Q,KAAK02C,SACR12C,KAAK02C,QAAQhmC,SAASC,EAAO+lC,SAE1B12C,KAAK22C,UACR32C,KAAK22C,SAASjmC,SAASC,EAAOgmC,WAIjCH,EAhEA,CAAiCvH,GAAA,GAwEjChuC,EAAA,EAASC,kBAA+B,YAAIq1C,GC5F5C,IAAAK,GAAA,SAAAh3C,GAgBC,SAAAi3C,IAAA,IAAA/2C,EACCF,EAAAG,KAAAC,OAAOA,YAEPF,EAAKuB,OAAOy1C,aACZh3C,EAAKuB,OAAO01C,aACZj3C,EAAKuB,OAAO21C,cACZl3C,EAAKuB,OAAO41C,cAEZn3C,EAAKG,UAAY,4BAEjBH,EAAKI,eAsGP,OAhI+CC,EAAA,EAAA02C,EAAAj3C,GAkC9CQ,OAAAC,eAAWw2C,EAAAv2C,UAAA,iBAOX,WACC,OAAON,KAAKqB,OAAOy1C,UAAUt2C,WAR9B,SAAqBA,GACpBR,KAAKsX,SAAS,YAAa9W,oCAe5BJ,OAAAC,eAAWw2C,EAAAv2C,UAAA,iBAOX,WACC,OAAON,KAAKqB,OAAO01C,UAAUv2C,WAR9B,SAAqBA,GACpBR,KAAKsX,SAAS,YAAa9W,oCAe5BJ,OAAAC,eAAWw2C,EAAAv2C,UAAA,kBAOX,WACC,OAAON,KAAKqB,OAAO21C,WAAWx2C,WAR/B,SAAsBA,GACrBR,KAAKsX,SAAS,aAAc9W,oCAe7BJ,OAAAC,eAAWw2C,EAAAv2C,UAAA,kBAOX,WACC,OAAON,KAAKqB,OAAO41C,WAAWz2C,WAR/B,SAAsBA,GACrBR,KAAKsX,SAAS,aAAc9W,oCAiB7BJ,OAAAC,eAAWw2C,EAAAv2C,UAAA,mBAOX,WACC,OAAON,KAAKqB,OAAO0V,OAAOvW,WAR3B,SAAuBA,GACtBR,KAAKsX,SAAS,SAAU9W,oCAiBzBJ,OAAAC,eAAWw2C,EAAAv2C,UAAA,mBAOX,WACC,OAAON,KAAKqB,OAAO2V,OAAOxW,WAR3B,SAAuBA,GACtBR,KAAKsX,SAAS,SAAU9W,oCAS1Bq2C,EAhIA,CAA+ClM,IA0N/CuM,GAAA,SAAAt3C,GAuDC,SAAAu3C,IAAA,IAAAr3C,EACCF,EAAAG,KAAAC,OAAOA,KACPF,EAAKG,UAAY,oBAEjBH,EAAKinB,cAAgB,EAErB,IAAIV,EAAkB,IAAIC,EAAA,EACtB8wB,EAAgB/wB,EAAgBK,OAAO,YACvC2wB,EAAgBhxB,EAAgBK,OAAO,mBAE3C5mB,EAAKw3C,kBAAkB7kC,WAAWlH,KAAO8rC,EACzCv3C,EAAKw3C,kBAAkB7kC,WAAWmU,OAASywB,EAE3Cv3C,EAAKy3C,kBAAkB9kC,WAAWlH,KAAO6rC,EACzCt3C,EAAKy3C,kBAAkB9kC,WAAWmU,OAASwwB,EAE3Ct3C,EAAKI,eAmQP,OA1UuCC,EAAA,EAAAg3C,EAAAv3C,GA8E5Bu3C,EAAA72C,UAAA+C,sBAAV,WACCzD,EAAAU,UAAM+C,sBAAqBtD,KAAAC,MACtBiG,EAAA,SAAejG,KAAKsZ,eACxBtZ,KAAKsZ,YAActZ,KAAKwD,SAASC,UAAU,wBAUnC0zC,EAAA72C,UAAAoD,eAAV,WACC,OAAO,IAAIkzC,IASLO,EAAA72C,UAAAwrC,wBAAP,SAA+BppC,GAC9B9C,EAAAU,UAAMwrC,wBAAuB/rC,KAAAC,KAAC0C,GAC9B1C,KAAKw3C,oBAAoB90C,IAGhBy0C,EAAA72C,UAAAk3C,oBAAV,SAA8B90C,GAC7B,IAAIooC,EAAsBpoC,EAASooC,OACnC,GAAIA,EAAQ,CACX,IAAI2M,EAAU3M,EAAO4L,QACjBgB,EAAW5M,EAAO6L,SAEtB,GAAI32C,KAAKuF,UAAYvF,KAAKiR,MAAO,CAChC,IAAIpL,EAAYilC,EAAOvjB,WAAa,EAEpCkwB,EAAQ5xC,EAAIA,EACZ6xC,EAAS7xC,EAAIA,EAEb,IAAIyoC,EAAO5rC,EAASqV,gBAAgB/X,KAAKmb,YACrCw8B,EAAQj1C,EAASqV,gBAAgB/X,KAAKkb,QAEtC08B,EAAQ53C,KAAKmR,MAAMzD,KAAKhL,EAAU1C,KAAKmb,YACvC08B,EAAS73C,KAAKmR,MAAMzD,KAAKhL,EAAU1C,KAAKkb,QACxC48B,EAAO93C,KAAKmR,MAAMzD,KAAKhL,EAAU1C,KAAK+3C,WACtCC,EAAQh4C,KAAKmR,MAAMzD,KAAKhL,EAAU1C,KAAKi4C,YAEvC37B,EAASwuB,EAAOxuB,OAEpBm7B,EAAQtP,GAAK2P,EAAOx7B,EACpBo7B,EAASvP,GAAK6P,EAAQ17B,EAElBgyB,EAAOqJ,GACVF,EAAQrP,GAAKwP,EAAQt7B,EACrBo7B,EAAStP,GAAKyP,EAASv7B,IAGvBm7B,EAAQrP,GAAKyP,EAASv7B,EACtBo7B,EAAStP,GAAKwP,EAAQt7B,GAIxB,GAAItc,KAAKuF,UAAYvF,KAAKmR,MAAO,CAChC,IAAIjE,EAAY49B,EAAOxjB,YAAc,EAErCmwB,EAAQvqC,EAAIA,EACZwqC,EAASxqC,EAAIA,EAEb,IAAIgrC,EAAOx1C,EAASqV,gBAAgB/X,KAAK+a,YACrCo9B,EAAQz1C,EAASqV,gBAAgB/X,KAAK8a,QAEtCs9B,EAAQp4C,KAAKiR,MAAM1D,KAAK7K,EAAU1C,KAAK+a,YACvCs9B,EAASr4C,KAAKiR,MAAM1D,KAAK7K,EAAU1C,KAAK8a,QACxCw9B,EAAOt4C,KAAKiR,MAAM1D,KAAK7K,EAAU1C,KAAKu4C,WACtCC,EAAQx4C,KAAKiR,MAAM1D,KAAK7K,EAAU1C,KAAKy4C,YAEvCl8B,EAASuuB,EAAOvuB,OAEpBk7B,EAAQ/T,GAAK4U,EAAO/7B,EACpBm7B,EAAShU,GAAK8U,EAAQj8B,EAElB27B,EAAOC,GACVV,EAAQtb,GAAKic,EAAQ77B,EACrBm7B,EAASvb,GAAKkc,EAAS97B,IAGvBk7B,EAAQtb,GAAKkc,EAAS97B,EACtBm7B,EAASvb,GAAKic,EAAQ77B,GAIxBnX,EAAA,KAAWpF,KAAK8b,WAAWxW,WAAY,SAAC2vB,GAEvC,IAAIiZ,EAAcxrC,EAASyrC,cAAcpnC,OAAOkuB,EAAU3uB,KAC1D,GAAI4nC,EAAa,CAChB,IAAIwK,EAAexK,EAAYwI,QAC/BgC,EAAa7yC,EAAI4xC,EAAQ5xC,EACzB6yC,EAAaxrC,EAAIuqC,EAAQvqC,EACzBwrC,EAAahV,GAAK+T,EAAQ/T,GAC1BgV,EAAavc,GAAKsb,EAAQtb,GAC1Buc,EAAavQ,GAAKsP,EAAQtP,GAC1BuQ,EAAatQ,GAAKqP,EAAQrP,GAG1B,IAAIuQ,EAAgBzK,EAAYyI,SAChCgC,EAAc9yC,EAAI6xC,EAAS7xC,EAC3B8yC,EAAczrC,EAAIwqC,EAASxqC,EAC3ByrC,EAAcjV,GAAKgU,EAAShU,GAC5BiV,EAAcxc,GAAKub,EAASvb,GAC5Bwc,EAAcxQ,GAAKuP,EAASvP,GAC5BwQ,EAAcvQ,GAAKsP,EAAStP,QAYhChoC,OAAAC,eAAW82C,EAAA72C,UAAA,iBAAX,WACC,OAAON,KAAK44C,4CASbx4C,OAAAC,eAAW82C,EAAA72C,UAAA,iBAAX,WACC,OAAON,KAAK64C,4CASbz4C,OAAAC,eAAW82C,EAAA72C,UAAA,kBAAX,WACC,OAAON,KAAK84C,6CASb14C,OAAAC,eAAW82C,EAAA72C,UAAA,kBAAX,WACC,OAAON,KAAK+4C,6CAMH5B,EAAA72C,UAAAsZ,aAAV,WAGC,GAFAha,EAAAU,UAAMsZ,aAAY7Z,KAAAC,MAEdA,KAAKuF,UAAYvF,KAAKiR,MAAO,CAChC,IAAIgK,EAAyBD,EAAA,WAAkBhb,KAAKmR,MAAM3O,eAC1DxC,KAAK64C,WAAgD,MAAQ59B,EAAiB,IAC9Ejb,KAAK+4C,YAAiD,OAAS99B,EAAiB,IAGjF,GAAIjb,KAAKuF,UAAYvF,KAAKmR,MAAO,CAChC,IAAI0J,EAAyBG,EAAA,WAAkBhb,KAAKiR,MAAMzO,eAC1DxC,KAAK44C,WAAgD,MAAQ/9B,EAAiB,IAC9E7a,KAAK84C,YAAiD,OAASj+B,EAAiB,IAGjF7a,KAAKsb,cAActb,KAAKiR,MAAYjR,KAAKuY,cAAoBvY,KAAK44C,YAClE54C,KAAKsb,cAActb,KAAKiR,MAAYjR,KAAKuY,cAAoBvY,KAAK84C,aAElE94C,KAAKsb,cAActb,KAAKmR,MAAYnR,KAAKwY,cAAoBxY,KAAK64C,YAClE74C,KAAKsb,cAActb,KAAKmR,MAAYnR,KAAKwY,cAAoBxY,KAAK+4C,cAU5D5B,EAAA72C,UAAAy7B,mBAAP,SAA0BC,GAEzB,IAAI7U,EAAY6U,EAAOzU,WACnBF,EAAY2U,EAAO1U,YAEvB0U,EAAOoT,iBAEP,IAII4J,EACAC,EALAnO,EAAsB9O,EAAOxV,YAAY+vB,IAC7CzL,EAAO/nB,aAAc,EACrB+nB,EAAOp6B,SAAc1Q,KAAKirC,QAAQn8B,UAKlC,IAAI6nC,EAAiB7L,EAAO4L,QACxBA,EAAgB5L,EAAO6L,SAEvB32C,KAAKuF,UAAYvF,KAAKmR,OACzB6nC,EAAK7xB,EAAI,EACT8xB,EAAK5xB,EAELsvB,EAASzpC,EAAIma,EAAI,EACjBqvB,EAAQxpC,EAAIma,EAAI,EAEhBsvB,EAASxa,GAAKhV,EAAI,EAClBuvB,EAAQva,GAAKhV,EAAI,EACjBuvB,EAAQ7wC,EAAIshB,EAAI,EAAI,EACpB2jB,EAAOA,OAAOjlC,EAAIshB,EAAI,IAGtB6xB,EAAK7xB,EACL8xB,EAAK5xB,EAAI,EACTsvB,EAAS9wC,EAAIshB,EAAI,EACjBuvB,EAAQ7wC,EAAIshB,EAAI,EAEhBwvB,EAASvO,GAAK/gB,EAAI,EAClBqvB,EAAQtO,GAAK/gB,EAAI,EACjBqvB,EAAQxpC,EAAIma,EAAI,EAAI,EACpByjB,EAAOA,OAAO59B,EAAIma,EAAI,GAEvByjB,EAAO3uB,MAAQ68B,EACflO,EAAO1uB,OAAS68B,EAEhBjyC,EAAA,eAAuBhH,KAAMg8B,EAAQpjB,EAAA,GACrC5R,EAAA,eAAuBhH,KAAKirC,QAAQn8B,SAAUg8B,EAAQlyB,EAAA,GAEtDkyB,EAAOlkB,OAAS5mB,KAAKu3C,kBAAkB9kC,WAAWmU,OAClDkkB,EAAOv/B,KAAOu/B,EAAOlkB,OAErB,IAAIyV,EAAiCL,EAAOt5B,SAC5C25B,EAAeC,MAAQwO,EAAOv/B,KAC9B8wB,EAAeE,UAAYuO,EAAOv/B,MAQzB4rC,EAAA72C,UAAA0uC,qBAAV,WACC,OAAO,IAAIuH,IAGbY,EA1UA,CAAuChM,IAkVvClqC,EAAA,EAASC,kBAAqC,kBAAIg2C,GAClDj2C,EAAA,EAASC,kBAA6C,0BAAI01C,GCzhB1D,IAAAsC,GAAA,SAAAt5C,GAoCC,SAAAu5C,IAAA,IAAAr5C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,OACjBH,EAAK0tB,OAAS,SAoChB,OA3E0BrtB,EAAA,EAAAg5C,EAAAv5C,GA4Cfu5C,EAAA74C,UAAAm2C,aAAV,WAGCz2C,KAAKo5C,SAAWp5C,KAAKwmB,YAAY0V,EAAA,GACjCl8B,KAAKo5C,SAASr2B,aAAc,EAE5B/iB,KAAKq5C,YAAcr5C,KAAKwmB,YAAY0V,EAAA,GACpCl8B,KAAKq5C,YAAYt2B,aAAc,EAE/B/iB,KAAKs5C,UAAYt5C,KAAKwmB,YAAY0V,EAAA,GAClCl8B,KAAKs5C,UAAUv2B,aAAc,GAQvBo2B,EAAA74C,UAAAoQ,SAAP,SAAgBC,GACf/Q,EAAAU,UAAMoQ,SAAQ3Q,KAAAC,KAAC2Q,GACX3Q,KAAKo5C,UACRp5C,KAAKo5C,SAAS1oC,SAASC,EAAOyoC,UAE3Bp5C,KAAKq5C,aACRr5C,KAAKq5C,YAAY3oC,SAASC,EAAO0oC,aAE9Br5C,KAAKs5C,WACRt5C,KAAKs5C,UAAU5oC,SAASC,EAAO2oC,YAIlCH,EA3EA,CAA0B5C,IAmF1Bt1C,EAAA,EAASC,kBAAwB,KAAIg4C,GCzGrC,IAAAK,GAAA,SAAA35C,GAgBC,SAAA45C,IAAA,IAAA15C,EACCF,EAAAG,KAAAC,OAAOA,YAEPF,EAAKG,UAAY,qBAEjBH,EAAKI,eAEP,OAvBwCC,EAAA,EAAAq5C,EAAA55C,GAuBxC45C,EAvBA,CAAwC5C,IAuExC6C,GAAA,SAAA75C,GAmCC,SAAA85C,IAAA,IAAA55C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,aAEjBH,EAAKI,eAuMP,OA9OgCC,EAAA,EAAAu5C,EAAA95C,GA8CrB85C,EAAAp5C,UAAA+C,sBAAV,WACCzD,EAAAU,UAAM+C,sBAAqBtD,KAAAC,MACtBiG,EAAA,SAAejG,KAAKsZ,eACxBtZ,KAAKsZ,YAActZ,KAAKwD,SAASC,UAAU,iBAUnCi2C,EAAAp5C,UAAAoD,eAAV,WACC,OAAO,IAAI61C,IAIFG,EAAAp5C,UAAAk3C,oBAAV,SAA8B90C,GAC7B,IAAIooC,EAAepoC,EAASooC,OAC5B,GAAIA,EAAQ,CACX,IAAI6O,EAAW7O,EAAOsO,SAClBQ,EAAc9O,EAAOuO,YACrBQ,EAAY/O,EAAOwO,UAEvB,GAAIt5C,KAAKuF,UAAYvF,KAAKiR,MAAO,CAChC,IAAIpL,EAAYilC,EAAOvjB,WAAa,EACpCqyB,EAAY/zC,EAAIA,EAGhBnD,EAASqV,gBAAgB/X,KAAKmb,YAC9BzY,EAASqV,gBAAgB/X,KAAKkb,QAE9B,IAAI08B,EAAQ53C,KAAKmR,MAAMzD,KAAKhL,EAAU1C,KAAKmb,YACvC08B,EAAS73C,KAAKmR,MAAMzD,KAAKhL,EAAU1C,KAAKkb,QACxC48B,EAAO93C,KAAKmR,MAAMzD,KAAKhL,EAAU1C,KAAK+3C,WACtCC,EAAQh4C,KAAKmR,MAAMzD,KAAKhL,EAAU1C,KAAKi4C,YAEvC37B,EAASwuB,EAAOxuB,OAEpBq9B,EAASxR,GAAKyP,EAAQt7B,EACtBq9B,EAASvR,GAAKwP,EAAQt7B,EACtBq9B,EAASjW,GAAK,EACdiW,EAASxd,GAAKt2B,EAEdg0C,EAAU1R,GAAK0P,EAASv7B,EACxBu9B,EAAUzR,GAAKyP,EAASv7B,EACxBu9B,EAAUnW,GAAK79B,EACfg0C,EAAU1d,GAAK,EAAIt2B,EAEnB+zC,EAAYzR,GAAK6P,EAAQ17B,EACzBs9B,EAAYxR,GAAK0P,EAAOx7B,EAGzB,GAAItc,KAAKuF,UAAYvF,KAAKmR,MAAO,CAChC,IAAIjE,EAAY49B,EAAOxjB,YAAc,EAErCsyB,EAAY1sC,EAAIA,EAGhBxK,EAASqV,gBAAgB/X,KAAK+a,YAC9BrY,EAASqV,gBAAgB/X,KAAK8a,QAE9B,IAAIs9B,EAAQp4C,KAAKiR,MAAM1D,KAAK7K,EAAU1C,KAAK+a,YACvCs9B,EAASr4C,KAAKiR,MAAM1D,KAAK7K,EAAU1C,KAAK8a,QACxCw9B,EAAOt4C,KAAKiR,MAAM1D,KAAK7K,EAAU1C,KAAKu4C,WACtCC,EAAQx4C,KAAKiR,MAAM1D,KAAK7K,EAAU1C,KAAKy4C,YAEvCl8B,EAASuuB,EAAOvuB,OAEpBo9B,EAASjW,GAAK0U,EAAQ77B,EACtBo9B,EAASxd,GAAKic,EAAQ77B,EACtBo9B,EAASxR,GAAKj7B,EACdysC,EAASvR,GAAK,EAAIl7B,EAElB2sC,EAAUnW,GAAK2U,EAAS97B,EACxBs9B,EAAU1d,GAAKkc,EAAS97B,EACxBs9B,EAAU1R,GAAK,EACf0R,EAAUzR,GAAKl7B,EAEf0sC,EAAYlW,GAAK8U,EAAQj8B,EACzBq9B,EAAYzd,GAAKmc,EAAO/7B,EAGzBnX,EAAA,KAAWpF,KAAK8b,WAAWxW,WAAY,SAAC2vB,GAEvC,IAAIiZ,EAAcxrC,EAASyrC,cAAcpnC,OAAOkuB,EAAU3uB,KAC1D,GAAI4nC,EAAa,CAChB,IAAI4L,EAAgB5L,EAAYkL,SAChCU,EAAcj0C,EAAI8zC,EAAS9zC,EAC3Bi0C,EAAc5sC,EAAIysC,EAASzsC,EAC3B4sC,EAAcpW,GAAKiW,EAASjW,GAC5BoW,EAAc3d,GAAKwd,EAASxd,GAC5B2d,EAAc3R,GAAKwR,EAASxR,GAC5B2R,EAAc1R,GAAKuR,EAASvR,GAE5B,IAAI2R,EAAiB7L,EAAYoL,UACjCS,EAAel0C,EAAIg0C,EAAUh0C,EAC7Bk0C,EAAe7sC,EAAI2sC,EAAU3sC,EAC7B6sC,EAAerW,GAAKmW,EAAUnW,GAC9BqW,EAAe5d,GAAK0d,EAAU1d,GAC9B4d,EAAe5R,GAAK0R,EAAU1R,GAC9B4R,EAAe3R,GAAKyR,EAAUzR,GAE9B,IAAI4R,EAAmB9L,EAAYmL,YACnCW,EAAiBn0C,EAAI+zC,EAAY/zC,EACjCm0C,EAAiB9sC,EAAI0sC,EAAY1sC,EACjC8sC,EAAiBtW,GAAKkW,EAAYlW,GAClCsW,EAAiB7d,GAAKyd,EAAYzd,GAClC6d,EAAiB7R,GAAKyR,EAAYzR,GAClC6R,EAAiB5R,GAAKwR,EAAYxR,QAc/BsR,EAAAp5C,UAAAy7B,mBAAP,SAA0BC,GAEzB,IAAI7U,EAAY6U,EAAOzU,WACnBF,EAAY2U,EAAO1U,YAEvB0U,EAAOoT,iBAEP,IAII4J,EACAC,EALAnO,EAAe9O,EAAOxV,YAAY0yB,IACtCpO,EAAO/nB,aAAc,EACrB+nB,EAAOp6B,SAAc1Q,KAAKirC,QAAQn8B,UAKlC,IAAIsqC,EAAiBtO,EAAOsO,SACxBE,EAAkBxO,EAAOwO,UACzBD,EAAoBvO,EAAOuO,YAE3Br5C,KAAKuF,UAAYvF,KAAKmR,OACzB6nC,EAAK7xB,EAAI,EACT8xB,EAAK5xB,EAELgyB,EAAYnsC,EAAIma,EAAI,EACpBgyB,EAAYld,GAAKhV,EAEjBiyB,EAASvzC,EAAIshB,EAAI,EAAI,EACrBiyB,EAAShR,GAAK/gB,EAAI,EAElBiyB,EAAUzzC,EAAIshB,EAAI,EAClBmyB,EAAUlR,GAAK/gB,EACfiyB,EAAUnR,GAAK9gB,EAAI,IAGnB2xB,EAAK7xB,EACL8xB,EAAK5xB,EAAI,EAETgyB,EAAYxzC,EAAIshB,EAAI,EACpBkyB,EAAYjR,GAAK/gB,EAEjB+xB,EAASlsC,EAAIma,EAAI,EAAI,EACrB+xB,EAASjd,GAAKhV,EAAI,EAElBmyB,EAAUpsC,EAAIma,EAAI,EAClBiyB,EAAUnd,GAAKhV,EACfmyB,EAAU5V,GAAKvc,EAAI,GAEpB2jB,EAAO3uB,MAAQ68B,EACflO,EAAO1uB,OAAS68B,EAEhBjyC,EAAA,eAAuBhH,KAAMg8B,EAAQpjB,EAAA,GACrC5R,EAAA,eAAuBhH,KAAKirC,QAAQn8B,SAAUg8B,EAAQlyB,EAAA,GAEtDkyB,EAAOlkB,OAAS5mB,KAAKu3C,kBAAkB9kC,WAAWmU,OAElD,IAAIyV,EAAiCL,EAAOt5B,SAC5C25B,EAAeC,MAAQwO,EAAOlkB,OAC9ByV,EAAeE,UAAYuO,EAAOlkB,QAQzB8yB,EAAAp5C,UAAA0uC,qBAAV,WACC,OAAO,IAAIkK,IAGbQ,EA9OA,CAAgCxC,IAsPhCj2C,EAAA,EAASC,kBAA8B,WAAIu4C,GAC3Cx4C,EAAA,EAASC,kBAAsC,mBAAIq4C,GCnSnD,IAAAU,GAAA,SAAAr6C,GAkCC,SAAAs6C,IAAA,IAAAp6C,EAGCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,0BA0DnB,OAhG2CE,EAAA,EAAA+5C,EAAAt6C,GAkDnCs6C,EAAA55C,UAAAg4B,YAAP,SAAmBC,EAAkBC,EAAuBC,EAAqBC,EAAqByhB,EAAoBC,GACzH,GAAI7hB,EAAOtwB,OAAS,GAAKuwB,EAAYvwB,OAAS,EAE7C,GAAIkyC,EAAU,CACb,IAAIl+B,EAAeC,EAAA,OAAaqc,EAAO,IACvC,GAAIA,EAAOtwB,OAAS,EACnB,IAAK,IAAIsL,EAAI,EAAGA,EAAIglB,EAAOtwB,OAAQsL,IAAK,CACvC,IAAIzG,EAAQyrB,EAAOhlB,GACfA,EAAI,GAAKvQ,KAAKC,MAAMsQ,EAAI,GAC3B0I,GAAQC,EAAA,OAAapP,GAGrBmP,GAAQC,EAAA,OAAapP,GAKxB9M,KAAKq4B,aAAapc,KAAOA,GAErBjc,KAAKymB,YAAc,GAAKzmB,KAAKo4B,WAAW3R,YAAc,KACzDxK,EAAOC,EAAA,OAAaqc,EAAO,IAAMrc,EAAA,SAAeqc,GAChDtc,GAAQC,EAAA,OAAasc,EAAY,IAAMtc,EAAA,SAAesc,GACtDvc,GAAQC,EAAA,OAAaqc,EAAO,IAC5Btc,GAAQC,EAAA,YAERlc,KAAKo4B,WAAWnc,KAAOA,OAMpB,CACAA,EAAeC,EAAA,OAAaqc,EAAO,IAAMrc,EAAA,SAAeqc,GAE5Dv4B,KAAKq4B,aAAapc,KAAOA,GAErBjc,KAAKymB,YAAc,GAAKzmB,KAAKo4B,WAAW3R,YAAc,KACzDxK,GAAQC,EAAA,OAAasc,EAAY,IAAMtc,EAAA,SAAesc,GACtDvc,GAAQC,EAAA,OAAaqc,EAAO,IAC5Btc,GAAQC,EAAA,YAERlc,KAAKo4B,WAAWnc,KAAOA,KAK5Bi+B,EAhGA,CAA2ChiB,GAwG3Cj3B,EAAA,EAASC,kBAAyC,sBAAI+4C,GCvItD,IAAAI,GAAA,SAAAz6C,GAUC,SAAA06C,IAAA,IAAAx6C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,yBACjBH,EAAKI,eAGP,OAhB4CC,EAAA,EAAAm6C,EAAA16C,GAgB5C06C,EAhBA,CAA4CvhB,IAsE5CwhB,GAAA,SAAA36C,GAkCC,SAAA46C,IAAA,IAAA16C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,iBACjBH,EAAKI,aACLJ,EAAKmM,cAAgB,EACrBnM,EAAKqM,YAAc,IAyJrB,OAhMoChM,EAAA,EAAAq6C,EAAA56C,GAgDzB46C,EAAAl6C,UAAAoD,eAAV,WACC,OAAO,IAAI22C,IAaFG,EAAAl6C,UAAAg7B,UAAV,SAAoB/C,EAAkB71B,EAA6BoY,EAAgBI,EAAgBuG,GAElG,IAAIxV,EAAgBjM,KAAKiM,cACrBE,EAAcnM,KAAKmM,YAEnBs3B,EAAazjC,KAAKiR,MAAM1D,KAAK7K,EAAUoY,EAAQ7O,GAC/CgkC,EAAajwC,KAAKmR,MAAMzD,KAAKhL,EAAUwY,EAAQjP,GAE/Cy3B,EAAa1jC,KAAKiR,MAAM1D,KAAK7K,EAAUoY,EAAQ3O,GAC/Cg8B,EAAanoC,KAAKmR,MAAMzD,KAAKhL,EAAUwY,EAAQ/O,GASnD,GAPAs3B,EAAKr5B,EAAA,WAAiBq5B,GAAK,IAAO,KAClCwM,EAAK7lC,EAAA,WAAiB6lC,GAAK,IAAO,KAElCvM,EAAKt5B,EAAA,WAAiBs5B,GAAK,IAAO,KAClCyE,EAAK/9B,EAAA,WAAiB+9B,GAAK,IAAO,MAG7BnoC,KAAKm6C,UAAYn6C,KAAKy5B,SACtBlB,EAAOtwB,OAAS,EAAG,CACtB,IAAIwyC,EAAoBliB,EAAOA,EAAOtwB,OAAS,GAC3CjI,KAAKuF,UAAYvF,KAAKiR,QACrBwQ,EACH8W,EAAO/mB,MAAO3L,EAAG40C,EAAU50C,EAAGqH,EAAGi7B,IAGjC5P,EAAO/mB,MAAO3L,EAAG49B,EAAIv2B,EAAGutC,EAAUvtC,KAGhClN,KAAKuF,UAAYvF,KAAKmR,QACrBsQ,EACH8W,EAAO/mB,MAAO3L,EAAG69B,EAAIx2B,EAAGutC,EAAUvtC,IAGlCqrB,EAAO/mB,MAAO3L,EAAG40C,EAAU50C,EAAGqH,EAAG+iC,KAMrC,IAAIyK,GAAmB70C,EAAG49B,EAAIv2B,EAAG+iC,GAC7BtH,GAAmB9iC,EAAG69B,EAAIx2B,EAAGi7B,GAE7B1mB,EACH8W,EAAO/mB,KAAKm3B,EAAQ+R,GAGpBniB,EAAO/mB,KAAKkpC,EAAQ/R,IAYZ6R,EAAAl6C,UAAAg4B,YAAV,SAAsB6B,EAAgC5B,EAAkBC,GACvE,IAAI4hB,GAAW,EACXp6C,KAAKmR,OAASnR,KAAKuF,WACtB60C,GAAW,GAEZjgB,EAAQ7B,YAAYC,EAAQC,EAAax4B,KAAK05B,SAAU15B,KAAK25B,SAAU35B,KAAKm6C,SAAUC,IAQ7EI,EAAAl6C,UAAA+4B,cAAV,WACC,OAAO,IAAI4gB,IAWZ75C,OAAAC,eAAWm6C,EAAAl6C,UAAA,gBAOX,WACC,OAAON,KAAKO,iBAAiB,iBAR9B,SAAoBC,GACnBR,KAAKS,iBAAiB,WAAYD,GAAO,oCAiB1CJ,OAAAC,eAAWm6C,EAAAl6C,UAAA,qBAOX,WACC,OAAON,KAAKO,iBAAiB,sBAR9B,SAAyBC,GACxBR,KAAKS,iBAAiB,gBAAiBD,GAAO,oCAgB/CJ,OAAAC,eAAWm6C,EAAAl6C,UAAA,mBAOX,WACC,OAAON,KAAKO,iBAAiB,oBAR9B,SAAuBC,GACtBR,KAAKS,iBAAiB,cAAeD,GAAO,oCAU9Cg6C,EAhMA,CAAoCvhB,IAwMpCh4B,EAAA,EAASC,kBAAkC,eAAIq5C,GAC/Ct5C,EAAA,EAASC,kBAA0C,uBAAIm5C,GCpPvD,IAAAM,GAAA,SAAA/6C,GA0BC,SAAAg7C,IAAA,IAAA96C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,gBAqDnB,OAjFiCE,EAAA,EAAAy6C,EAAAh7C,GAkCtBg7C,EAAAt6C,UAAAm2C,aAAV,WACCz2C,KAAK66C,YAAc76C,KAAKwmB,YAAY2f,GAAA,GACpCnmC,KAAK66C,YAAY93B,aAAc,EAC/B/iB,KAAK66C,YAAY9zB,mBAAgBlf,EAEjC7H,KAAK8qC,OAAc9qC,KAAK66C,aAQlBD,EAAAt6C,UAAAoQ,SAAP,SAAgBC,GACf/Q,EAAAU,UAAMoQ,SAAQ3Q,KAAAC,KAAC2Q,GACX3Q,KAAK66C,aACR76C,KAAK66C,YAAYnqC,SAASC,EAAOkqC,cAUzBD,EAAAt6C,UAAAw6C,YAAV,WACC,IAAIt6C,EAAQR,KAAKO,iBAAiB,YAIlC,OAHK0F,EAAA,SAAezF,KACnBA,EAAQR,KAAK66C,YAAY77B,UAEnBxe,GAQEo6C,EAAAt6C,UAAAy6C,YAAV,WACC,IAAIv6C,EAAQR,KAAKO,iBAAiB,YAIlC,OAHK0F,EAAA,SAAezF,KACnBA,EAAQR,KAAK66C,YAAY57B,UAEnBze,GAGTo6C,EAjFA,CAAiC3L,GAAA,GAyFjChuC,EAAA,EAASC,kBAA+B,YAAIy5C,GC9G5C,IAAAK,GAAA,SAAAp7C,GAgBC,SAAAq7C,IAAA,IAAAn7C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,uBACjBH,EAAKI,eAEP,OArB+CC,EAAA,EAAA86C,EAAAr7C,GAqB/Cq7C,EArBA,CAA+CtQ,IAqE/CuQ,GAAA,SAAAt7C,GAsCC,SAAAu7C,IAAA,IAAAr7C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,oBACjBH,EAAKI,eAqMP,OA9OuCC,EAAA,EAAAg7C,EAAAv7C,GAiD5Bu7C,EAAA76C,UAAA0uC,qBAAV,WACC,OAAO,IAAI2L,IAQLQ,EAAA76C,UAAAsT,SAAP,WAGK5T,KAAK0R,MAAMoC,SACd9T,KAAK0R,MAAMkC,WAGZhU,EAAAU,UAAMsT,SAAQ7T,KAAAC,OASRm7C,EAAA76C,UAAAwrC,wBAAP,SAA+BppC,GAA/B,IASK04C,EACAC,EAEAC,EACAC,EAbLz7C,EAAAE,KACKm9B,EAAan9B,KAAK0R,MAAMyrB,WACxBC,EAAWp9B,KAAK0R,MAAM0rB,SAEtBliB,EAAiBlb,KAAKkb,OACtBC,EAAqBnb,KAAKmb,WAC1BL,EAAiB9a,KAAK8a,OACtBC,EAAqB/a,KAAK+a,WAQ1B9O,EAAgBjM,KAAK+rC,iBAAiBrpC,GACtCyJ,EAAcnM,KAAKisC,eAAevpC,GAElC84C,GAAape,EAAWD,IAAen9B,KAAK2F,UAAUsC,QAAUjI,KAAK8D,IAAM9D,KAAK6D,QAEpFs5B,GAA0BlxB,EAAgBuvC,EAC1Cpe,IAAuB,EAAIjxB,GAAeqvC,EAE1C,IAEInU,EAFmBrnC,KAAKirC,QAAQn8B,SAEAu4B,aAEhCphC,EAAA,MAAYohC,KACfA,EAAe,KAGhB,IAAIwF,EAAiBziC,EAAA,OAAa+B,EAAcF,IAAkB,EAAIo7B,EAAe,KAAO,EAAG,GAmB/F,GAlBAp7B,GAAiB4gC,EACjB1gC,GAAe0gC,EAEX7sC,KAAKuF,UAAYvF,KAAKiR,OACzBqqC,EAAUlxC,EAAA,aAAoBvE,EAAG7F,KAAKmR,MAAM5D,KAAK7K,EAAUwY,EAAQxY,EAAS4P,UAAU4I,GAAS,UAAWhO,EAAGlN,KAAKmR,MAAMzD,KAAKhL,EAAUwY,EAAQxY,EAAS4P,UAAU4I,GAAS,YAC3KqgC,EAAUnxC,EAAA,aAAoBvE,EAAG7F,KAAKmR,MAAM5D,KAAK7K,EAAUyY,EAAYzY,EAAS4P,UAAU6I,GAAa,UAAWjO,EAAGlN,KAAKmR,MAAMzD,KAAKhL,EAAUyY,EAAYzY,EAAS4P,UAAU6I,GAAa,YAE3LigC,EAASp7C,KAAKiR,MAAMpD,SAASnL,EAAUqY,EAAY9O,EAAe,UAClEovC,EAASr7C,KAAKiR,MAAMpD,SAASnL,EAAUoY,EAAQ3O,EAAa,YAG5DmvC,EAAUlxC,EAAA,aAAoBvE,EAAG7F,KAAKmR,MAAM5D,KAAK7K,EAAUwY,EAAQjP,EAAe,UAAWiB,EAAGlN,KAAKmR,MAAMzD,KAAKhL,EAAUwY,EAAQjP,EAAe,YACjJsvC,EAAUnxC,EAAA,aAAoBvE,EAAG7F,KAAKmR,MAAM5D,KAAK7K,EAAUyY,EAAYhP,EAAa,UAAWe,EAAGlN,KAAKmR,MAAMzD,KAAKhL,EAAUyY,EAAYhP,EAAa,YAErJivC,EAASp7C,KAAKiR,MAAMpD,SAASnL,EAAUoY,EAAQpY,EAAS4P,UAAUwI,GAAS,UAC3EugC,EAASr7C,KAAKiR,MAAMpD,SAASnL,EAAUqY,EAAYrY,EAAS4P,UAAUyI,GAAa,WAGhFsgC,EAASD,EAAQ,CACpB,IAAIK,EAAOJ,EACXA,EAASD,EACTA,EAASK,EAGVL,EAAShxC,EAAA,WAAiBgxC,EAAQje,EAAYC,GAC9Cie,EAASjxC,EAAA,WAAiBixC,EAAQle,EAAYC,GAE9C,IAAIyd,EAAcn4C,EAASooC,OACtB+P,IACJA,EAAc76C,KAAKirC,QAAQnjC,SAC3BpF,EAASooC,OAAS+P,EAClB7zC,EAAA,oBAA4BhH,KAAKirC,QAAQn8B,SAAU+rC,EAAajiC,EAAA,GAChElW,EAASsoC,UAAU6P,GACnB76C,KAAKiuC,gBAAgB4M,IAGtB,IAAI5V,EAAQ4V,EAAYA,YAExB5V,EAAM9H,WAAaie,EAEnB,IAAIrd,EAAMsd,EAASD,EAEfrd,EAAM,GACTkH,EAAMlH,IAAMA,EACZkH,EAAM/H,OAASoe,EACfrW,EAAMvH,YAAc6d,EACpBV,EAAYz3C,YAAa,EAEzBy3C,EAAY/xB,OAAS9oB,KAAKwrC,iBAE1BpmC,EAAA,KAAWpF,KAAK8b,WAAWxW,WAAY,SAAC2vB,GACvC,IAAIiZ,EAAcxrC,EAASyrC,cAAcpnC,OAAOkuB,EAAU3uB,KACrD4nC,IACJA,EAAcpuC,EAAKmrC,QAAQnjC,SAE3Bd,EAAA,oBAA4BlH,EAAKmrC,QAAQn8B,SAAUo/B,EAAat1B,EAAA,GAChE5R,EAAA,eAAuBiuB,EAAUkG,SAAU+S,EAAat1B,EAAA,GAEpDs1B,EAAYxrC,UACfoV,EAAA,OAAco2B,EAAYxrC,SAASwwB,QAASgb,GAG7CxrC,EAASsoC,UAAUkD,GACnBpuC,EAAKmuC,gBAAgBC,GACrBxrC,EAASyrC,cAAc5qC,OAAO0xB,EAAU3uB,IAAK4nC,IAG9C,IAAIjJ,EAAQ4V,EAAYA,YACxB5V,EAAM9H,WAAaie,EACnBnW,EAAMlH,IAAMA,EACZkH,EAAM/H,OAASoe,EACfrW,EAAMvH,YAAc6d,EAEhBtW,EAAMnxB,SACTmxB,EAAMrxB,WAGPs6B,EAAY9qC,YAAa,EACzB8qC,EAAYplB,OAAShpB,EAAK0rC,oBAI3BxrC,KAAK6rC,qBAAqBnpC,IAgBlBy4C,EAAA76C,UAAAye,SAAV,SAAmBrc,EAAqC2f,EAAcC,EAAcnC,EAAoBC,EAAoBmC,EAAoBC,GAE1ID,IACJA,EAAY,UAERC,IACJA,EAAY,UAGb,IAAI3c,EAAY7F,KAAKmR,MAAM5D,KAAK7K,EAAU4f,EAAMlC,EAAWoC,GACvDtV,EAAYlN,KAAKmR,MAAMzD,KAAKhL,EAAU4f,EAAMlC,EAAWoC,GAEvD0a,EAAiB9yB,EAAA,aAAoBvE,EAAGA,EAAGqH,EAAGA,IAErC,GAAVgwB,IACFA,EAAS,MAGV,IAAIlwB,EAAgBhN,KAAKiR,MAAMpD,SAASnL,EAAU2f,EAAMlC,EAAWoC,GAEnE,OAAS1c,EAAGq3B,EAAS9yB,EAAA,IAAU4C,GAAQE,EAAGgwB,EAAS9yB,EAAA,IAAU4C,KASpDmuC,EAAA76C,UAAAub,YAAV,WACC,IAAI7R,EAAmDhK,KAAKmR,MAAMnH,SAClE,OAAOkS,EAAA,IAAUlS,EAASmzB,WAAYnzB,EAASozB,SAAWpzB,EAASmzB,WAAYnzB,EAASqzB,YAAarzB,EAASszB,mBAGhH6d,EA9OA,CAAuChQ,IAsPvClqC,EAAA,EAASC,kBAAqC,kBAAIg6C,GAClDj6C,EAAA,EAASC,kBAA6C,0BAAI85C,oBChU1DU,GAAA,SAAA97C,GAWC,SAAA+7C,IAAA,IAAA77C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,wBAEjBH,EAAKI,eAEP,OAjB2CC,EAAA,EAAAw7C,EAAA/7C,GAiB3C+7C,EAjBA,CAA2CC,GAAA,GAyF3CC,GAAA,SAAAj8C,GAyCC,SAAAk8C,IAAA,IAAAh8C,EACCF,EAAAG,KAAAC,OAAOA,YAEPF,EAAKG,UAAY,gBACjBH,EAAKi8C,SAAW37C,OAAA0iB,EAAA,EAAA1iB,CAAQ,GACxBN,EAAKk8C,YAAc57C,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAC3BN,EAAKm8C,cAAgB77C,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAC7BN,EAAKo8C,QAAU,OAEfp8C,EAAKq8C,WAAWrtC,SAASqN,MAAQ,EACjCrc,EAAKq8C,WAAWrtC,SAASsN,OAAS,EAElCtc,EAAKI,eAqWP,OA1ZmCC,EAAA,EAAA27C,EAAAl8C,GA6DxBk8C,EAAAx7C,UAAA+C,sBAAV,WACCzD,EAAAU,UAAM+C,sBAAqBtD,KAAAC,MACtBiG,EAAA,SAAejG,KAAKsZ,eACxBtZ,KAAKsZ,YAActZ,KAAKwD,SAASC,UAAU,oBAUnCq4C,EAAAx7C,UAAAoD,eAAV,WACC,OAAO,IAAIg4C,IAQLI,EAAAx7C,UAAAsT,SAAP,WACChU,EAAAU,UAAMsT,SAAQ7T,KAAAC,MACdA,KAAKo8C,gBAAav0C,GAUTi0C,EAAAx7C,UAAA+7C,aAAV,SAAuB35C,GACtB,IAAI0J,EAAQ1J,EAAS0J,MACjBkwC,EAAoB55C,EAASqV,gBAAgB,SAC7C3L,EAAQpM,KAAK2F,UAAUsC,OAAS,IAEnCq0C,EADet8C,KAAK2F,UAAU4G,SAASH,EAAQ,GAC1B2L,gBAAgB,UAKtC,OAHiB,GAAbukC,IACHA,EAAY,MAENA,GASDR,EAAAx7C,UAAA+gB,qBAAP,eAAAvhB,EAAAE,KACK82B,EAAW92B,KAAKu8C,gBAAgB/2B,WAChCuR,EAAY/2B,KAAKu8C,gBAAgB92B,YAiBrC,GAfAzlB,KAAK2F,UAAUU,KAAK,SAAC3D,GACpB,IAAI85C,EAAW95C,EAASqV,gBAAgB,SAAWrV,EAASlC,MACxDi8C,EAAY/5C,EAAS+5C,UACD,YAApB38C,EAAKusB,YACR0K,GAAc0lB,EAAUn1B,YAAck1B,EAGtC1lB,GAAa2lB,EAAUl1B,WAAai1B,IAKtCx8C,KAAK08C,eAAiB1hC,EAAA,gBAAuBhb,KAAKi8C,cAAellB,GACjE/2B,KAAK28C,cAAgB3hC,EAAA,gBAAuBhb,KAAKi8C,cAAenlB,GAExC,YAApB92B,KAAKqsB,YAA2B,CACnC,IAAInf,GAAK6pB,EAAY/2B,KAAK08C,gBAAkB,EAC5C18C,KAAKu8C,gBAAgBrvC,EAAIA,EACzBlN,KAAK48C,gBAAgB1vC,EAAIA,EACzBlN,KAAK68C,eAAe3vC,EAAIA,MAEpB,CACJ,IAAIrH,GAAKixB,EAAW92B,KAAK28C,eAAiB,EAC1C38C,KAAKu8C,gBAAgB12C,EAAIA,EACzB7F,KAAK48C,gBAAgB/2C,EAAIA,EACzB7F,KAAK68C,eAAeh3C,EAAIA,EAGzBjG,EAAAU,UAAM+gB,qBAAoBthB,KAAAC,OASjB87C,EAAAx7C,UAAAw8C,cAAV,SAAwBp6C,GAEvB,IAAI8wB,EAAMxzB,KAAK0C,SAASrB,OAAOb,MAAMgzB,IAErC,GAAU,GAAPA,EAAH,CAIA,IAAIyR,EAAQviC,EAASuiC,MACjBwX,EAAY/5C,EAAS+5C,UACrB/wC,EAAQhJ,EAASgJ,MACjBR,EAAOxI,EAASwI,KAGpBlL,KAAKq8C,aAAa35C,GAElB,IAAIq3B,EAAer3B,EAASqV,gBAAgB,SAExB,GAAhBgiB,IACHA,EAAe,MAGhB,IAAIgjB,EAAe/8C,KAAK28C,cACpBV,EAAgBj8C,KAAK08C,eAErB5lB,EAAW92B,KAAKu8C,gBAAgB/2B,WAChCuR,EAAY/2B,KAAKu8C,gBAAgB92B,YAEjCu3B,EAAYP,EAAUl1B,WACtB01B,EAAaR,EAAUn1B,YAE3B,GAAwB,YAApBtnB,KAAKqsB,YAA2B,CACnC,IAAI0vB,EAAW/gC,EAAA,gBAAuBhb,KAAK+7C,SAAUjlB,GAEhD7wB,EAAA,SAAejG,KAAKo8C,cACxBp8C,KAAKo8C,WAAaL,GAInB,IAAIC,EAAchhC,EAAA,gBAAuBhb,KAAKg8C,YAAallB,GACvDomB,EAAgBl9C,KAAKo8C,WAErBpvC,EAAQhK,KAAKy8B,MAAMwc,EAAeF,EAAWC,GAExC,IADLmB,EAAIn6C,KAAKo6C,IAAIp6C,KAAK08B,GAAK,EAAI1yB,MAE9BmwC,EAAI,MAGL,IAAIE,OAAW,EACXC,OAAgB,EAEpB,GAAoB,QAAhBt9C,KAAKk8C,QAAmB,CAC3B,IACIqB,GADexB,EAAWC,GAAe,EAAIC,EACtBliB,EAAevG,EAEtC4iB,EAAIpzC,KAAKwL,IAAI0uC,EAAgBA,EAAgB,EAAIK,EAASJ,GAG9DG,GAAoB,EAAIC,GADxBF,GAAeH,EAAgBl6C,KAAKqxC,KAAK+B,IAAM+G,GACAD,GAAiBG,MAE5D,CAGJC,EAAmBJ,GADnBG,EAAcpB,EAAgBliB,EADpB/5B,KAAK0C,SAASrB,OAAOb,MAAMgzB,KAEY2pB,EAIlDlY,EAAM7oB,OAASihC,EACfpY,EAAM9oB,MAAQ2a,EACdmO,EAAM+W,YAAcsB,EACpBrY,EAAM8W,SAAWmB,EAEjBT,EAAUV,SAAW9W,EAAM+W,YAC3BS,EAAUT,YAAc/W,EAAM+W,YAE9B/W,EAAM/3B,EAAIlN,KAAKw9C,OAGVx9C,KAAKy9C,YAIT/xC,EAAM7F,EAAI,EAHV6F,EAAM7F,EAAIixB,EAAW,EAMtBprB,EAAMwB,EAAI+3B,EAAM3oB,OAAS2oB,EAAM3d,YAAcpc,EAAKkV,UAAY6kB,EAAM8C,GAEpE/nC,KAAKw9C,QAAUvY,EAAM3d,YAAc21B,EAAaljB,EAAer3B,EAASlC,MACxEi8C,EAAUvvC,EAAIlN,KAAKw9C,OAASP,EAC5BR,EAAU52C,EAAIixB,EAAW,MAErB,CACAilB,EAAW/gC,EAAA,gBAAuBhb,KAAK+7C,SAAUhlB,GAEhD9wB,EAAA,SAAejG,KAAKo8C,cACxBp8C,KAAKo8C,WAAaL,GAGnB,IAIIoB,EAJAnB,EAAchhC,EAAA,gBAAuBhb,KAAKg8C,YAAajlB,GACvDmmB,EAAgBl9C,KAAKo8C,WAErBpvC,EAAQhK,KAAKy8B,MAAMsd,EAAchB,EAAWC,GAEvC,IADLmB,EAAIn6C,KAAKo6C,IAAIp6C,KAAK08B,GAAK,EAAI1yB,MAE9BmwC,EAAI,MAGL,IAAIO,OAAU,EACVJ,OAAgB,EAEpB,GAAoB,QAAhBt9C,KAAKk8C,QAIRoB,GAAoB,GAFhBC,GADexB,EAAWC,GAAe,EAAIe,EACtBhjB,EAAe/5B,KAAK0C,SAASrB,OAAOb,MAAMgzB,MACrEkqB,GAAcR,EAAgBl6C,KAAKqxC,KAAK6I,EAAgBA,EAAgB,EAAIK,EAASJ,IAAMA,GAC7CD,GAAiBQ,OAI/DJ,EAAmBJ,GADnBQ,EAAaX,EAAehjB,EAAe/5B,KAAK0C,SAASrB,OAAOb,MAAMgzB,KACtB2pB,EAGjDlY,EAAM9oB,MAAQuhC,EACdzY,EAAM7oB,OAAS2a,EACfkO,EAAM+W,YAAcsB,EACpBrY,EAAM8W,SAAWmB,EAEjBT,EAAUV,SAAW9W,EAAM+W,YAC3BS,EAAUT,YAAc/W,EAAM+W,YAE9B/W,EAAMp/B,EAAI7F,KAAKw9C,OAEVx9C,KAAKy9C,YAIT/xC,EAAMwB,EAAIlN,KAAK48C,gBAAgB3nC,eAH/BvJ,EAAMwB,EAAI6pB,EAAY,EAMvBrrB,EAAM7F,EAAIo/B,EAAM1oB,OAAS0oB,EAAM1d,WAAarc,EAAKiV,UAAY8kB,EAAM6C,GAEnE9nC,KAAKw9C,QAAUvY,EAAM1d,WAAay1B,EAAYjjB,EAAer3B,EAASlC,MACtEi8C,EAAU52C,EAAI7F,KAAKw9C,OAASR,EAC5BP,EAAUvvC,EAAI6pB,EAAY,EAG3B/2B,KAAKo8C,WAAanX,EAAM+W,cAgBzB57C,OAAAC,eAAWy7C,EAAAx7C,UAAA,gBASX,WACC,OAAON,KAAKO,iBAAiB,iBAV9B,SAAoBC,GACfR,KAAK0+B,mBAAmB,WAAYl+B,GAAO,GAAO,EAAO,IAAI,IAChER,KAAKa,8CAmBPT,OAAAC,eAAWy7C,EAAAx7C,UAAA,qBASX,WACC,OAAON,KAAKO,iBAAiB,sBAV9B,SAAyBC,GACpBR,KAAK0+B,mBAAmB,gBAAiBl+B,GAAO,GAAO,EAAO,IAAI,IACrER,KAAKa,8CAuBPT,OAAAC,eAAWy7C,EAAAx7C,UAAA,mBASX,WACC,OAAON,KAAKO,iBAAiB,oBAV9B,SAAuBC,GAClBR,KAAK0+B,mBAAmB,cAAel+B,GAAO,GAAO,EAAO,IAAI,IACnER,KAAKa,8CAkCPT,OAAAC,eAAWy7C,EAAAx7C,UAAA,eASX,WACC,OAAON,KAAKO,iBAAiB,gBAV9B,SAAmBC,GACdR,KAAKS,iBAAiB,UAAWD,IACpCR,KAAKa,8CAURi7C,EA1ZA,CAAmCF,GAAA,GAkanC36C,EAAA,EAASC,kBAAiC,cAAI26C,GAC9C56C,EAAA,EAASC,kBAAyC,sBAAIw6C,GC3ftD,IAAAiC,GAAA,SAAA/9C,GAUC,SAAAg+C,IAAA,IAAA99C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,iCAEjBH,EAAKI,eAEP,OAhBoDC,EAAA,EAAAy9C,EAAAh+C,GAgBpDg+C,EAhBA,CAAoDlC,IAgFpDmC,GAAA,SAAAj+C,GAmCC,SAAAk+C,IAAA,IAAAh+C,EACCF,EAAAG,KAAAC,OAAOA,YAEPF,EAAKG,UAAY,yBACjBH,EAAKi8C,SAAW37C,OAAA0iB,EAAA,EAAA1iB,CAAQ,KACxBN,EAAKk8C,YAAc57C,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAC3BN,EAAKo8C,QAAU,SAEfp8C,EAAKI,aAELJ,EAAKmM,cAAgB,EACrBnM,EAAKqM,YAAc,EAEnBrM,EAAKi+C,YAAcj+C,EAAKy8C,gBAAgB/1B,YAAY5N,EAAA,GACpD9Y,EAAKi+C,YAAYz/B,SAAU,EAC3Bxe,EAAKi+C,YAAYrwB,OAAS,MAsQ5B,OAxT4CvtB,EAAA,EAAA29C,EAAAl+C,GA0DpCk+C,EAAAx9C,UAAA+gB,qBAAP,WAEC,IAAIyV,EAAW92B,KAAKu8C,gBAAgBzlB,SAChCC,EAAY/2B,KAAKu8C,gBAAgBxlB,UAEjCinB,EAAah+C,KAAK+9C,YAGlBE,EAAeD,EAAWhpC,cAAgBgpC,EAAWE,MACrDC,EAAgBH,EAAW/oC,eAAiB+oC,EAAWE,MAEvDA,EAAQ9zC,EAAA,IAAU2sB,EAAYonB,EAAernB,EAAWmnB,GAExDC,GAAS5gC,MACZ4gC,EAAQ,GAGTA,EAAQ9zC,EAAA,IAAU,KAAO8zC,GAEzB,IAAIjyC,EAAgBjM,KAAKiM,cACrBE,EAAcnM,KAAKmM,YAEnBiyC,EAAWh0C,EAAA,IAAU0sB,EAAUmnB,EAAeC,GAC9CG,EAAYj0C,EAAA,IAAU2sB,EAAWonB,EAAgBD,GAyBrD,GAvBAF,EAAWE,MAAQA,EAEK,YAApBl+C,KAAKqsB,aACRrsB,KAAK+7C,SAAWqC,EAAW,EAC3Bp+C,KAAKg8C,YAAcoC,EAAW,EAC9Bp+C,KAAKi8C,cAAgBoC,GAAalyC,EAAcF,GAChD+xC,EAAWn4C,EAAIixB,EAAW,EAC1BknB,EAAW9wC,EAAImxC,EAAY,IAG3Br+C,KAAK+7C,SAAWsC,EAAY,EAC5Br+C,KAAKg8C,YAAcqC,EAAY,EAC/Br+C,KAAKi8C,cAAgBmC,GAAYjyC,EAAcF,GAC/C+xC,EAAWnvB,OAAS,SACpBmvB,EAAWn4C,EAAIu4C,EAAW,EAC1BJ,EAAW9wC,EAAI6pB,EAAY,GAG5BinB,EAAWjd,eAAiB,SAC5Bid,EAAWld,iBAAmB,SAE9BlhC,EAAAU,UAAM+gB,qBAAoBthB,KAAAC,MAEF,YAApBA,KAAKqsB,YAA2B,CACnC,IAAInf,GAAK6pB,EAAYsnB,GAAa,EAClCr+C,KAAKu8C,gBAAgBrvC,EAAIA,EACzBlN,KAAK48C,gBAAgB1vC,EAAIA,EACzBlN,KAAK68C,eAAe3vC,EAAIA,EACxBlN,KAAKs+C,OAAOxvC,SAASi5B,GAAK97B,EAAgBoyC,MAEtC,CACJ,IAAIx4C,GAAKixB,EAAWsnB,GAAY,EAChCp+C,KAAKu8C,gBAAgB12C,EAAIA,EACzB7F,KAAK48C,gBAAgB/2C,EAAIA,EACzB7F,KAAK68C,eAAeh3C,EAAIA,EACxB7F,KAAKs+C,OAAOxvC,SAASg5B,GAAK77B,EAAgBmyC,EAG3Cp+C,KAAKu8C,gBAAgB9wC,KAAOzL,KAAK+9C,aAOxBD,EAAAx9C,UAAA+C,sBAAV,WACCzD,EAAAU,UAAM+C,sBAAqBtD,KAAAC,MACtBiG,EAAA,SAAejG,KAAKsZ,eACxBtZ,KAAKsZ,YAActZ,KAAKwD,SAASC,UAAU,oBAUnCq6C,EAAAx9C,UAAAoD,eAAV,WACC,OAAO,IAAIi6C,IAuCZv9C,OAAAC,eAAWy9C,EAAAx9C,UAAA,kBAAX,WACC,OAAON,KAAK+9C,6CAQHD,EAAAx9C,UAAAi+C,UAAV,SAAoBtZ,GACnBrlC,EAAAU,UAAMi+C,UAASx+C,KAAAC,KAACilC,GAEhB,IAAIuZ,EAAKvZ,EAAMna,OAAO/jB,OAAO,SACzBy3C,IACHA,EAAG/rC,WAAWgsC,eAAiB,IAgDjCr+C,OAAAC,eAAWy9C,EAAAx9C,UAAA,qBASX,WACC,OAAON,KAAKO,iBAAiB,sBAV9B,SAAyBC,GACpBR,KAAKS,iBAAiB,gBAAiBD,IAC1CR,KAAK+R,uDAuDP3R,OAAAC,eAAWy9C,EAAAx9C,UAAA,mBASX,WACC,OAAON,KAAKO,iBAAiB,oBAV9B,SAAuBC,GAClBR,KAAKS,iBAAiB,cAAeD,IACxCR,KAAK+R,uDAUR+rC,EAxTA,CAA4CjC,IAgU5C56C,EAAA,EAASC,kBAA0C,uBAAI28C,GACvD58C,EAAA,EAASC,kBAAkD,+BAAIy8C,8CCzX/De,GAAA,SAAA9+C,GA0BC,SAAA++C,IAAA,IAAA7+C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,eAyBnB,OArDgCE,EAAA,EAAAw+C,EAAA/+C,GAkC/B++C,EAAAr+C,UAAAm2C,aAAA,WACCz2C,KAAK4+C,WAAa5+C,KAAKwmB,YAAYq4B,GAAA,GACnC7+C,KAAK4+C,WAAW77B,aAAc,EAG9B/iB,KAAK8qC,OAAc9qC,KAAK4+C,YAQzBD,EAAAr+C,UAAAoQ,SAAA,SAASC,GACR/Q,EAAAU,UAAMoQ,SAAQ3Q,KAAAC,KAAC2Q,GACX3Q,KAAK4+C,YACR5+C,KAAK4+C,WAAWluC,SAASC,EAAOiuC,aAGnCD,EArDA,CAAgC1P,GAAA,GA6DhChuC,EAAA,EAASC,kBAA8B,WAAIw9C,GCxF3C,IAAAI,GAAA,SAAAl/C,GAgBC,SAAAm/C,IAAA,IAAAj/C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,qBACjBH,EAAKI,eAGP,OAtBwCC,EAAA,EAAA4+C,EAAAn/C,GAsBxCm/C,EAtBA,CAAwCpU,IAsExCqU,GAAA,SAAAp/C,GA+BC,SAAAq/C,IAAA,IAAAn/C,EACCF,EAAAG,KAAAC,OAAOA,YAEPF,EAAKG,UAAY,aACjBH,EAAKI,eA6DP,OAhGgCC,EAAA,EAAA8+C,EAAAr/C,GA2CrBq/C,EAAA3+C,UAAA0uC,qBAAV,WACC,OAAO,IAAI0P,IAQFO,EAAA3+C,UAAAub,YAAV,WACC,IAAIisB,EAAK,EACLC,EAAK,EACL+C,EAAS9qC,KAAKirC,QAAQ1+B,SAAS,GACnC,GAAGu+B,EAQF,OAPI9qC,KAAKuF,UAAYvF,KAAKiR,MACzB82B,EAAK+C,EAAO8T,WAAW5qB,OAAOkrB,QAAU,EAGxCpX,EAAKgD,EAAO8T,WAAW5qB,OAAOkrB,QAAU,EAGlChjC,EAAA,YACNrW,GAAIiiC,EACJ56B,EAAG,EACHiP,MAAOnc,KAAKiR,MAAM+C,WAAa8zB,EAC/B1rB,OAAQpc,KAAKmR,MAAM6C,WAAa+zB,KAY5BkX,EAAA3+C,UAAAwrC,wBAAP,SAA+BppC,GAG9B,GAFA9C,EAAAU,UAAMwrC,wBAAuB/rC,KAAAC,KAAC0C,GACjBA,EAASooC,OACZ,CACT,IAAI8T,EAAal8C,EAASooC,OAAO8T,WAEjCA,EAAWrzC,KAAO7I,EAASooC,OAAOv/B,KAE9BvL,KAAKuF,UAAYvF,KAAKmR,MACzBytC,EAAWvyB,YAAc,aAGzBuyB,EAAWvyB,YAAc,aAI7B4yB,EAhGA,CAAgC9T,IAwGhClqC,EAAA,EAASC,kBAA8B,WAAI89C,GAC3C/9C,EAAA,EAASC,kBAAsC,mBAAI49C,GCxHnD,IAAAK,GAAA,SAAAv/C,GAyBC,SAAAw/C,IAAA,IAAAt/C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,iBA8GnB,OAzIkCE,EAAA,EAAAi/C,EAAAx/C,GAoCvBw/C,EAAA9+C,UAAAm2C,aAAV,WACCz2C,KAAKq/C,aAAer/C,KAAKwmB,YAAY5N,EAAA,GACrC5Y,KAAKq/C,aAAat8B,aAAc,EAEhC/iB,KAAKS,iBAAiB,UAAW,IAEjCT,KAAKmc,MAAQ/b,OAAA0iB,EAAA,EAAA1iB,CAAQ,KACrBJ,KAAKoc,OAAShc,OAAA0iB,EAAA,EAAA1iB,CAAQ,KAGtBJ,KAAK8qC,OAAc9qC,KAAKq/C,cAQlBD,EAAA9+C,UAAA6uB,KAAP,WACCvvB,EAAAU,UAAM6uB,KAAIpvB,KAAAC,MACV,IAKIu4B,EALApR,EAAInnB,KAAK8tC,UACTzmB,EAAIrnB,KAAK+tC,WACTloC,EAAI7F,KAAK4tC,MAAQ5tC,KAAKuc,OACtBrP,EAAIlN,KAAK6tC,MAAQ7tC,KAAKsc,OAK1BtB,EAAA,KAAYhb,KAAKmc,OAEjB,IAAIud,EAAW,EACXC,EAAW,EAES,YAApB35B,KAAKqsB,aACRqN,EAAW15B,KAAKs/C,QAChB/mB,IAAY1yB,EAAG,EAAGqH,EAAGma,EAAIna,IAAOrH,EAAGshB,EAAI,EAAGja,EAAGA,IAAOrH,EAAGshB,EAAGja,EAAGma,EAAIna,MAGjEysB,EAAW35B,KAAKs/C,QAChB/mB,IAAY1yB,EAAGA,EAAGqH,EAAG,IAAOrH,EAAGA,EAAIshB,EAAGja,EAAGma,EAAI,IAAOxhB,EAAGA,EAAGqH,EAAGma,KAG9D,IAAIpL,EAAOC,EAAA,OAAaqc,EAAO,IAAM,IAAII,EAAA,EAAmBe,EAAUC,GAAUf,OAAOL,GACvFv4B,KAAK8qC,OAAO7uB,KAAOA,GAQbmjC,EAAA9+C,UAAAoQ,SAAP,SAAgBC,GACf/Q,EAAAU,UAAMoQ,SAAQ3Q,KAAAC,KAAC2Q,GACX3Q,KAAKq/C,cACRr/C,KAAKq/C,aAAa3uC,SAASC,EAAO0uC,eAiBpCj/C,OAAAC,eAAW++C,EAAA9+C,UAAA,eAOX,WACC,OAAON,KAAKO,iBAAiB,gBAR9B,SAAmBC,GAClBR,KAAKS,iBAAiB,UAAWD,GAAO,oCAkBzCJ,OAAAC,eAAW++C,EAAA9+C,UAAA,mBAOX,WACC,OAAON,KAAKO,iBAAiB,oBAR9B,SAAuBC,GACtBR,KAAKS,iBAAiB,cAAeD,GAAO,oCAU9C4+C,EAzIA,CAAkCnQ,GAAA,GAiJlChuC,EAAA,EAASC,kBAAgC,aAAIi+C,GCxM7C,IAAAI,GAAA,SAAA3/C,GAgBC,SAAA4/C,IAAA,IAAA1/C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,6BACjBH,EAAKI,eAGP,OAtBgDC,EAAA,EAAAq/C,EAAA5/C,GAsBhD4/C,EAtBA,CAAgD7U,IAqEhD8U,GAAA,SAAA7/C,GAmCC,SAAA8/C,IAAA,IAAA5/C,EACCF,EAAAG,KAAAC,OAAOA,YAEPF,EAAKG,UAAY,qBACjBH,EAAKI,eAsCP,OA7EwCC,EAAA,EAAAu/C,EAAA9/C,GAgD7B8/C,EAAAp/C,UAAA0uC,qBAAV,WACC,OAAO,IAAImQ,IAULO,EAAAp/C,UAAAwrC,wBAAP,SAA+BppC,GAE9B,IAAIooC,EAASpoC,EAASooC,OAClBA,IACgBpoC,EAASooC,OAAOuU,aAEtB9zC,KAAO7I,EAASooC,OAAOv/B,KAEhCvL,KAAKuF,UAAYvF,KAAKmR,MACzB25B,EAAOze,YAAc,aAGrBye,EAAOze,YAAc,YAIvBzsB,EAAAU,UAAMwrC,wBAAuB/rC,KAAAC,KAAC0C,IAEhCg9C,EA7EA,CAAwCvU,IAqFxClqC,EAAA,EAASC,kBAAsC,mBAAIu+C,GACnDx+C,EAAA,EAASC,kBAA8C,2BAAIq+C,8CC1J3DI,GAAA,SAAA//C,GAUC,SAAAggD,IAAA,IAAA9/C,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,uBACjBH,EAAKI,eAEP,OAf0CC,EAAA,EAAAy/C,EAAAhgD,GAe1CggD,EAfA,CAA0Cl+C,EAAA,GAsF1Cm+C,GAAA,SAAAjgD,GAmDC,SAAAkgD,IAAA,IAAAhgD,EAGCF,EAAAG,KAAAC,OAAOA,YAtBEF,EAAAigD,UAAsB,SAuB/BjgD,EAAKG,UAAY,eAEjBH,EAAKW,iBAAiB,gBAAiB,KAGvCX,EAAKI,eAoLP,OAhPyEC,EAAA,EAAA2/C,EAAAlgD,GAsEjEkgD,EAAAx/C,UAAAoM,YAAP,SAAmBlM,EAAeiJ,GACjC,OAAOzJ,KAAKggD,kBAAkBv2C,OAAOjJ,EAAOiJ,GAAUzJ,KAAKigD,qBAmBrDH,EAAAx/C,UAAAwL,aAAP,SAAoB5I,EAAac,EAAauK,EAAoBjC,EAAmB4zC,GAEpF,IAAIC,MAEAh+C,EAAWnC,KAAKogD,SAIpB,GAFApgD,KAAKS,iBAAiB,eAAgB,GAEtB,eAAZ0B,GAAyC,UAAZA,GAAoC,UAAZA,GAAoC,QAAZA,EAAoB,CAEhGmK,GAAa,IAChBA,EAAY,GAGbA,EAAYtJ,KAAKC,MAAMqJ,GAEvB,IAAI+zC,EAAqBn9C,EACrBo9C,EAAqBt8C,EAGN,IAAfuK,IACHA,EAAavL,KAAKwL,IAAIxK,IAGvB,IAAI+H,EAEAw0C,GAAY,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GACnCC,EAAc,EAEF,QAAZr+C,IACHo+C,GAAY,GAAI,GAAI,EAAG,EAAG,EAAG,QAG9B,IAAoB,IAAAE,EAAAtgD,EAAA,EAAAogD,GAAQG,EAAAD,EAAAlhC,QAAAmhC,EAAAlhC,KAAAkhC,EAAAD,EAAAlhC,OAAA,CAAvB,IAAIohC,EAAOD,EAAAlgD,MACf,GAAI+N,EAAaoyC,EAAUr0C,EAAW,CACrCk0C,EAAcG,EACd,yGAGF,IAAIv+C,EAAQY,KAAKiC,MAAOjB,EAAMd,GAAOs9C,EAAel0C,GAEhDs0C,EAAmB59C,KAAK69C,IAAI79C,KAAKwL,IAAIpM,IAAUY,KAAK89C,OACpDC,EAAQ/9C,KAAKg+C,IAAI,GAAIh+C,KAAKmC,MAAMy7C,IAAa,GAC7CK,EAAe7+C,EAAQ2+C,EAM3Bh1C,EAAOy0C,GAFPp+C,EADcgI,EAAA,QAAcm2C,EAAUU,GACpBF,GAKlB/gD,KAAKggD,kBAAkBkB,aAAan1C,EAAM/L,KAAKogD,UAE/Cl9C,EAAMF,KAAKmC,MAAMjC,EAAM6I,GAAQA,EAC/B/H,EAAMhB,KAAKiC,KAAKjB,EAAM+H,GAAQA,EAE1Bm0C,KACHh9C,GAAO6I,GACG,GAAKs0C,GAAc,IAC5Bn9C,EAAM,IAEPc,GAAO+H,GAEG,GAAKu0C,GAAc,IAC5Bt8C,EAAM,IAGRm8C,GAAej9C,IAAKA,EAAKc,IAAKA,EAAK+H,KAAMA,QAGzCo0C,EAAavgD,EAAAU,UAAMwL,aAAY/L,KAAAC,KAACkD,EAAKc,EAAKuK,EAAYjC,EAAW4zC,GAMlE,OAFAlgD,KAAKigD,mBAAqBjgD,KAAKggD,kBAAkBmB,UAAUhB,EAAWp0C,KAAMo0C,EAAWn8C,IAAKhE,KAAKogD,UAE1FD,GAWR//C,OAAAC,eAAWy/C,EAAAx/C,UAAA,6BAOX,WACC,OAAON,KAAKohD,4BARb,SAAiC5gD,GAChCR,KAAKohD,uBAAyB5gD,mCAqBxBs/C,EAAAx/C,UAAA4O,eAAP,SAAsBpE,GACrB,IAAItK,EAAgB4J,EAAA,MAAYpK,KAAKsN,gBAAgBxC,GAAW9K,KAAKqhD,oBACrE,OAAOrhD,KAAKsP,QAAQC,MAAM,iBAAkBvP,KAAK0M,YAAYlM,EAAOR,KAAKshD,yBAc1ElhD,OAAAC,eAAWy/C,EAAAx/C,UAAA,gBAWX,WACC,OAAON,KAAK+/C,eAZb,SAAoB59C,GACfnC,KAAK+/C,WAAa59C,IACrBnC,KAAK+/C,UAAY59C,EACjBnC,KAAKggD,kBAAkBI,SAAWj+C,EAClCnC,KAAKa,+CAgBAi/C,EAAAx/C,UAAAoQ,SAAP,SAAgBC,GACf/Q,EAAAU,UAAMoQ,SAAQ3Q,KAAAC,KAAC2Q,GACf3Q,KAAKogD,SAAWzvC,EAAOyvC,UAEzBN,EAhPA,CAAyEp+C,EAAA,GAwPzET,EAAA,EAASC,kBAAgC,aAAI2+C,GAC7C5+C,EAAA,EAASC,kBAAwC,qBAAIy+C,iCCnTrD4B,GAAA,SAAA3hD,GAyBC,SAAA4hD,IAAA,IAAA1hD,EACCF,EAAAG,KAAAC,OAAOA,KAEPF,EAAKG,UAAY,eAEjB,IAAIwhD,EAAS3hD,EAAK0mB,YAAY2b,GAAA,UAC9Bsf,EAAO1+B,aAAc,EACrB0+B,EAAOvkB,OAAS,EAChBukB,EAAOhpC,YAAa,EACpB3Y,EAAK2hD,OAASA,IAahB,OA/CkCthD,EAAA,EAAAqhD,EAAA5hD,GA2C1B4hD,EAAAlhD,UAAAoQ,SAAP,SAAgBC,GACf/Q,EAAAU,UAAMoQ,SAAQ3Q,KAAAC,KAAC2Q,GACf3Q,KAAKyhD,OAAO/wC,SAASC,EAAO8wC,SAE9BD,EA/CA,CAAkC7a,GAAA,GAuDlC1lC,EAAA,EAASC,kBAAgC,aAAIqgD,GCtD7C,IAAAG,GAAA,SAAA9hD,GAsBC,SAAA+hD,IAAA,IAAA7hD,EACCF,EAAAG,KAAAC,OAAOA,YAEPF,EAAKG,UAAY,cACjBH,EAAK8hD,UAAY9hD,EAAK0mB,YAAY5N,EAAA,GAClC9Y,EAAK8hD,UAAU7+B,aAAc,EAC7BjjB,EAAKqc,MAAQ,GACbrc,EAAKsc,OAAS,GACdtc,EAAKinB,cAAgB,EACrBjnB,EAAK+hD,WAAY,IAsBnB,OArDiC1hD,EAAA,EAAAwhD,EAAA/hD,GAmChC+hD,EAAArhD,UAAAknB,iBAAA,WACC5nB,EAAAU,UAAMknB,iBAAgBznB,KAAAC,MACtB,IAAImnB,EAAInnB,KAAKunB,WAAa,EACtBF,EAAIrnB,KAAKsnB,YAAc,EAE3BtnB,KAAK4hD,UAAU3lC,KAAOC,EAAA,QAAcrW,GAAGshB,EAAGja,GAAGma,IAAMnL,EAAA,QAAcrW,EAAEshB,EAAGja,GAAGma,IAAMnL,EAAA,QAAcrW,EAAE,EAAGqH,GAAGma,IAAMnL,EAAA,QAAcrW,EAAE,EAAGqH,EAAEma,IAAMnL,EAAA,QAAcrW,GAAGshB,EAAGja,EAAEma,IAAMnL,EAAA,QAAcrW,EAAEshB,EAAGja,EAAEma,KASjLs6B,EAAArhD,UAAAoQ,SAAP,SAAgBC,GACf/Q,EAAAU,UAAMoQ,SAAQ3Q,KAAAC,KAAC2Q,GACf3Q,KAAK4hD,UAAUlxC,SAASC,EAAOixC,YAEjCD,EArDA,CAAiChb,GAAA,GA6DjC1lC,EAAA,EAASC,kBAA+B,YAAIwgD,qFCtF5CI,GAAA,SAAAliD,GAUC,SAAAmiD,IAAA,IAAAjiD,EACCF,EAAAG,KAAAC,OAAOA,YACPF,EAAKG,UAAY,wBACjBH,EAAKI,eAmBP,OAhC2CC,EAAA,EAAA4hD,EAAAniD,GAqB1CQ,OAAAC,eAAW0hD,EAAAzhD,UAAA,YAOX,WACC,OAAON,KAAKyS,WAAiB,UAR9B,SAAgBjS,GACfR,KAAK0S,YAAY,OAAQlS,oCAU3BuhD,EAhCA,CAA2CC,GAAA,GA0F3CC,GAAA,SAAAriD,GA2DC,SAAAsiD,IAAA,IAAApiD,EAGCF,EAAAG,KAAAC,OAAOA,KACPF,EAAKG,UAAY,gBAEjB,IAAIomB,EAAkB,IAAIC,EAAA,EAEtB67B,EAAW,IAAIC,GAAA,EACnBD,EAAStzB,OAAS,SAClBszB,EAAS3V,WAAa,EACtB2V,EAASzV,cAAgB,EAEzB5sC,EAAK4sC,cAAgB,EAErB5sC,EAAK0qC,MAAQ,IAAI1oC,EAAA,EAAuBqgD,GACxCriD,EAAKkT,WAAWxB,KAAK,IAAI1P,EAAA,EAAahC,EAAK0qC,QAC3C1qC,EAAKkT,WAAWxB,KAAK2wC,GAErBriD,EAAKuiD,eAAiB,IAAIj9C,EAAA,aAA6BtF,EAAK0qC,MAAO,WAAM,OAAA1qC,EAAK0qC,MAAM1iC,WACpFhI,EAAKuiD,eAAe7oB,gBAAiB,EAErC,IAAI8oB,EAAW,IAAIC,GAAA,EACnBD,EAASE,UAAY,QACrBF,EAASnmC,MAAQ,EACjBmmC,EAASlmC,OAAS,GAClBkmC,EAAS/2C,KAAO8a,EAAgBK,OAAO,yBACvC47B,EAAS77B,YAAc,GACvB67B,EAASzzB,OAAS,SAClByzB,EAASG,WAAa,GACtBH,EAAStzB,YAAc,GAEvBlvB,EAAK4iD,WAAa,IAAI5gD,EAAA,EAAuBwgD,GAC7CxiD,EAAKkT,WAAWxB,KAAK,IAAI1P,EAAA,EAAahC,EAAK4iD,aAC3C5iD,EAAKkT,WAAWxB,KAAK8wC,GAErB,IAAIK,EAAa,IAAIP,GAAA,SACrBtiD,EAAK6iD,WAAaA,EAClBA,EAAWjyC,SAASyxC,GACpBQ,EAAW9zB,OAAS,SACpB8zB,EAAWC,WAAa,OAExB9iD,EAAKqc,MAAQ/b,OAAA0iB,EAAA,EAAA1iB,CAAQ,KACrBN,EAAK0tB,OAAS,OACd1tB,EAAKia,WAAWI,KAAO,OAGvBra,EAAKI,eA2CP,OArJmCC,EAAA,EAAA+hD,EAAAtiD,GAkH3BsiD,EAAA5hD,UAAA+gB,qBAAP,WACCrhB,KAAKovC,iBACLpvC,KAAKqiD,eAAet5B,QACpBnpB,EAAAU,UAAM+gB,qBAAoBthB,KAAAC,OAUpBkiD,EAAA5hD,UAAAwJ,oBAAP,SAA2BpH,GAG1B,IAAIy/C,EACJ,GAHAviD,EAAAU,UAAMwJ,oBAAmB/J,KAAAC,KAAC0C,GAGtBA,EAAS0J,MAAQpM,KAAK2F,UAAUsC,OAAS,EAAG,EAC/Ck6C,EAAWniD,KAAKqiD,eAAeQ,WACtB/5B,OAAS9oB,KAClB,IAAI8iD,EAAY9iD,KAAK0iD,WAAW56C,SAChCg7C,EAAUh6B,OAAS9oB,KACnB8iD,EAAUj0B,OAAS,cAGnBszB,EAAWniD,KAAK2iD,YACPxpC,OAAOzI,SAAS1Q,KAAKwqC,MAAM17B,SAASqK,QAC7CgpC,EAASjhC,KAAK,GACdihC,EAAS5hC,OACT4hC,EAASr5B,OAAS9oB,KAEnBmiD,EAASz/C,SAAWA,EACpBy/C,EAASx4C,KAAOjH,EAASyX,KACzBgoC,EAASvuC,YAEXsuC,EArJA,CAAmCa,GAAA,GA6JnC9hD,EAAA,EAASC,kBAAiC,cAAI+gD,GAC9ChhD,EAAA,EAASC,kBAAyC,sBAAI4gD,GCzRtDkB,OAAAC,UAAmBC","file":"charts.js","sourcesContent":["/**\r\n * DateAxisBreak includes functionality to add breaks on a [[DateAxis]].\r\n *\r\n * A \"break\" can be used to \"cut out\" specific ranges of the axis scale, e.g.\r\n * weekends and holidays out of the Date-based axis.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\nimport { ValueAxisBreak, IValueAxisBreakProperties, IValueAxisBreakAdapters, IValueAxisBreakEvents } from \"./ValueAxisBreak\";\r\nimport { DateAxis } from \"./DateAxis\";\r\nimport { ITimeInterval } from \"../../core/defs/ITimeInterval\";\r\nimport { registry } from \"../../core/Registry\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[DateAxisBreak]].\r\n */\r\nexport interface IDateAxisBreakProperties extends IValueAxisBreakProperties {\r\n\r\n\t/**\r\n\t * A `Date` break starts on.\r\n\t */\r\n\tstartDate?: Date;\r\n\r\n\t/**\r\n\t * A `Date` break ends on.\r\n\t */\r\n\tendDate?: Date;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[DateAxisBreak]]\r\n */\r\nexport interface IDateAxisBreakEvents extends IValueAxisBreakEvents { }\r\n\r\n/**\r\n * Defines adapters for [[DateAxisBreak]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IDateAxisBreakAdapters extends IValueAxisBreakAdapters, IDateAxisBreakProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Class used to define breaks for [[DateAxis]].\r\n *\r\n * A \"break\" can be used to \"cut out\" specific ranges of the axis scale, e.g.\r\n * weekends and holidays out of the Date-based axis.\r\n *\r\n * @see {@link IDateAxisBreakEvents} for a list of available events\r\n * @see {@link IDateAxisBreakAdapters} for a list of available Adapters\r\n * @important\r\n */\r\nexport class DateAxisBreak extends ValueAxisBreak {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IDateAxisBreakProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IDateAxisBreakAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IDateAxisBreakEvents;\r\n\r\n\t/**\r\n\t * Defines the type of the Axis this break is used for.\r\n\t */\r\n\tpublic _axisType: DateAxis;\r\n\r\n\t/**\r\n\t * [gridInterval description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t */\r\n\tpublic gridInterval: ITimeInterval;\r\n\r\n\t/**\r\n\t * [gridDate description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t */\r\n\tpublic gridDate: Date;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"DateAxisBreak\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Starting date for the break.\r\n\t *\r\n\t * @param value Start date\r\n\t */\r\n\tpublic set startDate(value: Date) {\r\n\t\tif (this.setPropertyValue(\"startDate\", value)) {\r\n\t\t\tthis.startValue = value.getTime();\r\n\t\t\tif (this.axis) {\r\n\t\t\t\tthis.axis.invalidate();\r\n\t\t\t\tthis.axis.invalidateSeries();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Start date\r\n\t */\r\n\tpublic get startDate(): Date {\r\n\t\treturn this.getPropertyValue(\"startDate\");\r\n\t}\r\n\r\n\t/**\r\n\t * Ending date for the break.\r\n\t *\r\n\t * @param value End date\r\n\t */\r\n\tpublic set endDate(value: Date) {\r\n\t\tif (this.setPropertyValue(\"endDate\", value)) {\r\n\t\t\tthis.endValue = value.getTime();\r\n\t\t\tif (this.axis) {\r\n\t\t\t\tthis.axis.invalidate();\r\n\t\t\t\tthis.axis.invalidateSeries();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return End date\r\n\t */\r\n\tpublic get endDate(): Date {\r\n\t\treturn this.getPropertyValue(\"endDate\");\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"DateAxisBreak\"] = DateAxisBreak;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/axes/DateAxisBreak.ts","/**\r\n * DateAxis module\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { ValueAxis, ValueAxisDataItem, IValueAxisProperties, IValueAxisDataFields, IValueAxisAdapters, IValueAxisEvents } from \"./ValueAxis\";\r\nimport { AxisItemLocation } from \"./Axis\";\r\nimport { AxisRenderer } from \"./AxisRenderer\";\r\nimport { AxisTick } from \"./AxisTick\";\r\nimport { AxisLabel } from \"./AxisLabel\";\r\nimport { AxisFill } from \"./AxisFill\";\r\nimport { List } from \"../../core/utils/List\";\r\nimport { Dictionary } from \"../../core/utils/Dictionary\";\r\nimport { IPoint, IOrientationPoint } from \"../../core/defs/IPoint\";\r\nimport { Grid } from \"./Grid\";\r\nimport { XYSeries, XYSeriesDataItem } from \"../series/XYSeries\";\r\nimport { TimeUnit } from \"../../core/defs/TimeUnit\";\r\nimport { ITimeInterval } from \"../../core/defs/ITimeInterval\";\r\nimport { IMinMaxStep } from \"./ValueAxis\";\r\nimport { DateAxisBreak } from \"./DateAxisBreak\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $time from \"../../core/utils/Time\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $object from \"../../core/utils/Object\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data item for [[DateAxis]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class DateAxisDataItem extends ValueAxisDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: DateAxis;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"DateAxisDataItem\";\r\n\t\tthis.applyTheme();\r\n\r\n\t\tthis.values.date = {};\r\n\t\tthis.values.endDate = {};\r\n\t}\r\n\r\n\t/**\r\n\t * Date position of the data item.\r\n\t *\r\n\t * @param date Date\r\n\t */\r\n\tpublic set date(date: Date) {\r\n\t\tthis.setDate(\"date\", date);\r\n\t\tthis.value = date.getTime();\r\n\t}\r\n\r\n\t/**\r\n\t * @return Date\r\n\t */\r\n\tpublic get date(): Date {\r\n\t\treturn this.dates[\"date\"];\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * End date for data item.\r\n\t *\r\n\t * @param date End date\r\n\t */\r\n\tpublic set endDate(date: Date) {\r\n\t\tthis.setDate(\"endDate\", date);\r\n\t\tthis.endValue = date.getTime();\r\n\t}\r\n\r\n\t/**\r\n\t * @return End date\r\n\t */\r\n\tpublic get endDate(): Date {\r\n\t\treturn this.dates[\"endDate\"];\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[DateAxis]].\r\n */\r\nexport interface IDateAxisDataFields extends IValueAxisDataFields {\r\n\r\n\t/**\r\n\t * Date.\r\n\t */\r\n\tdate?: string;\r\n\r\n}\r\n\r\n/**\r\n * Defines properties for [[DateAxis]].\r\n */\r\nexport interface IDateAxisProperties extends IValueAxisProperties {\r\n\r\n\t/**\r\n\t * If enabled, axis will automatically collapse empty (without data points)\r\n\t * periods of time, i.e. weekends.\r\n\t *\r\n\t * @default false\r\n\t */\r\n\tskipEmptyPeriods?: boolean;\r\n\r\n\t/**\r\n\t * Use `periodChangeDateFormats` to apply different formats to the first\r\n\t * label in bigger time unit.\r\n\t *\r\n\t * @default true\r\n\t * @param value Use different format for period beginning?\r\n\t */\r\n\tmarkUnitChange?: boolean;\r\n\r\n\t/**\r\n\t * Should the nearest tooltip be shown if no data item is found on the\r\n\t * current cursor position.\r\n\t *\r\n\t * @default true\r\n\t */\r\n\tsnapTooltip?: boolean;\r\n\r\n\t/**\r\n\t * A special date format to apply axis tooltips.\r\n\t *\r\n\t * Will use same format as for labels, if not set.\r\n\t */\r\n\ttooltipDateFormat?: string;\r\n}\r\n\r\n/**\r\n * Defines events for [[DateAxis]].\r\n */\r\nexport interface IDateAxisEvents extends IValueAxisEvents { }\r\n\r\n/**\r\n * Defines adapters for [[DateAxis]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IDateAxisAdapters extends IValueAxisAdapters, IDateAxisProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Used to create a date/time-based axis for the chart.\r\n *\r\n * ```TypeScript\r\n * // Create the axis\r\n * let xAxis = chart.xAxes.push(new am4charts.DateAxis());\r\n *\r\n * // Set settings\r\n * xAxis.title.text = \"Time\";\r\n * ```\r\n * ```JavaScript\r\n * // Create the axis\r\n * var valueAxis = chart.xAxes.push(new am4charts.DateAxis());\r\n *\r\n * // Set settings\r\n * valueAxis.title.text = \"Time\";\r\n * ```\r\n * ```JSON\r\n * \"xAxes\": [{\r\n * \"type\": \"DateAxis\",\r\n * \"title\": {\r\n * \"text\": \"Time\"\r\n * }\r\n * }]\r\n * ```\r\n *\r\n * @see {@link IDateAxisEvents} for a list of available Events\r\n * @see {@link IDateAxisAdapters} for a list of available Adapters\r\n * @important\r\n */\r\nexport class DateAxis extends ValueAxis {\r\n\r\n\t/**\r\n\t * Defines data fields.\r\n\t */\r\n\tpublic _dataFields: IDateAxisDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IDateAxisProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IDateAxisAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IDateAxisEvents;\r\n\r\n\t/**\r\n\t * Defines the type of the Date Items.\r\n\t */\r\n\tpublic _dataItem: DateAxisDataItem;\r\n\r\n\t/**\r\n\t * Defines the type of the axis breaks.\r\n\t */\r\n\tpublic _axisBreak: DateAxisBreak;\r\n\r\n\t/**\r\n\t * A list of date/time intervals for Date axis.\r\n\t *\r\n\t * This define various granularities available for the axis. For example\r\n\t * if you have an axis spanning an hour, and space for 6 grid lines / labels\r\n\t * the axis will choose the granularity of 10 minutes, displaying a label\r\n\t * every 10 minutes.\r\n\t *\r\n\t * Default intervals:\r\n\t *\r\n\t * ```JSON\r\n\t * [\r\n\t * { timeUnit: \"millisecond\", count: 1 },\r\n\t * { timeUnit: \"millisecond\", count: 5 },\r\n\t * { timeUnit: \"millisecond\", count: 10 },\r\n\t * { timeUnit: \"millisecond\", count: 50 },\r\n\t * { timeUnit: \"millisecond\", count: 100 },\r\n\t * { timeUnit: \"millisecond\", count: 500 },\r\n\t * { timeUnit: \"second\", count: 1 },\r\n\t * { timeUnit: \"second\", count: 5 },\r\n\t * { timeUnit: \"second\", count: 10 },\r\n\t * { timeUnit: \"second\", count: 30 },\r\n\t * { timeUnit: \"minute\", count: 1 },\r\n\t * { timeUnit: \"minute\", count: 5 },\r\n\t * { timeUnit: \"minute\", count: 10 },\r\n\t * { timeUnit: \"minute\", count: 30 },\r\n\t * { timeUnit: \"hour\", count: 1 },\r\n\t * { timeUnit: \"hour\", count: 3 },\r\n\t * { timeUnit: \"hour\", count: 6 },\r\n\t * { timeUnit: \"hour\", count: 12 },\r\n\t * { timeUnit: \"day\", count: 1 },\r\n\t * { timeUnit: \"day\", count: 2 },\r\n\t * { timeUnit: \"day\", count: 3 },\r\n\t * { timeUnit: \"day\", count: 4 },\r\n\t * { timeUnit: \"day\", count: 5 },\r\n\t * { timeUnit: \"week\", count: 1 },\r\n\t * { timeUnit: \"month\", count: 1 },\r\n\t * { timeUnit: \"month\", count: 2 },\r\n\t * { timeUnit: \"month\", count: 3 },\r\n\t * { timeUnit: \"month\", count: 6 },\r\n\t * { timeUnit: \"year\", count: 1 },\r\n\t * { timeUnit: \"year\", count: 2 },\r\n\t * { timeUnit: \"year\", count: 5 },\r\n\t * { timeUnit: \"year\", count: 10 },\r\n\t * { timeUnit: \"year\", count: 50 },\r\n\t * { timeUnit: \"year\", count: 100 }\r\n\t * ]\r\n\t * ```\r\n\t */\r\n\tpublic gridIntervals: List = new List();\r\n\r\n\t/**\r\n\t * A collection of date formats to use when formatting different time units\r\n\t * on Date/time axis.\r\n\t *\r\n\t * Actual defaults will depend on the language locale set for the chart.\r\n\t *\r\n\t * To override format for a specific time unit, say days, you need to set\r\n\t * the appropriate key to a format string. E.g.:\r\n\t *\r\n\t * ```TypeScript\r\n\t * axis.dateFormats.setKey(\"day\", \"MMMM d, yyyy\");\r\n\t * ```\r\n\t * ```JavaScript\r\n\t * axis.dateFormats.setKey(\"day\", \"MMMM d, yyyy\");\r\n\t * ```\r\n\t * ```JSON\r\n\t * \"xAxes\": [{\r\n\t * \"type\": \"DateAxis\",\r\n\t * \"dateFormats\": {\r\n\t * \"day\": \"MMMM d, yyyy\"\r\n\t * }\r\n\t * }]\r\n\t * ```\r\n\t *\r\n\t * @see {@link DateFormatter}\r\n\t */\r\n\tpublic dateFormats: Dictionary = new Dictionary();\r\n\r\n\t/**\r\n\t * These formats are applied to labels that are first in a larger unit.\r\n\t *\r\n\t * For example, if we have a DateAxis with days on it, the first day of month\r\n\t * indicates a break in month - a start of the bigger period.\r\n\t *\r\n\t * For those labels, `periodChangeDateFormats` are applied instead of\r\n\t * `dateFormats`.\r\n\t *\r\n\t * This allows us implement convenient structures, like instead of:\r\n\t *\r\n\t * `Jan 1 - Jan 2 - Jan 3 - ...`\r\n\t *\r\n\t * We can have:\r\n\t *\r\n\t * `Jan - 1 - 2 - 3 - ...`\r\n\t *\r\n\t * This can be disabled by setting `markUnitChange = false`.\r\n\t */\r\n\tpublic periodChangeDateFormats: Dictionary = new Dictionary();\r\n\r\n\t/**\r\n\t * At which intervals grid elements are displayed.\r\n\t */\r\n\tprotected _gridInterval: ITimeInterval;\r\n\r\n\t/**\r\n\t * [_intervalDuration description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _intervalDuration: number;\r\n\r\n\t/**\r\n\t * [_gridDate description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _gridDate: Date;\r\n\r\n\t/**\r\n\t * [_nextGridUnit description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _nextGridUnit: TimeUnit;\r\n\r\n\t/**\r\n\t * User-defined granularity of data.\r\n\t */\r\n\tprotected _baseInterval: ITimeInterval;\r\n\r\n\t/**\r\n\t * Actual interval (granularity) derived from the actual data.\r\n\t */\r\n\tprotected _baseIntervalReal: ITimeInterval = { timeUnit: \"day\", count: 1 };\r\n\r\n\t/**\r\n\t */\r\n\tprotected _prevSeriesTime: number;\r\n\r\n\t/**\r\n\t * [_minDifference description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _minDifference: { [index: string]: number } = {};\r\n\r\n\t/**\r\n\t * A function which applies fills to axis cells.\r\n\t *\r\n\t * Default function fills every second fill. You can set this to a function\r\n\t * that follows some other logic.\r\n\t *\r\n\t * Function should accept a [[DateAxisDataItem]] and modify its `axisFill`\r\n\t * property accordingly.\r\n\t */\r\n\tpublic fillRule(dataItem: this[\"_dataItem\"]): void {\r\n\t\tlet value = dataItem.value;\r\n\t\tlet axis = dataItem.component;\r\n\t\tlet gridInterval = axis._gridInterval;\r\n\t\tlet gridDuration = $time.getDuration(gridInterval.timeUnit, gridInterval.count);\r\n\r\n\t\tif (Math.round((value - axis.min) / gridDuration) / 2 == Math.round(Math.round((value - axis.min) / gridDuration) / 2)) {\r\n\t\t\tdataItem.axisFill.__disabled = true;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tdataItem.axisFill.__disabled = false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"DateAxis\";\r\n\r\n\t\tthis.setPropertyValue(\"markUnitChange\", true);\r\n\t\tthis.snapTooltip = true;\r\n\r\n\t\t// Translatable defaults are applied in `applyInternalDefaults()`\r\n\t\t// ...\r\n\r\n\t\t// Define default intervals\r\n\t\tthis.gridIntervals.pushAll([\r\n\t\t\t{ timeUnit: \"millisecond\", count: 1 },\r\n\t\t\t{ timeUnit: \"millisecond\", count: 5 },\r\n\t\t\t{ timeUnit: \"millisecond\", count: 10 },\r\n\t\t\t{ timeUnit: \"millisecond\", count: 50 },\r\n\t\t\t{ timeUnit: \"millisecond\", count: 100 },\r\n\t\t\t{ timeUnit: \"millisecond\", count: 500 },\r\n\t\t\t{ timeUnit: \"second\", count: 1 },\r\n\t\t\t{ timeUnit: \"second\", count: 5 },\r\n\t\t\t{ timeUnit: \"second\", count: 10 },\r\n\t\t\t{ timeUnit: \"second\", count: 30 },\r\n\t\t\t{ timeUnit: \"minute\", count: 1 },\r\n\t\t\t{ timeUnit: \"minute\", count: 5 },\r\n\t\t\t{ timeUnit: \"minute\", count: 10 },\r\n\t\t\t{ timeUnit: \"minute\", count: 15 },\r\n\t\t\t{ timeUnit: \"minute\", count: 30 },\r\n\t\t\t{ timeUnit: \"hour\", count: 1 },\r\n\t\t\t{ timeUnit: \"hour\", count: 3 },\r\n\t\t\t{ timeUnit: \"hour\", count: 6 },\r\n\t\t\t{ timeUnit: \"hour\", count: 12 },\r\n\t\t\t{ timeUnit: \"day\", count: 1 },\r\n\t\t\t{ timeUnit: \"day\", count: 2 },\r\n\t\t\t{ timeUnit: \"day\", count: 3 },\r\n\t\t\t{ timeUnit: \"day\", count: 4 },\r\n\t\t\t{ timeUnit: \"day\", count: 5 },\r\n\t\t\t{ timeUnit: \"week\", count: 1 },\r\n\t\t\t{ timeUnit: \"month\", count: 1 },\r\n\t\t\t{ timeUnit: \"month\", count: 2 },\r\n\t\t\t{ timeUnit: \"month\", count: 3 },\r\n\t\t\t{ timeUnit: \"month\", count: 6 },\r\n\t\t\t{ timeUnit: \"year\", count: 1 },\r\n\t\t\t{ timeUnit: \"year\", count: 2 },\r\n\t\t\t{ timeUnit: \"year\", count: 5 },\r\n\t\t\t{ timeUnit: \"year\", count: 10 },\r\n\t\t\t{ timeUnit: \"year\", count: 50 },\r\n\t\t\t{ timeUnit: \"year\", count: 100 },\r\n\t\t\t{ timeUnit: \"year\", count: 200 },\r\n\t\t\t{ timeUnit: \"year\", count: 500 },\r\n\t\t\t{ timeUnit: \"year\", count: 1000 },\r\n\t\t\t{ timeUnit: \"year\", count: 2000 },\r\n\t\t\t{ timeUnit: \"year\", count: 5000 },\r\n\t\t\t{ timeUnit: \"year\", count: 10000 },\r\n\t\t\t{ timeUnit: \"year\", count: 100000 }\r\n\t\t]);\r\n\r\n\t\t// Set field name\r\n\t\tthis.axisFieldName = \"date\";\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets defaults that instantiate some objects that rely on parent, so they\r\n\t * cannot be set in constructor.\r\n\t */\r\n\tprotected applyInternalDefaults(): void {\r\n\t\tsuper.applyInternalDefaults();\r\n\r\n\t\t// Set default date formats\r\n\t\tif (!this.dateFormats.hasKey(\"millisecond\")) {\r\n\t\t\tthis.dateFormats.setKey(\"millisecond\", this.language.translate(\"_date_millisecond\"));\r\n\t\t}\r\n\t\tif (!this.dateFormats.hasKey(\"second\")) {\r\n\t\t\tthis.dateFormats.setKey(\"second\", this.language.translate(\"_date_second\"));\r\n\t\t}\r\n\t\tif (!this.dateFormats.hasKey(\"minute\")) {\r\n\t\t\tthis.dateFormats.setKey(\"minute\", this.language.translate(\"_date_minute\"));\r\n\t\t}\r\n\t\tif (!this.dateFormats.hasKey(\"hour\")) {\r\n\t\t\tthis.dateFormats.setKey(\"hour\", this.language.translate(\"_date_hour\"));\r\n\t\t}\r\n\t\tif (!this.dateFormats.hasKey(\"day\")) {\r\n\t\t\tthis.dateFormats.setKey(\"day\", this.language.translate(\"_date_day\"));\r\n\t\t}\r\n\t\tif (!this.dateFormats.hasKey(\"week\")) {\r\n\t\t\tthis.dateFormats.setKey(\"week\", this.language.translate(\"_date_day\"));\t // not a mistake\r\n\t\t}\r\n\t\tif (!this.dateFormats.hasKey(\"month\")) {\r\n\t\t\tthis.dateFormats.setKey(\"month\", this.language.translate(\"_date_month\"));\r\n\t\t}\r\n\t\tif (!this.dateFormats.hasKey(\"year\")) {\r\n\t\t\tthis.dateFormats.setKey(\"year\", this.language.translate(\"_date_year\"));\r\n\t\t}\r\n\r\n\t\tif (!this.periodChangeDateFormats.hasKey(\"millisecond\")) {\r\n\t\t\tthis.periodChangeDateFormats.setKey(\"millisecond\", this.language.translate(\"_date_millisecond\"));\r\n\t\t}\r\n\t\tif (!this.periodChangeDateFormats.hasKey(\"second\")) {\r\n\t\t\tthis.periodChangeDateFormats.setKey(\"second\", this.language.translate(\"_date_second\"));\r\n\t\t}\r\n\t\tif (!this.periodChangeDateFormats.hasKey(\"minute\")) {\r\n\t\t\tthis.periodChangeDateFormats.setKey(\"minute\", this.language.translate(\"_date_minute\"));\r\n\t\t}\r\n\t\tif (!this.periodChangeDateFormats.hasKey(\"hour\")) {\r\n\t\t\tthis.periodChangeDateFormats.setKey(\"hour\", this.language.translate(\"_date_hour\"));\r\n\t\t}\r\n\t\tif (!this.periodChangeDateFormats.hasKey(\"day\")) {\r\n\t\t\tthis.periodChangeDateFormats.setKey(\"day\", this.language.translate(\"_date_day\"));\r\n\t\t}\r\n\t\tif (!this.periodChangeDateFormats.hasKey(\"week\")) {\r\n\t\t\tthis.periodChangeDateFormats.setKey(\"week\", this.language.translate(\"_date_day\"));\r\n\t\t}\r\n\t\tif (!this.periodChangeDateFormats.hasKey(\"month\")) {\r\n\t\t\tthis.periodChangeDateFormats.setKey(\"month\", this.language.translate(\"_date_month\") + \" \" + this.language.translate(\"_date_year\"));\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty [[DataItem]] of the type appropriate for this object.\r\n\t *\r\n\t * @see {@link DataItem}\r\n\t * @return Data Item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new DateAxisDataItem();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty [[AxisBreak]] of the appropriate type.\r\n\t *\r\n\t * @return Axis break\r\n\t */\r\n\tprotected createAxisBreak(): this[\"_axisBreak\"] {\r\n\t\treturn new DateAxisBreak();\r\n\t}\r\n\r\n\t/**\r\n\t * Validates Axis' data items.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validateDataItems(): void {\r\n\t\t// allows to keep selection of the same size\r\n\t\tlet start: number = this.start;\r\n\t\tlet end: number = this.end;\r\n\t\tlet periodCount: number = (this.max - this.min) / this.baseDuration;\r\n\r\n\t\tsuper.validateDataItems();\r\n\r\n\t\tthis.maxZoomFactor = (this.max - this.min) / this.baseDuration;\r\n\r\n\t\t// allows to keep selection of the same size\r\n\t\tlet newPeriodCount: number = (this.max - this.min) / this.baseDuration;\r\n\t\tstart = start + (end - start) * (1 - periodCount / newPeriodCount);\r\n\t\tthis.zoom({ start: start, end: end }, false, true); // added instantlyto solve zoomout problem when we have axes gaps. @todo: check how this affects maxZoomFactor\r\n\t}\r\n\r\n\t/**\r\n\t * Handles process after zoom.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Does nothing?\r\n\t */\r\n\tpublic handleSelectionExtremesChange(): void {\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Calculates all positions, related to axis as per current zoom.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic calculateZoom(): void {\r\n\t\tsuper.calculateZoom();\r\n\r\n\t\tlet gridInterval: ITimeInterval = this.chooseInterval(0, this.adjustDifference(this._minZoomed, this._maxZoomed), this._gridCount);\r\n\r\n\t\tif ($time.getDuration(gridInterval.timeUnit, gridInterval.count) < this.baseDuration) {\r\n\t\t\tgridInterval = { ...this.baseInterval };\r\n\t\t}\r\n\r\n\t\tthis._gridInterval = gridInterval;\r\n\r\n\t\tthis._gridDate = $time.round(new Date(this.min), gridInterval.timeUnit, gridInterval.count, this.getFirstWeekDay());\r\n\t\tthis._nextGridUnit = $time.getNextUnit(gridInterval.timeUnit);\r\n\r\n\t\t// the following is needed to avoid grid flickering while scrolling\r\n\t\tthis._intervalDuration = $time.getDuration(gridInterval.timeUnit, gridInterval.count);\r\n\t\tlet count: number = Math.ceil(this._difference / this._intervalDuration);\r\n\t\tcount = Math.floor(this.start * count) - 3; // some extra is needed\r\n\r\n\t\t$time.add(this._gridDate, gridInterval.timeUnit, count * gridInterval.count);\r\n\r\n\t\t// tell series start/end\r\n\t\t$iter.each(this.series.iterator(), (series) => {\r\n\t\t\tif (series.baseAxis == this) {\r\n\t\t\t\tlet field = series.getAxisField(this);\r\n\r\n\t\t\t\t// TODO use $type.castNumber ?\r\n\t\t\t\tlet startIndex: number = series.dataItems.findClosestIndex(this._minZoomed, (x) => x[field], \"left\");\r\n\t\t\t\t// 1 millisecond is removed so that if only first item is selected, it would not count in the second.\r\n\t\t\t\tlet baseInterval = this.baseInterval;\r\n\t\t\t\tlet maxZoomed = $time.add($time.round(new Date(this._maxZoomed), baseInterval.timeUnit, baseInterval.count), baseInterval.timeUnit, baseInterval.count).getTime() - 1;\r\n\r\n\t\t\t\tlet endIndex: number = series.dataItems.findClosestIndex(maxZoomed, (x) => x[field], \"right\") + 1;\r\n\r\n\t\t\t\tseries.startIndex = startIndex;\r\n\t\t\t\tseries.endIndex = endIndex;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)validates data.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validateData(): void {\r\n\t\tsuper.validateData();\r\n\t\tif (!$type.isNumber(this.baseInterval.count)) {\r\n\t\t\tthis.baseInterval.count = 1;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic get minDifference(): number {\r\n\t\tvar minDifference = Number.MAX_VALUE;\r\n\t\tthis.series.each((series) => {\r\n\t\t\tif (minDifference > this._minDifference[series.uid]) {\r\n\t\t\t\tminDifference = this._minDifference[series.uid];\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tif (minDifference == Number.MAX_VALUE || minDifference == 0) {\r\n\t\t\tminDifference = $time.getDuration(\"day\");\r\n\t\t}\r\n\r\n\t\treturn minDifference;\r\n\t}\r\n\r\n\t/**\r\n\t * [dataChangeUpdate description]\r\n\t *\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t */\r\n\tpublic seriesDataChangeUpdate(series: XYSeries): void {\r\n\t\tthis._minDifference[series.uid] = Number.MAX_VALUE;\r\n\t}\r\n\r\n\t/**\r\n\t * [postProcessSeriesDataItems description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t */\r\n\tpublic postProcessSeriesDataItems(): void {\r\n\t\tthis.series.each((series) => {\r\n\t\t\tif (JSON.stringify(series._baseInterval[this.uid]) != JSON.stringify(this.baseInterval)) {\r\n\t\t\t\tseries.dataItems.each((dataItem) => {\r\n\t\t\t\t\tthis.postProcessSeriesDataItem(dataItem);\r\n\t\t\t\t});\r\n\t\t\t\tseries._baseInterval[this.uid] = this.baseInterval;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.addEmptyUnitsBreaks();\r\n\t}\r\n\r\n\t/**\r\n\t * [postProcessSeriesDataItem description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic postProcessSeriesDataItem(dataItem: XYSeriesDataItem): void {\r\n\t\t// we need to do this for all series data items not only added recently, as baseInterval might change\r\n\t\tlet baseInterval: ITimeInterval = this.baseInterval;\r\n\r\n\t\tlet series: XYSeries = dataItem.component;\r\n\t\tlet dataItemsByAxis = series.dataItemsByAxis.getKey(this.uid);\r\n\r\n\t\t$object.each(dataItem.dates, (key) => {\r\n\t\t\tlet date: Date = dataItem.getDate(key);\r\n\t\t\tlet time = date.getTime();\r\n\r\n\t\t\tlet startDate: Date = $time.round(new Date(time), baseInterval.timeUnit, baseInterval.count, this.getFirstWeekDay());\r\n\t\t\tlet startTime = startDate.getTime();\r\n\t\t\tlet endDate: Date = $time.add(new Date(startTime), baseInterval.timeUnit, baseInterval.count);\r\n\r\n\t\t\tdataItem.setCalculatedValue(key, startTime, \"open\");\r\n\t\t\tdataItem.setCalculatedValue(key, endDate.getTime(), \"close\");\r\n\r\n\t\t\tdataItemsByAxis.setKey(startTime.toString(), dataItem);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Collapses empty stretches of date/time scale by creating [[AxisBreak]]\r\n\t * elements for them.\r\n\t *\r\n\t * Can be used to automatically remove strethes without data, like weekends.\r\n\t *\r\n\t * No, need to call this manually. It will automatically be done if\r\n\t * `skipEmptyPeriods = true`.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tprotected addEmptyUnitsBreaks(): void {\r\n\r\n\t\tif (this.skipEmptyPeriods && $type.isNumber(this.min) && $type.isNumber(this.max)) {\r\n\t\t\tlet timeUnit: TimeUnit = this.baseInterval.timeUnit;\r\n\t\t\tlet count: number = this.baseInterval.count;\r\n\r\n\t\t\tthis.axisBreaks.clear(); // TODO: what about breaks added by user?\r\n\r\n\t\t\tlet date: Date = $time.round(new Date(this.min), timeUnit, count, this.getFirstWeekDay());\r\n\t\t\tlet axisBreak: DateAxisBreak;\r\n\r\n\t\t\twhile (date.getTime() < this.max - this.baseDuration) {\r\n\t\t\t\t$time.add(date, timeUnit, count);\r\n\r\n\t\t\t\tlet startTime: number = date.getTime();\r\n\t\t\t\tlet startTimeStr: string = startTime.toString();\r\n\r\n\t\t\t\tlet hasData = $iter.contains(this.series.iterator(), (series) => {\r\n\t\t\t\t\treturn !!series.dataItemsByAxis.getKey(this.uid).getKey(startTimeStr);\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// open break if not yet opened\r\n\t\t\t\tif (!hasData) {\r\n\t\t\t\t\tif (!axisBreak) {\r\n\t\t\t\t\t\taxisBreak = this.axisBreaks.create();\r\n\t\t\t\t\t\taxisBreak.startDate = new Date(startTime);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t// close if already opened\r\n\t\t\t\t\tif (axisBreak) {\r\n\t\t\t\t\t\t// close at end time minus one millisecond\r\n\t\t\t\t\t\taxisBreak.endDate = new Date(startTime - 1);\r\n\t\t\t\t\t\taxisBreak = undefined;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Updates positioning of Axis breaks after something changes.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic fixAxisBreaks(): void {\r\n\t\tsuper.fixAxisBreaks();\r\n\r\n\t\tlet axisBreaks = this.axisBreaks;\r\n\t\tif (axisBreaks.length > 0) {\r\n\t\t\t// process breaks\r\n\t\t\taxisBreaks.each((axisBreak) => {\r\n\t\t\t\tlet breakGridCount: number = Math.ceil(this._gridCount * (Math.min(this.end, axisBreak.endPosition) - Math.max(this.start, axisBreak.startPosition)) / (this.end - this.start));\r\n\t\t\t\taxisBreak.gridInterval = this.chooseInterval(0, axisBreak.adjustedEndValue - axisBreak.adjustedStartValue, breakGridCount);\r\n\t\t\t\tlet gridDate = $time.round(new Date(axisBreak.adjustedStartValue), axisBreak.gridInterval.timeUnit, axisBreak.gridInterval.count, this.getFirstWeekDay());\r\n\t\t\t\tif (gridDate.getTime() > axisBreak.startDate.getTime()) {\r\n\t\t\t\t\t$time.add(gridDate, axisBreak.gridInterval.timeUnit, axisBreak.gridInterval.count);\r\n\t\t\t\t}\r\n\r\n\t\t\t\taxisBreak.gridDate = gridDate;\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tprotected getFirstWeekDay(): number {\r\n\t\tif (this.dateFormatter) {\r\n\t\t\treturn this.dateFormatter.firstDayOfWeek;\r\n\t\t}\r\n\r\n\t\treturn 1;\r\n\t}\r\n\r\n\t/**\r\n\t * [getGridDate description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @param date [description]\r\n\t * @param intervalCount [description]\r\n\t * @return [description]\r\n\t */\r\n\tpublic getGridDate(date: Date, intervalCount: number): Date {\r\n\t\tlet timeUnit: TimeUnit = this._gridInterval.timeUnit;\r\n\t\tlet realIntervalCount: number = this._gridInterval.count;\r\n\t\t// round date\r\n\t\t$time.round(date, timeUnit, 1, this.getFirstWeekDay());\r\n\r\n\t\tlet prevTimestamp: number = date.getTime();\r\n\r\n\t\tlet newDate: Date = $time.copy(date);\r\n\t\t// modify date by adding intervalcount\r\n\t\tlet timestamp: number = $time.add(newDate, timeUnit, intervalCount).getTime();\r\n\r\n\t\t// if it's axis break, get first rounded date which is not in a break\r\n\t\tlet axisBreak: DateAxisBreak = this.isInBreak(timestamp);\r\n\t\tif (axisBreak) {\r\n\t\t\tnewDate = new Date(axisBreak.endDate.getTime());\r\n\t\t\t$time.round(newDate, timeUnit, realIntervalCount, this.getFirstWeekDay());\r\n\t\t\tif (newDate.getTime() < axisBreak.endDate.getTime()) {\r\n\t\t\t\t$time.add(newDate, timeUnit, realIntervalCount);\r\n\t\t\t}\r\n\t\t\ttimestamp = newDate.getTime();\r\n\t\t}\r\n\r\n\t\t// get duration between grid lines with break duration removed\r\n\t\tlet durationBreaksRemoved: number = this.adjustDifference(prevTimestamp, timestamp);\r\n\t\t// calculate how many time units fit to this duration\r\n\t\tlet countBreaksRemoved: number = Math.round(durationBreaksRemoved / $time.getDuration(timeUnit));\r\n\r\n\t\t// if less units fit, add one and repeat\r\n\t\tif (countBreaksRemoved < realIntervalCount) {\r\n\t\t\treturn this.getGridDate(date, intervalCount + realIntervalCount);\r\n\t\t}\r\n\r\n\t\treturn newDate;\r\n\t}\r\n\r\n\t/**\r\n\t * [getBreaklessDate description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @param axisBreak [description]\r\n\t * @param timeUnit [description]\r\n\t * @param count [description]\r\n\t * @return [description]\r\n\t */\r\n\tpublic getBreaklessDate(axisBreak: DateAxisBreak, timeUnit: TimeUnit, count: number): Date {\r\n\t\tlet date = new Date(axisBreak.endValue);\r\n\t\t$time.round(date, timeUnit, count, this.getFirstWeekDay());\r\n\t\t$time.add(date, timeUnit, count);\r\n\r\n\t\tlet timestamp = date.getTime();\r\n\r\n\t\taxisBreak = this.isInBreak(timestamp);\r\n\t\tif (axisBreak) {\r\n\t\t\treturn this.getBreaklessDate(axisBreak, timeUnit, count);\r\n\t\t}\r\n\t\treturn date;\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)validates all Axis elements.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t */\r\n\tpublic validateAxisElements(): void {\r\n\t\tif ($type.isNumber(this.max) && $type.isNumber(this.min)) {\r\n\r\n\t\t\tthis.calculateZoom();\r\n\r\n\t\t\t// first regular items\r\n\t\t\tlet timestamp = this._gridDate.getTime();\r\n\t\t\tlet timeUnit = this._gridInterval.timeUnit;\r\n\t\t\tlet intervalCount = this._gridInterval.count;\r\n\t\t\tlet prevGridDate = $time.copy(this._gridDate);\r\n\r\n\t\t\tlet dataItemsIterator = this._dataItemsIterator;\r\n\t\t\tthis.resetIterators();\r\n\r\n\t\t\twhile (timestamp <= this._maxZoomed) {\r\n\t\t\t\tlet date = this.getGridDate($time.copy(prevGridDate), intervalCount);\r\n\r\n\t\t\t\ttimestamp = date.getTime();\r\n\r\n\t\t\t\tlet endDate = $time.copy(date); // you might think it's easier to add intervalduration to timestamp, however it won't work for months or years which are not of the same length\r\n\t\t\t\tendDate = $time.add(endDate, timeUnit, intervalCount);\r\n\r\n\t\t\t\tlet format = this.dateFormats.getKey(timeUnit);\r\n\r\n\t\t\t\tif (this.markUnitChange && prevGridDate) {\r\n\t\t\t\t\tif ($time.checkChange(date, prevGridDate, this._nextGridUnit)) {\r\n\t\t\t\t\t\tif (timeUnit !== \"year\") {\r\n\t\t\t\t\t\t\tformat = this.periodChangeDateFormats.getKey(timeUnit);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet text = this.dateFormatter.format(date, format);\r\n\r\n\t\t\t\tlet dataItem = dataItemsIterator.find((x) => x.text === text);\r\n\t\t\t\tif (dataItem.__disabled) {\r\n\t\t\t\t\tdataItem.__disabled = false;\r\n\t\t\t\t}\r\n\t\t\t\tthis.appendDataItem(dataItem);\r\n\r\n\t\t\t\tdataItem.axisBreak = undefined;\r\n\t\t\t\tdataItem.date = date;\r\n\t\t\t\tdataItem.endDate = endDate;\r\n\r\n\t\t\t\tdataItem.text = text;\r\n\r\n\t\t\t\tprevGridDate = date;\r\n\r\n\t\t\t\tthis.validateDataElement(dataItem);\r\n\t\t\t}\r\n\r\n\t\t\t// breaks later\r\n\t\t\tlet renderer: AxisRenderer = this.renderer;\r\n\r\n\t\t\t$iter.each(this.axisBreaks.iterator(), (axisBreak) => {\r\n\t\t\t\tif (axisBreak.breakSize > 0) {\r\n\t\t\t\t\tlet timeUnit: TimeUnit = axisBreak.gridInterval.timeUnit;\r\n\t\t\t\t\tlet intervalCount: number = axisBreak.gridInterval.count;\r\n\r\n\t\t\t\t\t// only add grid if gap is bigger then minGridDistance\r\n\t\t\t\t\tif ($math.getDistance(axisBreak.startPoint, axisBreak.endPoint) > renderer.minGridDistance * 4) {\r\n\t\t\t\t\t\tlet timestamp: number = axisBreak.gridDate.getTime();\r\n\r\n\t\t\t\t\t\tlet prevGridDate;\r\n\t\t\t\t\t\tlet count: number = 0;\r\n\t\t\t\t\t\twhile (timestamp <= axisBreak.adjustedMax) {\r\n\t\t\t\t\t\t\tlet date: Date = $time.copy(axisBreak.gridDate);\r\n\t\t\t\t\t\t\ttimestamp = $time.add(date, timeUnit, intervalCount * count).getTime();\r\n\t\t\t\t\t\t\tcount++;\r\n\t\t\t\t\t\t\tif (timestamp > axisBreak.adjustedStartValue && timestamp < axisBreak.adjustedEndValue) {\r\n\t\t\t\t\t\t\t\tlet endDate = $time.copy(date); // you might think it's easier to add intervalduration to timestamp, however it won't work for months or years which are not of the same length\r\n\t\t\t\t\t\t\t\tendDate = $time.add(endDate, timeUnit, intervalCount);\r\n\r\n\t\t\t\t\t\t\t\tlet format: string = this.dateFormats.getKey(timeUnit);\r\n\r\n\t\t\t\t\t\t\t\tif (this.markUnitChange && prevGridDate) {\r\n\t\t\t\t\t\t\t\t\tif ($time.checkChange(date, prevGridDate, this._nextGridUnit)) {\r\n\t\t\t\t\t\t\t\t\t\tif (timeUnit !== \"year\") {\r\n\t\t\t\t\t\t\t\t\t\t\tformat = this.periodChangeDateFormats.getKey(timeUnit);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tlet text: string = this.dateFormatter.format(date, format);\r\n\r\n\t\t\t\t\t\t\t\tlet dataItem: this[\"_dataItem\"] = dataItemsIterator.find((x) => x.text === text);\r\n\t\t\t\t\t\t\t\tif (dataItem.__disabled) {\r\n\t\t\t\t\t\t\t\t\tdataItem.__disabled = false;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t//this.processDataItem(dataItem);\r\n\t\t\t\t\t\t\t\tthis.appendDataItem(dataItem);\r\n\t\t\t\t\t\t\t\tdataItem.axisBreak = axisBreak;\r\n\t\t\t\t\t\t\t\taxisBreak.dataItems.moveValue(dataItem);\r\n\r\n\t\t\t\t\t\t\t\tdataItem.date = date;\r\n\t\t\t\t\t\t\t\tdataItem.endDate = endDate;\r\n\t\t\t\t\t\t\t\tdataItem.text = text;\r\n\t\t\t\t\t\t\t\tprevGridDate = date;\r\n\t\t\t\t\t\t\t\tthis.validateDataElement(dataItem);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Validates Axis data item.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic validateDataElement(dataItem: this[\"_dataItem\"]): void {\r\n\t\t//super.validateDataElement(dataItem);\r\n\t\tif ($type.isNumber(this.max) && $type.isNumber(this.min)) {\r\n\t\t\tlet renderer: AxisRenderer = this.renderer;\r\n\r\n\t\t\tlet timestamp = dataItem.value;\r\n\t\t\tlet endTimestamp = dataItem.endValue;\r\n\r\n\t\t\tif (!$type.isNumber(endTimestamp)) {\r\n\t\t\t\tendTimestamp = timestamp;\r\n\t\t\t}\r\n\r\n\t\t\tlet position: number = this.valueToPosition(timestamp);\r\n\t\t\tlet endPosition: number = this.valueToPosition(endTimestamp);\r\n\t\t\tlet fillEndPosition = endPosition;\r\n\r\n\t\t\tif (!dataItem.isRange && this._gridInterval.count > this.baseInterval.count) {\r\n\t\t\t\tendPosition = position + (endPosition - position) / (this._gridInterval.count / this.baseInterval.count);\r\n\t\t\t}\r\n\r\n\t\t\tdataItem.position = position;\r\n\r\n\t\t\tlet tick: AxisTick = dataItem.tick;\r\n\t\t\tif (tick && !tick.disabled) {\r\n\t\t\t\trenderer.updateTickElement(tick, position, endPosition);\r\n\t\t\t}\r\n\r\n\t\t\tlet grid: Grid = dataItem.grid;\r\n\t\t\tif (grid && !grid.disabled) {\r\n\t\t\t\trenderer.updateGridElement(grid, position, endPosition);\r\n\t\t\t}\r\n\r\n\t\t\tlet fill: AxisFill = dataItem.axisFill;\r\n\t\t\tif (fill && !fill.disabled) {\r\n\t\t\t\trenderer.updateFillElement(fill, position, fillEndPosition);\r\n\t\t\t\tif (!dataItem.isRange) {\r\n\t\t\t\t\tthis.fillRule(dataItem);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlet mask: AxisFill = dataItem.mask;\r\n\t\t\tif (mask) {\r\n\t\t\t\trenderer.updateFillElement(mask, position, endPosition);\r\n\t\t\t}\r\n\r\n\t\t\tlet label: AxisLabel = dataItem.label;\r\n\t\t\tif (label && !label.disabled) {\r\n\t\t\t\tlet location = label.location;\r\n\r\n\r\n\r\n\t\t\t\tif (location == 0) {\r\n\t\t\t\t\tif (this._gridInterval.count == 1 && this._gridInterval.timeUnit != \"week\" && !dataItem.isRange) {\r\n\t\t\t\t\t\tlocation = 0.5;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tlocation = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\r\n\t\t\t\trenderer.updateLabelElement(label, position, endPosition, location);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * A duration in milliseconds of the `baseInterval`.\r\n\t *\r\n\t * @return Duration (ms)\r\n\t */\r\n\tpublic get baseDuration(): number {\r\n\t\treturn $time.getDuration(this.baseInterval.timeUnit, this.baseInterval.count);\r\n\t}\r\n\r\n\t/**\r\n\t * Adjusts min/max values.\r\n\t *\r\n\t * @ignore Exclude from docs.\r\n\t * @todo Description (review)\r\n\t * @param min Min timestamp\r\n\t * @param max Max timestamp\r\n\t * @return Adjusted min/max step\r\n\t */\r\n\tpublic adjustMinMax(min: number, max: number): IMinMaxStep {\r\n\t\treturn { min: min, max: max, step: this.baseDuration };\r\n\t}\r\n\r\n\t/**\r\n\t * Adjusts the minimum timestamp as per cell start location.\r\n\t *\r\n\t * @param value Value\r\n\t * @return Adjusted value\r\n\t */\r\n\tprotected fixMin(value: number) {\r\n\t\t// like this because months are not equal\r\n\t\tlet startTime = $time.round(new Date(value), this.baseInterval.timeUnit, this.baseInterval.count, this.getFirstWeekDay()).getTime();\r\n\t\tlet endTime = $time.add(new Date(startTime), this.baseInterval.timeUnit, this.baseInterval.count).getTime();\r\n\t\treturn startTime + (endTime - startTime) * this.startLocation;\r\n\t}\r\n\r\n\t/**\r\n\t * Adjusts the maximum timestamp as per cell start location.\r\n\t *\r\n\t * @param value Value\r\n\t * @return Adjusted value\r\n\t */\r\n\tprotected fixMax(value: number) {\r\n\t\t// like this because months are not equal\r\n\t\tlet startTime = $time.round(new Date(value), this.baseInterval.timeUnit, this.baseInterval.count, this.getFirstWeekDay()).getTime();\r\n\t\tlet endTime = $time.add(new Date(startTime), this.baseInterval.timeUnit, this.baseInterval.count).getTime();\r\n\t\treturn startTime + (endTime - startTime) * this.endLocation;\r\n\t}\r\n\r\n\t/**\r\n\t * [chooseInterval description]\r\n\t *\r\n\t * @ignore Exclude from docs.\r\n\t * @todo Description\r\n\t * @param index [description]\r\n\t * @param duration [description]\r\n\t * @param gridCount [description]\r\n\t * @return [description]\r\n\t */\r\n\tpublic chooseInterval(index: number, duration: number, gridCount: number): ITimeInterval {\r\n\t\tlet gridIntervals: List = this.gridIntervals;\r\n\r\n\t\tlet gridInterval: ITimeInterval = gridIntervals.getIndex(index);\r\n\r\n\t\tlet intervalDuration: number = $time.getDuration(gridInterval.timeUnit, gridInterval.count);\r\n\r\n\t\tlet lastIndex: number = gridIntervals.length - 1;\r\n\t\tif (index >= lastIndex) {\r\n\t\t\treturn { ...gridIntervals.getIndex(lastIndex) };\r\n\t\t}\r\n\r\n\t\tlet count: number = Math.ceil(duration / intervalDuration);\r\n\r\n\t\tif (duration < intervalDuration && index > 0) {\r\n\t\t\treturn { ...gridIntervals.getIndex(index - 1) };\r\n\t\t}\r\n\r\n\t\tif (count <= gridCount) {\r\n\t\t\treturn { ...gridIntervals.getIndex(index) };\r\n\t\t} else {\r\n\t\t\tif (index + 1 < gridIntervals.length) {\r\n\t\t\t\treturn this.chooseInterval(index + 1, duration, gridCount);\r\n\t\t\t} else {\r\n\t\t\t\treturn { ...gridIntervals.getIndex(index) };\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Formats the value according to axis' own [[DateFormatter]].\r\n\t *\r\n\t * @param value Source value\r\n\t * @return Formatted value\r\n\t */\r\n\tpublic formatLabel(value: number): string {\r\n\t\treturn this.dateFormatter.format(value);\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a Date to an asbolute pixel position within Axis.\r\n\t *\r\n\t * @param date Date\r\n\t * @return Position (px)\r\n\t */\r\n\tpublic dateToPosition(date: Date): number {\r\n\t\treturn this.valueToPosition(date.getTime());\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a numeric timestamp or a `Date` to a relative position on axis.\r\n\t *\r\n\t * @param date Date or a timestamp\r\n\t * @return Relative position\r\n\t */\r\n\tpublic anyToPosition(date: Date | number): number {\r\n\t\tif (date instanceof Date) {\r\n\t\t\treturn this.dateToPosition(date);\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn this.valueToPosition(date);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Converts date to orientation point (x, y, angle) on axis\r\n\t *\r\n\t * @param date Date\r\n\t * @return IOrientationPoint\r\n\t */\r\n\tpublic dateToPoint(date: Date): IOrientationPoint {\r\n\t\tlet position = this.dateToPosition(date);\r\n\t\tlet point = this.renderer.positionToPoint(position);\r\n\t\tlet angle = this.renderer.positionToAngle(position);\r\n\t\treturn { x: point.x, y: point.y, angle: angle };\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Converts a numeric value to orientation (x, y, angle) point on axis\r\n\t *\r\n\t * @param value Value\r\n\t * @return Orientation point\r\n\t */\r\n\tpublic anyToPoint(date: Date | number): IOrientationPoint {\r\n\t\tif (date instanceof Date) {\r\n\t\t\treturn this.dateToPoint(date);\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn this.valueToPoint(date);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Converts pixel position within Axis to a corresponding Date.\r\n\t *\r\n\t * @param position Position (px)\r\n\t * @return Date\r\n\t */\r\n\tpublic positionToDate(position: number): Date {\r\n\t\treturn new Date(this.positionToValue(position));\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the X coordinate for series' data item's value.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t * @param dataItem Data item\r\n\t * @param key Data field to get value from\r\n\t * @param location Location (0-1)\r\n\t * @return X coordinate (px)\r\n\t */\r\n\tpublic getX(dataItem: XYSeriesDataItem, key: string, location?: number): number {\r\n\t\tlet value: number = this.getTimeByLocation(dataItem, key, location);\r\n\t\t//let stack: number = dataItem.getValue(\"valueX\", \"stack\");\r\n\r\n\t\tif (!$type.isNumber(value)) {\r\n\t\t\tvalue = this.baseValue;\r\n\t\t}\r\n\r\n\t\treturn this.renderer.positionToPoint(this.valueToPosition(value)).x;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the Y coordinate for series' data item's value.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t * @param dataItem Data item\r\n\t * @param key Data field to get value from\r\n\t * @param location Location (0-1)\r\n\t * @return Y coordinate (px)\r\n\t */\r\n\tpublic getY(dataItem: XYSeriesDataItem, key: string, location?: number): number {\r\n\t\tlet value: number = this.getTimeByLocation(dataItem, key, location);\r\n\t\tlet stack: number = dataItem.getValue(\"valueX\", \"stack\");\r\n\r\n\t\tif (!$type.isNumber(value)) {\r\n\t\t\tvalue = this.baseValue;\r\n\t\t}\r\n\r\n\t\treturn this.renderer.positionToPoint(this.valueToPosition(value + stack)).y;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an angle for series data item.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t * @param dataItem Data item\r\n\t * @param key Data field to get value from\r\n\t * @param location Location (0-1)\r\n\t * @param stackKey Stack ID\r\n\t * @return Angle\r\n\t */\r\n\tpublic getAngle(dataItem: XYSeriesDataItem, key: string, location?: number, stackKey?: string): number {\r\n\t\tlet value: number = this.getTimeByLocation(dataItem, key, location);\r\n\t\tlet stack: number = dataItem.getValue(stackKey, \"stack\");\r\n\r\n\t\tif (!$type.isNumber(value)) {\r\n\t\t\tvalue = this.baseValue;\r\n\t\t}\r\n\r\n\t\treturn this.positionToAngle(this.valueToPosition(value + stack));\r\n\t}\r\n\r\n\t/**\r\n\t * [getTimeByLocation description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @param dataItem [description]\r\n\t * @param key [description]\r\n\t * @param location [description]\r\n\t * @return [description]\r\n\t */\r\n\tprotected getTimeByLocation(dataItem: XYSeriesDataItem, key: string, location: number): number {\r\n\t\tif (!$type.hasValue(key)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!$type.isNumber(location)) {\r\n\t\t\tlocation = dataItem.workingLocations[key];\r\n\r\n\t\t\tif (!$type.isNumber(location)) {\r\n\t\t\t\tlocation = 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet startTime: number = dataItem.values[key][\"open\"];\r\n\t\tlet endTime: number = dataItem.values[key][\"close\"];\r\n\r\n\t\tif ($type.isNumber(startTime) && $type.isNumber(endTime)) {\r\n\t\t\treturn startTime + (endTime - startTime) * location;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Processes a related series' data item.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic processSeriesDataItem(dataItem: XYSeriesDataItem, axisLetter?: string): void {\r\n\r\n\t\tlet series = dataItem.component;\r\n\t\tlet time: number;\r\n\r\n\t\tlet date: Date = (dataItem)[\"date\" + axisLetter];\r\n\t\tif (date) {\r\n\t\t\ttime = date.getTime();\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tlet openDate: Date = (dataItem)[\"openDate\" + axisLetter];\r\n\t\tlet prevSeriesTime: number = this._prevSeriesTime;\r\n\r\n\r\n\t\tlet openTime: number;\r\n\t\tif (openDate) {\r\n\t\t\topenTime = openDate.getTime();\r\n\t\t}\r\n\r\n\t\tif ($type.isNumber(openTime)) {\r\n\t\t\tlet difference = Math.abs(time - openTime);\r\n\r\n\t\t\tif (this._minDifference[series.uid] > difference) {\r\n\t\t\t\tthis._minDifference[series.uid] = difference;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet differece: number = time - prevSeriesTime;\r\n\r\n\t\tif (differece > 0) {\r\n\t\t\tif (this._minDifference[series.uid] > differece) {\r\n\t\t\t\tthis._minDifference[series.uid] = differece;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._prevSeriesTime = time;\r\n\r\n\t\tif (series._baseInterval[this.uid]) {\r\n\t\t\tthis.postProcessSeriesDataItem(dataItem);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif (this._baseInterval) {\r\n\t\t\t\tseries._baseInterval[this.uid] = this._baseInterval;\r\n\t\t\t\tthis.postProcessSeriesDataItem(dataItem);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * [updateAxisBySeries description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t */\r\n\tpublic updateAxisBySeries() {\r\n\t\tsuper.updateAxisBySeries();\r\n\r\n\t\tlet baseInterval: ITimeInterval = this.chooseInterval(0, this.minDifference, 1);\r\n\t\t// handle short months\r\n\t\tif (this.minDifference >= $time.getDuration(\"day\", 27) && baseInterval.timeUnit == \"week\") {\r\n\t\t\tbaseInterval.timeUnit = \"month\";\r\n\t\t\tbaseInterval.count = 1;\r\n\t\t}\r\n\t\t// handle daylight saving\r\n\t\tif (this.minDifference >= $time.getDuration(\"hour\", 23) && baseInterval.timeUnit == \"hour\") {\r\n\t\t\tbaseInterval.timeUnit = \"day\";\r\n\t\t\tbaseInterval.count = 1;\r\n\t\t}\r\n\r\n\t\tthis._baseIntervalReal = baseInterval;\r\n\t\t// no need to invalidate\r\n\t}\r\n\r\n\t/**\r\n\t * A base interval (granularity) of data.\r\n\t *\r\n\t * Used to indicate what are the base units of your data.\r\n\t *\r\n\t * For example, if you have a data set that has a data point every 5 minutes,\r\n\t * you may want to set this to `{ timeUnit: \"minute\", count: 5 }`.\r\n\t *\r\n\t * If not set, the Axis will try to determine the setting by its own, looking\r\n\t * at actual data.\r\n\t *\r\n\t * @param timeInterval base interval\r\n\t */\r\n\tpublic set baseInterval(timeInterval: ITimeInterval) {\r\n\t\tif (JSON.stringify(this._baseInterval) != JSON.stringify(timeInterval)) {\r\n\t\t\tthis._baseInterval = timeInterval;\r\n\t\t\tthis.invalidate();\r\n\t\t\tthis.postProcessSeriesDataItems();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Base interval\r\n\t */\r\n\tpublic get baseInterval(): ITimeInterval {\r\n\t\tif (this._baseInterval) {\r\n\t\t\treturn this._baseInterval;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn this._baseIntervalReal;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * If enabled, axis will automatically collapse empty (without data points)\r\n\t * periods of time, i.e. weekends.\r\n\t *\r\n\t * An \"empty\" period is considered a stretch of time in the length of current\r\n\t * `baseInterval` without a single data point in it.\r\n\t *\r\n\t * For each such empty period, axis will automatically create an\r\n\t * [[AxisBreak]]. By default they will be invisible. You can still configure\r\n\t * them by accessing `axis.breaks.template`.\r\n\t *\r\n\t * [More info about breaks](https://www.amcharts.com/docs/v4/concepts/axes/#Breaks).\r\n\t *\r\n\t * Important notes:\r\n\t * * If you set this property to `true`, you can not add your custom axis breaks to this axis anymore.\r\n\t * * Using this feature affects performance. Use only if you need it.\r\n\t * * Setting this to `true` will reset appearance of breaks. If you want to modify appearance, do it *after* you set `skipEmptyPeriods`.\r\n\t *\r\n\t * @default false\r\n\t * @param value Remove empty stretches of time?\r\n\t */\r\n\tpublic set skipEmptyPeriods(value: boolean) {\r\n\t\tif (this.setPropertyValue(\"skipEmptyPeriods\", value)) {\r\n\t\t\tthis.invalidateData();\r\n\t\t}\r\n\r\n\t\tif (value) {\r\n\t\t\tlet breakTemplate = this.axisBreaks.template;\r\n\t\t\tbreakTemplate.startLine.disabled = true;\r\n\t\t\tbreakTemplate.endLine.disabled = true;\r\n\t\t\tbreakTemplate.fillShape.disabled = true;\r\n\t\t\tbreakTemplate.breakSize = 0;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Remove empty stretches of time?\r\n\t */\r\n\tpublic get skipEmptyPeriods(): boolean {\r\n\t\treturn this.getPropertyValue(\"skipEmptyPeriods\");\r\n\t}\r\n\r\n\t/**\r\n\t * A special date format to apply axis tooltips.\r\n\t *\r\n\t * Will use same format as for labels, if not set.\r\n\t *\r\n\t * @param value Date format\r\n\t */\r\n\tpublic set tooltipDateFormat(value: string) {\r\n\t\tthis.setPropertyValue(\"tooltipDateFormat\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Date format\r\n\t */\r\n\tpublic get tooltipDateFormat(): string {\r\n\t\treturn this.getPropertyValue(\"tooltipDateFormat\");\r\n\t}\r\n\r\n\t/**\r\n\t * Use `periodChangeDateFormats` to apply different formats to the first\r\n\t * label in bigger time unit.\r\n\t *\r\n\t * @default true\r\n\t * @param value Use different format for period beginning?\r\n\t */\r\n\tpublic set markUnitChange(value: boolean) {\r\n\t\tif (this.setPropertyValue(\"markUnitChange\", value)) {\r\n\t\t\tthis.invalidateData();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Use different format for period beginning?\r\n\t */\r\n\tpublic get markUnitChange(): boolean {\r\n\t\treturn this.getPropertyValue(\"markUnitChange\");\r\n\t}\r\n\r\n\t/**\r\n\t * Returns text to show in a tooltip, based on specific relative position\r\n\t * within axis.\r\n\t *\r\n\t * The label will be formatted as per [[DateFormatter]] set for the whole\r\n\t * chart, or explicitly for this Axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param position Position\r\n\t * @return Label (formatted date)\r\n\t */\r\n\tpublic getTooltipText(position: number): string {\r\n\t\tlet text: string;\r\n\t\tlet date = this.positionToDate(position);\r\n\t\tdate = $time.round(date, this.baseInterval.timeUnit, this.baseInterval.count, this.getFirstWeekDay());\r\n\r\n\t\tif ($type.hasValue(this.tooltipDateFormat)) {\r\n\t\t\ttext = this.dateFormatter.format(date, this.tooltipDateFormat);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet dateFormat = this.dateFormats.getKey(this.baseInterval.timeUnit);\r\n\t\t\tif (dateFormat) {\r\n\t\t\t\ttext = this.dateFormatter.format(date, dateFormat);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\ttext = this.getPositionLabel(position);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.adapter.apply(\"getTooltipText\", text);\r\n\t}\r\n\r\n\t/**\r\n\t * Takes an absolute position within axis and adjust it to a specific position within base interval. (cell)\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param position Source position\r\n\t * @param location Location in the cell\r\n\t * @return Adjusted position\r\n\t */\r\n\tpublic roundPosition(position: number, location?: AxisItemLocation): number {\r\n\t\tlet baseInterval = this.baseInterval;\r\n\t\tlet timeUnit = baseInterval.timeUnit;\r\n\t\tlet count = baseInterval.count;\r\n\r\n\t\tlet date: Date = this.positionToDate(position);\r\n\r\n\t\t$time.round(date, timeUnit, count, this.getFirstWeekDay());\r\n\r\n\t\tif (location > 0) {\r\n\t\t\t$time.add(date, timeUnit, location * count);\r\n\t\t}\r\n\r\n\t\tif (this.isInBreak(date.getTime())) {\r\n\t\t\twhile (date.getTime() < this.max) {\r\n\t\t\t\t$time.add(date, timeUnit, count);\r\n\t\t\t\tif (!this.isInBreak(date.getTime())) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.dateToPosition(date);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an relative position of the start of the cell (period), that specific position value falls into.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t * @param position Relative position\r\n\t * @return Cell start relative position\r\n\t */\r\n\tpublic getCellStartPosition(position: number): number {\r\n\t\treturn this.roundPosition(position, 0);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an relative position of the end of the cell (period), that specific position value falls into.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t * @param position Relative position\r\n\t * @return Cell end relative position\r\n\t */\r\n\tpublic getCellEndPosition(position: number): number {\r\n\t\treturn this.roundPosition(position, 1);\r\n\t\t//return this.dateToPosition($time.add(this.positionToDate(this.roundPosition(position, 1)), this.baseInterval.timeUnit, this.baseInterval.count));\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a Series data item that corresponds to the specific pixel position\r\n\t * of the Axis.\r\n\t *\r\n\t * If `findNearest` (third parameter) is set to `true`, the method will try\r\n\t * to locate nearest available data item if none is found directly under\r\n\t * `position`.\r\n\t *\r\n\t * @param series Series\r\n\t * @param position Position (px)\r\n\t * @param findNearest Should axis try to find nearest tooltip if there is no data item at exact position\r\n\t * @return Data item\r\n\t */\r\n\tpublic getSeriesDataItem(series: XYSeries, position: number, findNearest?: boolean): XYSeriesDataItem {\r\n\r\n\t\tlet value: number = this.positionToValue(position);\r\n\t\tlet date: Date = $time.round(new Date(value), this.baseInterval.timeUnit, this.baseInterval.count, this.getFirstWeekDay());\r\n\r\n\t\tlet dataItemsByAxis = series.dataItemsByAxis.getKey(this.uid);\r\n\r\n\t\tlet dataItem = dataItemsByAxis.getKey(date.getTime().toString());\r\n\r\n\t\t// todo: alternatively we can find closiest here\r\n\t\tif (!dataItem && findNearest) {\r\n\t\t\t/*\r\n\t\t\t// to the left\r\n\t\t\tlet leftCount = 0;\r\n\t\t\tlet leftDataItem: XYSeriesDataItem;\r\n\t\t\tlet leftDate = new Date(date.getTime());\r\n\r\n\t\t\twhile (leftDate.getTime() > this.minZoomed) {\r\n\t\t\t\tleftDate = $time.add(leftDate, this.baseInterval.timeUnit, -this.baseInterval.count);\r\n\t\t\t\tleftDataItem = dataItemsByAxis.getKey(leftDate.getTime().toString());\r\n\t\t\t\tif (leftDataItem) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tleftCount++;\r\n\t\t\t\tif (leftCount > 5000) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlet rightCount = 0;\r\n\t\t\tlet rightDataItem: XYSeriesDataItem;\r\n\t\t\tlet rightDate = new Date(date.getTime());\r\n\t\t\twhile (rightDate.getTime() < this.maxZoomed) {\r\n\t\t\t\trightDate = $time.add(rightDate, this.baseInterval.timeUnit, this.baseInterval.count);\r\n\t\t\t\trightDataItem = dataItemsByAxis.getKey(rightDate.getTime().toString());\r\n\t\t\t\tif (rightDataItem) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\trightCount++;\r\n\t\t\t\tif (rightCount > 5000) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (leftDataItem && !rightDataItem) {\r\n\t\t\t\treturn leftDataItem;\r\n\t\t\t}\r\n\t\t\telse if (!leftDataItem && rightDataItem) {\r\n\t\t\t\treturn rightDataItem;\r\n\t\t\t}\r\n\t\t\telse if (leftDataItem && rightDataItem) {\r\n\t\t\t\tif (leftCount < rightCount) {\r\n\t\t\t\t\treturn leftDataItem;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\treturn rightDataItem;\r\n\t\t\t\t}\r\n\t\t\t}*/\r\n\r\n\t\t\tlet key: \"dateX\" | \"dateY\";\r\n\r\n\t\t\tif (this.axisLetter == \"Y\") {\r\n\t\t\t\tkey = \"dateY\";\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tkey = \"dateX\";\r\n\t\t\t}\r\n\r\n\t\t\tdataItem = series.dataItems.getIndex(series.dataItems.findClosestIndex(date.getTime(), (x) => x[key].getTime(), \"any\"));\r\n\t\t}\r\n\r\n\t\treturn dataItem;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a formatted date based on position in axis scale.\r\n\t *\r\n\t * Please note that `position` represents position within axis which may be\r\n\t * zoomed and not correspond to Cursor's `position`.\r\n\t *\r\n\t * To convert Cursor's `position` to Axis' `position` use `toAxisPosition()` method.\r\n\t *\r\n\t * @see {@link https://www.amcharts.com/docs/v4/tutorials/tracking-cursors-position-via-api/#Tracking_Cursor_s_position} For more information about cursor tracking.\r\n\t * @param position Relative position on axis (0-1)\r\n\t * @return Position label\r\n\t */\r\n\tpublic getPositionLabel(position: number): string {\r\n\t\t// @todo Better format recognition\r\n\t\tlet date = this.positionToDate(position);\r\n\t\treturn this.dateFormatter.format(date, this.getCurrentLabelFormat());\r\n\t}\r\n\r\n\t/**\r\n\t * Returns label date format based on currently used time units\r\n\t *\r\n\t * @return Format\r\n\t */\r\n\tprotected getCurrentLabelFormat(): string {\r\n\t\treturn this.dateFormats.getKey(this._gridInterval ? this._gridInterval.timeUnit : \"day\");\r\n\t}\r\n\r\n\t/**\r\n\t * Initializes an Axis renderer.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic initRenderer(): void {\r\n\t\tsuper.initRenderer();\r\n\t\tlet renderer = this.renderer;\r\n\t\tif (renderer) {\r\n\t\t\t// Set defaults\r\n\t\t\trenderer.ticks.template.location = 0;\r\n\t\t\trenderer.grid.template.location = 0;\r\n\t\t\trenderer.labels.template.location = 0;\r\n\t\t\trenderer.baseGrid.disabled = true;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Coordinates of the actual axis start.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @return Base point\r\n\t */\r\n\tpublic get basePoint(): IPoint {\r\n\t\treturn { x: 0, y: 0 };\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Zooms axis to specific Dates.\r\n\t *\r\n\t * @param startDate Start date\r\n\t * @param endValue End date\r\n\t * @param skipRangeEvent Do not invoke events\r\n\t * @param instantly Do not play zoom animations\r\n\t */\r\n\tpublic zoomToDates(startDate: Date, endDate: Date, skipRangeEvent?: boolean, instantly?: boolean): void {\r\n\t\tstartDate = this.dateFormatter.parse(startDate);\r\n\t\tendDate = this.dateFormatter.parse(endDate);\r\n\t\tthis.zoomToValues(startDate.getTime(), endDate.getTime(), skipRangeEvent, instantly);\r\n\t}\r\n\r\n\t/**\r\n\t * Adds `baseInterval` to \"as is\" fields.\r\n\t *\r\n\t * @param field Field name\r\n\t * @return Assign as is?\r\n\t */\r\n\tprotected asIs(field: string): boolean {\r\n\t\treturn field == \"baseInterval\" || super.asIs(field);\r\n\t}\r\n\r\n\t/**\r\n\t * Copies all properties and related data from a different instance of Axis.\r\n\t *\r\n\t * @param source Source Axis\r\n\t */\r\n\tpublic copyFrom(source: this): void {\r\n\t\tsuper.copyFrom(source);\r\n\t\tthis.dateFormats = source.dateFormats;\r\n\t\tthis.periodChangeDateFormats = source.periodChangeDateFormats;\r\n\t\tif (source[\"_baseInterval\"]) {\r\n\t\t\tthis.baseInterval = source.baseInterval;\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Shows Axis tooltip at specific relative position within Axis. (0-1)\r\n\t *\r\n\t * @param position Position (0-1)\r\n\t * @param local or global position\r\n\t */\r\n\tpublic showTooltipAtPosition(position: number, local?: boolean) {\r\n\r\n\t\tif (!local) {\r\n\t\t\tposition = this.toAxisPosition(position);\r\n\t\t}\r\n\r\n\t\tif (this.snapTooltip) {\r\n\t\t\tlet actualDate = $time.round(this.positionToDate(position), this.baseInterval.timeUnit, 1, this.getFirstWeekDay());\r\n\r\n\t\t\tlet actualTime = actualDate.getTime();\r\n\t\t\tlet closestDate: Date;\r\n\r\n\t\t\tthis.series.each((series) => {\r\n\t\t\t\tif(series.baseAxis == this){\r\n\t\t\t\t\tlet dataItem = this.getSeriesDataItem(series, position, true);\r\n\t\t\t\t\tif (dataItem) {\r\n\t\t\t\t\t\tlet date: Date;\r\n\t\t\t\t\t\tif (series.xAxis == this) {\r\n\t\t\t\t\t\t\tdate = dataItem.dateX;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (series.yAxis == this) {\r\n\t\t\t\t\t\t\tdate = dataItem.dateY;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (!closestDate) {\r\n\t\t\t\t\t\t\tclosestDate = date;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tif (Math.abs(closestDate.getTime() - actualTime) > Math.abs(date.getTime() - actualTime)) {\r\n\t\t\t\t\t\t\t\tclosestDate = date;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\tif (closestDate) {\r\n\t\t\t\tlet closestTime = closestDate.getTime();\r\n\t\t\t\tclosestDate = $time.round(new Date(closestTime), this.baseInterval.timeUnit, this.baseInterval.count, this.getFirstWeekDay());\r\n\t\t\t\tclosestTime = closestDate.getTime();\r\n\t\t\t\tclosestDate = new Date(closestDate.getTime() + this.baseDuration / 2);\r\n\t\t\t\tposition = this.dateToPosition(closestDate);\r\n\r\n\t\t\t\tlet seriesPoints: { point: IPoint, series: XYSeries }[] = [];\r\n\r\n\t\t\t\tthis.series.each((series) => {\r\n\t\t\t\t\tlet dataItem = series.dataItemsByAxis.getKey(this.uid).getKey(closestTime.toString());\r\n\t\t\t\t\tlet point = series.showTooltipAtDataItem(dataItem);\r\n\t\t\t\t\tif (point) {\r\n\t\t\t\t\t\tseriesPoints.push({ series: series, point: point });\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tseries.hideTooltip();\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\r\n\t\t\t\tthis.chart.sortSeriesTooltips(seriesPoints);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsuper.showTooltipAtPosition(position, true);\r\n\t}\r\n\r\n\t/**\r\n\t * Should the nearest tooltip be shown if no data item is found on the\r\n\t * current cursor position.\r\n\t *\r\n\t * @default true\r\n\t * @param value Should snap?\r\n\t */\r\n\tpublic set snapTooltip(value: boolean) {\r\n\t\tthis.setPropertyValue(\"snapTooltip\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Should snap?\r\n\t */\r\n\tpublic get snapTooltip(): boolean {\r\n\t\treturn this.getPropertyValue(\"snapTooltip\");\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Current grid interval.\r\n\t *\r\n\t * @return Grid interval\r\n\t */\r\n\tpublic get gridInterval(): ITimeInterval {\r\n\t\treturn this._gridInterval;\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"DateAxis\"] = DateAxis;\r\nregistry.registeredClasses[\"DateAxisDataItem\"] = DateAxisDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/axes/DateAxis.ts","/**\r\n * A module which defines functionality related to Category Axis Break.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\nimport { AxisBreak, IAxisBreakProperties, IAxisBreakAdapters, IAxisBreakEvents } from \"./AxisBreak\";\r\nimport { CategoryAxis } from \"./CategoryAxis\";\r\nimport { registry } from \"../../core/Registry\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[CategoryAxisBreak]].\r\n */\r\nexport interface ICategoryAxisBreakProperties extends IAxisBreakProperties {\r\n\r\n\t/**\r\n\t * Category break starts on.\r\n\t */\r\n\tstartCategory?: string;\r\n\r\n\t/**\r\n\t * Category break ends on.\r\n\t */\r\n\tendCategory?: string;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[CategoryAxisBreak]].\r\n */\r\nexport interface ICategoryAxisBreakEvents extends IAxisBreakEvents { }\r\n\r\n/**\r\n * Defines adapters for [[CategoryAxisBreak]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface ICategoryAxisBreakAdapters extends IAxisBreakAdapters, ICategoryAxisBreakProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Base class to define \"breaks\" in axes\r\n * @see {@link ICategoryAxisBreakEvents} for a list of available events\r\n * @see {@link ICategoryAxisBreakAdapters} for a list of available Adapters\r\n */\r\nexport class CategoryAxisBreak extends AxisBreak {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: ICategoryAxisBreakProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: ICategoryAxisBreakAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: ICategoryAxisBreakEvents;\r\n\r\n\t/**\r\n\t * Defines the type of the Axis this break is used for.\r\n\t */\r\n\tpublic _axisType: CategoryAxis;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"CategoryAxisBreak\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Pixel position of the break's start.\r\n\t *\r\n\t * @return Position (px)\r\n\t * @readonly\r\n\t */\r\n\tpublic get startPosition(): number {\r\n\t\tif (this.axis) {\r\n\t\t\treturn this.axis.indexToPosition(this.adjustedStartValue);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Pixel position of the break's end.\r\n\t *\r\n\t * @return Position (px)\r\n\t * @readonly\r\n\t */\r\n\tpublic get endPosition(): number {\r\n\t\tif (this.axis) {\r\n\t\t\treturn this.axis.indexToPosition(this.adjustedEndValue);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * A category break starts on.\r\n\t *\r\n\t * @param value Start category\r\n\t */\r\n\tpublic set startCategory(value: string) {\r\n\t\tif (this.setPropertyValue(\"startCategory\", value)) {\r\n\t\t\tif (this.axis) {\r\n\t\t\t\tthis.axis.invalidateDataItems();\r\n\t\t\t\tthis.axis.invalidateSeries();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Start category\r\n\t */\r\n\tpublic get startCategory(): string {\r\n\t\treturn this.getPropertyValue(\"startCategory\");\r\n\t}\r\n\r\n\t/**\r\n\t * A category break ends on.\r\n\t *\r\n\t * @param value End category\r\n\t */\r\n\tpublic set endCategory(value: string) {\r\n\t\tif (this.setPropertyValue(\"endCategory\", value)) {\r\n\t\t\tif (this.axis) {\r\n\t\t\t\tthis.axis.invalidateDataItems();\r\n\t\t\t\tthis.axis.invalidateSeries();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return End category\r\n\t */\r\n\tpublic get endCategory(): string {\r\n\t\treturn this.getPropertyValue(\"endCategory\");\r\n\t}\r\n\r\n\t/**\r\n\t * An index of start category.\r\n\t *\r\n\t * @param value Value\r\n\t */\r\n\tpublic set startValue(value: number) {\r\n\t\tif (this.setPropertyValue(\"startValue\", value)) {\r\n\t\t\tif (this.axis) {\r\n\t\t\t\tthis.axis.invalidateDataItems();\r\n\t\t\t\tthis.axis.invalidateSeries();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Value\r\n\t */\r\n\tpublic get startValue(): number {\r\n\t\tlet category: string = this.getPropertyValue(\"startCategory\");\r\n\t\tif (category) {\r\n\t\t\treturn this.axis.categoryToIndex(category);\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn this.getPropertyValue(\"startValue\");\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * An index of end category or a end value.\r\n\t *\r\n\t * @param value Value\r\n\t */\r\n\tpublic set endValue(value: number) {\r\n\t\tif (this.setPropertyValue(\"endValue\", value)) {\r\n\t\t\tif (this.axis) {\r\n\t\t\t\tthis.axis.invalidateDataItems();\r\n\t\t\t\tthis.axis.invalidateSeries();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Value\r\n\t */\r\n\tpublic get endValue(): number {\r\n\t\tlet category: string = this.getPropertyValue(\"endCategory\");\r\n\t\tif (category) {\r\n\t\t\treturn this.axis.categoryToIndex(category);\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn this.getPropertyValue(\"endValue\");\r\n\t\t}\r\n\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"CategoryAxisBreak\"] = CategoryAxisBreak;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/axes/CategoryAxisBreak.ts","/**\r\n * Category axis module\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Axis, AxisItemLocation, AxisDataItem, IAxisProperties, IAxisDataFields, IAxisAdapters, IAxisEvents, IAxisDataItemAdapters } from \"./Axis\";\r\nimport { IPoint, IOrientationPoint } from \"../../core/defs/IPoint\";\r\nimport { AxisFill } from \"./AxisFill\";\r\nimport { AxisRenderer } from \"./AxisRenderer\";\r\nimport { SerialChart } from \"../types/SerialChart\";\r\nimport { AxisTick } from \"./AxisTick\";\r\nimport { Grid } from \"./Grid\";\r\nimport { AxisLabel } from \"./AxisLabel\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { Dictionary } from \"../../core/utils/Dictionary\";\r\nimport { XYSeries, XYSeriesDataItem } from \"../series/XYSeries\";\r\nimport { CategoryAxisBreak } from \"./CategoryAxisBreak\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport { Adapter } from \"../../core/utils/Adapter\";\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[CategoryAxis]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class CategoryAxisDataItem extends AxisDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: CategoryAxis;\r\n\r\n\t/**\r\n\t * Holds Adapter.\r\n\t */\r\n\tpublic adapter = new Adapter(this);\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"CategoryAxisDataItem\";\r\n\t\tthis.text = \"{category}\";\r\n\r\n\t\tthis.locations.category = 0;\r\n\t\tthis.locations.endCategory = 1;\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Category.\r\n\t *\r\n\t * @param value Category\r\n\t */\r\n\tpublic set category(value: string) {\r\n\t\tthis.setProperty(\"category\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Category\r\n\t */\r\n\tpublic get category(): string {\r\n\t\tif (this.adapter.isEnabled(\"category\")) {\r\n\t\t\treturn this.adapter.apply(\"category\", this.properties[\"category\"]);\r\n\t\t}\r\n\t\treturn this.properties[\"category\"];\r\n\t}\r\n\r\n\t/**\r\n\t * End category.\r\n\t *\r\n\t * Used for items that span several categories, like [[CategoryAxisBreak]].\r\n\t *\r\n\t * @param value End category\r\n\t */\r\n\tpublic set endCategory(value: string) {\r\n\t\tthis.setProperty(\"endCategory\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return End category\r\n\t */\r\n\tpublic get endCategory(): string {\r\n\t\treturn this.properties[\"endCategory\"];\r\n\t}\r\n}\r\n\r\n/**\r\n * Defines adapters for [[DataItem]]\r\n * Includes both the [[Adapter]] definitions and properties\r\n * @see {@link Adapter}\r\n */\r\nexport interface ICategoryAxisDataItemAdapters extends IAxisDataItemAdapters {\r\n\tcategory: string;\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[CategoryAxis]].\r\n */\r\nexport interface ICategoryAxisDataFields extends IAxisDataFields {\r\n\r\n\t/**\r\n\t * A field that holds category information.\r\n\t */\r\n\tcategory?: string;\r\n\r\n}\r\n\r\n/**\r\n * Defines properties for [[CategoryAxis]].\r\n */\r\nexport interface ICategoryAxisProperties extends IAxisProperties { }\r\n\r\n/**\r\n * Defines events for [[CategoryAxis]].\r\n */\r\nexport interface ICategoryAxisEvents extends IAxisEvents { }\r\n\r\n/**\r\n * Defines adapter for [[CategoryAxis]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface ICategoryAxisAdapters extends IAxisAdapters, ICategoryAxisProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Used to create a category-based axis for the chart.\r\n *\r\n * ```TypeScript\r\n * // Create the axis\r\n * let xAxis = chart.xAxes.push(new am4charts.CategoryAxis());\r\n *\r\n * // Set settings\r\n * xAxis.title.text = \"Clients\";\r\n * ```\r\n * ```JavaScript\r\n * // Create the axis\r\n * var valueAxis = chart.xAxes.push(new am4charts.CategoryAxis());\r\n *\r\n * // Set settings\r\n * valueAxis.title.text = \"Clients\";\r\n * ```\r\n * ```JSON\r\n * \"xAxes\": [{\r\n * \"type\": \"CategoryAxis\",\r\n * \"title\": {\r\n * \"text\": \"Clients\"\r\n * }\r\n * }]\r\n * ```\r\n *\r\n * @see {@link ICategoryAxisEvents} for a list of available Events\r\n * @see {@link ICategoryAxisAdapters} for a list of available Adapters\r\n * @important\r\n */\r\nexport class CategoryAxis extends Axis {\r\n\r\n\t/**\r\n\t * Defines data fields.\r\n\t */\r\n\tpublic _dataFields: ICategoryAxisDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: ICategoryAxisProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: ICategoryAxisAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: ICategoryAxisEvents;\r\n\r\n\t/**\r\n\t * Defines the type of the Date Items.\r\n\t */\r\n\tpublic _dataItem: CategoryAxisDataItem;\r\n\r\n\t/**\r\n\t * Defines the type of the axis breaks.\r\n\t */\r\n\tpublic _axisBreak: CategoryAxisBreak;\r\n\r\n\t/**\r\n\t * A reference to chart the axis is for.\r\n\t */\r\n\tpublic chart: SerialChart;\r\n\r\n\t/**\r\n\t * Frequency of the labels on axis.\r\n\t */\r\n\tprotected _frequency: number;\r\n\r\n\t/**\r\n\t * A collection that holds Axis' data items sorted by each category.\r\n\t */\r\n\tpublic dataItemsByCategory: Dictionary = new Dictionary();\r\n\r\n\t/**\r\n\t * last data item is used for the closing grid\r\n\t */\r\n\tprotected _lastDataItem: CategoryAxisDataItem;\r\n\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"CategoryAxis\";\r\n\r\n\t\t// Set field name\r\n\t\tthis.axisFieldName = \"category\";\r\n\r\n\t\tthis._lastDataItem = this.createDataItem();\r\n\t\tthis._lastDataItem.component = this;\r\n\t\tthis._disposers.push(this._lastDataItem);\r\n\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty [[DataItem]] of the type appropriate for this object.\r\n\t *\r\n\t * @see {@link DataItem}\r\n\t * @return Data Item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new CategoryAxisDataItem();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty [[AxisBreak]] of the appropriate type.\r\n\t *\r\n\t * @return Axis break\r\n\t */\r\n\tprotected createAxisBreak(): this[\"_axisBreak\"] {\r\n\t\treturn new CategoryAxisBreak();\r\n\t}\r\n\r\n\t/**\r\n\t * Validates the data range.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t */\r\n\tpublic validateDataRange(): void {\r\n\r\n\t\tsuper.validateDataRange();\r\n\r\n\t\t$iter.each(this._series.iterator(), (series) => {\r\n\t\t\tif ((series.xAxis instanceof CategoryAxis) && (series.yAxis instanceof CategoryAxis)) {\r\n\t\t\t\tseries.invalidateDataRange();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tlet firstSeriesDataItem: XYSeriesDataItem;\r\n\t\t\t\tlet lastSeriesDataItem: XYSeriesDataItem;\r\n\r\n\t\t\t\tlet startIndex = this.positionToIndex(this.start);\r\n\t\t\t\tlet endIndex = this.positionToIndex(this.end);\r\n\r\n\t\t\t\tfor(let i = startIndex; i <= endIndex; i++){\r\n\t\t\t\t\tlet dataItem = this.dataItems.getIndex(i);\r\n\t\t\t\t\tif(dataItem){\r\n\t\t\t\t\t\tlet fdi = this.getFirstSeriesDataItem(series, dataItem.category);\r\n\t\t\t\t\t\tif(fdi){\r\n\t\t\t\t\t\t\tif (!firstSeriesDataItem) {\r\n\t\t\t\t\t\t\t\tfirstSeriesDataItem = fdi;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif (firstSeriesDataItem && fdi.index < firstSeriesDataItem.index) {\r\n\t\t\t\t\t\t\t\tfirstSeriesDataItem = fdi;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tlet ldi = this.getLastSeriesDataItem(series, dataItem.category);\r\n\t\t\t\t\t\tif(ldi){\r\n\t\t\t\t\t\t\tif (!lastSeriesDataItem) {\r\n\t\t\t\t\t\t\t\tlastSeriesDataItem = ldi;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif (lastSeriesDataItem && ldi.index > lastSeriesDataItem.index) {\r\n\t\t\t\t\t\t\t\tlastSeriesDataItem = ldi;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (firstSeriesDataItem) {\r\n\t\t\t\t\tseries.startIndex = firstSeriesDataItem.index;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tseries.start = this.start;\r\n\t\t\t\t}\r\n\t\t\t\tif (lastSeriesDataItem) {\r\n\t\t\t\t\tseries.endIndex = lastSeriesDataItem.index + 1;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tseries.end = this.end;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// range might not change, but axis breaks might.\r\n\t\t\t\tif (this.axisBreaks.length > 0) {\r\n\t\t\t\t\tseries.invalidateDataRange();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Validates the whole axis. Causes it to redraw.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t */\r\n\tpublic validate(): void {\r\n\r\n\t\tsuper.validate();\r\n\r\n\t\tlet dataCount: number = this.dataItems.length;\r\n\r\n\t\tlet startIndex = $math.fitToRange(Math.floor(this.start * dataCount - 1), 0, dataCount);\r\n\t\tlet endIndex = $math.fitToRange(Math.ceil(this.end * dataCount), 0, dataCount);\r\n\r\n\t\tif (this.renderer.invalid) {\r\n\t\t\tthis.renderer.validate();\r\n\t\t}\r\n\r\n\t\t// find frequency at which we'll show items\r\n\t\tlet maxCount: number = this.renderer.axisLength / this.renderer.minGridDistance;\r\n\t\tlet frequency: number = Math.min(this.dataItems.length, Math.ceil((endIndex - startIndex) / maxCount));\r\n\r\n\t\tthis._startIndex = Math.floor(startIndex / frequency) * frequency;\r\n\t\tthis._endIndex = Math.ceil(this.end * dataCount);\r\n\r\n\t\tthis.fixAxisBreaks();\r\n\r\n\t\tif (this._startIndex == this._endIndex) {\r\n\t\t\tthis._endIndex++;\r\n\t\t}\r\n\r\n\t\tthis._frequency = frequency;\r\n\r\n\t\tif (this.axisLength <= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.maxZoomFactor = this.dataItems.length;\r\n\t\tif (this.dataItems.length <= 0) {\r\n\t\t\tthis.maxZoomFactor = 1;\r\n\t\t}\r\n\r\n\t\tthis.resetIterators();\r\n\r\n\t\t// it's important to use protected variables here, as getters will return 0 - length\r\n\t\t// TODO use iterator instead\r\n\t\t// @ todo: not solved cat axis item fading\r\n\t\tstartIndex = $math.max(0, this._startIndex - this._frequency);\r\n\t\tendIndex = $math.min(this.dataItems.length, this._endIndex + this._frequency);\r\n\r\n\t\tlet itemIndex = 0;\r\n\r\n\t\tfor (let i = 0; i < startIndex; i++) {\r\n\t\t\tlet dataItem = this.dataItems.getIndex(i);\r\n\t\t\tdataItem.__disabled = true;\r\n\t\t}\r\n\r\n\t\tfor (let i = endIndex, len = this.dataItems.length; i < len; i++) {\r\n\t\t\tlet dataItem = this.dataItems.getIndex(i);\r\n\t\t\tdataItem.__disabled = true;\r\n\t\t}\r\n\r\n\t\tfor (let i = startIndex; i < endIndex; i++) {\r\n\t\t\tif (i < this.dataItems.length) {\r\n\t\t\t\tlet dataItem: this[\"_dataItem\"] = this.dataItems.getIndex(i);\r\n\t\t\t\tif (i / this._frequency == Math.round(i / this._frequency)) {\r\n\t\t\t\t\tlet axisBreak: CategoryAxisBreak = this.isInBreak(i);\r\n\t\t\t\t\tif (!axisBreak) {\r\n\t\t\t\t\t\tthis.appendDataItem(dataItem);\r\n\t\t\t\t\t\tthis.validateDataElement(dataItem, itemIndex);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\titemIndex++;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t//previously we disabled all before, but this is better for cpu\r\n\t\t\t\t\tthis.validateDataElement(dataItem, itemIndex); // helps to solve shrinking\r\n\t\t\t\t\tdataItem.__disabled = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.appendDataItem(this._lastDataItem);\r\n\t\tthis.validateDataElement(this._lastDataItem, itemIndex + 1, this.dataItems.length);\r\n\r\n\t\tlet axisBreaks = this.axisBreaks;\r\n\r\n\t\taxisBreaks.each((axisBreak) => {\r\n\t\t\tlet adjustedStartValue: number = axisBreak.adjustedStartValue;\r\n\t\t\tlet adjustedEndValue: number = axisBreak.adjustedEndValue;\r\n\r\n\t\t\tif ($math.intersect({ start: adjustedStartValue, end: adjustedEndValue }, { start: this._startIndex, end: this._endIndex })) {\r\n\r\n\t\t\t\tlet frequency: number = $math.fitToRange(Math.ceil(this._frequency / axisBreak.breakSize), 1, adjustedEndValue - adjustedStartValue);\r\n\t\t\t\tlet itemIndex = 0;\r\n\t\t\t\t// TODO use iterator instead\r\n\t\t\t\tfor (let b = adjustedStartValue; b <= adjustedEndValue; b = b + frequency) {\r\n\t\t\t\t\tlet dataItem: this[\"_dataItem\"] = this.dataItems.getIndex(b);\r\n\t\t\t\t\tthis.appendDataItem(dataItem);\r\n\t\t\t\t\tthis.validateDataElement(dataItem, itemIndex);\r\n\t\t\t\t\titemIndex++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.validateBreaks();\r\n\t\tthis.validateAxisRanges();\r\n\r\n\t\tthis.ghostLabel.invalidate(); // solves font issue\r\n\t\tthis.renderer.invalidateLayout();\r\n\t}\r\n\r\n\t/**\r\n\t * [validateDataElement description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @param dataItem [description]\r\n\t * @param itemIndex [description]\r\n\t */\r\n\tpublic validateDataElement(dataItem: this[\"_dataItem\"], itemIndex?: number, index?: number): void {\r\n\t\tsuper.validateDataElement(dataItem);\r\n\r\n\t\t//dataItem.__disabled = false;\r\n\r\n\t\tlet renderer: AxisRenderer = this.renderer;\r\n\t\tif (!$type.isNumber(index)) {\r\n\t\t\tindex = this.categoryToIndex(dataItem.category);\r\n\t\t}\r\n\r\n\t\tlet endIndex = this.categoryToIndex(dataItem.endCategory);\r\n\r\n\t\tif (!$type.isNumber(endIndex)) {\r\n\t\t\tendIndex = index;\r\n\t\t}\r\n\r\n\t\tlet position: number = this.indexToPosition(index, dataItem.locations.category);\r\n\t\tlet endPosition: number = this.indexToPosition(endIndex, dataItem.locations.endCategory);\r\n\r\n\t\tdataItem.position = position;\r\n\r\n\t\tlet fillEndIndex: number;\r\n\t\tlet fillPosition: number;\r\n\t\tlet fillEndPosition: number;\r\n\r\n\t\tif (dataItem.isRange) {\r\n\t\t\tfillEndIndex = endIndex;\r\n\t\t\tfillPosition = this.indexToPosition(index, dataItem.locations.category);\r\n\t\t\tfillEndPosition = this.indexToPosition(fillEndIndex, dataItem.locations.endCategory);\r\n\t\t}\r\n\r\n\t\tdataItem.point = renderer.positionToPoint(position);\r\n\r\n\t\tlet tick: AxisTick = dataItem.tick;\r\n\t\tif (tick && !tick.disabled) {\r\n\t\t\trenderer.updateTickElement(tick, position, endPosition);\r\n\t\t}\r\n\r\n\t\tlet grid: Grid = dataItem.grid;\r\n\t\tif (grid && !grid.disabled) {\r\n\t\t\trenderer.updateGridElement(grid, position, endPosition);\r\n\t\t}\r\n\r\n\r\n\t\tlet label: AxisLabel = dataItem.label;\r\n\t\tif (label && !label.disabled) {\r\n\t\t\t// theorethically this might result problems if category text changes, the range text won't change. But otherwise range.label.text = \"custom text\" wont' work, which is not intuitive.\r\n\t\t\tif (!dataItem.isRange || label.text == undefined) {\r\n\t\t\t\tdataItem.text = dataItem.text;\r\n\t\t\t}\r\n\r\n\t\t\trenderer.updateLabelElement(label, position, endPosition);\r\n\r\n\t\t\tif (dataItem.label.measuredWidth > this.ghostLabel.measuredWidth || dataItem.label.measuredHeight > this.ghostLabel.measuredHeight) {\r\n\t\t\t\tthis.ghostLabel.text = dataItem.label.currentText;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet fill: AxisFill = dataItem.axisFill;\r\n\t\tif (fill && !fill.disabled) {\r\n\r\n\t\t\tif (!dataItem.isRange) {\r\n\t\t\t\tfillEndIndex = index + this._frequency;\r\n\t\t\t\tfillPosition = this.indexToPosition(index, fill.location);\r\n\t\t\t\tfillEndPosition = this.indexToPosition(fillEndIndex, fill.location);\r\n\t\t\t}\r\n\r\n\t\t\trenderer.updateFillElement(fill, fillPosition, fillEndPosition);\r\n\t\t\tif (!dataItem.isRange) {\r\n\t\t\t\tthis.fillRule(dataItem, itemIndex);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tlet mask: AxisFill = dataItem.mask;\r\n\t\tif (mask) {\r\n\t\t\trenderer.updateFillElement(mask, fillPosition, fillEndPosition);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Processes the axis data item.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItem Data item\r\n\t * @param dataContext The raw data that corresponds to this data item\r\n\t */\r\n\tpublic processDataItem(dataItem: this[\"_dataItem\"], dataContext: Object): void {\r\n\t\t// creat a collection for fast access\r\n\t\tsuper.processDataItem(dataItem, dataContext);\r\n\t\t// check if such category already exists\r\n\t\tlet existingDataItem: CategoryAxisDataItem = this.dataItemsByCategory.getKey(dataItem.category);\r\n\t\tif (existingDataItem && existingDataItem != dataItem) {\r\n\t\t\tthis.dataItems.remove(existingDataItem);\r\n\t\t}\r\n\r\n\t\tthis.dataItemsByCategory.setKey(dataItem.category, dataItem);\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a category index to an actual screen coordinate on the axis.\r\n\t *\r\n\t * `location` identifies relative location within category. 0 - beginning,\r\n\t * 0.5 - middle, 1 - end, and anything inbetween.\r\n\t *\r\n\t * @param index Index\r\n\t * @param location Location (0-1)\r\n\t * @return Position (px)\r\n\t */\r\n\tpublic indexToPosition(index: number, location?: AxisItemLocation | number): number {\r\n\t\tif (!$type.isNumber(location)) {\r\n\t\t\tlocation = 0.5;\r\n\t\t}\r\n\r\n\t\tlet startIndex: number = this.startIndex;\r\n\t\tlet endIndex: number = this.endIndex;\r\n\r\n\t\tlet difference: number = this.adjustDifference(startIndex, endIndex);\r\n\r\n\t\tlet startLocation = this.startLocation;\r\n\t\tlet endLocation = this.endLocation;\r\n\r\n\t\tdifference -= startLocation;\r\n\t\tdifference -= (1 - endLocation);\r\n\r\n\t\tlet axisBreaks = this.axisBreaks;\r\n\r\n\t\t$iter.eachContinue(axisBreaks.iterator(), (axisBreak) => {\r\n\t\t\tlet breakStartIndex: number = axisBreak.adjustedStartValue;\r\n\t\t\tlet breakEndIndex: number = axisBreak.adjustedEndValue;\r\n\r\n\t\t\tif (index < startIndex) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif ($math.intersect({ start: breakStartIndex, end: breakEndIndex }, { start: startIndex, end: endIndex })) {\r\n\t\t\t\tbreakStartIndex = Math.max(startIndex, breakStartIndex);\r\n\t\t\t\tbreakEndIndex = Math.min(endIndex, breakEndIndex);\r\n\r\n\t\t\t\tlet breakSize: number = axisBreak.breakSize;\r\n\r\n\t\t\t\t// value to the right of break end\r\n\t\t\t\tif (index > breakEndIndex) {\r\n\t\t\t\t\tstartIndex += (breakEndIndex - breakStartIndex) * (1 - breakSize);\r\n\t\t\t\t}\r\n\t\t\t\t// value to the left of break start\r\n\t\t\t\telse if (index < breakStartIndex) {\r\n\r\n\t\t\t\t}\r\n\t\t\t\t// value within break\r\n\t\t\t\telse {\r\n\t\t\t\t\tindex = breakStartIndex + (index - breakStartIndex) * breakSize;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t\treturn $math.round((index + location - startLocation - startIndex) / difference, 5);\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a string category name to relative position on axis.\r\n\t *\r\n\t * `location` identifies relative location within category. 0 - beginning,\r\n\t * 0.5 - middle, 1 - end, and anything inbetween.\r\n\t *\r\n\t * @param category Category name\r\n\t * @param location Location (0-1)\r\n\t * @return Position\r\n\t */\r\n\tpublic categoryToPosition(category: string, location?: AxisItemLocation): number {\r\n\t\tlet index: number = this.categoryToIndex(category);\r\n\t\treturn this.indexToPosition(index, location);\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a string category name to a orientation point (x, y, angle) on axis\r\n\t *\r\n\t * `location` identifies relative location within category. 0 - beginning,\r\n\t * 0.5 - middle, 1 - end, and anything inbetween.\r\n\t * @param category Category name\r\n\t * @param location Location (0-1)\r\n\t * @return Orientation point\r\n\t */\r\n\tpublic categoryToPoint(category: string, location?: AxisItemLocation): IOrientationPoint {\r\n\t\tlet position = this.categoryToPosition(category, location);\r\n\t\tlet point = this.renderer.positionToPoint(position);\r\n\t\tlet angle = this.renderer.positionToAngle(position);\r\n\t\treturn { x: point.x, y: point.y, angle: angle };\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Converts a string category name to a orientation point (x, y, angle) on axis\r\n\t *\r\n\t * `location` identifies relative location within category. 0 - beginning,\r\n\t * 0.5 - middle, 1 - end, and anything inbetween.\r\n\t * @param category Category name\r\n\t * @param location Location (0-1)\r\n\t * @return Orientation point\r\n\t */\r\n\tanyToPoint(category: string, location?: AxisItemLocation): IOrientationPoint {\r\n\t\treturn this.categoryToPoint(category, location);\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Converts a string category name to relative position on axis.\r\n\t *\r\n\t * An alias to `categoryToPosition()`.\r\n\t *\r\n\t * @param category Category name\r\n\t * @param location Location (0-1)\r\n\t * @return Relative position\r\n\t */\r\n\tpublic anyToPosition(category: string, location?: AxisItemLocation): number {\r\n\t\treturn this.categoryToPosition(category, location);\r\n\t}\r\n\r\n\t/**\r\n\t * Converts named category to an index of data item it corresponds to.\r\n\t *\r\n\t * @param category Category\r\n\t * @return Data item index\r\n\t */\r\n\tpublic categoryToIndex(category: string): number {\r\n\t\tif ($type.hasValue(category)) {\r\n\t\t\tlet dataItem: this[\"_dataItem\"] = this.dataItemsByCategory.getKey(category);\r\n\t\t\tif (dataItem) {\r\n\t\t\t\treturn dataItem.index;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Zooms the axis to specific named ctaegories.\r\n\t *\r\n\t * @param startCategory Start category\r\n\t * @param endCategory End category\r\n\t */\r\n\tpublic zoomToCategories(startCategory: string, endCategory: string): void {\r\n\t\tthis.zoomToIndexes(this.categoryToIndex(startCategory), this.categoryToIndex(endCategory) + 1);\r\n\t}\r\n\r\n\t/**\r\n\t * [getAnyRangePath description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @param start [description]\r\n\t * @param end [description]\r\n\t * @param startLocation [description]\r\n\t * @param endLocation [description]\r\n\t * @return [description]\r\n\t */\r\n\tpublic getAnyRangePath(start: string, end: string, startLocation?: AxisItemLocation, endLocation?: AxisItemLocation): string {\r\n\t\tlet startPos: number = this.categoryToPosition(start, startLocation);\r\n\t\tlet endPos: number = this.categoryToPosition(end, endLocation);\r\n\t\treturn this.getPositionRangePath(startPos, endPos); // Base class (Axis) gets range shape from AxisRenderer\r\n\t}\r\n\r\n\t/**\r\n\t * Takes an absolute position (px) within axis and adjust it to a specific\r\n\t * `location` within category it corresponds to.\r\n\t *\r\n\t * @param position Source position (px)\r\n\t * @param location Location within category (0-1)\r\n\t * @return Adjusted position (px)\r\n\t */\r\n\tpublic roundPosition(position: number, location?: AxisItemLocation): number {\r\n\t\tlet index: number = this.positionToIndex(position);\r\n\t\treturn this.indexToPosition(index, location);\r\n\t}\r\n\r\n\t/**\r\n\t * Finds and returns first series data item with specific category\r\n\t * @param series Target series\r\n\t * @param category Category\r\n\t * @return XYSeriesDataItem data item\r\n\t */\r\n\tpublic getFirstSeriesDataItem(series: XYSeries, category: string): XYSeriesDataItem {\r\n\r\n\t\tfor (let i = 0; i < series.dataItems.length; i++) {\r\n\t\t\tlet dataItem = series.dataItems.getIndex(i);\r\n\t\t\tif (series.xAxis == this) {\r\n\t\t\t\tif (dataItem.categoryX == category) {\r\n\t\t\t\t\treturn dataItem;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (series.yAxis == this) {\r\n\t\t\t\tif (dataItem.categoryY == category) {\r\n\t\t\t\t\treturn dataItem;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Finds and returns last series data item with specific category.\r\n\t * @param series Target series\r\n\t * @param category Category\r\n\t * @return XYSeriesDataItem data item\r\n\t */\r\n\tpublic getLastSeriesDataItem(series: XYSeries, category: string): XYSeriesDataItem {\r\n\r\n\t\tfor (let i = series.dataItems.length - 1; i >= 0; i--) {\r\n\t\t\tlet dataItem = series.dataItems.getIndex(i);\r\n\t\t\tif (series.xAxis == this) {\r\n\t\t\t\tif (dataItem.categoryX == category) {\r\n\t\t\t\t\treturn dataItem;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (series.yAxis == this) {\r\n\t\t\t\tif (dataItem.categoryY == category) {\r\n\t\t\t\t\treturn dataItem;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Returns a data item from Series that corresponds to a specific absolute\r\n\t * position on the Axis.\r\n\t *\r\n\t * @param series Target series\r\n\t * @param position Position (px)\r\n\t * @return XYSeriesDataItem data item\r\n\t */\r\n\tpublic getSeriesDataItem(series: XYSeries, position: number, findNearest?: boolean): XYSeriesDataItem {\r\n\r\n\t\tif ($type.isNumber(position)) {\r\n\r\n\t\t\tlet index = this.positionToIndex(position);\r\n\r\n\t\t\tlet dataItem = this.dataItems.getIndex(index);\r\n\r\n\t\t\tif (dataItem) {\r\n\t\t\t\tlet category = dataItem.category;\r\n\t\t\t\tlet sdi: XYSeriesDataItem;\r\n\r\n\t\t\t\tlet seriesDataItem = series.dataItems.getIndex(index);\r\n\t\t\t\tif(seriesDataItem){\r\n\t\t\t\t\tif (series.xAxis == this) {\r\n\t\t\t\t\t\tif (seriesDataItem.categoryX == category) {\r\n\t\t\t\t\t\t\treturn seriesDataItem;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (series.yAxis == this) {\r\n\t\t\t\t\t\tif (seriesDataItem.categoryY == category) {\r\n\t\t\t\t\t\t\treturn seriesDataItem;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\r\n\t\t\t\tseries.dataItems.each((dataItem) => {\r\n\t\t\t\t\tif (series.xAxis == this) {\r\n\t\t\t\t\t\tif (dataItem.categoryX == category) {\r\n\t\t\t\t\t\t\tif(!sdi){\r\n\t\t\t\t\t\t\t\tsdi = dataItem;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif(Math.abs(index - sdi.index) > Math.abs(index - dataItem.index)) {\r\n\t\t\t\t\t\t\t\tsdi = dataItem;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (series.yAxis == this) {\r\n\t\t\t\t\t\tif (dataItem.categoryY == category) {\r\n\t\t\t\t\t\t\tif(!sdi){\r\n\t\t\t\t\t\t\t\tsdi = dataItem;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif(Math.abs(index - sdi.index) > Math.abs(index - dataItem.index)) {\r\n\t\t\t\t\t\t\t\tsdi = dataItem;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\r\n\t\t\t\t//@todo\r\n\t\t\t\tif(findNearest){\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn sdi;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the X coordinate for series' data item.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t * @param dataItem Data item\r\n\t * @param key Category\r\n\t * @param location Location (0-1)\r\n\t * @return X coordinate (px)\r\n\t */\r\n\tpublic getX(dataItem: XYSeriesDataItem, key?: string, location?: number): number {\r\n\t\tlet position;\r\n\t\tif ($type.hasValue(key)) {\r\n\t\t\tposition = this.categoryToPosition(dataItem.categories[key], location);\r\n\t\t}\r\n\t\tif ($type.isNaN(position)) {\r\n\t\t\treturn this.basePoint.x;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn this.renderer.positionToPoint(position).x;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the Y coordinate for series' data item.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t * @param dataItem Data item\r\n\t * @param key Category\r\n\t * @param location Location (0-1)\r\n\t * @return Y coordinate (px)\r\n\t */\r\n\tpublic getY(dataItem: XYSeriesDataItem, key?: string, location?: number): number {\r\n\t\tlet position;\r\n\t\tif ($type.hasValue(key)) {\r\n\t\t\tposition = this.categoryToPosition(dataItem.categories[key], location);\r\n\t\t}\r\n\t\tif ($type.isNaN(position)) {\r\n\t\t\treturn this.basePoint.y;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn this.renderer.positionToPoint(position).y;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an angle for series data item.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t * @param dataItem Data item\r\n\t * @param key Category\r\n\t * @param location Location (0-1)\r\n\t * @param stackKey Stack key (?)\r\n\t * @return Angle\r\n\t */\r\n\tpublic getAngle(dataItem: XYSeriesDataItem, key: string, location?: number, stackKey?: string): number {\r\n\t\treturn this.positionToAngle(this.categoryToPosition(dataItem.categories[key], location));\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an absolute pixel coordinate of the start of the cell (category),\r\n\t * that specific position value falls into.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t * @param position Position (px)\r\n\t * @return Cell start position (px)\r\n\t */\r\n\tpublic getCellStartPosition(position: number): number {\r\n\t\treturn this.roundPosition(position, 0);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an absolute pixel coordinate of the end of the cell (category),\r\n\t * that specific position value falls into.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t * @param position Position (px)\r\n\t * @return Cell end position (px)\r\n\t */\r\n\tpublic getCellEndPosition(position: number): number {\r\n\t\treturn this.roundPosition(position, 1);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns text to show in a category tooltip, based on specific position\r\n\t * within axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param position Position (px)\r\n\t * @return Label (category)\r\n\t */\r\n\tpublic getTooltipText(position: number): string {\r\n\t\tlet dataItem: this[\"_dataItem\"] = this.dataItems.getIndex(this.positionToIndex(position));\r\n\t\tif (dataItem) {\r\n\t\t\treturn this.adapter.apply(\"getTooltipText\", dataItem.category);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an index of the category that corresponds to specific pixel\r\n\t * position within axis.\r\n\t *\r\n\t * @param position Position (px)\r\n\t * @return Category index\r\n\t */\r\n\tpublic positionToIndex(position: number): number {\r\n\t\tposition = $math.round(position, 10);\r\n\t\tif (position < 0) {\r\n\t\t\tposition = 0;\r\n\t\t}\r\n\r\n\t\tlet startIndex: number = this.startIndex;\r\n\t\tlet endIndex: number = this.endIndex;\r\n\t\tlet difference: number = endIndex - startIndex;\r\n\r\n\t\tlet axisBreaks = this.axisBreaks;\r\n\r\n\t\tlet index: number = null;\r\n\r\n\t\t// in case we have some axis breaks\r\n\t\t$iter.eachContinue(axisBreaks.iterator(), (axisBreak) => {\r\n\t\t\tlet breakStartPosition: number = axisBreak.startPosition;\r\n\t\t\tlet breakEndPosition: number = axisBreak.endPosition;\r\n\r\n\t\t\tlet breakStartIndex: number = axisBreak.adjustedStartValue;\r\n\t\t\tlet breakEndIndex: number = axisBreak.adjustedEndValue;\r\n\r\n\t\t\tbreakStartIndex = $math.max(breakStartIndex, startIndex);\r\n\t\t\tbreakEndIndex = $math.min(breakEndIndex, endIndex);\r\n\r\n\t\t\tlet breakSize: number = axisBreak.breakSize;\r\n\r\n\t\t\tdifference -= (breakEndIndex - breakStartIndex) * (1 - breakSize);\r\n\r\n\t\t\t// position to the right of break end\r\n\t\t\tif (position > breakEndPosition) {\r\n\t\t\t\tstartIndex += (breakEndIndex - breakStartIndex) * (1 - breakSize);\r\n\t\t\t}\r\n\t\t\t// position to the left of break start\r\n\t\t\telse if (position < breakStartPosition) {\r\n\r\n\t\t\t}\r\n\t\t\t// value within break\r\n\t\t\telse {\r\n\t\t\t\tlet breakPosition = (position - breakStartPosition) / (breakEndPosition - breakStartPosition);\r\n\t\t\t\tindex = breakStartIndex + Math.round(breakPosition * (breakEndIndex - breakStartIndex));\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t\tif (!$type.isNumber(index)) {\r\n\t\t\tindex = Math.floor(position * difference + startIndex);\r\n\t\t}\r\n\t\tif (index >= endIndex) {\r\n\t\t\tindex--;\r\n\t\t}\r\n\r\n\t\treturn index;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns category based on position.\r\n\t *\r\n\t * Please note that `position` represents position within axis which may be\r\n\t * zoomed and not correspond to Cursor's `position`.\r\n\t *\r\n\t * To convert Cursor's `position` to Axis' `position` use `toAxisPosition()` method.\r\n\t *\r\n\t * @see {@link https://www.amcharts.com/docs/v4/tutorials/tracking-cursors-position-via-api/#Tracking_Cursor_s_position} For more information about cursor tracking.\r\n\t * @param position Relative position on axis (0-1)\r\n\t * @return Position label\r\n\t */\r\n\tpublic getPositionLabel(position: number): string {\r\n\t\tlet dataItem: this[\"_dataItem\"] = this.dataItems.getIndex(this.positionToIndex(position));\r\n\t\tif (dataItem) {\r\n\t\t\treturn dataItem.category;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Coordinates of the actual axis start.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @return Base point\r\n\t */\r\n\tpublic get basePoint(): IPoint {\r\n\t\t// This makes base grid to be drawn at the end of the axis and adds extra\r\n\t\t// grid which we need to nicely close the chart.\r\n\t\treturn this.renderer.positionToPoint(1);\r\n\t}\r\n\r\n\t/**\r\n\t * Initializes Axis' renderer.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic initRenderer(): void {\r\n\t\tsuper.initRenderer();\r\n\r\n\t\tlet renderer = this.renderer;\r\n\t\trenderer.baseGrid.disabled = true;\r\n\t}\r\n\r\n\t/**\r\n\t * Current frequency of labels of the axis.\r\n\t *\r\n\t * Normally it would be 1, but when labels start to be hidden due\r\n\t * to `minGridDistance` this read-only property will increase.\r\n\t *\r\n\t * @readonly\r\n\t * @since 4.2.0\r\n\t * @return Label frequency\r\n\t */\r\n\tpublic get frequency(): number {\r\n\t\treturn this._frequency;\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"CategoryAxis\"] = CategoryAxis;\r\nregistry.registeredClasses[\"CategoryAxisDataItem\"] = CategoryAxisDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/axes/CategoryAxis.ts","/**\r\n * XY series module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Series, SeriesDataItem, ISeriesProperties, ISeriesDataFields, ISeriesAdapters, ISeriesEvents } from \"./Series\";\r\nimport { Sprite } from \"../../core/Sprite\";\r\nimport { Axis } from \"../axes/Axis\";\r\nimport { AxisRenderer } from \"../axes/AxisRenderer\";\r\nimport { ValueAxis } from \"../axes/ValueAxis\";\r\nimport { Dictionary } from \"../../core/utils/Dictionary\";\r\nimport { List } from \"../../core/utils/List\";\r\nimport { MutableValueDisposer } from \"../../core/utils/Disposer\";\r\nimport { XYChart } from \"../types/XYChart\";\r\nimport { CategoryAxis } from \"../axes/CategoryAxis\";\r\nimport { IPoint } from \"../../core/defs/IPoint\";\r\nimport { DateAxis } from \"../axes/DateAxis\";\r\nimport { Bullet } from \"../elements/Bullet\";\r\nimport { CalculatedValue } from \"../../core/Component\";\r\nimport { Animation } from \"../../core/utils/Animation\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $array from \"../../core/utils/Array\";\r\nimport * as $object from \"../../core/utils/Object\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\nimport { ITimeInterval } from \"../../core/defs/ITimeInterval\";\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[XYSeries]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class XYSeriesDataItem extends SeriesDataItem {\r\n\r\n\t/**\r\n\t * [_minX description]\r\n\t *\r\n\t * @todo Descripion\r\n\t */\r\n\tprotected _minX: number;\r\n\r\n\t/**\r\n\t * [_maxX description]\r\n\t *\r\n\t * @todo Descripion\r\n\t */\r\n\tprotected _maxX: number;\r\n\r\n\t/**\r\n\t * [_minY description]\r\n\t *\r\n\t * @todo Descripion\r\n\t */\r\n\tprotected _minY: number;\r\n\r\n\t/**\r\n\t * [_maxY description]\r\n\t *\r\n\t * @todo Descripion\r\n\t */\r\n\tprotected _maxY: number;\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: XYSeries;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\r\n\t\tthis.className = \"XYSeriesDataItem\";\r\n\r\n\t\tthis.values.valueX = { stack: 0 };\r\n\t\tthis.values.valueY = { stack: 0 };\r\n\t\tthis.values.openValueX = {};\r\n\t\tthis.values.openValueY = {};\r\n\r\n\t\tthis.values.dateX = {};\r\n\t\tthis.values.dateY = {};\r\n\t\tthis.values.openDateX = {};\r\n\t\tthis.values.openDateY = {};\r\n\r\n\t\tthis.setLocation(\"dateX\", 0.5, 0);\r\n\t\tthis.setLocation(\"dateY\", 0.5, 0);\r\n\r\n\t\tthis.setLocation(\"categoryX\", 0.5, 0);\r\n\t\tthis.setLocation(\"categoryY\", 0.5, 0);\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Item's numeric value on X value axis.\r\n\t *\r\n\t * @param value Value\r\n\t */\r\n\tpublic set valueX(value: number) {\r\n\t\tthis.setValue(\"valueX\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Value\r\n\t */\r\n\tpublic get valueX(): number {\r\n\t\treturn this.values.valueX.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Item's numeric value on Y value axis.\r\n\t *\r\n\t * @param value Value\r\n\t */\r\n\tpublic set valueY(value: number) {\r\n\t\tthis.setValue(\"valueY\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Value\r\n\t */\r\n\tpublic get valueY(): number {\r\n\t\treturn this.values.valueY.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Item's date value on X date-based axis.\r\n\t *\r\n\t * @param date Date\r\n\t */\r\n\tpublic set dateX(date: Date) {\r\n\t\tthis.setDate(\"dateX\", date);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Date\r\n\t */\r\n\tpublic get dateX(): Date {\r\n\t\treturn this.getDate(\"dateX\");\r\n\t}\r\n\r\n\t/**\r\n\t * Item's date value on Y date-based axis.\r\n\t *\r\n\t * @param date Date\r\n\t */\r\n\tpublic set dateY(date: Date) {\r\n\t\tthis.setDate(\"dateY\", date);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Date\r\n\t */\r\n\tpublic get dateY(): Date {\r\n\t\treturn this.getDate(\"dateY\");\r\n\t}\r\n\r\n\t/**\r\n\t * Item's category on X category axis.\r\n\t *\r\n\t * @param category Category\r\n\t */\r\n\tpublic set categoryX(category: string) {\r\n\t\tthis.setCategory(\"categoryX\", category);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Category\r\n\t */\r\n\tpublic get categoryX(): string {\r\n\t\treturn this.categories.categoryX;\r\n\t}\r\n\r\n\t/**\r\n\t * Item's category on Y category axis.\r\n\t *\r\n\t * @param category Category\r\n\t */\r\n\tpublic set categoryY(category: string) {\r\n\t\tthis.setCategory(\"categoryY\", category);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Category\r\n\t */\r\n\tpublic get categoryY(): string {\r\n\t\treturn this.categories.categoryY;\r\n\t}\r\n\r\n\t/**\r\n\t * Item's open numeric value on X value axis.\r\n\t *\r\n\t * @param value Value\r\n\t */\r\n\tpublic set openValueX(value: number) {\r\n\t\tthis.setValue(\"openValueX\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Value\r\n\t */\r\n\tpublic get openValueX(): number {\r\n\t\treturn this.values.openValueX.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Item's open numeric value on Y value axis.\r\n\t *\r\n\t * @param value Value\r\n\t */\r\n\tpublic set openValueY(value: number) {\r\n\t\tthis.setValue(\"openValueY\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Value\r\n\t */\r\n\tpublic get openValueY(): number {\r\n\t\treturn this.values.openValueY.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Item's open date value on X date-based axis.\r\n\t *\r\n\t * @param date Date\r\n\t */\r\n\tpublic set openDateX(date: Date) {\r\n\t\tthis.setDate(\"openDateX\", date);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Date\r\n\t */\r\n\tpublic get openDateX(): Date {\r\n\t\treturn this.getDate(\"openDateX\");\r\n\t}\r\n\r\n\t/**\r\n\t * Item's open date value on Y date-based axis.\r\n\t *\r\n\t * @param date Date\r\n\t */\r\n\tpublic set openDateY(date: Date) {\r\n\t\tthis.setDate(\"openDateY\", date);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Date\r\n\t */\r\n\tpublic get openDateY(): Date {\r\n\t\treturn this.getDate(\"openDateY\");\r\n\t}\r\n\r\n\t/**\r\n\t * Item's open category on X category axis.\r\n\t *\r\n\t * @param category Category\r\n\t */\r\n\tpublic set openCategoryX(category: string) {\r\n\t\tthis.setProperty(\"openCategoryX\", category);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Category\r\n\t */\r\n\tpublic get openCategoryX(): string {\r\n\t\treturn this.categories.openCategoryX;\r\n\t}\r\n\r\n\t/**\r\n\t * Item's open category on Y category axis.\r\n\t *\r\n\t * @param category Category\r\n\t */\r\n\tpublic set openCategoryY(category: string) {\r\n\t\tthis.setProperty(\"openCategoryY\", category);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Category\r\n\t */\r\n\tpublic get openCategoryY(): string {\r\n\t\treturn this.categories.openCategoryY;\r\n\t}\r\n\r\n\t/**\r\n\t * Return smallest value out of all item's value fields.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param fields Fields to check in\r\n\t * @param working Include working (temporary) values\r\n\t * @param stackValue If item is in a stack, the value item starts as\r\n\t * @return Value\r\n\t */\r\n\tpublic getMin(fields: string[], working?: boolean, stackValue?: number): number {\r\n\t\t//if (this.visible) { // dumped because of non smooth zooming\r\n\t\tlet min: number;\r\n\r\n\t\tif (!$type.isNumber(stackValue)) {\r\n\t\t\tstackValue = 0;\r\n\t\t}\r\n\r\n\t\t$array.each(fields, (field) => {\r\n\t\t\tlet value: number;\r\n\r\n\t\t\tif (working) {\r\n\t\t\t\tvalue = this.getWorkingValue(field);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvalue = this.getValue(field);\r\n\t\t\t}\r\n\r\n\t\t\tvalue += stackValue;\r\n\r\n\t\t\tif (value < min || !$type.isNumber(min)) {\r\n\t\t\t\tmin = value;\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn min;\r\n\t\t//}\r\n\t}\r\n\r\n\t/**\r\n\t * Return biggest value out of all item's value fields.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param fields Fields to check in\r\n\t * @param working Include working (temporary) values\r\n\t * @param stackValue If item is in a stack, the value item starts as\r\n\t * @return Value\r\n\t */\r\n\tpublic getMax(fields: string[], working?: boolean, stackValue?: number): number {\r\n\t\t//if (this.visible) { // dumped because of non smooth zooming\r\n\t\tlet max: number;\r\n\r\n\t\tif (!$type.isNumber(stackValue)) {\r\n\t\t\tstackValue = 0;\r\n\t\t}\r\n\r\n\t\t$array.each(fields, (field) => {\r\n\t\t\tlet value: number;\r\n\r\n\t\t\tif (working) {\r\n\t\t\t\tvalue = this.getWorkingValue(field);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvalue = this.getValue(field);\r\n\t\t\t}\r\n\r\n\t\t\tvalue += stackValue;\r\n\r\n\t\t\tif (value > max || !$type.isNumber(max)) {\r\n\t\t\t\tmax = value;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn max;\r\n\t\t//}\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * Defines property set for a [[XYSeries]] tooltip event that contains information about dataItem\r\n */\r\nexport type XYSeriesTooltipEvent = {\r\n\r\n\t/**\r\n\t * Shift in coordinates after dragging.\r\n\t */\r\n\tdataItem: XYSeriesDataItem;\r\n};\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[XYSeries]].\r\n */\r\nexport interface IXYSeriesDataFields extends ISeriesDataFields {\r\n\r\n\t/**\r\n\t * Name of the field in data that holds numeric value for horizontal axis.\r\n\t */\r\n\tvalueX?: string;\r\n\r\n\t/**\r\n\t * Name of the field in data that holds numeric value for vertical axis.\r\n\t */\r\n\tvalueY?: string;\r\n\r\n\t/**\r\n\t * Name of the field in data that holds category for horizontal axis.\r\n\t */\r\n\tcategoryX?: string;\r\n\r\n\t/**\r\n\t * Name of the field in data that holds category for vertical axis.\r\n\t */\r\n\tcategoryY?: string;\r\n\r\n\t/**\r\n\t * Name of the field in data that holds date for horizontal axis.\r\n\t */\r\n\tdateX?: string;\r\n\r\n\t/**\r\n\t * Name of the field in data that holds date for vertical axis.\r\n\t */\r\n\tdateY?: string;\r\n\r\n\t/**\r\n\t * Name of the field in data that holds open numeric value for horizontal\r\n\t * axis.\r\n\t */\r\n\topenValueX?: string;\r\n\r\n\t/**\r\n\t * Name of the field in data that holds open numeric value for vertical\r\n\t * axis.\r\n\t */\r\n\topenValueY?: string;\r\n\r\n\t/**\r\n\t * Name of the field in data that holds open category for horizontal axis.\r\n\t */\r\n\topenCategoryX?: string;\r\n\r\n\t/**\r\n\t * Name of the field in data that holds open category for vertical axis.\r\n\t */\r\n\topenCategoryY?: string;\r\n\r\n\t/**\r\n\t * Name of the field in data that holds open date for horizontal axis.\r\n\t */\r\n\topenDateX?: string;\r\n\r\n\t/**\r\n\t * Name of the field in data that holds open date for vertical axis.\r\n\t */\r\n\topenDateY?: string;\r\n\r\n\t/**\r\n\t * Which calculated field to use to use as a horizontal axis value for the\r\n\t * item.\r\n\t */\r\n\tvalueXShow?: CalculatedValue;\r\n\r\n\t/**\r\n\t * Which calculated field to use to use as a vertical axis value for the\r\n\t * item.\r\n\t */\r\n\tvalueYShow?: CalculatedValue;\r\n\r\n\t/**\r\n\t * Which calculated field to use to use as a horizontal axis open value for\r\n\t * the item.\r\n\t */\r\n\topenValueXShow?: CalculatedValue;\r\n\r\n\t/**\r\n\t * Which calculated field to use to use as a vertical axis open value for\r\n\t * the item.\r\n\t */\r\n\topenValueYShow?: CalculatedValue;\r\n\r\n}\r\n\r\n/**\r\n * Defines properties for [[XYSeries]].\r\n */\r\nexport interface IXYSeriesProperties extends ISeriesProperties {\r\n\r\n\t/**\r\n\t * Can items from this series be included into stacks?\r\n\t *\r\n\t * @default false\r\n\t */\r\n\tstacked?: boolean;\r\n\r\n\t/**\r\n\t * Should the nearest tooltip be shown if no data item is found on the current cursor position\r\n\t *\r\n\t * @default false\r\n\t */\r\n\tsnapTooltip?: boolean;\r\n\r\n\t/**\r\n\t * Indicates if series should display a tooltip for chart's cursor.\r\n\t */\r\n\tcursorTooltipEnabled?: boolean;\r\n}\r\n\r\n/**\r\n * Defines events for [[XYSeries]].\r\n */\r\nexport interface IXYSeriesEvents extends ISeriesEvents {\r\n\t/**\r\n\t * Invoked when series tooltip was shown on some particular data item\r\n\t */\r\n\ttooltipshownat: XYSeriesTooltipEvent;\r\n}\r\n\r\n/**\r\n * Defines adapters for [[XYSeries]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IXYSeriesAdapters extends ISeriesAdapters, IXYSeriesProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines Series for [[XYChart]].\r\n *\r\n * @see {@link IXYSeriesEvents} for a list of available Events\r\n * @see {@link IXYSeriesAdapters} for a list of available Adapters\r\n * @todo Example\r\n * @important\r\n */\r\nexport class XYSeries extends Series {\r\n\r\n\t/**\r\n\t * Defines the type of data fields used for the series.\r\n\t */\r\n\tpublic _dataFields: IXYSeriesDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IXYSeriesProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IXYSeriesAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IXYSeriesEvents;\r\n\r\n\t/**\r\n\t * Defines the type of data item.\r\n\t */\r\n\tpublic _dataItem: XYSeriesDataItem;\r\n\r\n\t/**\r\n\t * X axis the series is attached to.\r\n\t */\r\n\tprotected _xAxis = new MutableValueDisposer>();\r\n\r\n\t/**\r\n\t * Y axis the series is attached to.\r\n\t */\r\n\tprotected _yAxis = new MutableValueDisposer>();\r\n\r\n\t/**\r\n\t * A chart series belongs to.\r\n\t */\r\n\tpublic _chart: XYChart;\r\n\r\n\t/**\r\n\t * The main (base) axis.\r\n\t *\r\n\t * This is the axis that series fills will go to, or grow animations will\r\n\t * happen from.\r\n\t */\r\n\tprotected _baseAxis: Axis;\r\n\r\n\t/**\r\n\t * Total data item count.\r\n\t */\r\n\tprotected _count: Dictionary;\r\n\r\n\t/**\r\n\t * Data item count in current selection.\r\n\t */\r\n\tprotected _scount: Dictionary;\r\n\r\n\t/**\r\n\t * [_xField description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _xField: string;\r\n\r\n\t/**\r\n\t * [_yField description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _yField: string;\r\n\r\n\t/**\r\n\t * [_xOpenField description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _xOpenField: string;\r\n\r\n\t/**\r\n\t * [_yOpenField description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _yOpenField: string;\r\n\r\n\t/**\r\n\t * [_tooltipXField description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _tooltipXField: string;\r\n\r\n\t/**\r\n\t * [_tooltipYField description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _tooltipYField: string;\r\n\r\n\t/**\r\n\t * [_xValueFields description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _xValueFields: Array = [];\r\n\r\n\t/**\r\n\t * [_yValueFields description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _yValueFields: Array = [];\r\n\r\n\t/**\r\n\t * Series which is stacked on top of this series, if any.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic stackedSeries: XYSeries;\r\n\r\n\r\n\t/**\r\n\t * dataitem of previously shown tooltip, used to avoid multiple tooltipshownat dispatches\r\n\t * @ignore\r\n\t */\r\n\tprotected _prevTooltipDataItem: XYSeriesDataItem;\r\n\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic _baseInterval:{[index:string]:ITimeInterval} = {};\r\n\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"XYSeries\";\r\n\t\tthis.isMeasured = false;\r\n\r\n\t\tthis.cursorTooltipEnabled = true;\r\n\r\n\t\tthis.mainContainer.mask = new Sprite();\r\n\t\tthis.mainContainer.mask.setElement(this.paper.add(\"path\"));\r\n\r\n\t\tthis.stacked = false;\r\n\t\tthis.snapTooltip = false;\r\n\r\n\t\tthis.tooltip.pointerOrientation = \"horizontal\";\r\n\r\n\t\tthis.tooltip.events.on(\"hidden\", () => {\r\n\t\t\tthis.returnBulletDefaultState();\r\n\t\t}, undefined, false)\r\n\r\n\t\tthis._disposers.push(this._xAxis);\r\n\t\tthis._disposers.push(this._yAxis);\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Sets defaults that instantiate some objects that rely on parent, so they\r\n\t * cannot be set in constructor.\r\n\t */\r\n\tprotected applyInternalDefaults(): void {\r\n\t\tsuper.applyInternalDefaults();\r\n\t\tif (!$type.hasValue(this.readerTitle)) {\r\n\t\t\tthis.readerTitle = this.language.translate(\"X/Y Series\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty DataItem of the type appropriate for this object.\r\n\t *\r\n\t * @see {@link DataItem}\r\n\t * @return Data Item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new XYSeriesDataItem();\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic dataChangeUpdate() {\r\n\t\tthis._tmin.clear();\r\n\t\tthis._tmax.clear();\r\n\r\n\t\tthis._smin.clear();\r\n\t\tthis._smax.clear();\r\n\r\n\r\n\t\tif (this.xAxis) {\r\n\t\t\tthis.xAxis.seriesDataChangeUpdate(this);\r\n\t\t}\r\n\r\n\t\tif (this.yAxis) {\r\n\t\t\tthis.yAxis.seriesDataChangeUpdate(this);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)validates the series' data.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validateData(): void {\r\n\t\tthis.defineFields();\r\n\r\n\t\tif (this.data.length > 0) {\r\n\t\t\tthis.dataChangeUpdate();\r\n\t\t}\r\n\r\n\t\tsuper.validateData();\r\n\r\n\t\tthis.updateItemReaderText();\r\n\r\n\t\tif (!$type.hasValue(this.dataFields[this._xField]) || !$type.hasValue(this.dataFields[this._yField])) {\r\n\t\t\tthrow Error(\"Data fields for series \\\"\" + (this.name ? this.name : this.uid) + \"\\\" are not properly defined.\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Processes data item.\r\n\t *\r\n\t * @param dataItem Data item\r\n\t * @param dataContext Raw data\r\n\t * @param index Index of the data item\r\n\t */\r\n\tprotected processDataItem(dataItem: this[\"_dataItem\"], dataContext?: Object): void {\r\n\r\n\t\ttry {\r\n\t\t\tsuper.processDataItem(dataItem, dataContext);\r\n\r\n\t\t\tdataItem.events.disable();\r\n\t\t\tthis.xAxis.processSeriesDataItem(dataItem, \"X\");\r\n\t\t\tthis.yAxis.processSeriesDataItem(dataItem, \"Y\");\r\n\r\n\t\t\tdataItem.events.enable();\r\n\r\n\t\t\tthis.setInitialWorkingValues(dataItem);\r\n\t\t}\r\n\t\tcatch (e) {\r\n\t\t\tthis._chart.raiseCriticalError(e);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Inits data item's working values.\r\n\t *\r\n\t * @param dataItem Data item\r\n\t * @param index Data item's index\r\n\t */\r\n\r\n\tprotected setInitialWorkingValues(dataItem: this[\"_dataItem\"]): void {\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic disposeData() {\r\n\t\tsuper.disposeData();\r\n\t\tif (this.xAxis) {\r\n\t\t\tlet dataItemsX = this.dataItemsByAxis.getKey(this.xAxis.uid);\r\n\t\t\tif (dataItemsX) {\r\n\t\t\t\tdataItemsX.clear();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (this.yAxis) {\r\n\t\t\tlet dataItemsY = this.dataItemsByAxis.getKey(this.yAxis.uid);\r\n\t\t\tif (dataItemsY) {\r\n\t\t\t\tdataItemsY.clear();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\t/**\r\n\t * Sets up which data fields to use for data access.\r\n\t */\r\n\tprotected defineFields() {\r\n\t\tlet xAxis: Axis = this.xAxis;\r\n\t\tlet yAxis: Axis = this.yAxis;\r\n\r\n\t\tlet xAxisFieldName: string = xAxis.axisFieldName;\r\n\t\tlet xField: $type.Keyof = <$type.Keyof>(xAxisFieldName + \"X\");\r\n\t\tlet xOpenField: $type.Keyof = <$type.Keyof>(\"open\" + $utils.capitalize(xAxisFieldName) + \"X\");\r\n\r\n\t\tlet yAxisFieldName: string = yAxis.axisFieldName;\r\n\t\tlet yField: $type.Keyof = <$type.Keyof>(yAxisFieldName + \"Y\");\r\n\t\tlet yOpenField: $type.Keyof = <$type.Keyof>(\"open\" + $utils.capitalize(yAxisFieldName) + \"Y\");\r\n\r\n\t\tthis._xField = xField;\r\n\t\tthis._yField = yField;\r\n\r\n\t\tif (this.dataFields[xOpenField]) {\r\n\t\t\tthis._xOpenField = xOpenField;\r\n\t\t}\r\n\r\n\t\tif (this.dataFields[yOpenField]) {\r\n\t\t\tthis._yOpenField = yOpenField;\r\n\t\t}\r\n\r\n\t\tif (!this.dataFields[yOpenField] && this.baseAxis == this.yAxis) {\r\n\t\t\tthis._yOpenField = yField;\r\n\t\t}\r\n\r\n\t\tif (!this.dataFields[xOpenField] && this.baseAxis == this.xAxis) {\r\n\t\t\tthis._xOpenField = xField;\r\n\t\t}\r\n\r\n\t\tif (this.stacked && this.baseAxis == this.xAxis) {\r\n\t\t\tthis._xOpenField = xField;\r\n\t\t}\r\n\r\n\t\tif (this.stacked && this.baseAxis == this.yAxis) {\r\n\t\t\tthis._yOpenField = yField;\r\n\t\t}\r\n\r\n\t\tif ((this.xAxis instanceof CategoryAxis) && (this.yAxis instanceof CategoryAxis)) {\r\n\t\t\tif (!this._yOpenField) {\r\n\t\t\t\tthis._yOpenField = yField;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._xValueFields = [];\r\n\t\tthis._yValueFields = [];\r\n\r\n\t\tthis.addValueField(this.xAxis, this._xValueFields, this._xField);\r\n\t\tthis.addValueField(this.xAxis, this._xValueFields, this._xOpenField);\r\n\r\n\t\tthis.addValueField(this.yAxis, this._yValueFields, this._yField);\r\n\t\tthis.addValueField(this.yAxis, this._yValueFields, this._yOpenField);\r\n\t}\r\n\r\n\t/**\r\n\t * [axis description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param axis Axis\r\n\t * @param fields Fields (?)\r\n\t * @param field Field\r\n\t */\r\n\tprotected addValueField(axis: Axis, fields: Array, field: Key): void {\r\n\t\tif (axis instanceof ValueAxis) {\r\n\t\t\tif ($type.hasValue(this.dataFields[field]) && fields.indexOf(field) == -1) {\r\n\t\t\t\tfields.push(field);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Sets category field from the category axis.\r\n\t *\r\n\t * User might set field for category axis only, but not for series. In such\r\n\t * case, we take field value from axis and set it for series.\r\n\t *\r\n\t * @param field Field\r\n\t * @param axis Axis\r\n\t */\r\n\tprotected setCategoryAxisField(field: Key, axis: CategoryAxis): void {\r\n\t\tif (!$type.hasValue(this.dataFields[field])) {\r\n\t\t\tthis.dataFields[field] = axis.dataFields.category;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Sets date field from the date axis.\r\n\t *\r\n\t * User might set field for category axis only, but not for series. In such\r\n\t * case, we take field value from axis and set it for series.\r\n\t *\r\n\t * @param field Field\r\n\t * @param axis Axis\r\n\t */\r\n\tprotected setDateAxisField(field: Key, axis: DateAxis): void {\r\n\t\tif (!$type.hasValue(this.dataFields[field])) {\r\n\t\t\tthis.dataFields[field] = axis.dataFields.date;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Performs after-draw tasks, e.g. creates masks.\r\n\t */\r\n\tprotected afterDraw(): void {\r\n\t\tsuper.afterDraw();\r\n\t\tthis.createMask();\r\n\t}\r\n\r\n\t/**\r\n\t * Create a mask for the series.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic createMask(): void {\r\n\t\t// this mask from which we cut out ranges. does not work well if ranges overlap.\r\n\t\tif (this.mainContainer.mask) {\r\n\t\t\tlet path: string = this.getMaskPath();\r\n\r\n\t\t\t// @todo: this approach won't work well on circluar or other non x/y axes\r\n\t\t\t$iter.each(this.axisRanges.iterator(), (range) => {\r\n\t\t\t\tif (range.axisFill.fillPath) {\r\n\t\t\t\t\trange.axisFill.validate();\r\n\t\t\t\t\tpath += range.axisFill.fillPath;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tthis.mainContainer.mask.path = path;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an SVG path to use as series mask.\r\n\t *\r\n\t * @return SVG path\r\n\t */\r\n\tprotected getMaskPath(): string {\r\n\t\treturn $path.rectToPath({\r\n\t\t\tx: 0,\r\n\t\t\ty: 0,\r\n\t\t\twidth: this.xAxis.axisLength,\r\n\t\t\theight: this.yAxis.axisLength\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Returns axis data field to use.\r\n\t *\r\n\t * @param axis Axis\r\n\t * @return Field name\r\n\t */\r\n\tpublic getAxisField(axis: Axis): string {\r\n\t\tif (axis == this.xAxis) {\r\n\t\t\treturn this.xField;\r\n\t\t}\r\n\t\tif (axis == this.yAxis) {\r\n\t\t\treturn this.yField;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Validates data items.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validateDataItems() {\r\n\r\n\t\t// this helps date axis to check which baseInterval we should use\r\n\t\tthis.xAxis.updateAxisBySeries();\r\n\t\tthis.yAxis.updateAxisBySeries();\r\n\r\n\t\tsuper.validateDataItems();\r\n\r\n\t\tthis.xAxis.postProcessSeriesDataItems();\r\n\t\tthis.yAxis.postProcessSeriesDataItems();\r\n\t}\r\n\r\n\t/**\r\n\t * Validates data range.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validateDataRange() {\r\n\t\tif (this.xAxis.dataRangeInvalid) {\r\n\t\t\tthis.xAxis.validateDataRange();\r\n\t\t}\r\n\r\n\t\tif (this.yAxis.dataRangeInvalid) {\r\n\t\t\tthis.yAxis.validateDataRange();\r\n\t\t}\r\n\r\n\t\tsuper.validateDataRange();\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)validates the whole series, effectively causing it to redraw.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validate(): void {\r\n\t\tif (this.xAxis.invalid) {\r\n\t\t\tthis.xAxis.validate();\r\n\t\t}\r\n\r\n\t\tif (this.yAxis.invalid) {\r\n\t\t\tthis.yAxis.validate();\r\n\t\t}\r\n\r\n\t\tthis.y = this.yAxis.pixelY;\r\n\t\tthis.x = this.xAxis.pixelX;\r\n\r\n\r\n\t\tthis._showBullets = true;\r\n\t\tlet minBulletDistance: number = this.minBulletDistance;\r\n\t\tif ($type.isNumber(minBulletDistance)) {\r\n\t\t\tif (this.baseAxis.axisLength / (this.endIndex - this.startIndex) < minBulletDistance) {\r\n\t\t\t\tthis._showBullets = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsuper.validate();\r\n\t}\r\n\r\n\t/**\r\n\t * X axis the series is attached to.\r\n\t *\r\n\t * @param axis Axis\r\n\t */\r\n\tpublic set xAxis(axis: Axis) {\r\n\t\tlet oldAxis = this._xAxis.get();\r\n\t\tif (oldAxis != axis) {\r\n\t\t\tif (oldAxis) {\r\n\t\t\t\tthis.dataItemsByAxis.removeKey(oldAxis.uid);\r\n\t\t\t\t// TODO why is this here ?\r\n\t\t\t\tthis._xAxis.dispose();\r\n\t\t\t\t// temp @todo: why it is not disposed?\r\n\t\t\t\toldAxis.series.removeValue(this);\r\n\t\t\t}\r\n\r\n\t\t\tthis._xAxis.set(axis, axis.registerSeries(this));\r\n\r\n\t\t\tthis.dataItemsByAxis.setKey(axis.uid, new Dictionary());\r\n\t\t\tthis.invalidateData();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Axis\r\n\t */\r\n\tpublic get xAxis(): Axis {\r\n\t\tif (this.chart) {\r\n\t\t\tif (!this._xAxis.get()) {\r\n\t\t\t\tconst axis = this.chart.xAxes.getIndex(0);\r\n\r\n\t\t\t\tif (!axis) {\r\n\t\t\t\t\tthrow Error(\"There are no X axes on chart.\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.xAxis = axis;\r\n\t\t\t}\r\n\t\t\treturn this._xAxis.get();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Y axis the series is attached to.\r\n\t *\r\n\t * @param axis Axis\r\n\t */\r\n\tpublic set yAxis(axis: Axis) {\r\n\t\tlet oldAxis = this._yAxis.get();\r\n\t\tif (oldAxis != axis) {\r\n\t\t\tif (oldAxis) {\r\n\t\t\t\tthis.dataItemsByAxis.removeKey(oldAxis.uid);\r\n\t\t\t\t// TODO why is this here ?\r\n\t\t\t\tthis._yAxis.dispose();\r\n\t\t\t\t// temp @todo: why it is not disposed?\r\n\t\t\t\toldAxis.series.removeValue(this);\r\n\t\t\t}\r\n\r\n\t\t\tthis._yAxis.set(axis, axis.registerSeries(this));\r\n\r\n\t\t\tthis.dataItemsByAxis.setKey(axis.uid, new Dictionary());\r\n\t\t\tthis.invalidateData();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Axis\r\n\t */\r\n\tpublic get yAxis(): Axis {\r\n\t\tif (this.chart) {\r\n\t\t\tif (!this._yAxis.get()) {\r\n\t\t\t\tconst axis = this.chart.yAxes.getIndex(0);\r\n\r\n\t\t\t\tif (!axis) {\r\n\t\t\t\t\tthrow Error(\"There are no Y axes on chart.\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.yAxis = axis;\r\n\t\t\t}\r\n\r\n\t\t\treturn this._yAxis.get();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * The main (base) axis.\r\n\t *\r\n\t * This is the axis that series fills will go to, or grow animations will\r\n\t * happen from.\r\n\t *\r\n\t * @param value Axis\r\n\t */\r\n\tpublic set baseAxis(value: Axis) {\r\n\t\tif (this._baseAxis != value) {\r\n\t\t\tthis._baseAxis = value;\r\n\t\t\tthis.invalidate();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Axis\r\n\t */\r\n\tpublic get baseAxis(): Axis {\r\n\t\tif (!this._baseAxis) {\r\n\t\t\tif (this.yAxis instanceof DateAxis) {\r\n\t\t\t\tthis._baseAxis = this.yAxis;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.xAxis instanceof DateAxis) {\r\n\t\t\t\tthis._baseAxis = this.xAxis;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.yAxis instanceof CategoryAxis) {\r\n\t\t\t\tthis._baseAxis = this.yAxis;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.xAxis instanceof CategoryAxis) {\r\n\t\t\t\tthis._baseAxis = this.xAxis;\r\n\t\t\t}\r\n\r\n\t\t\tif (!this._baseAxis) {\r\n\t\t\t\tthis._baseAxis = this.xAxis;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this._baseAxis;\r\n\t}\r\n\r\n\t/**\r\n\t * Processes values after data items' were added.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItems Data items\r\n\t */\r\n\tpublic processValues(working: boolean): void {\r\n\t\t// todo: if this is stacked, ensure that series to which this one can be stacked are processed before.\r\n\t\tsuper.processValues(working);\r\n\r\n\t\tlet dataItems = this.dataItems;\r\n\r\n\t\tlet minX = Infinity;\r\n\t\tlet maxX = - Infinity;\r\n\r\n\t\tlet minY = Infinity;\r\n\t\tlet maxY = - Infinity;\r\n\r\n\t\tlet startIndex = this.startIndex;\r\n\t\tlet endIndex = this.endIndex;\r\n\r\n\t\tif (!working) {\r\n\t\t\tstartIndex = 0;\r\n\t\t\tendIndex = this.dataItems.length;\r\n\t\t}\r\n\r\n\t\tfor (let i = startIndex; i < endIndex; i++) {\r\n\t\t\tlet dataItem = dataItems.getIndex(i);\r\n\r\n\t\t\tthis.getStackValue(dataItem, working);\r\n\r\n\t\t\tlet stackX = dataItem.getValue(\"valueX\", \"stack\");\r\n\t\t\tlet stackY = dataItem.getValue(\"valueY\", \"stack\");\r\n\r\n\t\t\tminX = $math.min(dataItem.getMin(this._xValueFields, working, stackX), minX);\r\n\t\t\tminY = $math.min(dataItem.getMin(this._yValueFields, working, stackY), minY);\r\n\r\n\t\t\tmaxX = $math.max(dataItem.getMax(this._xValueFields, working, stackX), maxX);\r\n\t\t\tmaxY = $math.max(dataItem.getMax(this._yValueFields, working, stackY), maxY);\r\n\r\n\t\t\t// if it's stacked, pay attention to stack value\r\n\t\t\tif (this.stacked) {\r\n\t\t\t\tif (this.baseAxis == this.xAxis) {\r\n\t\t\t\t\tminY = $math.min(minY, stackY);\r\n\t\t\t\t}\r\n\t\t\t\tif (this.baseAxis == this.yAxis) {\r\n\t\t\t\t\tminX = $math.min(minX, stackX);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// this is mainly for value axis to calculate total and perecent.total of each series category\r\n\t\tthis.xAxis.processSeriesDataItems();\r\n\t\tthis.yAxis.processSeriesDataItems();\r\n\r\n\t\tlet xAxisId: string = this.xAxis.uid;\r\n\t\tlet yAxisId: string = this.yAxis.uid;\r\n\r\n\t\tif (!working) {\r\n\t\t\tif (this._tmin.getKey(xAxisId) != minX || this._tmax.getKey(xAxisId) != maxX || this._tmin.getKey(yAxisId) != minY || this._tmax.getKey(yAxisId) != maxY) {\r\n\t\t\t\tthis._tmin.setKey(xAxisId, minX);\r\n\t\t\t\tthis._tmax.setKey(xAxisId, maxX);\r\n\t\t\t\tthis._tmin.setKey(yAxisId, minY);\r\n\t\t\t\tthis._tmax.setKey(yAxisId, maxY);\r\n\r\n\t\t\t\tif (this.stackedSeries) {\r\n\t\t\t\t\tthis.stackedSeries.processValues(false);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.dispatchImmediately(\"extremeschanged\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this._smin.getKey(xAxisId) != minX || this._smax.getKey(xAxisId) != maxX || this._smin.getKey(yAxisId) != minY || this._smax.getKey(yAxisId) != maxY) {\r\n\t\t\tthis._smin.setKey(xAxisId, minX);\r\n\t\t\tthis._smax.setKey(xAxisId, maxX);\r\n\t\t\tthis._smin.setKey(yAxisId, minY);\r\n\t\t\tthis._smax.setKey(yAxisId, maxY);\r\n\r\n\t\t\tif (this.appeared || this.start != 0 || this.end != 1) {\r\n\t\t\t\tthis.dispatchImmediately(\"selectionextremeschanged\");\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Hides element's [[Tooltip]].\r\n\t *\r\n\t * @see {@link Tooltip}\r\n\t */\r\n\tpublic hideTooltip() {\r\n\t\tsuper.hideTooltip();\r\n\t\tthis.returnBulletDefaultState();\r\n\t\tthis._prevTooltipDataItem = undefined;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Shows series tooltip at specific position.\r\n\t *\r\n\t * @param xPosition X\r\n\t * @param yPosition Y\r\n\t */\r\n\tpublic showTooltipAtPosition(xPosition: number, yPosition: number): IPoint {\r\n\t\tif (this.cursorTooltipEnabled) {\r\n\t\t\tlet dataItem: this[\"_dataItem\"];\r\n\r\n\t\t\tif (this.visible && !this.isHiding && !this.isShowing) {\r\n\r\n\t\t\t\tlet xAxis: Axis = this._xAxis.get();\r\n\t\t\t\tlet yAxis: Axis = this._yAxis.get();\r\n\r\n\t\t\t\tif (xAxis == this.baseAxis) {\r\n\t\t\t\t\tdataItem = xAxis.getSeriesDataItem(this, xAxis.toAxisPosition(xPosition), this.snapTooltip);\r\n\t\t\t\t}\r\n\t\t\t\tif (yAxis == this.baseAxis) {\r\n\t\t\t\t\tdataItem = yAxis.getSeriesDataItem(this, yAxis.toAxisPosition(yPosition), this.snapTooltip);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet point = this.showTooltipAtDataItem(dataItem);\r\n\r\n\t\t\t\tif(point){\r\n\t\t\t\t\treturn point;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// so that if tooltip is shown on columns or bullets for it not to be hidden\r\n\t\t\t\tif (!this.tooltipText) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.hideTooltip();\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Shows series tooltip at specific dataItem.\r\n\t *\r\n\t * @param dataItem\r\n\t */\r\n\tpublic showTooltipAtDataItem(dataItem: this[\"_dataItem\"]): IPoint {\r\n\t\tthis.returnBulletDefaultState(dataItem);\r\n\t\tif (this.cursorTooltipEnabled) {\r\n\t\t\tif (dataItem && dataItem.visible) {\r\n\r\n\t\t\t\tthis.updateLegendValue(dataItem);\r\n\t\t\t\tthis.tooltipDataItem = dataItem;\r\n\r\n\t\t\t\t// todo: add tooltipXField and tooltipYField.\r\n\t\t\t\tlet tooltipXField = this.tooltipXField;\r\n\t\t\t\tlet tooltipYField = this.tooltipYField;\r\n\r\n\t\t\t\tif ($type.hasValue((dataItem)[tooltipXField]) && $type.hasValue((dataItem)[tooltipYField])) {\r\n\r\n\t\t\t\t\tlet tooltipPoint = this.getPoint(dataItem, tooltipXField, tooltipYField, dataItem.locations[tooltipXField], dataItem.locations[tooltipYField]);\r\n\r\n\t\t\t\t\tif (tooltipPoint) {\r\n\r\n\t\t\t\t\t\tthis.tooltipX = tooltipPoint.x;\r\n\t\t\t\t\t\tthis.tooltipY = tooltipPoint.y;\r\n\r\n\t\t\t\t\t\tif (this._prevTooltipDataItem != dataItem) {\r\n\t\t\t\t\t\t\tthis.dispatchImmediately(\"tooltipshownat\", {\r\n\t\t\t\t\t\t\t\ttype: \"tooltipshownat\",\r\n\t\t\t\t\t\t\t\ttarget: this,\r\n\t\t\t\t\t\t\t\tdataItem: dataItem\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\tthis._prevTooltipDataItem = dataItem;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfor (let a of dataItem.bullets) {\r\n\t\t\t\t\t\t\tlet bullet = a[1]\r\n\t\t\t\t\t\t\tbullet.isHover = true;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (this.showTooltip()) {\r\n\t\t\t\t\t\t\treturn $utils.spritePointToSvg({ x: tooltipPoint.x, y: tooltipPoint.y }, this);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t * returns default state to bullets when tooltip is shown at some other data item or hidden\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tprotected returnBulletDefaultState(dataItem?: XYSeriesDataItem) {\r\n\t\tif (this._prevTooltipDataItem && this._prevTooltipDataItem != dataItem) {\r\n\t\t\tfor (let a of this._prevTooltipDataItem.bullets) {\r\n\t\t\t\tlet bullet = a[1];\r\n\t\t\t\tif (!bullet.isDisposed()) {\r\n\t\t\t\t\tbullet.isHover = false;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis._prevTooltipDataItem = undefined;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Positions series bullet.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param bullet Bullet\r\n\t */\r\n\tpublic positionBullet(bullet: Bullet) {\r\n\t\tsuper.positionBullet(bullet);\r\n\r\n\t\tlet dataItem: XYSeriesDataItem = bullet.dataItem;\r\n\r\n\t\t// use series xField/yField if bullet doesn't have fields set\r\n\t\tlet xField: string = bullet.xField;\r\n\t\tif (!$type.hasValue(xField)) {\r\n\t\t\txField = this.xField;\r\n\t\t}\r\n\r\n\t\tlet yField: string = bullet.yField;\r\n\t\tif (!$type.hasValue(yField)) {\r\n\t\t\tyField = this.yField;\r\n\t\t}\r\n\r\n\t\tif ((this.xAxis instanceof ValueAxis && !dataItem.hasValue([xField])) || (this.yAxis instanceof ValueAxis && !dataItem.hasValue([yField]))) {\r\n\t\t\tbullet.visible = false;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet bulletLocationX: number = this.getBulletLocationX(bullet, xField);\r\n\t\t\tlet bulletLocationY: number = this.getBulletLocationY(bullet, yField);\r\n\r\n\t\t\tlet point = this.getPoint(dataItem, xField, yField, bulletLocationX, bulletLocationY);\r\n\t\t\tif (point) {\r\n\t\t\t\tlet x: number = point.x;\r\n\t\t\t\tlet y: number = point.y;\r\n\r\n\t\t\t\tif ($type.isNumber(bullet.locationX) && this.xOpenField != this.xField) {\r\n\t\t\t\t\tlet openX: number = this.xAxis.getX(dataItem, this.xOpenField);\r\n\t\t\t\t\tx = x - (x - openX) * bullet.locationX;\r\n\t\t\t\t}\r\n\r\n\r\n\t\t\t\tif ($type.isNumber(bullet.locationY) && this.yOpenField != this.yField) {\r\n\t\t\t\t\tlet openY: number = this.yAxis.getY(dataItem, this.yOpenField);\r\n\t\t\t\t\ty = y - (y - openY) * bullet.locationY;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbullet.moveTo({ x: x, y: y });\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tbullet.visible = false;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t* returns bullet x location\r\n\t* @ignore\r\n\t*/\r\n\tprotected getBulletLocationX(bullet: Bullet, field: string): number {\r\n\t\tlet bulletLocation: number = bullet.locationX;\r\n\t\tlet dataItem = bullet.dataItem;\r\n\t\tif (!$type.isNumber(bulletLocation)) {\r\n\t\t\tbulletLocation = dataItem.workingLocations[field];\r\n\t\t}\r\n\t\treturn bulletLocation;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* returns bullet x location\r\n\t* @ignore\r\n\t*/\r\n\tprotected getBulletLocationY(bullet: Bullet, field: string): number {\r\n\t\tlet bulletLocation: number = bullet.locationY;\r\n\t\tlet dataItem = bullet.dataItem;\r\n\t\tif (!$type.isNumber(bulletLocation)) {\r\n\t\t\tbulletLocation = dataItem.workingLocations[field];\r\n\t\t}\r\n\t\treturn bulletLocation;\r\n\t}\r\n\r\n\t/**\r\n\t * Can items from this series be included into stacks?\r\n\t *\r\n\t * @default false\r\n\t * @param stacked Can be stacked?\r\n\t */\r\n\tpublic set stacked(stacked: boolean) {\r\n\t\tthis.setPropertyValue(\"stacked\", stacked, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Can be stacked?\r\n\t */\r\n\tpublic get stacked(): boolean {\r\n\t\treturn this.getPropertyValue(\"stacked\");\r\n\t}\r\n\r\n\t/**\r\n\t * Should the nearest tooltip be shown if no data item is found on the\r\n\t * current cursor position?\r\n\t *\r\n\t * @default false\r\n\t * @param value Should snap?\r\n\t */\r\n\tpublic set snapTooltip(value: boolean) {\r\n\t\tthis.setPropertyValue(\"snapTooltip\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Should snap?\r\n\t */\r\n\tpublic get snapTooltip(): boolean {\r\n\t\treturn this.getPropertyValue(\"snapTooltip\");\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Shows hidden series.\r\n\t *\r\n\t * @param duration Duration of reveal animation (ms)\r\n\t * @return Animation\r\n\t */\r\n\tpublic show(duration?: number): Animation {\r\n\r\n\t\tlet fields: string[];\r\n\t\tif (this.xAxis instanceof ValueAxis && this.xAxis != this.baseAxis) {\r\n\t\t\tfields = this._xValueFields;\r\n\t\t}\r\n\r\n\t\tif (this.yAxis instanceof ValueAxis && this.yAxis != this.baseAxis) {\r\n\t\t\tfields = this._yValueFields;\r\n\t\t}\r\n\r\n\t\tlet startIndex: number = this.startIndex;\r\n\t\tlet endIndex: number = this.endIndex;\r\n\t\tlet delay: number = 0;\r\n\r\n\t\tlet interpolationDuration = this.defaultState.transitionDuration;\r\n\t\tif ($type.isNumber(duration)) {\r\n\t\t\tinterpolationDuration = duration;\r\n\t\t}\r\n\r\n\t\tlet anim: Animation;\r\n\t\t$iter.each($iter.indexed(this.dataItems.iterator()), (a) => {\r\n\t\t\tlet i = a[0];\r\n\t\t\tlet dataItem = a[1];\r\n\r\n\t\t\tif (this.sequencedInterpolation && interpolationDuration > 0) {\r\n\t\t\t\tdelay = this.sequencedInterpolationDelay * i + interpolationDuration * (i - startIndex) / (endIndex - startIndex);\r\n\t\t\t}\r\n\t\t\tanim = dataItem.show(interpolationDuration, delay, fields);\r\n\t\t});\r\n\r\n\t\tlet animation = super.show(duration);\r\n\r\n\t\tif (anim && !anim.isFinished()) {\r\n\t\t\tanimation = anim;\r\n\t\t}\r\n\r\n\t\treturn animation;\r\n\t}\r\n\r\n\t/**\r\n\t * Hides series.\r\n\t *\r\n\t * @param duration Duration of hiding animation (ms)\r\n\t * @return Animation\r\n\t */\r\n\tpublic hide(duration?: number): Animation {\r\n\r\n\t\tlet fields: string[];\r\n\t\tlet value: number;\r\n\t\tlet xAxis: Axis = this.xAxis;\r\n\r\n\t\tif (xAxis instanceof ValueAxis && xAxis != this.baseAxis) {\r\n\t\t\tfields = this._xValueFields;\r\n\t\t\t// animate to zero if 0 is within zoomMin/zoomMax\r\n\t\t\tif (this.stacked || (xAxis.minZoomed < 0 && xAxis.maxZoomed > 0) || this.stackedSeries) {\r\n\t\t\t\tvalue = 0;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvalue = xAxis.min;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet yAxis: Axis = this.yAxis;\r\n\t\tif (yAxis instanceof ValueAxis && yAxis != this.baseAxis) {\r\n\t\t\tfields = this._yValueFields;\r\n\t\t\t// animate to zero if 0 is within zoomMin/zoomMax\r\n\t\t\tif (this.stacked || (yAxis.minZoomed < 0 && yAxis.maxZoomed > 0) || this.stackedSeries) {\r\n\t\t\t\tvalue = 0;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tvalue = yAxis.min;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//if ($type.hasValue(fields)) {\r\n\t\tlet startIndex: number = this.startIndex;\r\n\t\tlet endIndex: number = this.endIndex;\r\n\r\n\t\tlet interpolationDuration = this.hiddenState.transitionDuration;\r\n\t\tif ($type.isNumber(duration)) {\r\n\t\t\tinterpolationDuration = duration;\r\n\t\t}\r\n\r\n\t\tlet delay: number = 0;\r\n\t\tlet anim: Animation;\r\n\r\n\t\t$iter.each($iter.indexed(this.dataItems.iterator()), (a) => {\r\n\t\t\tlet i = a[0];\r\n\t\t\tlet dataItem = a[1];\r\n\r\n\t\t\tif (interpolationDuration == 0) {\r\n\t\t\t\tdataItem.hide(0, 0, value, fields);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif (this.sequencedInterpolation && interpolationDuration > 0) {\r\n\t\t\t\t\tdelay = this.sequencedInterpolationDelay * i + interpolationDuration * (i - startIndex) / (endIndex - startIndex);\r\n\t\t\t\t}\r\n\t\t\t\tanim = dataItem.hide(interpolationDuration, delay, value, fields);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tlet animation = super.hide(interpolationDuration);\r\n\t\tif (animation && !animation.isFinished()) {\r\n\t\t\tanimation.delay(delay);\r\n\t\t}\r\n\r\n\t\tif (anim && !anim.isFinished()) {\r\n\t\t\tanimation = anim;\r\n\t\t}\r\n\r\n\t\t// helps to avoid flicker. otherwise columns will show up at full size and only on next frame will animate from 0\r\n\t\tthis.validateDataElements();\r\n\t\t//}\r\n\t\treturn animation;\r\n\t}\r\n\r\n\t/**\r\n\t * [handleDataItemWorkingValueChange description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic handleDataItemWorkingValueChange(dataItem?: this[\"_dataItem\"], name?: string): void {\r\n\t\tsuper.handleDataItemWorkingValueChange(dataItem, name);\r\n\r\n\t\t// to calculate stack values\r\n\t\tlet axisSeries: List = >this.baseAxis.series;\r\n\r\n\t\t$iter.each(axisSeries.iterator(), (series) => {\r\n\t\t\tif (series.stacked) {\r\n\t\t\t\tseries.invalidateProcessedData();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * [getStackValue description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic getStackValue(dataItem: this[\"_dataItem\"], working?: boolean): void {\r\n\t\t// todo: here wer stack x and y values only. question is - what should we do with other values, like openX, openY?\r\n\t\t// if this series is not stacked or new stack begins, return.\r\n\r\n\t\tif (!this.stacked) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\telse {\r\n\t\t\t// it might seem that it's better to go through base axis series, but we do not maintain the same order as in chart.series there.\r\n\t\t\tlet chart: XYChart = this.chart;\r\n\t\t\tlet index: number = chart.series.indexOf(this);\r\n\r\n\t\t\tlet field: string;\r\n\r\n\t\t\tif (this.xAxis != this.baseAxis && this.xAxis instanceof ValueAxis) {\r\n\t\t\t\tfield = this.xField;\r\n\t\t\t}\r\n\t\t\tif (this.yAxis != this.baseAxis && this.yAxis instanceof ValueAxis) {\r\n\t\t\t\tfield = this.yField;\r\n\t\t\t}\r\n\r\n\t\t\t//this is good for removing series, otherwise stack values will remain the same and chart won't pay atention when adding/removing series\r\n\t\t\tdataItem.setCalculatedValue(field, 0, \"stack\");\r\n\r\n\t\t\t$iter.eachContinue(chart.series.range(0, index).backwards().iterator(), (prevSeries) => {\r\n\t\t\t\t// stacking is only possible if both axes are the same\r\n\t\t\t\tif (prevSeries.xAxis == this.xAxis && prevSeries.yAxis == this.yAxis) {\r\n\t\t\t\t\t// saving value\r\n\t\t\t\t\tprevSeries.stackedSeries = this;\r\n\r\n\t\t\t\t\tlet prevDataItem = prevSeries.dataItems.getIndex(dataItem.index); // indexes should match\r\n\r\n\t\t\t\t\tif (prevDataItem && prevDataItem.hasValue(this._xValueFields) && prevDataItem.hasValue(this._yValueFields)) {\r\n\r\n\t\t\t\t\t\tlet value = dataItem.getValue(field);\r\n\t\t\t\t\t\tlet prevValue: number;\r\n\r\n\t\t\t\t\t\tif (working) {\r\n\t\t\t\t\t\t\tprevValue = prevDataItem.getWorkingValue(field) + prevDataItem.getValue(field, \"stack\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tprevValue = prevDataItem.getValue(field) + prevDataItem.getValue(field, \"stack\");\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif ((value >= 0 && prevValue >= 0) || (value < 0 && prevValue < 0)) {\r\n\t\t\t\t\t\t\t//dataItem.events.disable();\r\n\t\t\t\t\t\t\tdataItem.setCalculatedValue(field, prevValue, \"stack\");\r\n\t\t\t\t\t\t\t//dataItem.events.enable();\r\n\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (!prevSeries.stacked) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * [xField description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @return [description]\r\n\t */\r\n\tpublic get xField(): string {\r\n\t\treturn this._xField;\r\n\t}\r\n\r\n\t/**\r\n\t * [yField description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @return [description]\r\n\t */\r\n\tpublic get yField(): string {\r\n\t\treturn this._yField;\r\n\t}\r\n\r\n\t/**\r\n\t * [xOpenField description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @return [description]\r\n\t */\r\n\tpublic get xOpenField(): string {\r\n\t\treturn this._xOpenField;\r\n\t}\r\n\r\n\t/**\r\n\t * [yOpenField description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @return [description]\r\n\t */\r\n\tpublic get yOpenField(): string {\r\n\t\treturn this._yOpenField;\r\n\t}\r\n\r\n\t/**\r\n\t * [tooltipXField description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @param value [description]\r\n\t */\r\n\tpublic set tooltipXField(value: string) {\r\n\t\tthis._tooltipXField = value;\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @return [description]\r\n\t */\r\n\tpublic get tooltipXField(): string {\r\n\t\tif (this._tooltipXField) {\r\n\t\t\treturn this._tooltipXField;\r\n\t\t}\r\n\t\treturn this._xField;\r\n\t}\r\n\r\n\t/**\r\n\t * [tooltipYField description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @param value [description]\r\n\t */\r\n\tpublic set tooltipYField(value: string) {\r\n\t\tthis._tooltipYField = value;\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @return [description]\r\n\t */\r\n\tpublic get tooltipYField(): string {\r\n\t\tif (this._tooltipYField) {\r\n\t\t\treturn this._tooltipYField;\r\n\t\t}\r\n\t\treturn this._yField;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns lowest value in the series for the specific axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param axis Axis\r\n\t * @return value\r\n\t */\r\n\tpublic min(axis: ValueAxis): number {\r\n\t\treturn this._tmin.getKey(axis.uid);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns highest value in the series for the specific axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param axis Axis\r\n\t * @return value\r\n\t */\r\n\tpublic max(axis: ValueAxis): number {\r\n\t\treturn this._tmax.getKey(axis.uid);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns lowest value in the series for the specific axis within current\r\n\t * selection.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param axis Axis\r\n\t * @return value\r\n\t */\r\n\tpublic selectionMin(axis: ValueAxis): number {\r\n\t\tlet value = this._smin.getKey(axis.uid);\r\n\t\tif (!$type.isNumber(value)) {\r\n\t\t\tvalue = this.min(axis);\r\n\t\t}\r\n\t\treturn value;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns highest value in the series for the specific axis within current\r\n\t * selection.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param axis Axis\r\n\t * @return value\r\n\t */\r\n\tpublic selectionMax(axis: ValueAxis): number {\r\n\t\tlet value = this._smax.getKey(axis.uid);\r\n\t\tif (!$type.isNumber(value)) {\r\n\t\t\tvalue = this.max(axis);\r\n\t\t}\r\n\t\treturn value;\r\n\t}\r\n\r\n\t/**\r\n\t * Processes JSON-based config before it is applied to the object.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param config Config\r\n\t */\r\n\tpublic processConfig(config?: { [index: string]: any }): void {\r\n\r\n\t\tif (config) {\r\n\r\n\t\t\t// Set up axes\r\n\t\t\tif ($type.hasValue(config.xAxis) && $type.isString(config.xAxis)) {\r\n\t\t\t\tif (this.map.hasKey(config.xAxis)) {\r\n\t\t\t\t\tconfig.xAxis = this.map.getKey(config.xAxis);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.processingErrors.push(\"[XYSeries (\" + (this.name || \"unnamed\") + \")] No axis with id \\\"\" + config.xAxis + \"\\\" found for `xAxis`.\");\r\n\t\t\t\t\tdelete config.xAxis;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif ($type.hasValue(config.yAxis) && $type.isString(config.yAxis)) {\r\n\t\t\t\tif (this.map.hasKey(config.yAxis)) {\r\n\t\t\t\t\tconfig.yAxis = this.map.getKey(config.yAxis);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.processingErrors.push(\"[XYSeries (\" + (this.name || \"unnamed\") + \")] No axis with id \\\"\" + config.yAxis + \"\\\" found for `yAxis`.\");\r\n\t\t\t\t\tdelete config.yAxis;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Set up axis ranges\r\n\t\t\tif ($type.hasValue(config.axisRanges) && $type.isArray(config.axisRanges)) {\r\n\t\t\t\tfor (let i = 0, len = config.axisRanges.length; i < len; i++) {\r\n\t\t\t\t\tlet range = config.axisRanges[i];\r\n\t\t\t\t\tif (!$type.hasValue(range.type)) {\r\n\t\t\t\t\t\trange.type = \"AxisDataItem\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ($type.hasValue(range.axis) && $type.isString(range.axis) && this.map.hasKey(range.axis)) {\r\n\t\t\t\t\t\trange.component = this.map.getKey(range.axis);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if ($type.hasValue(range.component) && $type.isString(range.component) && this.map.hasKey(range.component)) {\r\n\t\t\t\t\t\trange.component = this.map.getKey(range.component);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Parse date fields based on the series fields\r\n\t\t\tif (!$type.hasValue(config.dataFields) || !$type.isObject(config.dataFields)) {\r\n\t\t\t\tthis.processingErrors.push(\"`dataFields` is not set for series [\" + (this.name || \"unnamed\") + \"]\");\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tsuper.processConfig(config);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * [getPoint description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param dataItem [description]\r\n\t * @param xKey [description]\r\n\t * @param yKey [description]\r\n\t * @param locationX [description]\r\n\t * @param locationY [description]\r\n\t * @param stackKeyX [description]\r\n\t * @param stackKeyY [description]\r\n\t */\r\n\tprotected getPoint(dataItem: XYSeriesDataItem, xKey: string, yKey: string, locationX?: number, locationY?: number, stackKeyX?: string, stackKeyY?: string) {\r\n\t\tlet x: number = this.xAxis.getX(dataItem, xKey, locationX);\r\n\t\tlet y: number = this.yAxis.getY(dataItem, yKey, locationY);\r\n\r\n\t\tx = $math.fitToRange(x, -20000, 20000); // from geometric point of view this is not right, but practically it's ok. this is done to avoid too big objects.\r\n\t\ty = $math.fitToRange(y, -20000, 20000); // from geometric point of view this is not right, but practically it's ok. this is done to avoid too big objects.\r\n\r\n\t\treturn { x: x, y: y };\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Updates item reader text based on the type and set up of axis.\r\n\t */\r\n\tprotected updateItemReaderText(): void {\r\n\t\tlet text = \"\"\r\n\t\t$object.each(this.dataFields, (key, val) => {\r\n\t\t\ttext += \"{\" + key + \"} \";\r\n\t\t});\r\n\t\tthis.itemReaderText = text;\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates if series should display a tooltip for chart's cursor.\r\n\t *\r\n\t * If set to `true` (default), the tooltips set for all series item's\r\n\t * elements like columns and bullets will be automatically shown\r\n\t * when [[XYCursor]] passes over category/date, even if its not hovered\r\n\t * directly over the item.\r\n\t *\r\n\t * Set this to `false` to disable such behavior and display item-specific\r\n\t * tooltips only when hovered directly over them\r\n\t *\r\n\t * @default true\r\n\t * @param value Display tooltip?\r\n\t */\r\n\tpublic set cursorTooltipEnabled(value: boolean) {\r\n\t\tthis.setPropertyValue(\"cursorTooltipEnabled\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Display tooltip?\r\n\t */\r\n\tpublic get cursorTooltipEnabled(): boolean {\r\n\t\treturn this.getPropertyValue(\"cursorTooltipEnabled\");\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"XYSeries\"] = XYSeries;\r\nregistry.registeredClasses[\"XYSeriesDataItem\"] = XYSeriesDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/XYSeries.ts","/**\r\n * Cursor module\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Container, IContainerProperties, IContainerAdapters, IContainerEvents } from \"../../core/Container\";\r\nimport { getInteraction, IInteractionEvents } from \"../../core/interaction/Interaction\";\r\nimport { IInteractionObjectEvents } from \"../../core/interaction/InteractionObjectEvents\";\r\nimport { IPoint, } from \"../../core/defs/IPoint\";\r\nimport { Chart } from \"../Chart\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { percent } from \"../../core/utils/Percent\";\r\nimport { MouseCursorStyle } from \"../../core/interaction/Mouse\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport { Animation } from \"../../core/utils/Animation\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[Cursor]].\r\n */\r\nexport interface ICursorProperties extends IContainerProperties { }\r\n\r\n/**\r\n * Defines events for [[Cursor]].\r\n */\r\nexport interface ICursorEvents extends IContainerEvents {\r\n\r\n\t/**\r\n\t * Invoked when position of cursor changes.\r\n\t */\r\n\tcursorpositionchanged: {};\r\n\r\n\t/**\r\n\t * Invoked when user starts selecting a range with a cursor, e.g. presses\r\n\t * down mouse button and drags the cursor.\r\n\t */\r\n\tselectstarted: {};\r\n\r\n\t/**\r\n\t * Invoked when selection has ended, e.g. user releases mouse button.\r\n\t */\r\n\tselectended: {};\r\n\r\n\t/**\r\n\t * Invoked when user starts zooming using cursor.\r\n\t */\r\n\tzoomstarted: {};\r\n\r\n\t/**\r\n\t * Invoked when user clicked to start zooming/panning/selecting but haven't\r\n\t * finished the operation.\r\n\t */\r\n\tbehaviorcanceled: {};\r\n\r\n\t/**\r\n\t * Invoked when user is done zooming using cursor.\r\n\t */\r\n\tzoomended: {};\r\n\r\n\t/**\r\n\t * Invoked when user starts panning using cursor.\r\n\t */\r\n\tpanstarted: {};\r\n\r\n\t/**\r\n\t * Invoked when user is done panning using cursor.\r\n\t */\r\n\tpanended: {};\r\n\r\n\t/**\r\n\t * Invoked when user is panning using cursor.\r\n\t */\r\n\tpanning: {};\r\n}\r\n\r\n/**\r\n * Defines adapters for [[Cursor]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface ICursorAdapters extends IContainerAdapters, ICursorProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Main Cursor class with common cursor functionality.\r\n *\r\n * Chart-specific cursors must extend this class.\r\n *\r\n * @see {@link ICursorEvents} for a list of available events\r\n * @see {@link ICursorAdapters} for a list of available Adapters\r\n * @todo Add description, examples\r\n * @todo Should we allow changing `_generalBehavior`?\r\n */\r\nexport class Cursor extends Container {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: ICursorProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: ICursorAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: ICursorEvents;\r\n\r\n\t/**\r\n\t * Point coordinates of where selection started.\r\n\t */\r\n\tpublic downPoint: IPoint;\r\n\r\n\t/**\r\n\t * Point coordinates of where selection ended.\r\n\t */\r\n\tpublic upPoint: IPoint;\r\n\r\n\t/**\r\n\t * Current cursor position during selection.\r\n\t *\r\n\t * @todo Better description\r\n\t */\r\n\tpublic point: IPoint = { x: 0, y: 0 };\r\n\r\n\t/**\r\n\t * Relative horizontal position.\r\n\t *\r\n\t * @todo: maybe we should make getter only? it is used from outside by axes or series to show tooltips at some position\r\n\t */\r\n\tpublic xPosition: number;\r\n\r\n\t/**\r\n\t * Relative vertical position.\r\n\t *\r\n\t * @todo: maybe we should make getter only? it is used from outside by axes or series to show tooltips at some position\r\n\t */\r\n\tpublic yPosition: number;\r\n\r\n\t/**\r\n\t * [_usesSelection description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _usesSelection: boolean;\r\n\r\n\t/**\r\n\t * What to do when user pressed down and drags cursor: zoom or select.\r\n\t */\r\n\tprotected _generalBehavior: \"zoom\" | \"select\" | \"pan\"; // todo: draw\r\n\r\n\t/**\r\n\t * A reference to chart cursor belongs to.\r\n\t */\r\n\tpublic _chart: Chart;\r\n\r\n\t/**\r\n\t * Specifies the rules when cursor needs to be moved or hidden.\r\n\t */\r\n\tprotected _stick: \"hard\" | \"soft\" | \"none\" = \"none\";\r\n\r\n\t/**\r\n\t * A screen point that cursor is \"stuck\" to.\r\n\t */\r\n\tprotected _stickPoint: IPoint;\r\n\r\n\t/**\r\n\t * non-modified down point\r\n\t * @ignore\r\n\t */\r\n\tprotected _downPointOrig: IPoint;\r\n\r\n\t/**\r\n\t * non-modified up point\r\n\t * @ignore\r\n\t */\r\n\tprotected _upPointOrig: IPoint;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"Cursor\";\r\n\r\n\t\t// Set defaults\r\n\t\tthis.width = percent(100);\r\n\t\tthis.height = percent(100);\r\n\t\tthis.shouldClone = false;\r\n\r\n\t\tthis.hide(0);\r\n\r\n\t\tthis.trackable = true;\r\n\t\tthis.clickable = true;\r\n\r\n\t\tthis.isMeasured = false;\r\n\r\n\t\t// Add events on body to trigger down and up events (to start zooming or\r\n\t\t// selection)\r\n\t\tconst interaction = getInteraction();\r\n\t\tthis._disposers.push(interaction.body.events.on(\"down\", this.handleCursorDown, this));\r\n\t\tthis._disposers.push(interaction.body.events.on(\"up\", this.handleCursorUp, this));\r\n\t\tthis._disposers.push(interaction.body.events.on(\"track\", this.handleCursorMove, this));\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Handle pointer movement in document and update cursor position as needed.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param event Event\r\n\t */\r\n\tpublic handleCursorMove(event: IInteractionObjectEvents[\"track\"]): IPoint {\r\n\r\n\t\tif (!this.interactionsEnabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (((this._generalBehavior != \"zoom\" && this._generalBehavior != \"pan\") || !this.downPoint) && !getInteraction().isLocalElement(event.pointer, this.paper.svg, this.uid)) {\r\n\t\t\t// We want to let zoom/pan continue even if cursor is outside chart area\r\n\t\t\tif (!this.isHidden || !this.isHiding) {\r\n\t\t\t\tthis.hide();\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet local: IPoint = $utils.documentPointToSprite(event.pointer.point, this);\r\n\r\n\t\tif (this._stick == \"hard\" && this._stickPoint) {\r\n\t\t\tlocal = this._stickPoint;\r\n\t\t}\r\n\r\n\t\tif (this._stick == \"soft\" && this._stickPoint) {\r\n\t\t\tif (!this.fitsToBounds(local)) {\r\n\t\t\t\tlocal = this._stickPoint;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.triggerMove(local);\r\n\t\treturn local;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Hides actual SVG elements and handles hiding animations.\r\n\t *\r\n\t * @param duration Fade out duration (ms)\r\n\t * @return Fade out duration (ms)\r\n\t * @ignore\r\n\t */\r\n\tprotected hideReal(duration?: number): $type.Optional {\r\n\t\tif ((this._stick == \"hard\" || this._stick == \"soft\") && this._stickPoint) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\treturn super.hideReal(duration);\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Places the cursor at specific point.\r\n\t *\r\n\t * The second parameter has following options:\r\n\t *\r\n\t * `\"none\"` - placed cursor will only be there until mouse/touch moves, then\r\n\t * it either moves to a new place (if pointer over plot area) or is hidden.\r\n\t *\r\n\t * `\"soft\"` - cursor will stay in the place if mouse/touch is happening\r\n\t * outside chart, but will move to a new place whe plot area is hovered or\r\n\t * touched.\r\n\t *\r\n\t * `\"hard\"` - cursor will stay in place no matter what, until it is moved by\r\n\t * another `triggerMove()` call.\r\n\t *\r\n\t * @param point Point to place cursor at\r\n\t * @param stick Level of cursor stickiness to the place\r\n\t */\r\n\tpublic triggerMove(point: IPoint, stick?: \"hard\" | \"soft\" | \"none\"): void {\r\n\r\n\t\tpoint.x = $math.round(point.x, 1);\r\n\t\tpoint.y = $math.round(point.y, 1);\r\n\r\n\t\tif (stick) {\r\n\t\t\tthis._stick = stick;\r\n\t\t}\r\n\r\n\t\tif (stick == \"hard\" || stick == \"soft\") {\r\n\t\t\tthis._stickPoint = point;\r\n\t\t}\r\n\r\n\t\tthis.triggerMoveReal(point);\r\n\t}\r\n\r\n\t/**\r\n\t * Places the cursor at specific point.\r\n\t *\r\n\t * @param point Point to place cursor at\r\n\t */\r\n\tprotected triggerMoveReal(point: IPoint): void {\r\n\t\tif (this.point.x != point.x || this.point.y != point.y) {\r\n\t\t\tthis.point = point;\r\n\t\t\tthis.invalidatePosition();\r\n\t\t\t// hide cursor if it's out of bounds\r\n\t\t\tif (this.fitsToBounds(point)) {\r\n\t\t\t\tthis.show(0);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// unless we are selecting (mouse is down)\r\n\t\t\t\tif (!this.downPoint) {\r\n\t\t\t\t\tthis.hide(0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (this.visible) {\r\n\t\t\t\tthis.getPositions();\r\n\r\n\t\t\t\tthis.dispatch(\"cursorpositionchanged\"); // not good to dispatch later (check step count example)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Simulates pressing down (click/touch) action by a cursor.\r\n\t *\r\n\t * @param point Point of action\r\n\t */\r\n\tpublic triggerDown(point: IPoint) {\r\n\t\tthis.triggerDownReal(point);\r\n\t}\r\n\r\n\t/**\r\n\t * Simulates pressing down (click/touch) action by a cursor.\r\n\t *\r\n\t * @param point Point of action\r\n\t */\r\n\tprotected triggerDownReal(point: IPoint) {\r\n\t\tswitch (this._generalBehavior) {\r\n\t\t\tcase \"zoom\":\r\n\t\t\t\tthis.dispatchImmediately(\"zoomstarted\");\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"select\":\r\n\t\t\t\tthis.dispatchImmediately(\"selectstarted\");\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"pan\":\r\n\t\t\t\tthis.dispatchImmediately(\"panstarted\");\r\n\t\t\t\tgetInteraction().setGlobalStyle(MouseCursorStyle.grabbing);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Simulates the action of release of the mouse down / touch.\r\n\t *\r\n\t * @param point Point of action\r\n\t */\r\n\tpublic triggerUp(point: IPoint) {\r\n\t\tthis.triggerUpReal(point);\r\n\t}\r\n\r\n\t/**\r\n\t * Simulates the action of release of the mouse down / touch.\r\n\t *\r\n\t * @param point Point of action\r\n\t */\r\n\tprotected triggerUpReal(point: IPoint) {\r\n\r\n\t\tthis.updatePoint(this.upPoint);\r\n\t\tlet interaction = getInteraction();\r\n\r\n\t\tif ($math.getDistance(this._upPointOrig, this._downPointOrig) > interaction.getHitOption(this.interactions, \"hitTolerance\")) {\r\n\t\t\tswitch (this._generalBehavior) {\r\n\t\t\t\tcase \"zoom\":\r\n\t\t\t\t\tthis.dispatchImmediately(\"zoomended\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"select\":\r\n\t\t\t\t\tthis.dispatchImmediately(\"selectended\");\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"pan\":\r\n\t\t\t\t\tthis.dispatchImmediately(\"panended\");\r\n\t\t\t\t\tinteraction.setGlobalStyle(MouseCursorStyle.default);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tthis.downPoint = undefined;\r\n\t\t\tthis.updateSelection();\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.dispatchImmediately(\"behaviorcanceled\");\r\n\t\t\tinteraction.setGlobalStyle(MouseCursorStyle.default);\r\n\t\t\tthis.downPoint = undefined;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Updates selection dimensions on size change.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic updateSelection(): void {\r\n\t}\r\n\r\n\t/**\r\n\t * Updates cursors current positions.\r\n\t */\r\n\tprotected getPositions(): void {\r\n\t\t// positions are used by axes or series\r\n\t\tthis.xPosition = this.point.x / this.innerWidth;\r\n\t\tthis.yPosition = 1 - this.point.y / this.innerHeight;\r\n\t}\r\n\r\n\t/**\r\n\t * Handles pointer down event so we can start zoom or selection.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param event Original event\r\n\t */\r\n\tpublic handleCursorDown(event: IInteractionEvents[\"down\"]): void {\r\n\r\n\t\tif (!this.interactionsEnabled || !getInteraction().isLocalElement(event.pointer, this.paper.svg, this.uid)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// Get local point\r\n\t\tlet local: IPoint = $utils.documentPointToSprite(event.pointer.point, this);\r\n\r\n\t\tthis._downPointOrig = { x: local.x, y: local.y };\r\n\r\n\t\t// We need to cancel the event to prevent gestures on touch devices\r\n\t\tif (event.event.cancelable && this.fitsToBounds(local)) {\r\n\t\t\tevent.event.preventDefault();\r\n\t\t}\r\n\r\n\t\t// Make this happen\r\n\t\tthis.triggerMove(local);\r\n\t\tthis.triggerDown(local);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the coordinates of where pointer down event occurred\r\n\t * (was pressed).\r\n\t */\r\n\tprotected updatePoint(point: IPoint) {\r\n\t}\r\n\r\n\t/**\r\n\t * Handles pointer up event - finishes zoom or selection action.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param event Original event\r\n\t */\r\n\tpublic handleCursorUp(event: IInteractionEvents[\"up\"]): void {\r\n\t\tif (!this.interactionsEnabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (((this._generalBehavior != \"zoom\" && this._generalBehavior != \"pan\") || !this.downPoint) && !getInteraction().isLocalElement(event.pointer, this.paper.svg, this.uid)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tlet local: IPoint = $utils.documentPointToSprite(event.pointer.point, this);\r\n\t\tthis._upPointOrig = { x: local.x, y: local.y };\r\n\r\n\t\tthis.triggerMove(local);\r\n\t\tthis.triggerUp(local);\r\n\t}\r\n\r\n\t/**\r\n\t * A reference to a [[Chart]] the cursor belongs to.\r\n\t *\r\n\t * @param value Chart\r\n\t */\r\n\tpublic set chart(value: this[\"_chart\"]) {\r\n\t\tthis._chart = value;\r\n\t\tif ($type.hasValue((this._chart).plotContainer)) {\r\n\t\t\tgetInteraction().lockElement((this._chart).plotContainer.interactions);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Chart\r\n\t */\r\n\tpublic get chart(): this[\"_chart\"] {\r\n\t\treturn this._chart;\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"Cursor\"] = Cursor;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/cursors/Cursor.ts","/**\r\n * Cursor for XY chart\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Cursor, ICursorProperties, ICursorAdapters, ICursorEvents } from \"./Cursor\";\r\nimport { Sprite, ISpriteEvents } from \"../../core/Sprite\";\r\nimport { MutableValueDisposer, MultiDisposer, IDisposer } from \"../../core/utils/Disposer\";\r\nimport { IPoint } from \"../../core/defs/IPoint\";\r\nimport { IRange } from \"../../core/defs/IRange\";\r\nimport { Axis } from \"../axes/Axis\";\r\nimport { XYSeries } from \"../series/XYSeries\";\r\nimport { AxisRenderer } from \"../axes/AxisRenderer\";\r\nimport { Tooltip } from \"../../core/elements/Tooltip\";\r\nimport { XYChart } from \"../types/XYChart\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { color } from \"../../core/utils/Color\";\r\nimport { InterfaceColorSet } from \"../../core/utils/InterfaceColorSet\";\r\nimport { getInteraction } from \"../../core/interaction/Interaction\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[XYCursor]].\r\n */\r\nexport interface IXYCursorProperties extends ICursorProperties {\r\n\r\n\t/**\r\n\t * Cursor's behavior when moved with pointer down:\r\n\t *\r\n\t * * \"zoomX\" - zooms horizontally; (default)\r\n\t * * \"zoomY\" - zooms vertically;\r\n\t * * \"zoomXY\" - zooms both horizontally and vertically;\r\n\t * * \"selectX\" - selects a range horizontally;\r\n\t * * \"selectY\" - selects a range vertically;\r\n\t * * \"selectXY\" - selects a range both horizontally and vertically;\r\n\t * * \"panX\" - moves (pans) current selection horizontally;\r\n\t * * \"panY\" - moves (pans) current selection vertically;\r\n\t * * \"panXY\" - moves (pans) current selection both horizontally and vertically;\r\n\t * * \"none\" - does nothing with pointer down.\r\n\t *\r\n\t * @default \"zoomX\"\r\n\t */\r\n\tbehavior?: \"zoomX\" | \"zoomY\" | \"zoomXY\" | \"selectX\" | \"selectY\" | \"selectXY\" | \"panX\" | \"panY\" | \"panXY\" | \"none\";\r\n\r\n\t/**\r\n\t * Cursor's horizontal line is expanded to take full width of the related\r\n\t * Axis' cell/category.\r\n\t */\r\n\tfullWidthLineX?: boolean;\r\n\r\n\t/**\r\n\t * Cursor's vertical line is expanded to take full width of the related\r\n\t * Axis' cell/category.\r\n\t */\r\n\tfullWidthLineY?: boolean;\r\n\r\n\t/**\r\n\t * If cursor behavior is panX or panY, we allow to pan plot out of it's max bounds for a better user experience.\r\n\t * This setting specifies relative value by how much we can pan out the plot\r\n\t */\r\n\tmaxPanOut?: number;\r\n\r\n\t/**\r\n\t * Specifies to which series cursor lines should be snapped. Works when one\r\n\t * of the axis is `DateAxis` or `CategoryAxis`. Won't work if both axes are\r\n\t * `ValueAxis`.\r\n\t */\r\n\tsnapToSeries: XYSeries;\r\n}\r\n\r\n/**\r\n * Defines events for [[XYCursor]].\r\n */\r\nexport interface IXYCursorEvents extends ICursorEvents { }\r\n\r\n/**\r\n * Defines adapters for [[XYCursor]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IXYCursorAdapters extends ICursorAdapters, IXYCursorProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * A cursor used on [[XYChart]].\r\n *\r\n * @see {@link IXYCursorEvents} for a list of available events\r\n * @see {@link IXYCursorAdapters} for a list of available Adapters\r\n * @todo Add description, examples\r\n * @todo Should we allow changing `_generalBehavior`?\r\n */\r\nexport class XYCursor extends Cursor {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IXYCursorProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters\r\n\t */\r\n\tpublic _adapter!: IXYCursorAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IXYCursorEvents;\r\n\r\n\t/**\r\n\t * Vertical cursor line element.\r\n\t */\r\n\tprotected _lineX = new MutableValueDisposer();\r\n\r\n\t/**\r\n\t * Horizontal cursor line element.\r\n\t */\r\n\tprotected _lineY = new MutableValueDisposer();\r\n\r\n\t/**\r\n\t * Element which highlights selected area.\r\n\t */\r\n\tprotected _selection: Sprite;\r\n\r\n\t/**\r\n\t * A range of current horizontal selection.\r\n\t */\r\n\tpublic xRange: IRange;\r\n\r\n\t/**\r\n\t * A range of current vertical selection.\r\n\t */\r\n\tpublic yRange: IRange;\r\n\r\n\t/**\r\n\t * Horizontal [[Axis]].\r\n\t */\r\n\tprotected _xAxis = new MutableValueDisposer>();\r\n\r\n\t/**\r\n\t * Vertical [[Axis]].\r\n\t */\r\n\tprotected _yAxis = new MutableValueDisposer>();\r\n\r\n\t/**\r\n\t * A reference to chart cursor belongs to.\r\n\t */\r\n\tpublic _chart: XYChart;\r\n\r\n\tprotected _snapToDisposer: IDisposer;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"XYCursor\";\r\n\r\n\t\t// Defaults\r\n\t\tthis.behavior = \"zoomX\";\r\n\r\n\t\tthis.maxPanOut = 0.1;\r\n\r\n\t\tlet interfaceColors = new InterfaceColorSet();\r\n\r\n\t\t// Create selection element\r\n\t\tlet selection: Sprite = this.createChild(Sprite);\r\n\t\tselection.shouldClone = false;\r\n\t\tselection.fillOpacity = 0.2;\r\n\t\tselection.fill = interfaceColors.getFor(\"alternativeBackground\");\r\n\t\tselection.isMeasured = false;\r\n\t\tselection.interactionsEnabled = false;\r\n\t\tthis.selection = selection;\r\n\t\tthis._disposers.push(this.selection);\r\n\r\n\t\t// Create cursor's vertical line\r\n\t\tlet lineX: Sprite = this.createChild(Sprite);\r\n\t\tlineX.shouldClone = false;\r\n\t\tlineX.stroke = interfaceColors.getFor(\"grid\");\r\n\t\tlineX.fill = color();\r\n\t\tlineX.strokeDasharray = \"3,3\";\r\n\t\tlineX.isMeasured = false;\r\n\t\tlineX.strokeOpacity = 0.4;\r\n\t\tlineX.interactionsEnabled = false;\r\n\t\tlineX.y = 0;// important\r\n\t\tthis.lineX = lineX;\r\n\t\tthis._disposers.push(this.lineX);\r\n\r\n\t\t// Create cursor's horizontal line\r\n\t\tlet lineY: Sprite = this.createChild(Sprite);\r\n\t\tlineY.shouldClone = false;\r\n\t\tlineY.stroke = interfaceColors.getFor(\"grid\");\r\n\t\tlineY.fill = color();\r\n\t\tlineY.strokeDasharray = \"3,3\";\r\n\t\tlineY.isMeasured = false;\r\n\t\tlineY.strokeOpacity = 0.4;\r\n\t\tlineY.interactionsEnabled = false;\r\n\t\tlineY.x = 0; // important\r\n\t\tthis.lineY = lineY;\r\n\t\tthis._disposers.push(this.lineY);\r\n\r\n\t\t// Add handler for size changes\r\n\t\tthis.events.on(\"sizechanged\", this.updateSize, this, false);\r\n\r\n\t\tthis._disposers.push(this._lineX);\r\n\t\tthis._disposers.push(this._lineY);\r\n\t\tthis._disposers.push(this._xAxis);\r\n\t\tthis._disposers.push(this._yAxis);\r\n\r\n\t\tthis.mask = this;\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates cursor element dimensions on size change.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic updateSize(): void {\r\n\t\tif (this.lineX) {\r\n\t\t\tthis.lineX.path = $path.moveTo({ x: 0, y: 0 }) + $path.lineTo({ x: 0, y: this.innerHeight });\r\n\t\t}\r\n\t\tif (this.lineY) {\r\n\t\t\tthis.lineY.path = $path.moveTo({ x: 0, y: 0 }) + $path.lineTo({ x: this.innerWidth, y: 0 });\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Updates selection dimensions on size change.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic updateSelection(): void {\r\n\t\tif (this._usesSelection) {\r\n\t\t\tlet downPoint: IPoint = this.downPoint;\r\n\r\n\t\t\tif (downPoint) {\r\n\t\t\t\tlet point: IPoint = this.point;\r\n\r\n\t\t\t\tif (this.lineX) {\r\n\t\t\t\t\tpoint.x = this.lineX.pixelX;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this.lineY) {\r\n\t\t\t\t\tpoint.y = this.lineY.pixelY;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet selection: Sprite = this.selection;\r\n\r\n\t\t\t\tlet x: number = Math.min(point.x, downPoint.x);\r\n\t\t\t\tlet y: number = Math.min(point.y, downPoint.y);\r\n\r\n\t\t\t\tlet w: number = $math.round(Math.abs(downPoint.x - point.x), this._positionPrecision);\r\n\t\t\t\tlet h: number = $math.round(Math.abs(downPoint.y - point.y), this._positionPrecision);\r\n\r\n\t\t\t\tswitch (this.behavior) {\r\n\t\t\t\t\tcase \"zoomX\":\r\n\t\t\t\t\t\ty = 0;\r\n\t\t\t\t\t\th = this.pixelHeight;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"zoomY\":\r\n\t\t\t\t\t\tx = 0;\r\n\t\t\t\t\t\tw = this.pixelWidth;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"selectX\":\r\n\t\t\t\t\t\ty = 0;\r\n\t\t\t\t\t\th = this.pixelHeight;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"selectY\":\r\n\t\t\t\t\t\tx = 0;\r\n\t\t\t\t\t\tw = this.pixelWidth;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tselection.x = x;\r\n\t\t\t\tselection.y = y;\r\n\r\n\t\t\t\tselection.path = $path.rectangle(w, h);\r\n\r\n\t\t\t\tselection.validatePosition(); // otherwise Edge shoes some incorrect size rectangle\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.selection.hide();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\r\n\tprotected fixPoint(point: IPoint): IPoint {\r\n\t\tpoint.x = Math.max(0, point.x);\r\n\t\tpoint.y = Math.max(0, point.y);\r\n\t\tpoint.x = Math.min(this.pixelWidth, point.x);\r\n\t\tpoint.y = Math.min(this.pixelHeight, point.y);\r\n\r\n\t\treturn point;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Places the cursor at specific point.\r\n\t *\r\n\t * @param point Point to place cursor at\r\n\t */\r\n\tprotected triggerMoveReal(point: IPoint): void {\r\n\t\tsuper.triggerMoveReal(point);\r\n\r\n\t\tif ((this.snapToSeries && !this.snapToSeries.isHidden)) {\r\n\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.updateLinePositions(point);\r\n\t\t}\r\n\r\n\t\tif (this.downPoint && $math.getDistance(this.downPoint, point) > 3) {\r\n\t\t\tif (this._generalBehavior == \"pan\") {\r\n\t\t\t\tthis.getPanningRanges();\r\n\t\t\t\tthis.dispatch(\"panning\");\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tprotected updateLinePositions(point: IPoint) {\r\n\t\tpoint = this.fixPoint(this.point);\r\n\r\n\t\tif (this.lineX && this.lineX.visible && !this.xAxis) {\r\n\t\t\tthis.lineX.x = point.x;\r\n\t\t}\r\n\t\tif (this.lineY && this.lineY.visible && !this.yAxis) {\r\n\t\t\tthis.lineY.y = point.y;\r\n\t\t}\r\n\t\tthis.updateSelection();\r\n\t}\r\n\r\n\r\n\tprotected triggerDownReal(point: IPoint) {\r\n\t\tif (this.visible && !this.isHiding) {\r\n\r\n\t\t\tif (this.fitsToBounds(point)) {\r\n\t\t\t\tthis.downPoint = { x: point.x, y: point.y };\r\n\r\n\t\t\t\tthis.updatePoint(point);\r\n\r\n\t\t\t\t//this.updateLinePositions(point); // otherwise lines won't be in correct position and touch won't work fine\r\n\r\n\t\t\t\tthis.point.x = this.downPoint.x;\r\n\t\t\t\tthis.point.y = this.downPoint.y;\r\n\r\n\t\t\t\tlet selection: Sprite = this.selection;\r\n\t\t\t\tlet selectionX: number = this.downPoint.x;\r\n\t\t\t\tlet selectionY: number = this.downPoint.y;\r\n\r\n\t\t\t\tif (this._usesSelection) {\r\n\t\t\t\t\tselection.x = selectionX;\r\n\t\t\t\t\tselection.y = selectionY;\r\n\t\t\t\t\tselection.path = \"\";\r\n\t\t\t\t\tselection.show();\r\n\t\t\t\t}\r\n\t\t\t\tsuper.triggerDownReal(point);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.downPoint = undefined;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.downPoint = undefined;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the coordinates of where pointer down event occurred\r\n\t * (was pressed).\r\n\t */\r\n\tprotected updatePoint(point: IPoint) {\r\n\t\tif (this.lineX) {\r\n\t\t\tpoint.x = this.lineX.pixelX;\r\n\t\t}\r\n\t\tif (this.lineY) {\r\n\t\t\tpoint.y = this.lineY.pixelY;\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tprotected triggerUpReal(point: IPoint) {\r\n\t\tif ($math.getDistance(this._upPointOrig, this._downPointOrig) > getInteraction().getHitOption(this.interactions, \"hitTolerance\")) {\r\n\t\t\tif (this.downPoint) {\r\n\t\t\t\tthis.upPoint = point;\r\n\r\n\t\t\t\tthis.updatePoint(this.upPoint);\r\n\r\n\t\t\t\tthis.getRanges();\r\n\r\n\t\t\t\tif (this.behavior == \"selectX\" || this.behavior == \"selectY\" || this.behavior == \"selectXY\") {\r\n\t\t\t\t\t// void\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.selection.hide();\r\n\t\t\t\t}\r\n\t\t\t\tsuper.triggerUpReal(point);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.selection.hide(0);\r\n\t\t}\r\n\t\tthis.downPoint = undefined;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * [getRanges description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected getPanningRanges() {\r\n\r\n\t\tlet startX = $math.round(this.downPoint.x / this.innerWidth, 5);\r\n\t\tlet startY = $math.round(this.downPoint.y / this.innerHeight, 5);\r\n\r\n\t\tlet currentX = $math.round(this.point.x / this.innerWidth, 5);\r\n\t\tlet currentY = $math.round(this.point.y / this.innerHeight, 5);\r\n\r\n\t\tlet deltaX = startX - currentX;\r\n\t\tlet deltaY = -startY + currentY;\r\n\r\n\t\tthis.xRange = { start: deltaX, end: 1 + deltaX };\r\n\t\tthis.yRange = { start: deltaY, end: 1 + deltaY };\r\n\r\n\t\tif (this.behavior == \"panX\") {\r\n\t\t\tthis.yRange.start = 0;\r\n\t\t\tthis.yRange.end = 1;\r\n\t\t}\r\n\t\tif (this.behavior == \"panY\") {\r\n\t\t\tthis.xRange.start = 0;\r\n\t\t\tthis.xRange.end = 1;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * [getRanges description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected getRanges() {\r\n\t\tif (this.lineX) {\r\n\t\t\tthis.upPoint.x = this.lineX.pixelX;\r\n\t\t}\r\n\t\tif (this.lineY) {\r\n\t\t\tthis.upPoint.y = this.lineY.pixelY;\r\n\t\t}\r\n\r\n\t\t// @todo Is this needed?\r\n\t\tthis.selection;\r\n\r\n\t\tlet startX: number = $math.round(this.downPoint.x / this.innerWidth, 5);\r\n\t\tlet endX: number = $math.round((this.upPoint.x) / this.innerWidth, 5);\r\n\r\n\t\tlet startY: number = $math.round(this.downPoint.y / this.innerHeight, 5);\r\n\t\tlet endY: number = $math.round((this.upPoint.y) / this.innerHeight, 5);\r\n\r\n\t\tthis.xRange = { start: $math.min(startX, endX), end: $math.max(startX, endX) };\r\n\t\tthis.yRange = { start: $math.min(startY, endY), end: $math.max(startY, endY) };\r\n\t}\r\n\r\n\t/**\r\n\t * Cursor's behavior when it's moved with pointer down:\r\n\t *\r\n\t * * \"zoomX\" - zooms horizontally;\r\n\t * * \"zoomY\" - zooms vertically;\r\n\t * * \"zoomXY\" - zooms both horizontally and vertically;\r\n\t * * \"selectX\" - selects a range horizontally;\r\n\t * * \"selectY\" - selects a range vertically;\r\n\t * * \"selectXY\" - selects a range both horizontally and vertically;\r\n\t * * \"panX\" - moves (pans) current selection horizontally;\r\n\t * * \"panY\" - moves (pans) current selection vertically;\r\n\t * * \"panXY\" - moves (pans) current selection both horizontally and vertically;\r\n\t * * \"none\" - does nothing with pointer down.\r\n\t *\r\n\t * E.g. \"zoomXY\" will mean that pressing a mouse (or touching) over plot area\r\n\t * and dragging it will start zooming the chart.\r\n\t *\r\n\t * @param value Bheavior\r\n\t */\r\n\tpublic set behavior(value: \"zoomX\" | \"zoomY\" | \"zoomXY\" | \"selectX\" | \"selectY\" | \"selectXY\" | \"panX\" | \"panY\" | \"panXY\" | \"none\") {\r\n\t\tthis.setPropertyValue(\"behavior\", value, true);\r\n\r\n\t\tthis._usesSelection = false;\r\n\r\n\t\tif (value.indexOf(\"zoom\") != -1) {\r\n\t\t\tthis._generalBehavior = \"zoom\";\r\n\t\t\tthis._usesSelection = true;\r\n\t\t}\r\n\t\tif (value.indexOf(\"select\") != -1) {\r\n\t\t\tthis._generalBehavior = \"select\";\r\n\t\t\tthis._usesSelection = true;\r\n\t\t}\r\n\t\tif (value.indexOf(\"pan\") != -1) {\r\n\t\t\tthis._generalBehavior = \"pan\";\r\n\t\t\tthis._usesSelection = false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Behavior\r\n\t */\r\n\tpublic get behavior(): \"zoomX\" | \"zoomY\" | \"zoomXY\" | \"selectX\" | \"selectY\" | \"selectXY\" | \"panX\" | \"panY\" | \"panXY\" | \"none\" {\r\n\t\treturn this.getPropertyValue(\"behavior\");\r\n\t}\r\n\r\n\t/**\r\n\t * Cursor's horizontal line is expanded to take full width of the related\r\n\t * Axis' cell/category.\r\n\t *\r\n\t * NOTE: this setting will work properly if `xAxis` is set and only in case\r\n\t * `xAxis` is [[CategoryAxis]] or [[DateAxis]].\r\n\t *\r\n\t * @param value Full width?\r\n\t */\r\n\tpublic set fullWidthLineX(value: boolean) {\r\n\t\tthis.setPropertyValue(\"fullWidthLineX\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Full width?\r\n\t */\r\n\tpublic get fullWidthLineX(): boolean {\r\n\t\treturn this.getPropertyValue(\"fullWidthLineX\");\r\n\t}\r\n\r\n\t/**\r\n\t * Cursor's vertical line is expanded to take full width of the related\r\n\t * Axis' cell/category.\r\n\t *\r\n\t * NOTE: this setting will work properly if `yAxis` is set and only in case\r\n\t * `yAxis` is [[CategoryAxis]] or [[DateAxis]].\r\n\t *\r\n\t * @param value Full width?\r\n\t */\r\n\tpublic set fullWidthLineY(value: boolean) {\r\n\t\tthis.setPropertyValue(\"fullWidthLineY\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Full width?\r\n\t */\r\n\tpublic get fullWidthLineY(): boolean {\r\n\t\treturn this.getPropertyValue(\"fullWidthLineY\");\r\n\t}\r\n\r\n\t/**\r\n\t * If cursor behavior is panX or panY, we allow to pan plot out of it's max bounds for a better user experience.\r\n\t * This setting specifies relative value by how much we can pan out the plot\r\n\t *\r\n\t * @param value\r\n\t */\r\n\tpublic set maxPanOut(value: number) {\r\n\t\tthis.setPropertyValue(\"maxPanOut\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Full width?\r\n\t */\r\n\tpublic get maxPanOut(): number {\r\n\t\treturn this.getPropertyValue(\"maxPanOut\");\r\n\t}\r\n\r\n\t/**\r\n\t * A reference to X [[Axis]].\r\n\t *\r\n\t * An XY cursor can live without `xAxis` set. You set xAxis for cursor when\r\n\t * you have axis tooltip enabled and you want cursor line to be at the same\r\n\t * position as tooltip.\r\n\t *\r\n\t * This works with [[CategoryAxis]] and [[DateAxis]] but not with\r\n\t * [[ValueAxis]].\r\n\t *\r\n\t * @todo Description (review)\r\n\t * @param axis X axis\r\n\t */\r\n\tpublic set xAxis(axis: Axis) {\r\n\t\tif (this._xAxis.get() != axis) {\r\n\t\t\tthis._xAxis.set(axis, new MultiDisposer([\r\n\t\t\t\taxis.tooltip.events.on(\"positionchanged\", this.handleXTooltipPosition, this, false),\r\n\t\t\t\t//axis.events.on(\"validated\", chart.handleCursorPositionChange, chart, false)\r\n\t\t\t]));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return X axis\r\n\t */\r\n\tpublic get xAxis(): Axis {\r\n\t\treturn this._xAxis.get();\r\n\t}\r\n\r\n\t/**\r\n\t * A reference to Y [[Axis]].\r\n\t *\r\n\t * An XY cursor can live without `yAxis` set. You set xAxis for cursor when\r\n\t * you have axis tooltip enabled and you want cursor line to be at the same\r\n\t * position as tooltip.\r\n\t *\r\n\t * This works with [[CategoryAxis]] and [[DateAxis]] but not with\r\n\t * [[ValueAxis]].\r\n\t *\r\n\t * @todo Description (review)\r\n\t * @param axis Y axis\r\n\t */\r\n\tpublic set yAxis(axis: Axis) {\r\n\t\tif (this._yAxis.get() != axis) {\r\n\t\t\tthis._yAxis.set(axis, new MultiDisposer([\r\n\t\t\t\taxis.tooltip.events.on(\"positionchanged\", this.handleYTooltipPosition, this, false),\r\n\t\t\t\t//axis.events.on(\"validated\", chart.handleCursorPositionChange, chart, false)\r\n\t\t\t]));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Y Axis\r\n\t */\r\n\tpublic get yAxis(): Axis {\r\n\t\treturn this._yAxis.get();\r\n\t}\r\n\r\n\t/**\r\n\t * Updates Cursor's position when axis tooltip changes position.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param event Original Axis event\r\n\t */\r\n\tprotected handleXTooltipPosition(event: ISpriteEvents[\"positionchanged\"]): void {\r\n\t\tlet tooltip: Tooltip = this.xAxis.tooltip;\r\n\t\tlet point: IPoint = $utils.svgPointToSprite({ x: tooltip.pixelX, y: tooltip.pixelY }, this);\r\n\t\tlet x: number = point.x;\r\n\r\n\t\tif (this.lineX) {\r\n\t\t\tthis.lineX.x = x;\r\n\t\t\tif (!this.fitsToBounds(point)) {\r\n\t\t\t\tthis.hide();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this.xAxis && this.fullWidthLineX) {\r\n\t\t\tlet startPoint: IPoint = this.xAxis.currentItemStartPoint;\r\n\t\t\tlet endPoint: IPoint = this.xAxis.currentItemEndPoint;\r\n\t\t\tif (startPoint && endPoint) {\r\n\t\t\t\tthis.lineX.x = x;\r\n\t\t\t\tlet width: number = endPoint.x - startPoint.x;\r\n\t\t\t\tthis.lineX.path = $path.rectangle(width, this.innerHeight, -width / 2);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Updates Cursor's position when Y axis changes position or scale.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param event Original Axis event\r\n\t */\r\n\tprotected handleYTooltipPosition(event: ISpriteEvents[\"positionchanged\"]): void {\r\n\t\tlet tooltip: Tooltip = this.yAxis.tooltip;\r\n\t\tlet point: IPoint = $utils.svgPointToSprite({ x: tooltip.pixelX, y: tooltip.pixelY }, this);\r\n\t\tlet y: number = point.y;\r\n\r\n\t\tif (this.lineY) {\r\n\t\t\tthis.lineY.y = y;\r\n\r\n\t\t\tif (!this.fitsToBounds(point)) {\r\n\t\t\t\tthis.hide();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this.yAxis && this.fullWidthLineY) {\r\n\t\t\tlet startPoint: IPoint = this.yAxis.currentItemStartPoint;\r\n\t\t\tlet endPoint: IPoint = this.yAxis.currentItemEndPoint;\r\n\t\t\tif (startPoint && endPoint) {\r\n\t\t\t\tthis.lineY.y = y;\r\n\t\t\t\tlet height: number = endPoint.y - startPoint.y;\r\n\t\t\t\tthis.lineY.path = $path.rectangle(this.innerWidth, height, 0, -height / 2);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * A Line element to use for X axis.\r\n\t *\r\n\t * @param lineX Line\r\n\t */\r\n\tpublic set lineX(lineX: Sprite) {\r\n\t\tif (lineX) {\r\n\t\t\tlineX.setElement(this.paper.add(\"path\"));\r\n\t\t\tthis._lineX.set(lineX, lineX.events.on(\"positionchanged\", this.updateSelection, this, false));\r\n\t\t\tlineX.interactionsEnabled = false;\r\n\t\t\tlineX.parent = this;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis._lineX.reset();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Line element\r\n\t */\r\n\tpublic get lineX(): Sprite {\r\n\t\treturn this._lineX.get();\r\n\t}\r\n\r\n\t/**\r\n\t * A Line element to use Y axis.\r\n\t *\r\n\t * @param lineY Line\r\n\t */\r\n\tpublic set lineY(lineY: Sprite) {\r\n\t\tif (lineY) {\r\n\t\t\tlineY.setElement(this.paper.add(\"path\"));\r\n\t\t\tthis._lineY.set(lineY, lineY.events.on(\"positionchanged\", this.updateSelection, this, false));\r\n\t\t\tlineY.parent = this;\r\n\t\t\tlineY.interactionsEnabled = false;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis._lineY.reset();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Line element\r\n\t */\r\n\tpublic get lineY(): Sprite {\r\n\t\treturn this._lineY.get();\r\n\t}\r\n\r\n\t/**\r\n\t * A selection element ([[Sprite]]).\r\n\t *\r\n\t * @param selection Selection rectangle\r\n\t */\r\n\tpublic set selection(selection: Sprite) {\r\n\t\tthis._selection = selection;\r\n\t\tif (selection) {\r\n\t\t\tselection.element = this.paper.add(\"path\");\r\n\t\t\tselection.parent = this;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Selection rectangle\r\n\t */\r\n\tpublic get selection(): Sprite {\r\n\t\treturn this._selection;\r\n\t}\r\n\r\n\t/**\r\n\t * Processes JSON-based config before it is applied to the object.\r\n\t *\r\n\t * Looks if `xAxis` and `yAxis` is set via ID in JSON config, and replaces\r\n\t * with real references.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param config Config\r\n\t */\r\n\tpublic processConfig(config?: { [index: string]: any }): void {\r\n\r\n\t\tif (config) {\r\n\r\n\t\t\t// Set up axes\r\n\t\t\tif ($type.hasValue(config.xAxis) && $type.isString(config.xAxis)) {\r\n\t\t\t\tif (this.map.hasKey(config.xAxis)) {\r\n\t\t\t\t\tconfig.xAxis = this.map.getKey(config.xAxis);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.processingErrors.push(\"[XYCursor] No axis with id \\\"\" + config.xAxis + \"\\\" found for `xAxis`\");\r\n\t\t\t\t\tdelete config.xAxis;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif ($type.hasValue(config.yAxis) && $type.isString(config.yAxis)) {\r\n\t\t\t\tif (this.map.hasKey(config.yAxis)) {\r\n\t\t\t\t\tconfig.yAxis = this.map.getKey(config.yAxis);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.processingErrors.push(\"[XYCursor] No axis with id \\\"\" + config.yAxis + \"\\\" found for `yAxis`\");\r\n\t\t\t\t\tdelete config.yAxis;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ($type.hasValue(config.snapToSeries) && $type.isString(config.snapToSeries)) {\r\n\t\t\t\tif (this.map.hasKey(config.snapToSeries)) {\r\n\t\t\t\t\tconfig.snapToSeries = this.map.getKey(config.snapToSeries);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.processingErrors.push(\"[XYCursor] No series with id \\\"\" + config.snapToSeries + \"\\\" found for `series`\");\r\n\t\t\t\t\tdelete config.snapToSeries;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tsuper.processConfig(config);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Specifies to which series cursor lines should be snapped. Works when one\r\n\t * of the axis is `DateAxis` or `CategoryAxis`. Won't work if both axes are\r\n\t * `ValueAxis`.\r\n\t *\r\n\t * @param {XYSeries}\r\n\t */\r\n\tpublic set snapToSeries(series: XYSeries) {\r\n\t\tif (this.setPropertyValue(\"snapToSeries\", series)) {\r\n\t\t\tif (this._snapToDisposer) {\r\n\t\t\t\tthis._snapToDisposer.dispose();\r\n\t\t\t}\r\n\r\n\t\t\tif (series) {\r\n\t\t\t\tthis._snapToDisposer = series.events.on(\"tooltipshownat\", this.handleSnap, this, false);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return {XYSeries}\r\n\t */\r\n\tpublic get snapToSeries(): XYSeries {\r\n\t\treturn this.getPropertyValue(\"snapToSeries\");\r\n\t}\r\n\r\n\t/**\r\n\t * [handleSnap description]\r\n\t *\r\n\t * @ignore\r\n\t * @todo Description\r\n\t */\r\n\tpublic handleSnap() {\r\n\r\n\t\tlet series = this.snapToSeries;\r\n\t\tlet y = series.tooltipY;\r\n\t\tlet x = series.tooltipX;\r\n\r\n\t\tif (this.xAxis) {\r\n\t\t\tif (this.xAxis.renderer.opposite) {\r\n\t\t\t\ty -= this.pixelHeight;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.point = { x: x, y: y };\r\n\t\tthis.getPositions();\r\n\r\n\t\tlet xx = x;\r\n\t\tlet yy = y;\r\n\r\n\t\tx -= this.pixelWidth;\r\n\r\n\t\tif (this.yAxis) {\r\n\t\t\tif (this.yAxis.renderer.opposite) {\r\n\t\t\t\tx += this.pixelWidth;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet tooltip = series.tooltip;\r\n\t\tlet duration = tooltip.animationDuration;\r\n\t\tlet easing = tooltip.animationEasing;\r\n\r\n\t\tif (series.baseAxis == series.xAxis) {\r\n\t\t\tseries.yAxis.showTooltipAtPosition(this.yPosition);\r\n\t\t}\r\n\r\n\t\tif (series.baseAxis == series.yAxis) {\r\n\t\t\tseries.xAxis.showTooltipAtPosition(this.xPosition);\r\n\t\t}\r\n\r\n\t\tthis.lineX.animate([{ property: \"y\", to: y }], duration, easing);\r\n\t\tthis.lineY.animate([{ property: \"x\", to: x }], duration, easing);\r\n\r\n\t\tif (!this.xAxis) {\r\n\t\t\tthis.lineX.animate([{ property: \"x\", to: xx }], duration, easing);\r\n\t\t}\r\n\t\tif (!this.yAxis) {\r\n\t\t\tthis.lineY.animate([{ property: \"y\", to: yy }], duration, easing);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"XYCursor\"] = XYCursor;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/cursors/XYCursor.ts","/**\r\n * A module with functionality for buildin a scrollbar with an XY graph in it.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Scrollbar, IScrollbarProperties, IScrollbarAdapters, IScrollbarEvents } from \"../../core/elements/Scrollbar\";\r\nimport { Sprite } from \"../../core/Sprite\";\r\nimport { List, IListEvents } from \"../../core/utils/List\";\r\nimport { XYSeries } from \"../series/XYSeries\";\r\nimport { MutableValueDisposer } from \"../../core/utils/Disposer\";\r\nimport { XYChart } from \"../types/XYChart\";\r\nimport { Axis } from \"../axes/Axis\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { InterfaceColorSet } from \"../../core/utils/InterfaceColorSet\";\r\nimport { DesaturateFilter } from \"../../core/rendering/filters/DesaturateFilter\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[XYChartScrollbar]].\r\n */\r\nexport interface IXYChartScrollbarProperties extends IScrollbarProperties { }\r\n\r\n/**\r\n * Defines events for [[XYChartScrollbar]].\r\n */\r\nexport interface IXYChartScrollbarEvents extends IScrollbarEvents { }\r\n\r\n/**\r\n * Defines adapters for [[XYChartScrollbar]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IXYChartScrollbarAdapters extends IScrollbarAdapters, IXYChartScrollbarProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * A special version of the Scrollbar that has an XY chart in it.\r\n *\r\n * Used mainly as an advanced scrollbar with a preview for other XY charts.\r\n *\r\n * However, can be used as standalone element.\r\n *\r\n * @see {@link IXYChartScrollbarEvents} for a list of available events\r\n * @see {@link IXYChartScrollbarAdapters} for a list of available Adapters\r\n * @important\r\n */\r\nexport class XYChartScrollbar extends Scrollbar {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IXYChartScrollbarProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IXYChartScrollbarAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IXYChartScrollbarEvents;\r\n\r\n\t/**\r\n\t * An [[XYSeries]] used to draw a graph on the Scrollbar.\r\n\t */\r\n\tprotected _series: List;\r\n\r\n\t/**\r\n\t * A chart element Scrollbar is for.\r\n\t */\r\n\tprotected _chart = new MutableValueDisposer();\r\n\r\n\t/**\r\n\t * A chart instance that shows mini-chart within Scrollbar.\r\n\t */\r\n\tprotected _scrollbarChart: XYChart;\r\n\r\n\t/**\r\n\t * [_unselectedOverlay description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _unselectedOverlay: Sprite;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"XYChartScrollbar\";\r\n\r\n\t\tlet interfaceColors = new InterfaceColorSet();\r\n\t\tthis.padding(0, 0, 0, 0);\r\n\r\n\t\tlet scrollbarChart: XYChart = this.createChild(XYChart);\r\n\t\tscrollbarChart.shouldClone = false;\r\n\t\tscrollbarChart.margin(0, 0, 0, 0);\r\n\t\tscrollbarChart.padding(0, 0, 0, 0);\r\n\t\tscrollbarChart.interactionsEnabled = false;\r\n\r\n\t\tthis._scrollbarChart = scrollbarChart;\r\n\t\tthis._disposers.push(this._scrollbarChart);\r\n\r\n\t\tthis.minHeight = 60;\r\n\t\tthis.minWidth = 60;\r\n\r\n\t\tlet unselectedOverlay: Sprite = this.createChild(Sprite);\r\n\t\tunselectedOverlay.shouldClone = false;\r\n\t\tunselectedOverlay.setElement(this.paper.add(\"path\"));\r\n\t\tunselectedOverlay.fill = interfaceColors.getFor(\"background\");\r\n\t\tunselectedOverlay.fillOpacity = 0.8;\r\n\t\tunselectedOverlay.interactionsEnabled = false;\r\n\t\tunselectedOverlay.isMeasured = false;\r\n\t\tunselectedOverlay.toBack();\r\n\t\tthis._unselectedOverlay = unselectedOverlay;\r\n\t\tthis._disposers.push(this._unselectedOverlay);\r\n\r\n\t\tscrollbarChart.toBack();\r\n\r\n\t\tthis.background.cornerRadius(0, 0, 0, 0);\r\n\r\n\t\tlet thumbBackground = this.thumb.background;\r\n\t\tthumbBackground.cornerRadius(0, 0, 0, 0);\r\n\t\tthumbBackground.fillOpacity = 0;\r\n\t\tthumbBackground.fill = interfaceColors.getFor(\"background\");\r\n\r\n\t\tlet hoverState = thumbBackground.states.getKey(\"hover\");\r\n\t\tif (hoverState) {\r\n\t\t\thoverState.properties.fillOpacity = 0.2;\r\n\t\t}\r\n\r\n\t\tlet downState = thumbBackground.states.getKey(\"down\");\r\n\t\tif (downState) {\r\n\t\t\tdownState.properties.fillOpacity = 0.4;\r\n\t\t}\r\n\r\n\t\tthis._disposers.push(this._chart);\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * A list of series that are used to draw graph(s) on the scrollbar.\r\n\t *\r\n\t * @readonly\r\n\t * @return Series\r\n\t */\r\n\tpublic get series(): List {\r\n\t\tif (!this._series) {\r\n\t\t\tthis._series = new List();\r\n\t\t\tthis._disposers.push(this._series.events.on(\"inserted\", this.handleSeriesAdded, this, false));\r\n\t\t\tthis._disposers.push(this._series.events.on(\"removed\", this.handleSeriesRemoved, this, false));\r\n\t\t}\r\n\t\treturn this._series;\r\n\t}\r\n\r\n\t/**\r\n\t * Decorates a new series when they are pushed into a `series` list.\r\n\t *\r\n\t * @param event Event\r\n\t */\r\n\tprotected handleSeriesAdded(event: IListEvents[\"inserted\"]) {\r\n\t\tlet sourceSeries: XYSeries = event.newValue;\r\n\t\tlet scrollbarChart: XYChart = this.scrollbarChart;\r\n\t\tscrollbarChart.zoomOutButton.disabled = true;\r\n\r\n\t\tthis.chart = sourceSeries.chart;\r\n\r\n\t\tlet addXAxis: boolean = true;\r\n\t\tlet addYAxis: boolean = true;\r\n\r\n\t\t// check if we haven't added clone of x or y axis before\r\n\t\t$iter.each(this.series.iterator(), (series) => {\r\n\t\t\tif (series != sourceSeries) {\r\n\t\t\t\tif (series.xAxis == sourceSeries.xAxis) {\r\n\t\t\t\t\taddXAxis = false;\r\n\t\t\t\t}\r\n\t\t\t\tif (series.yAxis == sourceSeries.yAxis) {\r\n\t\t\t\t\taddYAxis = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tlet interfaceColors = new InterfaceColorSet();\r\n\r\n\t\tlet series: XYSeries = sourceSeries.clone();\r\n\r\n\t\tif (addXAxis) {\r\n\r\n\t\t\tlet xAxis = sourceSeries.xAxis.clone();\r\n\t\t\tscrollbarChart.xAxes.moveValue(xAxis);\r\n\t\t\txAxis.title.disabled = true;\r\n\t\t\txAxis.rangeChangeDuration = 0;\r\n\t\t\txAxis.id = sourceSeries.uid;\r\n\t\t\txAxis.title.disabled = true;\r\n\r\n\t\t\tlet renderer = xAxis.renderer;\r\n\t\t\trenderer.ticks.template.disabled = true;\r\n\t\t\trenderer.inside = true;\r\n\t\t\trenderer.line.strokeOpacity = 0;\r\n\t\t\trenderer.minLabelPosition = 0.02;\r\n\t\t\trenderer.maxLabelPosition = 0.98;\r\n\t\t\trenderer.line.disabled = true;\r\n\t\t\trenderer.axisFills.template.disabled = true;\r\n\t\t\trenderer.baseGrid.disabled = true;\r\n\t\t\trenderer.grid.template.strokeOpacity = 0.05;\r\n\r\n\t\t\tlet labelsTemplate = renderer.labels.template;\r\n\t\t\tlabelsTemplate.fillOpacity = 0.5;\r\n\r\n\t\t\tseries.xAxis = xAxis;\r\n\t\t}\r\n\t\telse {\r\n\t\t\t// @todo find clone, otherwise there might be probs with multiple axes\r\n\t\t}\r\n\r\n\r\n\t\tif (addYAxis) {\r\n\t\t\tlet yAxis: Axis = sourceSeries.yAxis.clone();\r\n\t\t\tscrollbarChart.yAxes.moveValue(yAxis);\r\n\t\t\tyAxis.title.disabled = true;\r\n\t\t\tyAxis.rangeChangeDuration = 0;\r\n\r\n\t\t\tlet renderer = yAxis.renderer;\r\n\t\t\trenderer.ticks.template.disabled = true;\r\n\t\t\trenderer.inside = true;\r\n\t\t\trenderer.line.strokeOpacity = 0;\r\n\t\t\trenderer.minLabelPosition = 0.02;\r\n\t\t\trenderer.maxLabelPosition = 0.98;\r\n\t\t\trenderer.line.disabled = true;\r\n\t\t\trenderer.axisFills.template.disabled = true;\r\n\t\t\trenderer.grid.template.stroke = interfaceColors.getFor(\"background\");\r\n\t\t\trenderer.baseGrid.disabled = true;\r\n\t\t\trenderer.grid.template.strokeOpacity = 0.05;\r\n\r\n\t\t\tlet labelsTemplate = renderer.labels.template;\r\n\t\t\tlabelsTemplate.fillOpacity = 0.5;\r\n\r\n\t\t\tseries.yAxis = yAxis;\r\n\t\t}\r\n\t\telse {\r\n\t\t\t// @todo find clone, otherwise there might be probs with multiple axes\r\n\t\t}\r\n\r\n\t\tseries.rangeChangeDuration = 0;\r\n\t\tseries.interpolationDuration = 0;\r\n\t\tseries.defaultState.transitionDuration = 0;\r\n\t\tseries.showOnInit = false;\r\n\r\n\t\tthis._disposers.push(series.events.on(\"validated\", this.zoomOutAxes, this, false));\r\n\r\n\t\t// data might be set drectly on series\r\n\t\tthis._disposers.push(sourceSeries.events.on(\"datavalidated\", () => {\r\n\t\t\tif (series.data != sourceSeries.data) { // data setter doesn't check this\r\n\t\t\t\tseries.data = sourceSeries.data;\r\n\t\t\t}\r\n\t\t}, undefined, false));\r\n\t\tseries.defaultState.properties.visible = true;\r\n\r\n\t\tseries.filters.push(new DesaturateFilter());\r\n\t\tscrollbarChart.series.push(series);\r\n\r\n\t\tthis.updateByOrientation();\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tprotected updateByOrientation() {\r\n\t\tif (this._scrollbarChart) {\r\n\t\t\t$iter.each(this._scrollbarChart.xAxes.iterator(), (xAxis) => {\r\n\t\t\t\tlet renderer = xAxis.renderer;\r\n\t\t\t\tif (this.orientation == \"vertical\") {\r\n\t\t\t\t\trenderer.grid.template.disabled = true;\r\n\t\t\t\t\trenderer.labels.template.disabled = true;\r\n\t\t\t\t\trenderer.minGridDistance = 10;\r\n\t\t\t\t}\r\n\t\t\t\telse{\r\n\t\t\t\t\trenderer.grid.template.disabled = false;\r\n\t\t\t\t\trenderer.labels.template.disabled = false;\r\n\t\t\t\t\trenderer.minGridDistance = xAxis.clonedFrom.renderer.minGridDistance;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\r\n\t\t\t$iter.each(this._scrollbarChart.yAxes.iterator(), (yAxis) => {\r\n\t\t\t\tlet renderer = yAxis.renderer;\r\n\t\t\t\tif (this.orientation == \"horizontal\") {\r\n\t\t\t\t\trenderer.grid.template.disabled = true;\r\n\t\t\t\t\trenderer.labels.template.disabled = true;\r\n\t\t\t\t\trenderer.minGridDistance = 10;\r\n\t\t\t\t}\r\n\t\t\t\telse{\r\n\t\t\t\t\trenderer.grid.template.disabled = false;\r\n\t\t\t\t\trenderer.labels.template.disabled = false;\r\n\t\t\t\t\trenderer.minGridDistance = yAxis.clonedFrom.renderer.minGridDistance;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\t/**\r\n\t * Cleans up after series are removed from Scrollbar.\r\n\t *\r\n\t * @param event Event\r\n\t */\r\n\tprotected handleSeriesRemoved(event: IListEvents[\"removed\"]) {\r\n\t\tlet sourceSeries: XYSeries = event.oldValue;\r\n\t\tsourceSeries.events.off(\"validated\", this.zoomOutAxes, this);\r\n\t}\r\n\r\n\t/**\r\n\t * A chart element that is used to display graphs in the Scrollbar.\r\n\t *\r\n\t * This is not the same as `chart`. It's a totally independent instance of\r\n\t * [[XYChart]] with separate config, series, etc.\r\n\t *\r\n\t * It can be configured just like any other [[XYChart]].\r\n\t *\r\n\t * @readonly\r\n\t * @return Scrollbar's internal chart\r\n\t */\r\n\tpublic get scrollbarChart(): XYChart {\r\n\t\treturn this._scrollbarChart;\r\n\t}\r\n\r\n\t/**\r\n\t * A chart that Scrollbar belongs to.\r\n\t *\r\n\t * @param chart Chart\r\n\t */\r\n\tpublic set chart(chart: XYChart) {\r\n\t\tif (this._chart.get() !== chart) {\r\n\t\t\tthis._chart.set(chart, chart.events.on(\"datavalidated\", this.handleDataChanged, this, false));\r\n\t\t\tthis.handleDataChanged();\r\n\t\t\tthis._scrollbarChart.dataProvider = chart; // this makes scrollbar chart do not validate data untill charts' data is validated\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Chart\r\n\t */\r\n\tpublic get chart(): XYChart {\r\n\t\treturn this._chart.get();\r\n\t}\r\n\r\n\t/**\r\n\t * Updates Scrollbar's internal chart's data when the main chart's data\r\n\t * changes.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic handleDataChanged() {\r\n\t\t//@todo: what if raw data changed?\r\n\t\tif (this.chart.data != this.scrollbarChart.data) {\r\n\t\t\tthis.scrollbarChart.data = this.chart.data;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Zooms out all axes on the internal chart.\r\n\t */\r\n\tprotected zoomOutAxes() {\r\n\t\tlet scrollbarChart: XYChart = this.scrollbarChart;\r\n\t\t$iter.each(scrollbarChart.xAxes.iterator(), (x) => {\r\n\t\t\tx.zoom({ start: 0, end: 1 }, true, true);\r\n\t\t});\r\n\t\t$iter.each(scrollbarChart.yAxes.iterator(), (y) => {\r\n\t\t\ty.zoom({ start: 0, end: 1 }, true, true);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Updates scrollbar thumb.\r\n\t */\r\n\tprotected updateThumb() {\r\n\t\tsuper.updateThumb();\r\n\t\tif (this._unselectedOverlay) {\r\n\t\t\tlet thumb = this.thumb;\r\n\t\t\tlet x: number = thumb.pixelX || 0;\r\n\t\t\tlet y: number = thumb.pixelY || 0;\r\n\t\t\tlet w: number = thumb.pixelWidth || 0;\r\n\t\t\tlet h: number = thumb.pixelHeight || 0;\r\n\r\n\t\t\tlet path: string = \"\";\r\n\r\n\t\t\tif (this.orientation == \"horizontal\") {\r\n\t\t\t\tpath = $path.rectToPath({\r\n\t\t\t\t\tx: -1,\r\n\t\t\t\t\ty: 0,\r\n\t\t\t\t\twidth: x,\r\n\t\t\t\t\theight: h\r\n\t\t\t\t});\r\n\r\n\t\t\t\tpath += $path.rectToPath({\r\n\t\t\t\t\tx: x + w,\r\n\t\t\t\t\ty: 0,\r\n\t\t\t\t\twidth: (this.pixelWidth || 0) - x - w,\r\n\t\t\t\t\theight: h\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tpath = $path.rectToPath({\r\n\t\t\t\t\tx: 0,\r\n\t\t\t\t\ty: 0,\r\n\t\t\t\t\twidth: w,\r\n\t\t\t\t\theight: y\r\n\t\t\t\t});\r\n\r\n\t\t\t\tpath += $path.rectToPath({\r\n\t\t\t\t\tx: 0,\r\n\t\t\t\t\ty: y + h,\r\n\t\t\t\t\twidth: w,\r\n\t\t\t\t\theight: (this.pixelHeight || 0) - y - h\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis._unselectedOverlay.path = path;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Processes JSON-based config before it is applied to the object.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param config Config\r\n\t */\r\n\tpublic processConfig(config?: { [index: string]: any }): void {\r\n\r\n\t\tif (config) {\r\n\r\n\t\t\tif ($type.hasValue(config.series) && $type.isArray(config.series)) {\r\n\t\t\t\tfor (let i = 0, len = config.series.length; i < len; i++) {\r\n\t\t\t\t\tlet series = config.series[i];\r\n\t\t\t\t\tif ($type.hasValue(series) && $type.isString(series)) {\r\n\t\t\t\t\t\tif (this.map.hasKey(series)) {\r\n\t\t\t\t\t\t\tconfig.series[i] = this.map.getKey(series);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tthrow Error(\"XYChartScrollbar error: Series with id `\" + series + \"` does not exist.\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tsuper.processConfig(config);\r\n\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"XYChartScrollbar\"] = XYChartScrollbar;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/elements/XYChartScrollbar.ts","/**\r\n * XY Chart module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { SerialChart, ISerialChartProperties, ISerialChartDataFields, ISerialChartAdapters, ISerialChartEvents, SerialChartDataItem } from \"./SerialChart\";\r\nimport { Sprite, ISpriteEvents, AMEvent } from \"../../core/Sprite\";\r\nimport { Container } from \"../../core/Container\";\r\nimport { List, IListEvents } from \"../../core/utils/List\";\r\nimport { Axis } from \"../axes/Axis\";\r\nimport { DateAxis } from \"../axes/DateAxis\";\r\nimport { Optional } from \"../../core/utils/Type\";\r\nimport { AxisRenderer } from \"../axes/AxisRenderer\";\r\nimport { AxisRendererX } from \"../axes/AxisRendererX\";\r\nimport { AxisRendererY } from \"../axes/AxisRendererY\";\r\nimport { CategoryAxis } from \"../axes/CategoryAxis\";\r\nimport { XYSeries } from \"../series/XYSeries\";\r\nimport { Scrollbar, IScrollbarEvents } from \"../../core/elements/Scrollbar\";\r\nimport { IRange } from \"../../core/defs/IRange\";\r\nimport { XYCursor, IXYCursorEvents } from \"../cursors/XYCursor\";\r\nimport { IPoint } from \"../../core/defs/IPoint\";\r\nimport { IDisposer, Disposer } from \"../../core/utils/Disposer\";\r\nimport { Button } from \"../../core/elements/Button\";\r\nimport { ZoomOutButton } from \"../../core/elements/ZoomOutButton\";\r\nimport { percent } from \"../../core/utils/Percent\";\r\nimport { Ordering } from \"../../core/utils/Order\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { XYChartScrollbar } from \"../elements/XYChartScrollbar\";\r\n\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport * as $array from \"../../core/utils/Array\";\r\n\r\nimport { defaultRules, ResponsiveBreakpoints } from \"../../core/utils/Responsive\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[XYChart]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class XYChartDataItem extends SerialChartDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: XYChart;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"XYChartDataItem\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[XYChart]].\r\n */\r\nexport interface IXYChartDataFields extends ISerialChartDataFields { }\r\n\r\n/**\r\n * Defines properties for [[XYChart]].\r\n */\r\nexport interface IXYChartProperties extends ISerialChartProperties {\r\n\r\n\t/**\r\n\t * A container that is used as a maske for bullets so that they can't\r\n\t * \"spill\" outside of the plot area.\r\n\t */\r\n\tmaskBullets?: boolean;\r\n\r\n\t/**\r\n\t * Specifies what should chart do if when mouse wheel is rotated.\r\n\t *\r\n\t * @default \"none\"\r\n\t */\r\n\tmouseWheelBehavior?: \"zoomX\" | \"zoomY\" | \"zoomXY\" | \"panX\" | \"panY\" | \"panXY\" | \"none\";\r\n\r\n\t/**\r\n\t * Specifies if chart should arrange series tooltips so that they won't\r\n\t * overlap.\r\n\t *\r\n\t * @default true\r\n\t */\r\n\tarrangeTooltips?: boolean;\r\n}\r\n\r\n/**\r\n * Defines events for [[XYChart]].\r\n */\r\nexport interface IXYChartEvents extends ISerialChartEvents { }\r\n\r\n/**\r\n * Defines adapters for [[XYChart]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IXYChartAdapters extends ISerialChartAdapters, IXYChartProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Creates an XY chart, and any derivative chart, like Serial, Date-based, etc.\r\n *\r\n * Basically this is a chart type, that is used to display any chart\r\n * information in a square plot area.\r\n *\r\n * The horizontal and vertical scale is determined by the type of Axis.\r\n *\r\n * The plot types are determined by type of Series.\r\n *\r\n * ```TypeScript\r\n * // Includes\r\n * import * as am4core from \"@amcharts/amcharts4/core\";\r\n * import * as am4charts from \"@amcharts/amcharts4/charts\";\r\n *\r\n * // Create chart\r\n * let chart = am4core.create(\"chartdiv\", am4charts.XYChart);\r\n *\r\n * // Add Data\r\n * chart.data = [{\r\n * \"country\": \"USA\",\r\n * \"visits\": 3025\r\n * }, {\r\n * \t\"country\": \"China\",\r\n * \t\"visits\": 1882\r\n * }, {\r\n * \t\"country\": \"Japan\",\r\n * \t\"visits\": 1809\r\n * }];\r\n *\r\n * // Add category axis\r\n * let categoryAxis = chart.xAxes.push(new am4charts.CategoryAxis());\r\n * categoryAxis.dataFields.category = \"country\";\r\n *\r\n * // Add value axis\r\n * let valueAxis = chart.yAxes.push(new am4charts.ValueAxis());\r\n *\r\n * // Add series\r\n * let series = chart.series.push(new am4charts.ColumnSeries());\r\n * series.name = \"Web Traffic\";\r\n * series.dataFields.categoryX = \"country\";\r\n * series.dataFields.valueY = \"visits\";\r\n * ```\r\n * ```JavaScript\r\n * // Create chart\r\n * var chart = am4core.create(\"chartdiv\", am4charts.XYChart);\r\n *\r\n * // The following would work as well:\r\n * // var chart = am4core.create(\"chartdiv\", \"XYChart\");\r\n *\r\n * // Add Data\r\n * chart.data = [{\r\n * \"country\": \"USA\",\r\n * \"visits\": 3025\r\n * }, {\r\n * \t\"country\": \"China\",\r\n * \t\"visits\": 1882\r\n * }, {\r\n * \t\"country\": \"Japan\",\r\n * \t\"visits\": 1809\r\n * }];\r\n *\r\n * // Add category axis\r\n * var categoryAxis = chart.xAxes.push(new am4charts.CategoryAxis());\r\n * categoryAxis.dataFields.category = \"country\";\r\n *\r\n * // Add value axis\r\n * var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());\r\n *\r\n * // Add series\r\n * var series = chart.series.push(new am4charts.ColumnSeries());\r\n * series.name = \"Web Traffic\";\r\n * series.dataFields.categoryX = \"country\";\r\n * series.dataFields.valueY = \"visits\";\r\n * ```\r\n * ```JSON\r\n * var chart = am4core.createFromConfig({\r\n *\r\n * \t// Category axis\r\n * \t\"xAxes\": [{\r\n * \t\t\"type\": \"CategoryAxis\",\r\n * \t\t\"dataFields\": {\r\n * \t\t\t\"category\": \"country\"\r\n * \t\t}\r\n * \t}],\r\n *\r\n * \t// Value axis\r\n * \t\"yAxes\": [{\r\n * \t\t\"type\": \"ValueAxis\"\r\n * \t}],\r\n *\r\n * \t// Series\r\n * \t\"series\": [{\r\n * \t\t\"type\": \"ColumnSeries\",\r\n * \t\t\"dataFields\": {\r\n * \t\t\t\"categoryX\": \"country\",\r\n * \t\t\t\"valueY\": \"visits\"\r\n * \t\t},\r\n * \t\t\"name\": \"Web Traffic\"\r\n * \t}],\r\n *\r\n * \t// Cursor\r\n * \t\"cursor\": {},\r\n *\r\n * \t// Data\r\n * \t\"data\": [{\r\n * \t\t\"country\": \"USA\",\r\n * \t\t\"visits\": 3025\r\n * \t}, {\r\n * \t\t\"country\": \"China\",\r\n * \t\t\"visits\": 1882\r\n * \t}, {\r\n * \t\t\"country\": \"Japan\",\r\n * \t\t\"visits\": 1809\r\n * \t}]\r\n *\r\n * }, \"chartdiv\", \"XYChart\");\r\n * ```\r\n *\r\n *\r\n * @see {@link IXYChartEvents} for a list of available Events\r\n * @see {@link IXYChartAdapters} for a list of available Adapters\r\n * @see {@link https://www.amcharts.com/docs/v4/chart-types/xy-chart/} for documentation\r\n * @important\r\n */\r\nexport class XYChart extends SerialChart {\r\n\r\n\t/**\r\n\t * Defines available data fields.\r\n\t */\r\n\tpublic _dataFields: IXYChartDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IXYChartProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IXYChartAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IXYChartEvents;\r\n\r\n\t/**\r\n\t * Defines a type of series that this chart uses.\r\n\t */\r\n\tpublic _seriesType: XYSeries;\r\n\r\n\t/**\r\n\t * A list of horizontal axes.\r\n\t */\r\n\tprotected _xAxes: List>;\r\n\r\n\t/**\r\n\t * A list of vertical axes.\r\n\t */\r\n\tprotected _yAxes: List>;\r\n\r\n\t/**\r\n\t * A container that holds vertical axes and plot area.\r\n\t *\r\n\t * @type {Container}\r\n\t */\r\n\tpublic yAxesAndPlotContainer: Container\r\n\r\n\t/**\r\n\t * A container that holds top axes.\r\n\t *\r\n\t * @type {Container}\r\n\t */\r\n\tpublic topAxesContainer: Container;\r\n\r\n\t/**\r\n\t * A container that holds bottom axes.\r\n\t *\r\n\t * @type {Container}\r\n\t */\r\n\tpublic bottomAxesContainer: Container;\r\n\r\n\t/**\r\n\t * A container that holds left axes.\r\n\t *\r\n\t * @type {Container}\r\n\t */\r\n\tpublic leftAxesContainer: Container;\r\n\r\n\t/**\r\n\t * A container that holds right axes.\r\n\t *\r\n\t * @type {Container}\r\n\t */\r\n\tpublic rightAxesContainer: Container;\r\n\r\n\t/**\r\n\t * A container for plot area.\r\n\t *\r\n\t * @type {Container}\r\n\t */\r\n\tpublic plotContainer: Container;\r\n\r\n\t/**\r\n\t * A reference to horizontal [[Scrollbar]].\r\n\t */\r\n\tprotected _scrollbarX: Scrollbar;\r\n\r\n\t/**\r\n\t * A reference to vertical [[Scrollbar]].\r\n\t */\r\n\tprotected _scrollbarY: Scrollbar;\r\n\r\n\t/**\r\n\t * A reference to chart's cursor.\r\n\t */\r\n\tpublic _cursor: XYCursor;\r\n\r\n\t/**\r\n\t * A container that chart's cursor is placed in.\r\n\t */\r\n\tprotected _cursorContainer: Container;\r\n\r\n\t/**\r\n\t * Defines the type of horizontal axis rederer.\r\n\t */\r\n\tprotected _axisRendererX: typeof AxisRendererX = AxisRendererX;\r\n\r\n\t/**\r\n\t * Defines the type of vertical axis rederer.\r\n\t */\r\n\tprotected _axisRendererY: typeof AxisRendererY = AxisRendererY;\r\n\r\n\t/**\r\n\t * Defines the type horizontal axis renderer.\r\n\t */\r\n\tpublic _xAxisRendererType: AxisRendererX;\r\n\r\n\t/**\r\n\t * Defines the type of vertical axis renderer.\r\n\t */\r\n\tpublic _yAxisRendererType: AxisRendererY;\r\n\r\n\t/**\r\n\t * A button which is used to zoom out the chart.\r\n\t */\r\n\tprotected _zoomOutButton: Button;\r\n\r\n\t/**\r\n\t * An element that is used as a mask to contain bullets from spilling out of\r\n\t * the plot area.\r\n\t */\r\n\tprotected _bulletMask: Sprite;\r\n\r\n\r\n\tprotected _panStartXRange: IRange;\r\n\r\n\tprotected _panStartYRange: IRange;\r\n\r\n\tprotected _panEndXRange: IRange;\r\n\r\n\tprotected _panEndYRange: IRange;\r\n\r\n\tprotected _mouseWheelDisposer: IDisposer;\r\n\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\r\n\t\tthis.className = \"XYChart\";\r\n\r\n\t\t// Set defaults\r\n\t\t//this.margin(10, 10, 10, 10);\r\n\t\tthis.maskBullets = true;\r\n\t\tthis.arrangeTooltips = true;\r\n\r\n\t\t// Create main chart container\r\n\t\tlet chartContainer = this.chartContainer;\r\n\t\tchartContainer.layout = \"vertical\";\r\n\t\tthis.padding(15, 15, 15, 15);\r\n\r\n\t\t// Create top axes container\r\n\t\tlet topAxesCont = chartContainer.createChild(Container);\r\n\t\ttopAxesCont.shouldClone = false;\r\n\t\ttopAxesCont.layout = \"vertical\";\r\n\t\ttopAxesCont.width = percent(100);\r\n\t\ttopAxesCont.zIndex = 1;\r\n\t\tthis.topAxesContainer = topAxesCont;\r\n\r\n\t\t// Create vertical axes and plot area container\r\n\t\t// Plot area and vertical axes share the whole width of the chart,\r\n\t\t// so we need to put then into a separate container so that layouting\r\n\t\t// engine takes care of the positioning\r\n\t\tlet yAxesAndPlotCont = chartContainer.createChild(Container);\r\n\t\tyAxesAndPlotCont.shouldClone = false;\r\n\t\tyAxesAndPlotCont.layout = \"horizontal\";\r\n\t\tyAxesAndPlotCont.width = percent(100);\r\n\t\tyAxesAndPlotCont.height = percent(100);\r\n\t\tyAxesAndPlotCont.zIndex = 0;\r\n\t\tthis.yAxesAndPlotContainer = yAxesAndPlotCont;\r\n\r\n\t\t// Create a container for bottom axes\r\n\t\tlet bottomAxesCont = chartContainer.createChild(Container);\r\n\t\tbottomAxesCont.shouldClone = false;\r\n\t\tbottomAxesCont.width = percent(100);\r\n\t\tbottomAxesCont.layout = \"vertical\";\r\n\t\tbottomAxesCont.zIndex = 1;\r\n\t\tthis.bottomAxesContainer = bottomAxesCont;\r\n\r\n\t\t// Create a container for left-side axes\r\n\t\tlet leftAxesCont = yAxesAndPlotCont.createChild(Container);\r\n\t\tleftAxesCont.shouldClone = false;\r\n\t\tleftAxesCont.layout = \"horizontal\";\r\n\t\tleftAxesCont.height = percent(100);\r\n\t\tleftAxesCont.contentAlign = \"right\";\r\n\t\tleftAxesCont.events.on(\"transformed\", this.updateXAxesMargins, this, false);\r\n\t\tleftAxesCont.zIndex = 1;\r\n\t\tthis.leftAxesContainer = leftAxesCont;\r\n\r\n\t\t// Create a container for plot area\r\n\t\tlet plotCont = yAxesAndPlotCont.createChild(Container);\r\n\t\tplotCont.shouldClone = false;\r\n\t\tplotCont.height = percent(100);\r\n\t\tplotCont.width = percent(100);\r\n\t\t// Create transparend background for plot container so that hover works\r\n\t\t// on all of it\r\n\t\tplotCont.background.fillOpacity = 0;\r\n\t\tthis.plotContainer = plotCont;\r\n\r\n\t\t// must go below plot container\r\n\t\tthis.mouseWheelBehavior = \"none\";\r\n\r\n\t\tthis._cursorContainer = plotCont;\r\n\r\n\t\t// Create a container for right-side axes\r\n\t\tlet rightAxesCont = yAxesAndPlotCont.createChild(Container);\r\n\t\trightAxesCont.shouldClone = false;\r\n\t\trightAxesCont.layout = \"horizontal\";\r\n\t\trightAxesCont.height = percent(100);\r\n\t\trightAxesCont.zIndex = 1;\r\n\t\trightAxesCont.events.on(\"transformed\", this.updateXAxesMargins, this, false);\r\n\t\tthis.rightAxesContainer = rightAxesCont;\r\n\r\n\t\tthis.seriesContainer.parent = plotCont;\r\n\t\tthis.bulletsContainer.parent = plotCont;\r\n\r\n\t\tlet zoomOutButton = plotCont.createChild(ZoomOutButton);\r\n\t\tzoomOutButton.shouldClone = false;\r\n\t\tzoomOutButton.align = \"right\";\r\n\t\tzoomOutButton.valign = \"top\";\r\n\t\tzoomOutButton.zIndex = Number.MAX_SAFE_INTEGER;\r\n\t\tzoomOutButton.marginTop = 5;\r\n\t\tzoomOutButton.marginRight = 5;\r\n\r\n\t\tzoomOutButton.hide(0);\r\n\t\tthis.zoomOutButton = zoomOutButton;\r\n\r\n\t\tthis._bulletMask = this.plotContainer;\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets defaults that instantiate some objects that rely on parent, so they\r\n\t * cannot be set in constructor.\r\n\t */\r\n\tprotected applyInternalDefaults(): void {\r\n\r\n\t\tsuper.applyInternalDefaults();\r\n\t\tthis.zoomOutButton.exportable = false;\r\n\t\t// Add a default screen reader title for accessibility\r\n\t\t// This will be overridden in screen reader if there are any `titles` set\r\n\t\tif (!$type.hasValue(this.readerTitle)) {\r\n\t\t\tthis.readerTitle = this.language.translate(\"X/Y chart\");\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Draws the chart.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic draw(): void {\r\n\t\tsuper.draw();\r\n\r\n\t\tthis.seriesContainer.toFront();\r\n\t\tthis.bulletsContainer.toFront();\r\n\r\n\t\tif (this.maskBullets) {\r\n\t\t\tthis.bulletsContainer.mask = this._bulletMask;\r\n\t\t}\r\n\r\n\t\tthis.updateSeriesLegend();\r\n\t}\r\n\r\n\t/**\r\n\t * Triggers a redrawing of all chart's series.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic updatePlotElements(): void {\r\n\t\t$iter.each(this.series.iterator(), (series) => {\r\n\t\t\tseries.invalidate();\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Triggers data (re)validation which in turn can cause a redraw of the\r\n\t * whole chart or just aprticular series / elements.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validateData(): void {\r\n\r\n\t\t// tell axes that data changed\r\n\t\tif (this._parseDataFrom == 0) {\r\n\t\t\t$iter.each(this.xAxes.iterator(), (axis) => {\r\n\t\t\t\taxis.dataChangeUpdate();\r\n\t\t\t});\r\n\r\n\t\t\t$iter.each(this.yAxes.iterator(), (axis) => {\r\n\t\t\t\taxis.dataChangeUpdate();\r\n\t\t\t});\r\n\r\n\t\t\t$iter.each(this.series.iterator(), (series) => {\r\n\t\t\t\tseries.dataChangeUpdate();\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tsuper.validateData();\r\n\t}\r\n\r\n\t/**\r\n\t * Updates margins for horizontal axes based on settings and available space.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tprotected updateXAxesMargins(): void {\r\n\r\n\t\tlet leftAxesWidth = this.leftAxesContainer.measuredWidth;\r\n\t\tlet rightAxesWidth = this.rightAxesContainer.measuredWidth;\r\n\t\tlet bottomAxesCont = this.bottomAxesContainer;\r\n\r\n\t\tif (bottomAxesCont.paddingLeft != leftAxesWidth || bottomAxesCont.paddingRight != rightAxesWidth) {\r\n\t\t\tbottomAxesCont.paddingLeft = leftAxesWidth;\r\n\t\t\tbottomAxesCont.paddingRight = rightAxesWidth;\r\n\t\t}\r\n\r\n\t\tlet topAxesCont = this.topAxesContainer;\r\n\r\n\t\tif (topAxesCont.paddingLeft != leftAxesWidth || topAxesCont.paddingRight != rightAxesWidth) {\r\n\t\t\ttopAxesCont.paddingLeft = leftAxesWidth;\r\n\t\t\ttopAxesCont.paddingRight = rightAxesWidth;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Triggers an update on the horizontal axis when one of its properties\r\n\t * change.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param event An event object\r\n\t */\r\n\tpublic handleXAxisChange(event: AMEvent[\"propertychanged\"]) {\r\n\t\tthis.updateXAxis(event.target);\r\n\t}\r\n\r\n\t/**\r\n\t * Triggers an update on the vertical axis when one of its properties\r\n\t * change.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param event An event object\r\n\t */\r\n\tpublic handleYAxisChange(event: AMEvent[\"propertychanged\"]) {\r\n\t\tthis.updateYAxis(event.target);\r\n\t}\r\n\r\n\t/**\r\n\t * Sets up a new horizontal (X) axis when it is added to the chart.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param event Axis insert event\r\n\t */\r\n\tpublic processXAxis(event: IListEvents[\"inserted\"]): void {\r\n\r\n\t\tlet axis: Axis = event.newValue;\r\n\t\taxis.chart = this;\r\n\r\n\t\taxis.renderer = new this._axisRendererX();\r\n\t\taxis.axisLetter = \"X\";\r\n\r\n\t\taxis.renderer.observe([\"opposite\", \"inside\", \"inversed\", \"minGridDistance\"], this.handleXAxisChange, this);\r\n\t\taxis.events.on(\"startchanged\", this.handleXAxisRangeChange, this, false);\r\n\t\taxis.events.on(\"endchanged\", this.handleXAxisRangeChange, this, false);\r\n\r\n\t\t// Although axis does not use data directly, we set dataProvider here\r\n\t\t// (but not add to chart data users) to hold up rendering before data\r\n\t\t// is parsed (system handles this)\r\n\t\taxis.dataProvider = this;\r\n\r\n\t\tthis.updateXAxis(axis.renderer);\r\n\t\tthis.processAxis(axis);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Sets up a new vertical (Y) axis when it is added to the chart.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param event Axis insert event\r\n\t */\r\n\tpublic processYAxis(event: IListEvents[\"inserted\"]): void {\r\n\r\n\t\tlet axis: Axis = event.newValue;\r\n\t\taxis.chart = this;\r\n\r\n\t\taxis.renderer = new this._axisRendererY();\r\n\t\taxis.axisLetter = \"Y\";\r\n\r\n\t\taxis.renderer.observe([\"opposite\", \"inside\", \"inversed\", \"minGridDistance\"], this.handleYAxisChange, this);\r\n\t\taxis.events.on(\"startchanged\", this.handleYAxisRangeChange, this, false);\r\n\t\taxis.events.on(\"endchanged\", this.handleYAxisRangeChange, this, false);\r\n\r\n\t\t// Although axis does not use data directly, we set dataProvider here\r\n\t\t// (but not add to chart data users) to hold up rendering before data\r\n\t\t// is parsed (system handles this)\r\n\t\taxis.dataProvider = this;\r\n\r\n\t\tthis.updateYAxis(axis.renderer);\r\n\t\tthis.processAxis(axis);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates horizontal (X) scrollbar and other horizontal axis whenever axis'\r\n\t * value range changes.\r\n\t */\r\n\tprotected handleXAxisRangeChange() {\r\n\t\tlet range: IRange = this.getCommonAxisRange(this.xAxes);\r\n\t\tif (this.scrollbarX) {\r\n\t\t\tthis.zoomAxes(this.xAxes, range, true);\r\n\t\t}\r\n\t\tthis.toggleZoomOutButton();\r\n\t\tthis.updateScrollbar(this.scrollbarX, range);\r\n\t}\r\n\r\n\t/**\r\n\t * Shows or hides the Zoom Out button depending on whether the chart is fully\r\n\t * zoomed out or not.\r\n\t */\r\n\tprotected toggleZoomOutButton() {\r\n\t\tif (this.zoomOutButton) {\r\n\t\t\tlet show = false;\r\n\r\n\t\t\t$iter.eachContinue(this.xAxes.iterator(), (axis): boolean => {\r\n\t\t\t\tif ($math.round(axis.start, 3) != 0 || $math.round(axis.end, 3) != 1) {\r\n\t\t\t\t\tshow = true;\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\t\t\t$iter.eachContinue(this.yAxes.iterator(), (axis): boolean => {\r\n\t\t\t\tif ($math.round(axis.start, 3) != 0 || $math.round(axis.end, 3) != 1) {\r\n\t\t\t\t\tshow = true;\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\r\n\t\t\tif (!this.seriesAppeared) {\r\n\t\t\t\tshow = false;\r\n\t\t\t}\r\n\r\n\t\t\tif (show) {\r\n\t\t\t\tthis.zoomOutButton.show();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.zoomOutButton.hide();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t * moved this check to a separate method so that we could override it in TreeMapSeries\r\n\t */\r\n\tprotected seriesAppeared(): boolean {\r\n\t\tlet appeared: boolean = false;\r\n\t\t$iter.each(this.series.iterator(), (series) => {\r\n\t\t\tif (!series.appeared) {\r\n\t\t\t\tappeared = false;\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t})\r\n\t\treturn appeared;\r\n\t}\r\n\r\n\t/**\r\n\t * Updates vertical (Y) scrollbar and other horizontal axis whenever axis'\r\n\t * value range changes.\r\n\t */\r\n\tprotected handleYAxisRangeChange() {\r\n\t\tlet range: IRange = this.getCommonAxisRange(this.yAxes);\r\n\r\n\t\tif (this.scrollbarY) {\r\n\t\t\tthis.zoomAxes(this.yAxes, range, true);\r\n\t\t}\r\n\t\tthis.toggleZoomOutButton();\r\n\t\tthis.updateScrollbar(this.scrollbarY, range);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates a relative scrollbar whenever data range of the axis changes.\r\n\t *\r\n\t * @param scrollbar Scrollbar instance\r\n\t * @param range New data (values) range of the axis\r\n\t */\r\n\tprotected updateScrollbar(scrollbar: Scrollbar, range: IRange): void {\r\n\t\tif (scrollbar) {\r\n\t\t\tscrollbar.skipRangeEvents();\r\n\t\t\tscrollbar.start = range.start;\r\n\t\t\tscrollbar.end = range.end;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a common range of values between a list of axes.\r\n\t *\r\n\t * This is used to synchronize the zoom between multiple axes.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param axes A list of axes\r\n\t * @return Common value range\r\n\t */\r\n\tpublic getCommonAxisRange(axes: List): IRange {\r\n\t\tlet start: Optional;\r\n\t\tlet end: Optional;\r\n\r\n\t\t$iter.each(axes.iterator(), (axis) => {\r\n\t\t\tlet axisStart = axis.start;\r\n\t\t\tlet axisEnd = axis.end;\r\n\r\n\t\t\tif (axis.renderer.inversed) {\r\n\t\t\t\taxisStart = 1 - axis.end;\r\n\t\t\t\taxisEnd = 1 - axis.start;\r\n\t\t\t}\r\n\r\n\t\t\tif (!$type.isNumber(start) || (axisStart < start)) {\r\n\t\t\t\tstart = axisStart;\r\n\t\t\t}\r\n\t\t\tif (!$type.isNumber(end) || (axisEnd > end)) {\r\n\t\t\t\tend = axisEnd;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn { start: start, end: end };\r\n\t}\r\n\r\n\t/**\r\n\t * Triggers (re)rendering of the horizontal (X) axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param axis Axis\r\n\t */\r\n\tpublic updateXAxis(renderer: AxisRenderer) {\r\n\t\tlet axis = renderer.axis;\r\n\t\tif (renderer.opposite) {\r\n\t\t\taxis.parent = this.topAxesContainer;\r\n\t\t\taxis.toFront();\r\n\t\t}\r\n\t\telse {\r\n\t\t\taxis.parent = this.bottomAxesContainer;\r\n\t\t\taxis.toBack();\r\n\t\t}\r\n\t\tif (axis.renderer) {\r\n\t\t\taxis.renderer.processRenderer();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Triggers (re)rendering of the vertical (Y) axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param axis Axis\r\n\t */\r\n\tpublic updateYAxis(renderer: AxisRenderer) {\r\n\t\tlet axis = renderer.axis;\r\n\t\tif (renderer.opposite) {\r\n\t\t\taxis.parent = this.rightAxesContainer;\r\n\t\t\taxis.toBack();\r\n\t\t}\r\n\t\telse {\r\n\t\t\taxis.parent = this.leftAxesContainer;\r\n\t\t\taxis.toFront();\r\n\t\t}\r\n\t\tif (axis.renderer) {\r\n\t\t\taxis.renderer.processRenderer();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Decorates an Axis for use with this chart, e.g. sets proper renderer\r\n\t * and containers for placement.\r\n\t *\r\n\t * @param axis Axis\r\n\t */\r\n\tprotected processAxis(axis: Axis): void {\r\n\t\t// Value axis does not use data directly, only category axis does\r\n\t\tif (axis instanceof CategoryAxis) {\r\n\t\t\tthis._dataUsers.moveValue(axis);\r\n\t\t}\r\n\r\n\t\tlet renderer: AxisRenderer = axis.renderer;\r\n\r\n\t\trenderer.gridContainer.parent = this.plotContainer;\r\n\t\trenderer.gridContainer.toBack();\r\n\r\n\t\trenderer.breakContainer.parent = this.plotContainer;\r\n\t\trenderer.breakContainer.toFront();\r\n\t\trenderer.breakContainer.zIndex = 10;\r\n\r\n\t\taxis.addDisposer(new Disposer(() => {\r\n\t\t\tthis.dataUsers.removeValue(axis);\r\n\t\t}))\r\n\r\n\t\tthis.plotContainer.events.on(\"maxsizechanged\", () => {\r\n\t\t\tif (this.inited) {\r\n\t\t\t\taxis.invalidateDataItems();\r\n\t\t\t}\r\n\t\t}, axis, false);\r\n\t}\r\n\r\n\t/**\r\n\t * A list of horizontal (X) axes.\r\n\t *\r\n\t * @return List of axes\r\n\t */\r\n\tpublic get xAxes(): List> {\r\n\t\tif (!this._xAxes) {\r\n\t\t\tthis._xAxes = new List>();\r\n\t\t\tthis._xAxes.events.on(\"inserted\", this.processXAxis, this, false);\r\n\t\t\tthis._xAxes.events.on(\"removed\", this.handleAxisRemoval, this, false);\r\n\t\t}\r\n\r\n\t\treturn this._xAxes;\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tprotected handleAxisRemoval(event: IListEvents[\"removed\"]) {\r\n\t\tlet axis = event.oldValue;\r\n\t\tthis.dataUsers.removeValue(axis); // need to remove, as it might not be disposed\r\n\t\tif (axis.autoDispose) {\r\n\t\t\taxis.dispose();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * A list of vertical (Y) axes.\r\n\t *\r\n\t * @return List of axes\r\n\t */\r\n\tpublic get yAxes(): List> {\r\n\t\tif (!this._yAxes) {\r\n\t\t\tthis._yAxes = new List>();\r\n\t\t\tthis._yAxes.events.on(\"inserted\", this.processYAxis, this, false);\r\n\t\t\tthis._yAxes.events.on(\"removed\", this.handleAxisRemoval, this, false);\r\n\t\t}\r\n\r\n\t\treturn this._yAxes;\r\n\t}\r\n\r\n\t/**\r\n\t * Decorates a new [[XYSeries]] object with required parameters when it is\r\n\t * added to the chart.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param event Event\r\n\t */\r\n\tpublic handleSeriesAdded(event: IListEvents[\"inserted\"]): void {\r\n\t\ttry {\r\n\t\t\tsuper.handleSeriesAdded(event);\r\n\t\t\tlet series: XYSeries = event.newValue;\r\n\r\n\t\t\tif(this.xAxes.length == 0 || this.yAxes.length == 0){\r\n\t\t\t\tregistry.removeFromInvalidComponents(series);\r\n\t\t\t\tseries.dataInvalid = false;\r\n\t\t\t}\r\n\r\n\t\t\tseries.xAxis; // this is enough to get axis, handled in getter\r\n\t\t\tseries.yAxis; // this is enough to get axis, handled in getter\r\n\r\n\t\t\tif (series.fill == undefined) {\r\n\t\t\t\tseries.fill = this.colors.next();\r\n\t\t\t}\r\n\r\n\t\t\tif (series.stroke == undefined) {\r\n\t\t\t\tseries.stroke = series.fill;\r\n\t\t\t}\r\n\t\t}\r\n\t\tcatch (e) {\r\n\t\t\tthis.raiseCriticalError(e);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Chart's [[Cursor]].\r\n\t *\r\n\t * @param cursor Cursor\r\n\t */\r\n\tpublic set cursor(cursor: this[\"_cursor\"]) {\r\n\t\tif (this._cursor != cursor) {\r\n\t\t\tif (this._cursor) {\r\n\t\t\t\tthis.removeDispose(this._cursor);\r\n\t\t\t}\r\n\r\n\t\t\tthis._cursor = cursor;\r\n\r\n\t\t\tif (cursor) {\r\n\t\t\t\t// TODO this is wrong, fix it\r\n\t\t\t\tthis._disposers.push(cursor);\r\n\t\t\t\tcursor.chart = this;\r\n\t\t\t\tcursor.parent = this._cursorContainer;\r\n\t\t\t\tcursor.events.on(\"cursorpositionchanged\", this.handleCursorPositionChange, this, false);\r\n\t\t\t\tcursor.events.on(\"zoomstarted\", this.handleCursorZoomStart, this, false);\r\n\t\t\t\tcursor.events.on(\"zoomended\", this.handleCursorZoomEnd, this, false);\r\n\t\t\t\tcursor.events.on(\"panstarted\", this.handleCursorPanStart, this, false);\r\n\t\t\t\tcursor.events.on(\"panning\", this.handleCursorPanning, this, false);\r\n\t\t\t\tcursor.events.on(\"panended\", this.handleCursorPanEnd, this, false);\r\n\t\t\t\tcursor.events.on(\"behaviorcanceled\", this.handleCursorCanceled, this, false);\r\n\t\t\t\tcursor.events.on(\"hidden\", this.handleHideCursor, this, false);\r\n\t\t\t\tcursor.zIndex = Number.MAX_SAFE_INTEGER - 1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Cursor\r\n\t */\r\n\tpublic get cursor(): this[\"_cursor\"] {\r\n\t\treturn this._cursor;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates and returns a new [[Cursor]] suitable for this chart type.\r\n\t *\r\n\t * @return New cursor\r\n\t */\r\n\tprotected createCursor(): this[\"_cursor\"] {\r\n\t\treturn new XYCursor();\r\n\t}\r\n\r\n\t/**\r\n\t * Performs tasks when the cursor's position changes, e.g. shows proper\r\n\t * tooltips on axes and series.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic handleCursorPositionChange(): void {\r\n\r\n\t\tlet cursor = this.cursor;\r\n\r\n\t\tif (cursor.visible && !cursor.isHiding) {\r\n\t\t\tlet xPosition: number = this.cursor.xPosition;\r\n\t\t\tlet yPosition: number = this.cursor.yPosition;\r\n\r\n\t\t\tthis.showSeriesTooltip({\r\n\t\t\t\tx: xPosition,\r\n\t\t\t\ty: yPosition\r\n\t\t\t});\r\n\r\n\t\t\tlet exceptAxis: Axis;\r\n\t\t\tlet snapToSeries = cursor.snapToSeries;\r\n\t\t\tif (snapToSeries) {\r\n\t\t\t\tif (snapToSeries.baseAxis == snapToSeries.xAxis) {\r\n\t\t\t\t\texceptAxis = snapToSeries.yAxis;\r\n\t\t\t\t}\r\n\t\t\t\tif (snapToSeries.baseAxis == snapToSeries.yAxis) {\r\n\t\t\t\t\texceptAxis = snapToSeries.xAxis;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.showAxisTooltip(this.xAxes, xPosition, exceptAxis);\r\n\t\t\tthis.showAxisTooltip(this.yAxes, yPosition, exceptAxis);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Hides all cursor-related tooltips when the cursor itself is hidden.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic handleHideCursor(): void {\r\n\t\tthis.hideObjectTooltip(this.xAxes);\r\n\t\tthis.hideObjectTooltip(this.yAxes);\r\n\t\tthis.hideObjectTooltip(this.series);\r\n\r\n\t\tthis.updateSeriesLegend();\r\n\t}\r\n\r\n\t/**\r\n\t * Updates values for each series' legend item.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic updateSeriesLegend(): void {\r\n\t\t$iter.each(this.series.iterator(), (series) => {\r\n\t\t\tseries.updateLegendValue();\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Hides a tooltip for a list of objects.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param sprites A list of sprites to hide tooltip for\r\n\t */\r\n\tpublic hideObjectTooltip(sprites: List): void {\r\n\t\t$iter.each(sprites.iterator(), (sprite) => {\r\n\t\t\tsprite.hideTooltip(0);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Shows a tooltip for all chart's series, using specific coordinates as a\r\n\t * reference point.\r\n\t *\r\n\t * The tooltip might be shown at different coordinates depending on the\r\n\t * actual data point's position, overlapping with other tooltips, etc.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param position Reference point\r\n\t */\r\n\tpublic showSeriesTooltip(position?: IPoint): void {\r\n\r\n\t\tif (!position) {\r\n\t\t\tthis.series.each((series) => {\r\n\t\t\t\tseries.hideTooltip();\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet seriesPoints: { point: IPoint, series: XYSeries }[] = [];\r\n\r\n\t\tthis.series.each((series) => {\r\n\t\t\t//if (series.tooltipText || series.tooltipHTML) { // not good, bullets are not hovered then\r\n\r\n\t\t\tif ((series.xAxis instanceof DateAxis && series.xAxis.snapTooltip) || (series.yAxis instanceof DateAxis && series.yAxis.snapTooltip)) {\r\n\t\t\t\t// void\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tlet point = series.showTooltipAtPosition(position.x, position.y);\r\n\t\t\t\tif (point) {\r\n\t\t\t\t\tseries.tooltip.setBounds({ x: 0, y: 0, width: this.pixelWidth, height: this.pixelHeight });\r\n\t\t\t\t\tseriesPoints.push({ series: series, point: point });\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//}\r\n\t\t});\r\n\r\n\t\tif (this.arrangeTooltips) {\r\n\t\t\tthis.sortSeriesTooltips(seriesPoints);\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic sortSeriesTooltips(seriesPoints: { point: IPoint, series: XYSeries }[]) {\r\n\r\n\t\tlet topLeft = $utils.spritePointToSvg({ x: -0.5, y: -0.5 }, this.plotContainer);\r\n\t\tlet bottomRight = $utils.spritePointToSvg({ x: this.plotContainer.pixelWidth + 0.5, y: this.plotContainer.pixelHeight + 0.5 }, this.plotContainer);\r\n\r\n\t\tlet sum = 0;\r\n\t\tlet filteredSeriesPoints: { point: IPoint, series: XYSeries }[] = [];\r\n\t\t$array.each(seriesPoints, (seriesPoint) => {\r\n\t\t\tlet point = seriesPoint.point;\r\n\t\t\tif (point && $math.isInRectangle(point, { x: topLeft.x, y: topLeft.y, width: bottomRight.x - topLeft.x, height: bottomRight.y - topLeft.y })) {\r\n\t\t\t\tfilteredSeriesPoints.push({ point: point, series: seriesPoint.series });\r\n\t\t\t\tsum += point.y;\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tseriesPoints = filteredSeriesPoints;\r\n\r\n\t\tseriesPoints.sort((a, b) => {\r\n\t\t\tif (a.point.y > b.point.y) {\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\t\t\telse if (a.point.y < b.point.y) {\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tlet averageY = sum / seriesPoints.length;\r\n\t\tlet maxY = $utils.svgPointToDocument({ x: 0, y: 0 }, this.svgContainer.SVGContainer).y;\r\n\r\n\t\tif (seriesPoints.length > 0) {\r\n\r\n\t\t\tlet top = topLeft.y;\r\n\t\t\tlet bottom = bottomRight.y;\r\n\r\n\t\t\t// TODO is this needed ?\r\n\t\t\t$utils.spritePointToDocument({ x: 0, y: top }, this);\r\n\r\n\t\t\tlet dropped = false;\r\n\r\n\t\t\tif (averageY > top + (bottom - top) / 2) {\r\n\t\t\t\tlet nextHeight = bottom;\r\n\t\t\t\tfor (let i = seriesPoints.length - 1; i >= 0; i--) {\r\n\t\t\t\t\tlet series = seriesPoints[i].series;\r\n\t\t\t\t\tlet tooltip = series.tooltip;\r\n\t\t\t\t\tlet pointY = seriesPoints[i].point.y;\r\n\r\n\t\t\t\t\ttooltip.setBounds({ x: 0, y: -maxY, width: this.pixelWidth, height: nextHeight + maxY });\r\n\r\n\t\t\t\t\tif (tooltip.invalid) {\r\n\t\t\t\t\t\ttooltip.validate();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttooltip.toBack();\r\n\t\t\t\t\tnextHeight = $utils.spritePointToSvg({ x: 0, y: tooltip.label.pixelY - tooltip.pixelY + pointY - tooltip.pixelMarginTop }, tooltip).y;\r\n\r\n\t\t\t\t\tif (nextHeight < -maxY) {\r\n\t\t\t\t\t\tdropped = true;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (averageY <= top + (bottom - top) / 2 || dropped) {\r\n\t\t\t\tlet nextY = top;\r\n\t\t\t\tfor (let i = 0, len = seriesPoints.length; i < len; i++) {\r\n\t\t\t\t\tlet series = seriesPoints[i].series;\r\n\t\t\t\t\tlet pointY = seriesPoints[i].point.y;\r\n\t\t\t\t\tlet tooltip = series.tooltip;\r\n\t\t\t\t\ttooltip.setBounds({ x: 0, y: nextY, width: this.pixelWidth, height: bottom });\r\n\r\n\t\t\t\t\tif (tooltip.invalid) {\r\n\t\t\t\t\t\ttooltip.validate();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttooltip.toBack();\r\n\r\n\t\t\t\t\tnextY = $utils.spritePointToSvg({ x: 0, y: tooltip.label.pixelY + tooltip.label.measuredHeight - tooltip.pixelY + pointY + tooltip.pixelMarginBottom }, tooltip).y;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Shows tooltips for a list of axes at specific position.\r\n\t *\r\n\t * Position might be X coordinate for horizontal axes, and Y coordinate for\r\n\t * vertical axes.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param axes List of axes to show tooltip on\r\n\t * @param position Position (px)\r\n\t */\r\n\tpublic showAxisTooltip(axes: List, position: number, except?: Axis): void {\r\n\t\t$iter.each(axes.iterator(), (axis) => {\r\n\t\t\tif (axis != except) {\r\n\t\t\t\tif (this.dataItems.length > 0 || axis.dataItems.length > 0) {\r\n\t\t\t\t\taxis.showTooltipAtPosition(position);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Recalculates the value range for the axis taking into account zoom level & inversed.\r\n\t *\r\n\t * @param axis Axis\r\n\t * @param range Range\r\n\t * @return Modified range\r\n\t */\r\n\tpublic getUpdatedRange(axis: Axis, range: IRange): IRange {\r\n\r\n\t\tif (!axis) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet start: number;\r\n\t\tlet end: number;\r\n\t\tlet inversed = axis.renderer.inversed;\r\n\r\n\t\tif (axis.renderer instanceof AxisRendererY) {\r\n\t\t\trange = $math.invertRange(range);\r\n\t\t}\r\n\r\n\t\tif (inversed) {\r\n\t\t\t$math.invertRange(range);\r\n\r\n\t\t\tstart = 1 - axis.end;\r\n\t\t\tend = 1 - axis.start;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tstart = axis.start;\r\n\t\t\tend = axis.end;\r\n\t\t}\r\n\r\n\t\tlet difference: number = end - start;\r\n\r\n\t\treturn {\r\n\t\t\tstart: start + range.start * difference,\r\n\t\t\tend: start + range.end * difference\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Performs zoom and other operations when user finishes zooming using chart\r\n\t * cursor, e.g. zooms axes.\r\n\t *\r\n\t * @param event Cursor's event\r\n\t */\r\n\tprotected handleCursorZoomEnd(event: IXYCursorEvents[\"zoomended\"]): void {\r\n\t\tlet cursor: XYCursor = this.cursor;\r\n\t\tlet behavior = cursor.behavior;\r\n\t\tif (behavior == \"zoomX\" || behavior == \"zoomXY\") {\r\n\t\t\tlet xRange: IRange = cursor.xRange;\r\n\t\t\tif (xRange && this.xAxes.length > 0) {\r\n\t\t\t\txRange = this.getUpdatedRange(this.xAxes.getIndex(0), xRange);\r\n\t\t\t\txRange.priority = \"start\";\r\n\t\t\t\tthis.zoomAxes(this.xAxes, xRange);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (behavior == \"zoomY\" || behavior == \"zoomXY\") {\r\n\t\t\tlet yRange: IRange = cursor.yRange;\r\n\t\t\tif (yRange && this.yAxes.length > 0) {\r\n\t\t\t\tyRange = this.getUpdatedRange(this.yAxes.getIndex(0), yRange);\r\n\t\t\t\tyRange.priority = \"start\";\r\n\t\t\t\tthis.zoomAxes(this.yAxes, yRange);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.handleHideCursor();\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Performs zoom and other operations when user is panning chart plot using chart cursor.\r\n\t *\r\n\t * @param event Cursor's event\r\n\t */\r\n\tprotected handleCursorPanStart(event: IXYCursorEvents[\"panning\"]): void {\r\n\t\tlet xAxis = this.xAxes.getIndex(0);\r\n\t\tif (xAxis) {\r\n\t\t\tthis._panStartXRange = { start: xAxis.start, end: xAxis.end };\r\n\t\t}\r\n\r\n\t\tlet yAxis = this.yAxes.getIndex(0);\r\n\t\tif (yAxis) {\r\n\t\t\tthis._panStartYRange = { start: yAxis.start, end: yAxis.end };\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Performs zoom and other operations when user ends panning\r\n\t *\r\n\t * @param event Cursor's event\r\n\t */\r\n\tprotected handleCursorPanEnd(event: IXYCursorEvents[\"panning\"]): void {\r\n\t\tlet cursor: XYCursor = this.cursor;\r\n\t\tlet behavior = cursor.behavior;\r\n\r\n\t\tif (this._panEndXRange && (behavior == \"panX\" || behavior == \"panXY\")) {\r\n\t\t\tlet panEndRange = this._panEndXRange;\r\n\t\t\tlet delta = 0;\r\n\t\t\tif (panEndRange.start < 0) {\r\n\t\t\t\tdelta = panEndRange.start;\r\n\t\t\t}\r\n\t\t\tif (panEndRange.end > 1) {\r\n\t\t\t\tdelta = panEndRange.end - 1;\r\n\t\t\t}\r\n\t\t\tthis.zoomAxes(this.xAxes, { start: panEndRange.start - delta, end: panEndRange.end - delta }, false, true);\r\n\t\t\tthis._panEndXRange = undefined;\r\n\t\t\tthis._panStartXRange = undefined;\r\n\t\t}\r\n\t\tif (this._panEndYRange && (behavior == \"panY\" || behavior == \"panXY\")) {\r\n\t\t\tlet panEndRange = this._panEndYRange;\r\n\r\n\t\t\tlet delta = 0;\r\n\t\t\tif (panEndRange.start < 0) {\r\n\t\t\t\tdelta = panEndRange.start;\r\n\t\t\t}\r\n\t\t\tif (panEndRange.end > 1) {\r\n\t\t\t\tdelta = panEndRange.end - 1;\r\n\t\t\t}\r\n\r\n\t\t\tthis.zoomAxes(this.yAxes, { start: panEndRange.start - delta, end: panEndRange.end - delta }, false, true);\r\n\t\t\tthis._panEndYRange = undefined;\r\n\t\t\tthis._panStartYRange = undefined;\r\n\t\t}\r\n\t}\r\n\r\n\tprotected handleCursorCanceled(): void {\r\n\t\tthis._panEndXRange = undefined;\r\n\t\tthis._panStartXRange = undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * Performs zoom and other operations when user is panning chart plot using chart cursor.\r\n\t *\r\n\t * @param event Cursor's event\r\n\t */\r\n\tprotected handleCursorPanning(event: IXYCursorEvents[\"panning\"]): void {\r\n\t\tlet cursor: XYCursor = this.cursor;\r\n\t\tlet behavior = cursor.behavior;\r\n\t\tlet maxPanOut = cursor.maxPanOut;\r\n\t\tif (this._panStartXRange && (behavior == \"panX\" || behavior == \"panXY\")) {\r\n\t\t\tlet panStartRange = this._panStartXRange;\r\n\t\t\tlet range = cursor.xRange;\r\n\r\n\t\t\tlet axisRange = this.getCommonAxisRange(this.xAxes);\r\n\r\n\t\t\tlet difference = (panStartRange.end - panStartRange.start);\r\n\t\t\tlet delta = range.start * (axisRange.end - axisRange.start);\r\n\r\n\t\t\tlet newStart = Math.max(-maxPanOut, delta + panStartRange.start);\r\n\t\t\tlet newEnd = Math.min(delta + panStartRange.end, 1 + maxPanOut);\r\n\r\n\t\t\tif (newStart <= 0) {\r\n\t\t\t\tnewEnd = newStart + difference;\r\n\t\t\t}\r\n\r\n\t\t\tif (newEnd >= 1) {\r\n\t\t\t\tnewStart = newEnd - difference;\r\n\t\t\t}\r\n\r\n\t\t\tlet newRange = {\r\n\t\t\t\tstart: newStart,\r\n\t\t\t\tend: newEnd\r\n\t\t\t}\r\n\t\t\tthis._panEndXRange = newRange;\r\n\r\n\t\t\tthis.zoomAxes(this.xAxes, newRange, false, false, cursor.maxPanOut);\r\n\t\t}\r\n\r\n\t\tif (this._panStartYRange && (behavior == \"panY\" || behavior == \"panXY\")) {\r\n\t\t\tlet panStartRange = this._panStartYRange;\r\n\t\t\tlet range = cursor.yRange;\r\n\r\n\t\t\tlet axisRange = this.getCommonAxisRange(this.yAxes);\r\n\r\n\t\t\tlet difference = panStartRange.end - panStartRange.start;\r\n\t\t\tlet delta = range.start * (axisRange.end - axisRange.start);\r\n\r\n\t\t\tlet newStart = Math.max(-maxPanOut, delta + panStartRange.start);\r\n\t\t\tlet newEnd = Math.min(delta + panStartRange.end, 1 + maxPanOut);\r\n\r\n\t\t\tif (newStart <= 0) {\r\n\t\t\t\tnewEnd = newStart + difference;\r\n\t\t\t}\r\n\r\n\t\t\tif (newEnd >= 1) {\r\n\t\t\t\tnewStart = newEnd - difference;\r\n\t\t\t}\r\n\r\n\t\t\tlet newRange = {\r\n\t\t\t\tstart: newStart,\r\n\t\t\t\tend: newEnd\r\n\t\t\t}\r\n\t\t\tthis._panEndYRange = newRange;\r\n\t\t\tthis.zoomAxes(this.yAxes, newRange, false, false, cursor.maxPanOut);\r\n\t\t}\r\n\r\n\t\tthis.handleHideCursor();\r\n\t}\r\n\r\n\t/**\r\n\t * Performs zoom and other operations when user starts zooming using chart\r\n\t * cursor, e.g. zooms axes.\r\n\t *\r\n\t * @param event Cursor's event\r\n\t */\r\n\tprotected handleCursorZoomStart(event: IXYCursorEvents[\"zoomstarted\"]): void {\r\n\r\n\t\t// Nothing here\r\n\t\t// This method is here only as a \"placeholder\" for extending classes to\r\n\t\t// override if necessary\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Horizontal (X) scrollbar.\r\n\t *\r\n\t * @param scrollbar Scrollbar\r\n\t */\r\n\tpublic set scrollbarX(scrollbar: Scrollbar) {\r\n\t\tif (this._scrollbarX) {\r\n\t\t\tthis.removeDispose(this._scrollbarX);\r\n\t\t}\r\n\t\tthis._scrollbarX = scrollbar;\r\n\r\n\t\tif (scrollbar) {\r\n\t\t\tthis._disposers.push(scrollbar);\r\n\t\t\tscrollbar.parent = this.topAxesContainer;\r\n\t\t\tscrollbar.startGrip.exportable = false;\r\n\t\t\tscrollbar.endGrip.exportable = false;\r\n\t\t\tscrollbar.toBack();\r\n\t\t\tscrollbar.orientation = \"horizontal\";\r\n\t\t\tscrollbar.events.on(\"rangechanged\", this.handleXScrollbarChange, this, false);\r\n\t\t\t// accessibility related\r\n\t\t\tscrollbar.adapter.add(\"positionValue\", (arg) => {\r\n\t\t\t\tlet xAxis = this.xAxes.getIndex(0);\r\n\t\t\t\tif (xAxis) {\r\n\t\t\t\t\targ.value = xAxis.getPositionLabel(arg.position);\r\n\t\t\t\t}\r\n\t\t\t\treturn arg;\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Scrollbar\r\n\t */\r\n\tpublic get scrollbarX(): Scrollbar {\r\n\t\treturn this._scrollbarX;\r\n\t}\r\n\r\n\t/**\r\n\t * Vertical (Y) scrollbar.\r\n\t *\r\n\t * @param scrollbar Scrollbar\r\n\t */\r\n\tpublic set scrollbarY(scrollbar: Scrollbar) {\r\n\t\tif (this._scrollbarY) {\r\n\t\t\tthis.removeDispose(this._scrollbarY);\r\n\t\t}\r\n\t\tthis._scrollbarY = scrollbar;\r\n\r\n\t\tif (scrollbar) {\r\n\t\t\tthis._disposers.push(scrollbar);\r\n\t\t\tscrollbar.parent = this.rightAxesContainer;\r\n\t\t\tscrollbar.startGrip.exportable = false;\r\n\t\t\tscrollbar.endGrip.exportable = false;\r\n\t\t\tscrollbar.toFront();\r\n\t\t\tscrollbar.orientation = \"vertical\";\r\n\t\t\tscrollbar.events.on(\"rangechanged\", this.handleYScrollbarChange, this, false);\r\n\t\t\t// accessibility related\r\n\t\t\tscrollbar.adapter.add(\"positionValue\", (arg) => {\r\n\t\t\t\tlet yAxis = this.yAxes.getIndex(0);\r\n\t\t\t\tif (yAxis) {\r\n\t\t\t\t\targ.value = yAxis.getPositionLabel(arg.position);\r\n\t\t\t\t}\r\n\t\t\t\treturn arg;\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Scrollbar\r\n\t */\r\n\tpublic get scrollbarY(): Scrollbar {\r\n\t\treturn this._scrollbarY;\r\n\t}\r\n\r\n\t/**\r\n\t * Zooms axes affected by the horizontal (X) scrollbar when the selection\r\n\t * on it changes.\r\n\t *\r\n\t * @param event Scrollbar range change event\r\n\t */\r\n\tprotected handleXScrollbarChange(event: AMEvent[\"rangechanged\"]): void {\r\n\t\tif (this.inited) {\r\n\t\t\tlet scrollbar: Scrollbar = event.target;\r\n\t\t\tlet range = scrollbar.range;\r\n\t\t\tif (range.end == 1) {\r\n\t\t\t\trange.priority = \"end\";\r\n\t\t\t}\r\n\t\t\tif (range.start == 0) {\r\n\t\t\t\trange.priority = \"start\";\r\n\t\t\t}\r\n\t\t\trange = this.zoomAxes(this.xAxes, range);\r\n\t\t\tscrollbar.fixRange(range);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Zooms axes affected by the vertical (Y) scrollbar when the selection\r\n\t * on it changes.\r\n\t *\r\n\t * @param event Scrollbar range change event\r\n\t */\r\n\tprotected handleYScrollbarChange(event: AMEvent[\"rangechanged\"]): void {\r\n\t\tif (this.inited) {\r\n\t\t\tlet scrollbar: Scrollbar = event.target;\r\n\t\t\tlet range = scrollbar.range;\r\n\t\t\tif (range.end == 1) {\r\n\t\t\t\trange.priority = \"end\";\r\n\t\t\t}\r\n\t\t\tif (range.start == 0) {\r\n\t\t\t\trange.priority = \"start\";\r\n\t\t\t}\r\n\t\t\trange = this.zoomAxes(this.yAxes, range);\r\n\t\t\tscrollbar.fixRange(range);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Zooms axes that are affected by to specific relative range.\r\n\t *\r\n\t * @param axes List of axes to zoom\r\n\t * @param range Range of values to zoom to (0-1)\r\n\t * @param instantly If set to `true` will skip zooming animation\r\n\t * @return Recalculated range that is common to all involved axes\r\n\t */\r\n\tprotected zoomAxes(axes: List>, range: IRange, instantly?: boolean, round?: boolean, declination?: number): IRange {\r\n\t\tlet realRange: IRange = { start: 0, end: 1 };\r\n\r\n\t\tthis.showSeriesTooltip(); // hides\r\n\r\n\t\tif (!this.dataInvalid) {\r\n\t\t\t$iter.each(axes.iterator(), (axis) => {\r\n\t\t\t\tif (axis.renderer.inversed) {\r\n\t\t\t\t\trange = $math.invertRange(range);\r\n\t\t\t\t}\r\n\r\n\t\t\t\taxis.hideTooltip(0);\r\n\r\n\t\t\t\tif (round) {\r\n\t\t\t\t\tlet diff = range.end - range.start;\r\n\t\t\t\t\trange.start = axis.roundPosition(range.start + 0.0001, 0);\r\n\t\t\t\t\trange.end = range.start + diff;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet axisRange: IRange = axis.zoom(range, instantly, instantly, declination);\r\n\r\n\t\t\t\tif (axis.renderer.inversed) {\r\n\t\t\t\t\taxisRange = $math.invertRange(axisRange);\r\n\t\t\t\t}\r\n\r\n\t\t\t\trealRange = axisRange;\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn realRange;\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates if bullet container is masked.\r\n\t *\r\n\t * If it is set to `true`, any bullets that do not fit into bullet container\r\n\t * will be clipped off. Settting to `false` will allow bullets to \"spill out\"\r\n\t * of the plot area so they are not cut off.\r\n\t *\r\n\t * @param value Mask bullet container?\r\n\t */\r\n\tpublic set maskBullets(value: boolean) {\r\n\t\tthis.setPropertyValue(\"maskBullets\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Mask bullet container?\r\n\t */\r\n\tpublic get maskBullets(): boolean {\r\n\t\treturn this.getPropertyValue(\"maskBullets\");\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates if chart should arrange series tooltips so that they would not\r\n\t * overlap.\r\n\t *\r\n\t * If set to `true` (default), the chart will adjust vertical positions of\r\n\t * all simultaneously shown tooltips to avoid overlapping.\r\n\t *\r\n\t * However, if you have a vertically-arranged chart, it might not make sense,\r\n\t * because tooltips would most probably not be aligned horizontally. In this\r\n\t * case it would probably be a good idea to set this setting to `false`.\r\n\t *\r\n\t * @default true\r\n\t * @param value Arrange tooltips?\r\n\t */\r\n\tpublic set arrangeTooltips(value: boolean) {\r\n\t\tthis.setPropertyValue(\"arrangeTooltips\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Arrange tooltips?\r\n\t */\r\n\tpublic get arrangeTooltips(): boolean {\r\n\t\treturn this.getPropertyValue(\"arrangeTooltips\");\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Handles mouse wheel event.\r\n\t *\r\n\t * @param event Original event\r\n\t */\r\n\tprotected handleWheel(event: AMEvent[\"wheel\"]) {\r\n\t\tlet plotContainer = this.plotContainer;\r\n\t\tlet svgPoint: IPoint = $utils.documentPointToSvg(event.point, this.htmlContainer, this.svgContainer.cssScale);\r\n\t\tlet plotPoint = $utils.svgPointToSprite(svgPoint, plotContainer);\r\n\t\tlet shift = event.shift.y;\r\n\r\n\t\tlet rangeX: IRange = this.getCommonAxisRange(this.xAxes);\r\n\t\tlet rangeY: IRange = this.getCommonAxisRange(this.yAxes);\r\n\r\n\t\tlet shiftStep = 0.05;\r\n\r\n\t\tlet maxPanOut = 0;\r\n\r\n\t\tlet mouseWheelBehavior = this.mouseWheelBehavior;\r\n\r\n\t\tif (mouseWheelBehavior == \"panX\" || mouseWheelBehavior == \"panXY\") {\r\n\r\n\t\t\tlet differenceX = rangeX.end - rangeX.start;\r\n\r\n\t\t\tlet newStartX = Math.max(-maxPanOut, rangeX.start + shiftStep * shift / 100);\r\n\t\t\tlet newEndX = Math.min(rangeX.end + shiftStep * shift / 100, 1 + maxPanOut);\r\n\r\n\t\t\tif (newStartX <= 0) {\r\n\t\t\t\tnewEndX = newStartX + differenceX;\r\n\t\t\t}\r\n\r\n\t\t\tif (newEndX >= 1) {\r\n\t\t\t\tnewStartX = newEndX - differenceX;\r\n\t\t\t}\r\n\r\n\t\t\tthis.zoomAxes(this.xAxes, { start: newStartX, end: newEndX });\r\n\t\t}\r\n\r\n\t\tif (mouseWheelBehavior == \"panY\" || mouseWheelBehavior == \"panXY\") {\r\n\t\t\tshift *= -1;\r\n\t\t\tlet differenceY = rangeY.end - rangeY.start;\r\n\r\n\t\t\tlet newStartY = Math.max(-maxPanOut, rangeY.start + shiftStep * shift / 100);\r\n\t\t\tlet newEndY = Math.min(rangeY.end + shiftStep * shift / 100, 1 + maxPanOut);\r\n\r\n\t\t\tif (newStartY <= 0) {\r\n\t\t\t\tnewEndY = newStartY + differenceY;\r\n\t\t\t}\r\n\r\n\t\t\tif (newEndY >= 1) {\r\n\t\t\t\tnewStartY = newEndY - differenceY;\r\n\t\t\t}\r\n\r\n\t\t\tthis.zoomAxes(this.yAxes, { start: newStartY, end: newEndY });\r\n\t\t}\r\n\r\n\t\tif (mouseWheelBehavior == \"zoomX\" || mouseWheelBehavior == \"zoomXY\") {\r\n\t\t\tlet locationX = plotPoint.x / plotContainer.maxWidth;\r\n\r\n\t\t\tlet newStartX = Math.max(-maxPanOut, rangeX.start - shiftStep * shift / 100 * locationX);\r\n\t\t\tnewStartX = Math.min(newStartX, locationX);\r\n\r\n\t\t\tlet newEndX = Math.min(rangeX.end + shiftStep * shift / 100 * (1 - locationX), 1 + maxPanOut);\r\n\t\t\tnewEndX = Math.max(newEndX, locationX);\r\n\r\n\t\t\tthis.zoomAxes(this.xAxes, { start: newStartX, end: newEndX });\r\n\t\t}\r\n\r\n\t\tif (mouseWheelBehavior == \"zoomY\" || mouseWheelBehavior == \"zoomXY\") {\r\n\t\t\tlet locationY = plotPoint.y / plotContainer.maxHeight;\r\n\r\n\t\t\tlet newStartY = Math.max(-maxPanOut, rangeY.start - shiftStep * shift / 100 * (1 - locationY));\r\n\t\t\tnewStartY = Math.min(newStartY, locationY);\r\n\r\n\t\t\tlet newEndY = Math.min(rangeY.end + shiftStep * shift / 100 * locationY, 1 + maxPanOut);\r\n\t\t\tnewEndY = Math.max(newEndY, locationY);\r\n\r\n\t\t\tthis.zoomAxes(this.yAxes, { start: newStartY, end: newEndY });\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Specifies action for when mouse wheel is used when over the chart.\r\n\t *\r\n\t * Options: Options: `\"zoomX\"`, `\"zoomY\"`, `\"zoomXY\"`, `\"panX\"`, `\"panY\"`, `\"panXY\"`, `\"none\"` (default).\r\n\t *\r\n\t * @default \"none\"\r\n\t * @param mouse wheel behavior\r\n\t */\r\n\tpublic set mouseWheelBehavior(value: \"zoomX\" | \"zoomY\" | \"zoomXY\" | \"panX\" | \"panY\" | \"panXY\" | \"none\") {\r\n\r\n\t\tif (this.setPropertyValue(\"mouseWheelBehavior\", value)) {\r\n\t\t\tif (value != \"none\") {\r\n\t\t\t\tthis._mouseWheelDisposer = this.plotContainer.events.on(\"wheel\", this.handleWheel, this, false);\r\n\t\t\t\tthis._disposers.push(this._mouseWheelDisposer);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif (this._mouseWheelDisposer) {\r\n\t\t\t\t\tthis.plotContainer.wheelable = false;\r\n\t\t\t\t\tthis.plotContainer.hoverable = false;\r\n\t\t\t\t\tthis._mouseWheelDisposer.dispose();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Mouse wheel behavior\r\n\t */\r\n\tpublic get mouseWheelBehavior(): \"zoomX\" | \"zoomY\" | \"zoomXY\" | \"panX\" | \"panY\" | \"panXY\" | \"none\" {\r\n\t\treturn this.getPropertyValue(\"mouseWheelBehavior\");\r\n\t}\r\n\r\n\t/**\r\n\t * This function is called by the [[DataSource]]'s `dateFields` adapater\r\n\t * so that particular chart types can popuplate this setting with their\r\n\t * own type-specific data fields so they are parsed properly.\r\n\t *\r\n\t * @param fields Array of date fields\r\n\t * @return Array of date fields populated with chart's date fields\r\n\t */\r\n\tprotected dataSourceDateFields(fields: string[]): string[] {\r\n\t\t// Process parent\r\n\t\tfields = super.dataSourceDateFields(fields);\r\n\r\n\t\t// Check if we have any series with date-fields\r\n\t\t$iter.each(this.series.iterator(), (series: this[\"_seriesType\"]) => {\r\n\t\t\tfields = this.populateDataSourceFields(\r\n\t\t\t\tfields,\r\n\t\t\t\tseries.dataFields,\r\n\t\t\t\t[\"dateX\", \"dateY\", \"openDateX\", \"openDateY\"]\r\n\t\t\t);\r\n\t\t});\r\n\r\n\t\treturn fields;\r\n\t}\r\n\r\n\t/**\r\n\t * This function is called by the [[DataSource]]'s `numberFields` adapater\r\n\t * so that particular chart types can popuplate this setting with their\r\n\t * own type-specific data fields so they are parsed properly.\r\n\t *\r\n\t * @param value Array of number fields\r\n\t * @return Array of number fields populated with chart's number fields\r\n\t */\r\n\tprotected dataSourceNumberFields(fields: string[]): string[] {\r\n\t\tfields = super.dataSourceDateFields(fields);\r\n\r\n\t\t// Check if we have any series with date-fields\r\n\t\t$iter.each(this.series.iterator(), (series: this[\"_seriesType\"]) => {\r\n\t\t\tfields = this.populateDataSourceFields(\r\n\t\t\t\tfields,\r\n\t\t\t\tseries.dataFields,\r\n\t\t\t\t[\"valueX\", \"valueY\", \"openValueX\", \"openValueY\"]\r\n\t\t\t);\r\n\t\t});\r\n\r\n\t\treturn fields;\r\n\t}\r\n\r\n\t/**\r\n\t * Processes JSON-based config before it is applied to the object.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param config Config\r\n\t */\r\n\tpublic processConfig(config?: { [index: string]: any }): void {\r\n\r\n\t\tif (config) {\r\n\r\n\t\t\t// Save axis ranges for later processing\r\n\t\t\tlet xAxes: any[] = [];\r\n\t\t\tlet yAxes: any[] = [];\r\n\r\n\t\t\t// Set up axes\r\n\t\t\tif ($type.hasValue(config.xAxes) && $type.isArray(config.xAxes)) {\r\n\t\t\t\tfor (let i = 0, len = config.xAxes.length; i < len; i++) {\r\n\t\t\t\t\tif (!config.xAxes[i].type) {\r\n\t\t\t\t\t\tthrow Error(\"[XYChart error] No type set for xAxes[\" + i + \"].\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if ($type.hasValue(config.xAxes[i][\"axisRanges\"])) {\r\n\t\t\t\t\t\txAxes.push({\r\n\t\t\t\t\t\t\taxisRanges: config.xAxes[i][\"axisRanges\"],\r\n\t\t\t\t\t\t\tindex: i\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tdelete (config.xAxes[i][\"axisRanges\"]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif ($type.hasValue(config.yAxes) && $type.isArray(config.yAxes)) {\r\n\t\t\t\tfor (let i = 0, len = config.yAxes.length; i < len; i++) {\r\n\t\t\t\t\tif (!config.yAxes[i].type) {\r\n\t\t\t\t\t\tthrow Error(\"[XYChart error] No type set for yAxes[\" + i + \"].\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if ($type.hasValue(config.yAxes[i][\"axisRanges\"])) {\r\n\t\t\t\t\t\tyAxes.push({\r\n\t\t\t\t\t\t\taxisRanges: config.yAxes[i][\"axisRanges\"],\r\n\t\t\t\t\t\t\tindex: i\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tdelete (config.yAxes[i][\"axisRanges\"]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Set up series\r\n\t\t\tif ($type.hasValue(config.series) && $type.isArray(config.series)) {\r\n\t\t\t\tfor (let i = 0, len = config.series.length; i < len; i++) {\r\n\t\t\t\t\tconfig.series[i].type = config.series[i].type || \"LineSeries\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Set up cursor\r\n\t\t\tif ($type.hasValue(config.cursor) && !$type.hasValue(config.cursor.type)) {\r\n\t\t\t\tconfig.cursor.type = \"XYCursor\";\r\n\t\t\t}\r\n\r\n\t\t\t// Set up scrollbars\r\n\t\t\tif ($type.hasValue(config.scrollbarX) && !$type.hasValue(config.scrollbarX.type)) {\r\n\t\t\t\tconfig.scrollbarX.type = \"Scrollbar\";\r\n\t\t\t}\r\n\r\n\t\t\tif ($type.hasValue(config.scrollbarY) && !$type.hasValue(config.scrollbarY.type)) {\r\n\t\t\t\tconfig.scrollbarY.type = \"Scrollbar\";\r\n\t\t\t}\r\n\r\n\t\t\tsuper.processConfig(config);\r\n\r\n\t\t\t// Finish up with ranges.\r\n\t\t\t// We need to do this here because series are processed last in JSON\r\n\t\t\t// config. Therefore their respective objects are not yet are available\r\n\t\t\t// when axis (and respectively their ranges) are being processed.\r\n\t\t\tif (yAxes.length) {\r\n\t\t\t\tfor (let i = 0, len = yAxes.length; i < len; i++) {\r\n\t\t\t\t\tthis.yAxes.getIndex(yAxes[i].index).config = {\r\n\t\t\t\t\t\taxisRanges: yAxes[i].axisRanges\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (xAxes.length) {\r\n\t\t\t\tfor (let i = 0, len = xAxes.length; i < len; i++) {\r\n\t\t\t\t\tthis.xAxes.getIndex(xAxes[i].index).config = {\r\n\t\t\t\t\t\taxisRanges: xAxes[i].axisRanges\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * This function is used to sort element's JSON config properties, so that\r\n\t * some properties that absolutely need to be processed last, can be put at\r\n\t * the end.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param a Element 1\r\n\t * @param b Element 2\r\n\t * @return Sorting number\r\n\t */\r\n\tprotected configOrder(a: string, b: string): Ordering {\r\n\t\tif (a == b) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t// Must come last\r\n\t\telse if (a == \"scrollbarX\") {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\telse if (b == \"scrollbarX\") {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\telse if (a == \"scrollbarY\") {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\telse if (b == \"scrollbarY\") {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\telse if (a == \"cursor\") {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\telse if (b == \"cursor\") {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\telse if (a == \"series\") {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\telse if (b == \"series\") {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn super.configOrder(a, b);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a new Series of type suitable for this chart.\r\n\t *\r\n\t * @return New series\r\n\t */\r\n\tprotected createSeries(): this[\"_seriesType\"] {\r\n\t\treturn new XYSeries();\r\n\t}\r\n\r\n\t/**\r\n\t * A [[Button]] element that is used for zooming out the chart.\r\n\t *\r\n\t * This button appears only when chart is zoomed in, and disappears\r\n\t * autoamatically when it is zoome dout.\r\n\t *\r\n\t * @param button Zoom out button\r\n\t */\r\n\tpublic set zoomOutButton(button: Button) {\r\n\t\tthis._zoomOutButton = button;\r\n\t\tif (button) {\r\n\t\t\tbutton.events.on(\"hit\", () => {\r\n\t\t\t\tthis.zoomAxes(this.xAxes, { start: 0, end: 1 });\r\n\t\t\t\tthis.zoomAxes(this.yAxes, { start: 0, end: 1 });\r\n\t\t\t}, undefined, false);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Zoom out button\r\n\t */\r\n\tpublic get zoomOutButton(): Button {\r\n\t\treturn this._zoomOutButton;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Copies all parameters from another [[XYChart]].\r\n\t *\r\n\t * @param source Source XYChart\r\n\t */\r\n\tpublic copyFrom(source: this) {\r\n\t\tsuper.copyFrom(source);\r\n\t\tthis.xAxes.copyFrom(source.xAxes);\r\n\t\tthis.yAxes.copyFrom(source.yAxes);\r\n\r\n\t\tthis.zoomOutButton.copyFrom(source.zoomOutButton);\r\n\t\t//@todo copy all container properties\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic disposeData() {\r\n\t\tsuper.disposeData();\r\n\r\n\t\tlet scrollbarX = this.scrollbarX;\r\n\t\tif (scrollbarX && scrollbarX instanceof XYChartScrollbar) {\r\n\t\t\tscrollbarX.scrollbarChart.disposeData();\r\n\t\t}\r\n\r\n\t\tlet scrollbarY = this.scrollbarY;\r\n\t\tif (scrollbarY && scrollbarY instanceof XYChartScrollbar) {\r\n\t\t\tscrollbarY.scrollbarChart.disposeData();\r\n\t\t}\r\n\r\n\t\tthis.xAxes.each((axis) => {\r\n\t\t\taxis.disposeData();\r\n\t\t})\r\n\r\n\t\tthis.yAxes.each((axis) => {\r\n\t\t\taxis.disposeData();\r\n\t\t})\r\n\t}\r\n\r\n\t/**\r\n\t * Adds one or several (array) of data items to the existing data.\r\n\t *\r\n\t * @param rawDataItem One or many raw data item objects\r\n\t */\r\n\tpublic addData(rawDataItem: Object | Object[], removeCount?: number): void {\r\n\t\tsuper.addData(rawDataItem, removeCount);\r\n\t\tif (this.scrollbarX instanceof XYChartScrollbar) {\r\n\t\t\tthis.scrollbarX.scrollbarChart.addData(rawDataItem, removeCount);\r\n\t\t}\r\n\t\tif (this.scrollbarY instanceof XYChartScrollbar) {\r\n\t\t\tthis.scrollbarY.scrollbarChart.addData(rawDataItem, removeCount);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"XYChart\"] = XYChart;\r\n\r\n/**\r\n * Add default responsive rules\r\n */\r\n\r\n/**\r\n * Remove horizontal scrollbar on narrow charts.\r\n */\r\ndefaultRules.push({\r\n\trelevant: ResponsiveBreakpoints.maybeXS,\r\n\tstate: function(target, stateId) {\r\n\t\tif (target instanceof XYChart && target.scrollbarX) {\r\n\t\t\tlet state = target.states.create(stateId);\r\n\t\t\tlet sbstate = target.scrollbarX.states.create(stateId);\r\n\t\t\tsbstate.properties.disabled = true;\r\n\t\t\treturn state;\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n});\r\n\r\n/**\r\n * Remove vertical scrollbar on short charts.\r\n */\r\ndefaultRules.push({\r\n\trelevant: ResponsiveBreakpoints.maybeXS,\r\n\tstate: function(target, stateId) {\r\n\t\tif (target instanceof XYChart && target.scrollbarY) {\r\n\t\t\tlet state = target.states.create(stateId);\r\n\t\t\tlet sbstate = target.scrollbarY.states.create(stateId);\r\n\t\t\tsbstate.properties.disabled = true;\r\n\t\t\treturn state;\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n});\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/types/XYChart.ts","/**\r\n * Line series segment module.\r\n * @todo Add description about what this is\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Container, IContainerProperties, IContainerAdapters, IContainerEvents } from \"../../core/Container\";\r\nimport { Sprite, visualProperties } from \"../../core/Sprite\";\r\nimport { IPoint } from \"../../core/defs/IPoint\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\nimport * as $object from \"../../core/utils/Object\";\r\nimport * as $smoothing from \"../../core/rendering/Smoothing\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[LineSeriesSegment]].\r\n */\r\nexport interface ILineSeriesSegmentProperties extends IContainerProperties { }\r\n\r\n/**\r\n * Defines events for [[LineSeriesSegment]].\r\n */\r\nexport interface ILineSeriesSegmentEvents extends IContainerEvents { }\r\n\r\n/**\r\n * Defines adapters for [[LineSeriesSegment]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface ILineSeriesSegmentAdapters extends IContainerAdapters, ILineSeriesSegmentProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Represents a line series segment.\r\n *\r\n * A line segment can be used to apply different properties to a part of the\r\n * line series, between two data points.\r\n *\r\n * @see {@link ILineSeriesSegmentEvents} for a list of available events\r\n * @see {@link ILineSeriesSegmentAdapters} for a list of available Adapters\r\n * @todo Example\r\n */\r\nexport class LineSeriesSegment extends Container {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: ILineSeriesSegmentProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: ILineSeriesSegmentAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: ILineSeriesSegmentEvents;\r\n\r\n\t/**\r\n\t * Segment's line element.\r\n\t */\r\n\tpublic strokeSprite: Sprite;\r\n\r\n\t/**\r\n\t * Segment's fill element.\r\n\t */\r\n\tpublic fillSprite: Sprite;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"LineSeriesSegment\";\r\n\r\n\t\t// Set defaults\r\n\t\tthis.isMeasured = false;\r\n\t\tthis.interactionsEnabled = false;\r\n\t\tthis.layout = \"none\";\r\n\r\n\t\t// Create fill element\r\n\t\tlet fillSprite = this.createChild(Sprite);\r\n\t\tthis.fillSprite = fillSprite;\r\n\t\tfillSprite.shouldClone = false;\r\n\t\tfillSprite.setElement(this.paper.add(\"path\"));\r\n\t\tfillSprite.isMeasured = false;\r\n\t\tthis._disposers.push(fillSprite);\r\n\r\n\r\n\t\t// Create line element\r\n\t\tlet strokeSprite = this.createChild(Sprite);\r\n\t\tthis.strokeSprite = strokeSprite;\r\n\t\tstrokeSprite.shouldClone = false;\r\n\t\tstrokeSprite.setElement(this.paper.add(\"path\"));\r\n\t\tstrokeSprite.isMeasured = false;\r\n\t\tthis._disposers.push(strokeSprite);\r\n\t}\r\n\r\n\t/**\r\n\t * Draws the series segment.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param points Points to connect\r\n\t * @param closePoints ?\r\n\t * @param smoothnessX Horizontal bezier setting (?)\r\n\t * @param smoothnessY Vertical bezier setting (?)\r\n\t */\r\n\tpublic drawSegment(points: IPoint[], closePoints: IPoint[], smoothnessX: number, smoothnessY: number): void {\r\n\t\tif (!this.disabled) {\r\n\t\t\tif (points.length > 0 && closePoints.length > 0) {\r\n\t\t\t\t// first moveTo helps to avoid Chrome straight line in the mask bug.\r\n\t\t\t\tlet path: string = $path.moveTo({ x: points[0].x - 0.2, y: points[0].y - 0.2 }) + $path.moveTo(points[0]) + new $smoothing.Tension(smoothnessX, smoothnessY).smooth(points);\r\n\r\n\t\t\t\tif (this.strokeOpacity == 0 || this.strokeSprite.strokeOpacity == 0) {\r\n\t\t\t\t\t// like this and not if != 0, otherwise ranges stroke won't be drawn.\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.strokeSprite.path = path;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this.fillOpacity > 0 || this.fillSprite.fillOpacity > 0) { // helps to avoid drawing fill object if fill is not visible\r\n\t\t\t\t\tpath += $path.lineTo(closePoints[0]) + new $smoothing.Tension(smoothnessX, smoothnessY).smooth(closePoints);\r\n\t\t\t\t\tpath += $path.lineTo(points[0]);\r\n\t\t\t\t\tpath += $path.closePath();\r\n\r\n\t\t\t\t\tthis.fillSprite.path = path;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.fillSprite.path = \"\";\r\n\t\t\t\tthis.strokeSprite.path = \"\";\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Copies properties from a [[Sprite]] to both line and fill elements.\r\n\t *\r\n\t * @param source Source [[Sprite]] to copy properties from\r\n\t */\r\n\tpublic copyFrom(source: this): void {\r\n\t\tsuper.copyFrom(source);\r\n\r\n\t\tlet lineElement = this.strokeSprite;\r\n\t\t$object.copyProperties(source, lineElement.properties, visualProperties);\r\n\t\tlineElement.fillOpacity = 0;\r\n\r\n\t\tlet fillElement = this.fillSprite;\r\n\t\t$object.copyProperties(source, fillElement.properties, visualProperties);\r\n\t\tfillElement.strokeOpacity = 0;\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"LineSeriesSegment\"] = LineSeriesSegment;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/LineSeriesSegment.ts","/**\r\n * Line series module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { XYSeries, XYSeriesDataItem, IXYSeriesProperties, IXYSeriesDataFields, IXYSeriesAdapters, IXYSeriesEvents } from \"./XYSeries\";\r\nimport { Sprite, visualProperties } from \"../../core/Sprite\";\r\nimport { Container } from \"../../core/Container\";\r\nimport { ListTemplate, ListDisposer } from \"../../core/utils/List\";\r\nimport { IPoint } from \"../../core/defs/IPoint\";\r\nimport { LineSeriesSegment } from \"./LineSeriesSegment\";\r\nimport { Axis, AxisDataItem } from \"../axes/Axis\";\r\nimport { ValueAxis } from \"../axes/ValueAxis\";\r\nimport { DateAxis } from \"../axes/DateAxis\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { Line } from \"../../core/elements/Line\";\r\nimport { Label } from \"../../core/elements/Label\";\r\nimport { Rectangle } from \"../../core/elements/Rectangle\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $object from \"../../core/utils/Object\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $array from \"../../core/utils/Array\";\r\nimport { LegendDataItem } from \"../Legend\";\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[LineSeries]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class LineSeriesDataItem extends XYSeriesDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: LineSeries;\r\n\r\n\t/**\r\n\t * Point of line series data item\r\n\t */\r\n\tpublic point: IPoint;\r\n\r\n\t/**\r\n\t * A reference to a segment object, used for getting proper colors for tooltips\r\n\t */\r\n\tpublic segment: LineSeriesSegment;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"LineSeriesDataItem\";\r\n\t}\r\n\r\n\t// @todo: minimums/maximums\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[LineSeries]].\r\n */\r\nexport interface ILineSeriesDataFields extends IXYSeriesDataFields { }\r\n\r\n/**\r\n * Defines properties for [[LineSeries]].\r\n */\r\nexport interface ILineSeriesProperties extends IXYSeriesProperties {\r\n\r\n\t/**\r\n\t * Horizontal tension setting of the line (0-1).\r\n\t *\r\n\t * Used for smoothed lines.\r\n\t *\r\n\t * @default 1\r\n\t */\r\n\ttensionX?: number;\r\n\r\n\t/**\r\n\t * Vertical tension setting of the line (0-1).\r\n\t *\r\n\t * Used for smoothed lines.\r\n\t *\r\n\t * @default 1\r\n\t */\r\n\ttensionY?: number;\r\n\r\n\t/**\r\n\t * Connect the lines over empty data points?\r\n\t *\r\n\t * @default true\r\n\t */\r\n\tconnect?: boolean;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[LineSeries]].\r\n */\r\nexport interface ILineSeriesEvents extends IXYSeriesEvents { }\r\n\r\n/**\r\n * Defines adapters for [[LineSeries]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface ILineSeriesAdapters extends IXYSeriesAdapters, ILineSeriesProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines [[Series]] for a line graph.\r\n *\r\n * @see {@link ILineSeriesEvents} for a list of available Events\r\n * @see {@link ILineSeriesAdapters} for a list of available Adapters\r\n * @todo Example\r\n * @important\r\n */\r\nexport class LineSeries extends XYSeries {\r\n\r\n\t/**\r\n\t * Defines the type of data fields used for the series.\r\n\t */\r\n\tpublic _dataFields: ILineSeriesDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: ILineSeriesProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: ILineSeriesAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: ILineSeriesEvents;\r\n\r\n\t/**\r\n\t * Defines the type of data item.\r\n\t */\r\n\tpublic _dataItem: LineSeriesDataItem;\r\n\r\n\t/**\r\n\t * A list of line series segments.\r\n\t *\r\n\t * Segments are used in two cases:\r\n\t *\r\n\t * * When we want to change the appearance of a part of the line series;\r\n\t * * When we have an axis range.\r\n\t */\r\n\tpublic segments: ListTemplate;\r\n\r\n\r\n\t/**\r\n\t */\r\n\tpublic _segment: LineSeriesSegment;\r\n\r\n\t/**\r\n\t * A container for segment elements.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic segmentsContainer: Container;\r\n\r\n\t/**\r\n\t * Minimum distance in pixels between two adjacent points.\r\n\t *\r\n\t * If the distance is less than this setting, a point is skipped.\r\n\t *\r\n\t * This allows acceptable performance with huge amounts of data points.\r\n\t *\r\n\t * @default 0.5\r\n\t */\r\n\tpublic minDistance: number = 0.5;\r\n\r\n\t/**\r\n\t * Iterator for segments.\r\n\t */\r\n\tprotected _segmentsIterator: $iter.ListIterator;\r\n\r\n\tprotected _adjustedStartIndex: number;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\r\n\t\tthis.segments = new ListTemplate(this.createSegment());\r\n\t\tthis.segments.template.applyOnClones = true;\r\n\r\n\t\tthis._disposers.push(new ListDisposer(this.segments));\r\n\t\tthis._disposers.push(this.segments.template);\r\n\r\n\t\tthis._segmentsIterator = new $iter.ListIterator(this.segments, () => this.segments.create());\r\n\t\tthis._segmentsIterator.createNewItems = true;\r\n\r\n\t\tthis.className = \"LineSeries\";\r\n\r\n\t\tthis.strokeOpacity = 1;\r\n\t\tthis.fillOpacity = 0;\r\n\r\n\t\tthis.connect = true;\r\n\r\n\t\tthis.tensionX = 1;\r\n\t\tthis.tensionY = 1;\r\n\r\n\t\tthis.segmentsContainer = this.mainContainer.createChild(Container);\r\n\t\tthis.segmentsContainer.isMeasured = false;\r\n\r\n\t\t// line series might have multiple segments and it has a separate sprite for fill and stroke for each segment. So we need to observe all the changes on series and set them on the segments\r\n\t\t// todo: we need list here, otherwise everything will be redrawn event on change of properties like tooltipX or similar.\r\n\t\t// this.addEventListener(SpriteEvent.PROPERTY_CHANGED, this.validateDataElements, false, this);\r\n\r\n\t\tthis.bulletsContainer.toFront();\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Sets defaults that instantiate some objects that rely on parent, so they\r\n\t * cannot be set in constructor.\r\n\t */\r\n\tprotected applyInternalDefaults(): void {\r\n\t\tsuper.applyInternalDefaults();\r\n\t\tif (!$type.hasValue(this.readerTitle)) {\r\n\t\t\tthis.readerTitle = this.language.translate(\"Line Series\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tprotected createSegment(): this[\"_segment\"] {\r\n\t\treturn new LineSeriesSegment();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty DataItem of the type appropriate for this object.\r\n\t *\r\n\t * @see {@link DataItem}\r\n\t * @return Data Item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new LineSeriesDataItem();\r\n\t}\r\n\r\n\t/**\r\n\t * Inits data item's working values.\r\n\t *\r\n\t * @param dataItem Data item\r\n\t * @param index Data item's index\r\n\t */\r\n\r\n\tprotected setInitialWorkingValues(dataItem: this[\"_dataItem\"]): void {\r\n\r\n\t\t// this makes data items animate when added\r\n\t\tif (this.appeared && this.visible) {\r\n\r\n\t\t\tlet yAxis: Axis = this._yAxis.get();\r\n\t\t\tlet xAxis: Axis = this._xAxis.get();\r\n\r\n\t\t\tlet previousDataItem: XYSeriesDataItem = this.dataItems.getIndex(dataItem.index - 1);\r\n\r\n\t\t\tdataItem.component = this; // as these values are set before, we don't know component yet\r\n\r\n\t\t\tif (this.baseAxis == xAxis) {\r\n\t\t\t\tif (yAxis instanceof ValueAxis) {\r\n\t\t\t\t\tlet initialY: number = yAxis.minZoomed;\r\n\t\t\t\t\tif (previousDataItem) {\r\n\t\t\t\t\t\tinitialY = previousDataItem.values[\"valueY\"].workingValue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// this makes line animate from previous point to newly added point\r\n\t\t\t\t\tdataItem.setWorkingValue(\"valueY\", initialY, 0);\r\n\t\t\t\t\tdataItem.setWorkingValue(\"valueY\", dataItem.values.valueY.value);\r\n\r\n\t\t\t\t\tif (xAxis instanceof DateAxis) {\r\n\t\t\t\t\t\tdataItem.setWorkingLocation(\"dateX\", -0.5, 0); // instantly move it to previous\r\n\t\t\t\t\t\tdataItem.setWorkingLocation(\"dateX\", 0.5); // animate to it's location\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (this.baseAxis == yAxis) {\r\n\t\t\t\tif (xAxis instanceof ValueAxis) {\r\n\t\t\t\t\tlet initialX: number = xAxis.minZoomed;\r\n\t\t\t\t\tif (previousDataItem) {\r\n\t\t\t\t\t\tinitialX = previousDataItem.values[\"valueX\"].workingValue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdataItem.setWorkingValue(\"valueX\", initialX, 0);\r\n\t\t\t\t\tdataItem.setWorkingValue(\"valueX\", dataItem.values.valueX.value);\r\n\r\n\t\t\t\t\tif (yAxis instanceof DateAxis) {\r\n\t\t\t\t\t\tdataItem.setWorkingLocation(\"dateY\", -0.5, 0); // instantly move it to previous\r\n\t\t\t\t\t\tdataItem.setWorkingLocation(\"dateY\", 0.5); // animate to it's location\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Updates corresponding legend data item with current values.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic updateLegendValue(dataItem?: this[\"_dataItem\"]) {\r\n\t\tsuper.updateLegendValue(dataItem);\r\n\t\t//This is hack to save some methos, used to set tooltip color source only\r\n\t\tif (dataItem && dataItem.segment) {\r\n\t\t\tthis.tooltipColorSource = dataItem.segment;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)validates the whole series, effectively causing it to redraw.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validate(): void {\r\n\r\n\t\tsuper.validate();\r\n\r\n\t\tthis._segmentsIterator.reset();\r\n\r\n\t\tthis.openSegmentWrapper(this._adjustedStartIndex);\r\n\r\n\t\t$iter.each(this.axisRanges.iterator(), (range) => {\r\n\t\t\tthis.openSegmentWrapper(this._adjustedStartIndex, range);\r\n\t\t});\r\n\r\n\t\t$iter.each(this._segmentsIterator.iterator(), (segment) => {\r\n\t\t\tsegment.__disabled = true;\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * [sliceData description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected sliceData(): void {\r\n\t\tlet startIndex: number = this.startIndex;\r\n\t\tlet endIndex: number = this.endIndex;\r\n\r\n\t\t// we need extra one item to both sides with values for line series, otherwise the line will not continue out of bounds of the chart while scrolling\r\n\t\t// find first to the left\r\n\t\t// TODO use iterator instead\r\n\t\tfor (let i = this.startIndex - 1; i >= 0; i--) {\r\n\t\t\tlet dataItem = this.dataItems.getIndex(i);\r\n\t\t\tif (dataItem && dataItem.hasValue(this._xValueFields) && dataItem.hasValue(this._yValueFields)) {\r\n\t\t\t\tstartIndex = i;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis._adjustedStartIndex = this.findAdjustedIndex(startIndex, [\"stroke\", \"strokeWidth\", \"strokeDasharray\", \"strokeOpacity\", \"fill\", \"fillOpacity\", \"opacity\"]);\r\n\r\n\t\t// find first to the right\r\n\t\t// TODO use iterator instead\r\n\t\tfor (let i = this.endIndex, len = this.dataItems.length; i < len; i++) {\r\n\t\t\tlet dataItem = this.dataItems.getIndex(i);\r\n\t\t\tif (dataItem && dataItem.hasValue(this._xValueFields) && dataItem.hasValue(this._yValueFields)) {\r\n\t\t\t\tendIndex = i + 1;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._workingStartIndex = startIndex;\r\n\t\tthis._workingEndIndex = endIndex;\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tprotected findAdjustedIndex(adjustedIndex: number, properties: string[]): number {\r\n\t\tlet propertyFields: any = this.propertyFields;\r\n\t\tlet startIndex = adjustedIndex;\r\n\t\t$array.each(properties, (property) => {\r\n\t\t\tif ($type.hasValue(propertyFields[property])) {\r\n\t\t\t\tfor (let i = startIndex; i >= 0; i--) {\r\n\t\t\t\t\tlet dataItem = this.dataItems.getIndex(i);\r\n\t\t\t\t\tif ($type.hasValue(dataItem.properties[property])) {\r\n\t\t\t\t\t\tif (adjustedIndex > i) {\r\n\t\t\t\t\t\t\tadjustedIndex = i;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})\r\n\t\treturn adjustedIndex;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Wraps openSegment call with iterative solution to prevent stack overflow\r\n\t *\r\n\t * @param openIndex Index\r\n\t * @param axisRange Range\r\n\t */\r\n\tprotected openSegmentWrapper(openIndex: number, axisRange?: AxisDataItem): void {\r\n\t\tlet params = {\r\n\t\t\t\"index\": openIndex,\r\n\t\t\t\"axisRange\": axisRange\r\n\t\t};\r\n\t\tdo {\r\n\t\t\tparams = this.openSegment(params.index, params.axisRange);\r\n\t\t} while (params)\r\n\t}\r\n\r\n\t/**\r\n\t * [openSegment description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param openIndex [description]\r\n\t * @param axisRange [description]\r\n\t */\r\n\tprotected openSegment(openIndex: number, axisRange?: AxisDataItem): { \"index\": number, \"axisRange\": AxisDataItem } {\r\n\t\tlet points: IPoint[] = [];\r\n\t\topenIndex = Math.min(openIndex, this.dataItems.length);\r\n\t\tlet endIndex: number = Math.min(this._workingEndIndex, this.dataItems.length);\r\n\r\n\t\tlet closeIndex: number;\r\n\t\tlet propertiesChanged: boolean = false;\r\n\r\n\t\tlet segment: LineSeriesSegment = this._segmentsIterator.getFirst();\r\n\t\tsegment.__disabled = false;\r\n\r\n\t\tif (axisRange) {\r\n\t\t\tsegment.parent = axisRange.contents;\r\n\t\t\t$object.copyProperties(axisRange.contents, segment, visualProperties);\r\n\t\t}\r\n\t\telse {\r\n\t\t\t$object.copyProperties(this, segment, visualProperties);\r\n\t\t\tsegment.filters.clear();\r\n\t\t\tsegment.parent = this.segmentsContainer;\r\n\t\t}\r\n\r\n\t\tfor (let i: number = openIndex; i < endIndex; i++) {\r\n\r\n\t\t\tlet dataItem: this[\"_dataItem\"] = this.dataItems.getIndex(i);\r\n\t\t\tdataItem.segment = segment;\r\n\r\n\t\t\tif (dataItem.hasProperties) {\r\n\t\t\t\t// if this is first item of segment\r\n\t\t\t\tif (i == openIndex) {\r\n\t\t\t\t\tthis.updateSegmentProperties(dataItem.properties, segment);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t// this time we only need to know if properties changed, so we don't pass segment\r\n\t\t\t\t\tpropertiesChanged = this.updateSegmentProperties(dataItem.properties, segment, true);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (dataItem.hasValue(this._xValueFields) && dataItem.hasValue(this._yValueFields)) {\r\n\t\t\t\tthis.addPoints(points, dataItem, this.xField, this.yField);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// if no values in first data item, go to next\r\n\t\t\t\tif (i == openIndex) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tlet connect: boolean = this.connect;\r\n\t\t\t\t\t// todo: other connect conditions\r\n\r\n\t\t\t\t\t// stop cycle\r\n\t\t\t\t\tif (!connect) {\r\n\t\t\t\t\t\tcloseIndex = i;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tcloseIndex = i;\r\n\r\n\t\t\tif (propertiesChanged) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this.closeSegment(segment, points, openIndex, closeIndex, axisRange);\r\n\t}\r\n\r\n\t/**\r\n\t * [addPoints description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param points [description]\r\n\t * @param dataItem [description]\r\n\t * @param xField [description]\r\n\t * @param yField [description]\r\n\t * @param backwards [description]\r\n\t */\r\n\tprotected addPoints(points: IPoint[], dataItem: this[\"_dataItem\"], xField: string, yField: string, backwards?: boolean) {\r\n\t\tlet point = this.getPoint(dataItem, xField, yField, dataItem.workingLocations[xField], dataItem.workingLocations[yField]);\r\n\t\tif (!backwards) {\r\n\t\t\tdataItem.point = point;\r\n\t\t}\r\n\t\tpoints.push(point);\r\n\t}\r\n\r\n\t/**\r\n\t * [closeSegment description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param segment [description]\r\n\t * @param points [description]\r\n\t * @param openIndex [description]\r\n\t * @param closeIndex [description]\r\n\t * @param axisRange [description]\r\n\t */\r\n\tprotected closeSegment(segment: LineSeriesSegment, points: IPoint[], openIndex: number, closeIndex: number, axisRange?: AxisDataItem) {\r\n\r\n\t\tlet closePoints: IPoint[] = [];\r\n\r\n\t\tif (this.dataFields[this._xOpenField] ||\r\n\t\t\tthis.dataFields[this._yOpenField] ||\r\n\t\t\tthis.stacked) {\r\n\t\t\tfor (let i: number = closeIndex; i >= openIndex; i--) {\r\n\t\t\t\tlet dataItem: this[\"_dataItem\"] = this.dataItems.getIndex(i);\r\n\t\t\t\tif (dataItem.hasValue(this._xValueFields) && dataItem.hasValue(this._yValueFields)) { // not sure, this means that open point will only be added if value is also set for this point, but maybe it's ok.\r\n\t\t\t\t\tthis.addPoints(closePoints, dataItem, this.xOpenField, this.yOpenField, true);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet baseAxis: Axis = this.baseAxis;\r\n\t\t\tlet count: number = points.length;\r\n\t\t\tlet xAxis: Axis = this.xAxis;\r\n\t\t\tlet yAxis: Axis = this.yAxis;\r\n\t\t\tif (count > 0) {\r\n\t\t\t\tif (baseAxis == xAxis) {\r\n\t\t\t\t\tclosePoints.push({ x: points[count - 1].x, y: yAxis.basePoint.y }); // last x\r\n\t\t\t\t\tclosePoints.push({ x: points[0].x, y: yAxis.basePoint.y }); // first x\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tclosePoints.push({ x: xAxis.basePoint.x, y: points[count - 1].y }); // last y\r\n\t\t\t\t\tclosePoints.push({ x: xAxis.basePoint.x, y: points[0].y }); // first y\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.drawSegment(segment, points, closePoints);\r\n\r\n\t\tif (closeIndex < this._workingEndIndex - 1) {\r\n\t\t\treturn { \"index\": closeIndex, \"axisRange\": axisRange };\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Draws the line segment.\r\n\t *\r\n\t * @param segment Segment\r\n\t * @param points Segment points\r\n\t * @param closePoints Segment close points\r\n\t */\r\n\tprotected drawSegment(segment: LineSeriesSegment, points: IPoint[], closePoints: IPoint[]): void {\r\n\t\tsegment.drawSegment(points, closePoints, this.tensionX, this.tensionY);\r\n\t}\r\n\r\n\t/**\r\n\t * Segement will get its colors from `this.dataItem`, as thats how\r\n\t * `getPropertyValue()` method works.\r\n\t *\r\n\t * We pass `lineSeriesDataItem.properties` as item here each time when a flag\r\n\t * `hasProperties` is set to `true` on data item (this means it can contain\r\n\t * some properties set).\r\n\t *\r\n\t * @param itemProperties Item properties\r\n\t * @param segment Segment\r\n\t * @return Properties changed?\r\n\t */\r\n\tprotected updateSegmentProperties(itemProperties: { [index: string]: any }, segment: LineSeriesSegment, checkOnly?: boolean): boolean {\r\n\t\tlet changed: boolean = false;\r\n\r\n\t\t$object.each(itemProperties, (propertyName, value) => {\r\n\t\t\t// some value must be defined\r\n\t\t\tif ($type.hasValue(value)) {\r\n\t\t\t\tlet currentValue = (segment)[propertyName];\r\n\t\t\t\tlet currentValueStr: string;\r\n\t\t\t\t// current value can be Color, number, anything. So we check if it has toString, otherwise just do String().\r\n\t\t\t\t// toString() will return hex if it's color. The only problem is that it will return lowercased hex and if we have uppercase in data, it will think that it changed\r\n\t\t\t\tif (currentValue) {\r\n\t\t\t\t\tif (currentValue.toString) {\r\n\t\t\t\t\t\tcurrentValueStr = currentValue.toString();\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tcurrentValueStr = currentValue; // not doing String(currentValue) as this will make all Objects the same\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\t\t\t\tlet valueStr: string;\r\n\r\n\t\t\t\tif (value) {\r\n\t\t\t\t\tif (value.toString) {\r\n\t\t\t\t\t\tvalueStr = value.toString();\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvalueStr = value; // not doing String(currentValue) as this will make all Objects the same\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (currentValue == value || (currentValueStr != undefined && valueStr != undefined && currentValueStr == valueStr)) {\r\n\t\t\t\t\t// void\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (!checkOnly) {\r\n\t\t\t\t\t\t(segment)[propertyName] = value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tchanged = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn changed;\r\n\t}\r\n\r\n\t/**\r\n\t * Connect the lines over empty data points?\r\n\t *\r\n\t * If set to `true` the line will connect two adjacent data points by a\r\n\t * straight line. Even if there are data points with missing values\r\n\t * in-between.\r\n\t *\r\n\t * If you set this to `false`, the line will break when there are missing\r\n\t * values.\r\n\t *\r\n\t * @see {@link https://www.amcharts.com/docs/v4/chart-types/xy-chart/#Line_series_with_gaps} for more information about this feature\r\n\t * @default true\r\n\t * @param value Connect?\r\n\t */\r\n\tpublic set connect(value: boolean) {\r\n\t\tif (this.setPropertyValue(\"connect\", value)) {\r\n\t\t\tthis.invalidate();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Connect?\r\n\t */\r\n\tpublic get connect(): boolean {\r\n\t\treturn this.getPropertyValue(\"connect\");\r\n\t}\r\n\r\n\t/**\r\n\t * Horizontal tension setting of the line (0-1).\r\n\t *\r\n\t * Can be used to create smoothed lines. It works like this:\r\n\t *\r\n\t * Accepted values are in the range between 0 and 1. The biggest value (1)\r\n\t * will mean that the \"tension\" is very high, so the line is maximally\r\n\t * attracted to the points it connects, hence the straight line.\r\n\t *\r\n\t * Using smaller numbers will \"relax\" the tension, creating some curving.\r\n\t *\r\n\t * The smaller the tension setting, the more relaxed the line and the more\r\n\t * wide the curve.\r\n\t *\r\n\t * This setting is for horizontal tension, meaning the curve will bend in\r\n\t * such way that it never goes below or above connecting points. To enable\r\n\t * vertical bending as well, use `tensionY`.\r\n\t *\r\n\t * @default 1\r\n\t * @param value Horizontal tension (0-1)\r\n\t */\r\n\tpublic set tensionX(value: number) {\r\n\t\tthis.setPropertyValue(\"tensionX\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Horizontal tension (0-1)\r\n\t */\r\n\tpublic get tensionX(): number {\r\n\t\treturn this.getPropertyValue(\"tensionX\");\r\n\t}\r\n\r\n\t/**\r\n\t * Can be used to create smoothed lines. It works like this:\r\n\t *\r\n\t * Accepted values are in the range between 0 and 1. The biggest value (1)\r\n\t * will mean that the \"tension\" is very high, so the line is maximally\r\n\t * attracted to the points it connects, hence the straight line.\r\n\t *\r\n\t * Using smaller numbers will \"relax\" the tension, creating some curving.\r\n\t *\r\n\t * The smaller the tension setting, the more relaxed the line and the more\r\n\t * wide the curve.\r\n\t *\r\n\t * This setting is for vertical tension, meaning the curve might bend in\r\n\t * such way that it will go below or above connected points.\r\n\t *\r\n\t * Combine this setting with `tensionX` to create beautifully looking\r\n\t * smoothed line series.\r\n\t *\r\n\t * @default 1\r\n\t * @param value Vertical tension (0-1)\r\n\t */\r\n\tpublic set tensionY(value: number) {\r\n\t\tthis.setPropertyValue(\"tensionY\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Vertical tension (0-1)\r\n\t */\r\n\tpublic get tensionY(): number {\r\n\t\treturn this.getPropertyValue(\"tensionY\");\r\n\t}\r\n\r\n\r\n\t/*\r\n public positionBullet(bullet: Bullet): void {\r\n\t super.positionBullet(bullet);\r\n\r\n\t let dataItem: this[\"_dataItem\"] = bullet.dataItem;\r\n\t if (dataItem.segment) {\r\n\t\t $object.softCopyProperties(dataItem.segment, bullet, visualProperties);\r\n\t }\r\n }*/\r\n\r\n\t/**\r\n\t * Creates elements in related legend container, that mimics the look of this\r\n\t * Series.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param marker Legend item container\r\n\t */\r\n\tpublic createLegendMarker(marker: Container): void {\r\n\r\n\t\tlet w: number = marker.pixelWidth;\r\n\t\tlet h: number = marker.pixelHeight;\r\n\r\n\t\tmarker.disposeChildren();\r\n\r\n\t\tlet line: Line = marker.createChild(Line);\r\n\t\tline.shouldClone = false;\r\n\t\t//line.copyFrom(this); coppies events which is not good\r\n\t\t$object.copyProperties(this, line, visualProperties);\r\n\r\n\t\tline.x2 = w;\r\n\t\tline.y = h / 2;\r\n\t\tline.visible = true;\r\n\r\n\t\tif (this.fillOpacity > 0) {\r\n\t\t\tlet fill: Rectangle = marker.createChild(Rectangle);\r\n\t\t\t//fill.copyFrom(this); coppies events which is not good\r\n\t\t\t$object.copyProperties(this, fill, visualProperties);\r\n\t\t\tfill.width = w;\r\n\t\t\tfill.height = h;\r\n\t\t\tfill.y = 0;\r\n\t\t\tfill.strokeOpacity = 0;\r\n\t\t\tfill.visible = true;\r\n\r\n\t\t\tline.y = 0;\r\n\t\t}\r\n\r\n\t\tlet legendDataItem = marker.dataItem;\r\n\t\tlegendDataItem.color = this.stroke;\r\n\t\tlegendDataItem.colorOrig = this.fill;\r\n\r\n\t\t$iter.eachContinue(this.bullets.iterator(), (bullet) => {\r\n\t\t\tif (bullet.copyToLegendMarker) {\r\n\r\n\t\t\t\t// do not copy bullets with labels\r\n\t\t\t\tlet hasLabels: boolean = false;\r\n\t\t\t\t$iter.each(bullet.children.iterator(), (child) => {\r\n\t\t\t\t\tif (child instanceof Label) {\r\n\t\t\t\t\t\thasLabels = true;\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif (!hasLabels) {\r\n\t\t\t\t\tlet clone: Sprite = bullet.clone();\r\n\t\t\t\t\tclone.parent = marker;\r\n\t\t\t\t\tclone.isMeasured = true;\r\n\t\t\t\t\tclone.tooltipText = undefined;\r\n\t\t\t\t\tclone.x = w / 2;\r\n\t\t\t\t\tif (this.fillOpacity > 0) {\r\n\t\t\t\t\t\tclone.y = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tclone.y = h / 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tclone.visible = true;\r\n\r\n\t\t\t\t\t// otherwise will not transit to color after hiding\r\n\t\t\t\t\tif (!$type.hasValue(clone.fill)) {\r\n\t\t\t\t\t\tclone.fill = this.fill;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (!$type.hasValue(clone.stroke)) {\r\n\t\t\t\t\t\tclone.stroke = this.stroke;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic disposeData() {\r\n\t\tsuper.disposeData();\r\n\t\tthis.segments.clear();\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"LineSeries\"] = LineSeries;\r\nregistry.registeredClasses[\"LineSeriesDataItem\"] = LineSeriesDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/LineSeries.ts","/**\r\n * Radar series module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { LineSeries, LineSeriesDataItem, ILineSeriesDataFields, ILineSeriesProperties, ILineSeriesAdapters, ILineSeriesEvents } from \"./LineSeries\";\r\nimport { LineSeriesSegment } from \"./LineSeriesSegment\";\r\nimport { IPoint } from \"../../core/defs/IPoint\";\r\nimport { AxisRendererRadial } from \"../axes/AxisRendererRadial\";\r\nimport { Axis } from \"../axes/Axis\";\r\nimport { RadarChart } from \"../types/RadarChart\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[RadarSeries]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class RadarSeriesDataItem extends LineSeriesDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: RadarSeries;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"RadarSeriesDataItem\";\r\n\r\n\t\tthis.setLocation(\"dateX\", 0, 0);\r\n\t\tthis.setLocation(\"dateY\", 0, 0);\r\n\r\n\t\tthis.setLocation(\"categoryX\", 0, 0);\r\n\t\tthis.setLocation(\"categoryY\", 0, 0);\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[RadarSeries]].\r\n */\r\nexport interface IRadarSeriesDataFields extends ILineSeriesDataFields { }\r\n\r\n/**\r\n * Defines properties for [[RadarSeries]].\r\n */\r\nexport interface IRadarSeriesProperties extends ILineSeriesProperties {\r\n\r\n\t/**\r\n\t * Should the last and and first data points be connected, forming a complete\r\n\t * closed circle?\r\n\t *\r\n\t * @default true\r\n\t */\r\n\tconnectEnds?: boolean;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[RadarSeries]].\r\n */\r\nexport interface IRadarSeriesEvents extends ILineSeriesEvents { }\r\n\r\n/**\r\n * Defines adapters for [[RadarSeries]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IRadarSeriesAdapters extends ILineSeriesAdapters, IRadarSeriesProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines [[Series]] for a radar graph.\r\n *\r\n * @see {@link IRadarSeriesEvents} for a list of available Events\r\n * @see {@link IRadarSeriesAdapters} for a list of available Adapters\r\n * @todo Example\r\n * @important\r\n */\r\nexport class RadarSeries extends LineSeries {\r\n\r\n\t/**\r\n\t * Defines the type of data fields used for the series.\r\n\t */\r\n\tpublic _dataFields: IRadarSeriesDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IRadarSeriesProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IRadarSeriesAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IRadarSeriesEvents;\r\n\r\n\t/**\r\n\t * Defines the type of data item.\r\n\t */\r\n\tpublic _dataItem: RadarSeriesDataItem;\r\n\r\n\t/**\r\n\t * A chart series belongs to.\r\n\t */\r\n\tpublic _chart: RadarChart;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"RadarSeries\";\r\n\t\tthis.connectEnds = true;\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)validates the whole series, effectively causing it to redraw.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validate(): void {\r\n\r\n\t\t// so that radius would be updated\r\n\t\tif (this.chart.invalid) {\r\n\t\t\tthis.chart.validate();\r\n\t\t}\r\n\r\n\t\tsuper.validate();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty DataItem of the type appropriate for this object.\r\n\t *\r\n\t * @see {@link DataItem}\r\n\t * @return Data Item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new RadarSeriesDataItem();\r\n\t}\r\n\r\n\t/**\r\n\t * [getPoint description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param dataItem [description]\r\n\t * @param xKey [description]\r\n\t * @param yKey [description]\r\n\t * @param locationX [description]\r\n\t * @param locationY [description]\r\n\t * @param stackKeyX [description]\r\n\t * @param stackKeyY [description]\r\n\t */\r\n\tprotected getPoint(dataItem: RadarSeriesDataItem, xKey: string, yKey: string, locationX?: number, locationY?: number, stackKeyX?: string, stackKeyY?: string) {\r\n\t\tif (!stackKeyX) {\r\n\t\t\tstackKeyX = \"valueX\";\r\n\t\t}\r\n\t\tif (!stackKeyY) {\r\n\t\t\tstackKeyY = \"valueY\";\r\n\t\t}\r\n\r\n\t\tlet x: number = this.yAxis.getX(dataItem, yKey, locationY, stackKeyY);\r\n\t\tlet y: number = this.yAxis.getY(dataItem, yKey, locationY, stackKeyY);\r\n\r\n\t\tlet radius: number = $math.getDistance({ x: x, y: y });\r\n\r\n\t\t// hack to be able to determine angle later\r\n\t\tif(radius == 0){\r\n\t\t\tradius = 0.00001;\r\n\t\t}\r\n\r\n\t\tlet angle: number = this.xAxis.getAngle(dataItem, xKey, locationX, stackKeyX);\r\n\r\n\t\tlet startAngle = this.chart.startAngle;\r\n\t\tlet endAngle = this.chart.endAngle;\r\n\r\n\t\t//\t\tangle = $math.fitToRange(angle, startAngle, endAngle);\r\n\t\tif (angle < startAngle || angle > endAngle) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn { x: radius * $math.cos(angle), y: radius * $math.sin(angle) };\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * [addPoints description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param points [description]\r\n\t * @param dataItem [description]\r\n\t * @param xField [description]\r\n\t * @param yField [description]\r\n\t * @param backwards [description]\r\n\t */\r\n\tprotected addPoints(points: IPoint[], dataItem: this[\"_dataItem\"], xField: string, yField: string, backwards?: boolean): void {\r\n\t\tlet point = this.getPoint(dataItem, xField, yField, dataItem.locations[xField], dataItem.locations[yField]);\r\n\t\tif (point) {\r\n\t\t\tpoints.push(point);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an SVG path to be used as a mask for the series.\r\n\t *\r\n\t * @return SVG path\r\n\t */\r\n\tprotected getMaskPath(): string {\r\n\t\tlet renderer: AxisRendererRadial = this.yAxis.renderer;\r\n\t\treturn $path.arc(renderer.startAngle, renderer.endAngle - renderer.startAngle, renderer.pixelRadius, renderer.pixelInnerRadius);\r\n\t}\r\n\r\n\t/**\r\n\t * [drawSegment description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param segment [description]\r\n\t * @param points [description]\r\n\t * @param closePoints [description]\r\n\t */\r\n\tprotected drawSegment(segment: LineSeriesSegment, points: IPoint[], closePoints: IPoint[]): void {\r\n\t\tlet axis: Axis = this.yAxis;\r\n\t\tlet renderer: AxisRendererRadial = axis.renderer;\r\n\r\n\t\tif (this.connectEnds && Math.abs(renderer.endAngle - renderer.startAngle) == 360) {\r\n\t\t\t// adds one point to the beginning of closePoints array, if needed\r\n\t\t\tif (this.dataFields[this._xOpenField] ||\r\n\t\t\t\tthis.dataFields[this._yOpenField] ||\r\n\t\t\t\tthis.stacked) {\r\n\t\t\t\tpoints.push(points[0]);\r\n\t\t\t\tif (closePoints.length > 0) {\r\n\t\t\t\t\tclosePoints.unshift(closePoints[closePoints.length - 1]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tsuper.drawSegment(segment, points, closePoints);\r\n\t}\r\n\r\n\t/**\r\n\t * Should the last and and first data points be connected, forming a complete\r\n\t * closed circle?\r\n\t *\r\n\t * @default true\r\n\t * @param value Connect?\r\n\t */\r\n\tpublic set connectEnds(value: boolean) {\r\n\t\tthis.setPropertyValue(\"connectEnds\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Connect?\r\n\t */\r\n\tpublic get connectEnds(): boolean {\r\n\t\treturn this.getPropertyValue(\"connectEnds\");\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"RadarSeries\"] = RadarSeries;\r\nregistry.registeredClasses[\"RadarSeriesDataItem\"] = RadarSeriesDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/RadarSeries.ts","/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { RadarChart } from \"../types/RadarChart\";\r\nimport { XYCursor, IXYCursorAdapters, IXYCursorEvents, IXYCursorProperties } from \"./XYCursor\";\r\nimport { IPoint } from \"../../core/defs/IPoint\";\r\nimport { ISpriteEvents } from \"../../core/Sprite\";\r\nimport { Tooltip } from \"../../core/elements/Tooltip\";\r\nimport { Percent, percent } from \"../../core/utils/Percent\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport * as $type from \"../../core/utils/Type\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[RadarCursor]].\r\n */\r\nexport interface IRadarCursorProperties extends IXYCursorProperties {\r\n\r\n\t/**\r\n\t * Inner radius of the cursor's circular line.\r\n\t * Absolute (px) or relative ([[Percent]]).\r\n\t */\r\n\tinnerRadius: number | Percent;\r\n\r\n\t/**\r\n\t * Outer radius of the cursor's circular line.\r\n\t * Absolute (px) or relative ([[Percent]]).\r\n\t */\r\n\tradius: number | Percent;\r\n\r\n\t/**\r\n\t * Starting angle of the cursor's radial line.\r\n\t */\r\n\tstartAngle: number;\r\n\r\n\t/**\r\n\t * Ending angle of the cursor's radial line.\r\n\t */\r\n\tendAngle: number;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[RadarCursor]].\r\n */\r\nexport interface IRadarCursorEvents extends IXYCursorEvents { }\r\n\r\n/**\r\n * Defines adapters for [[RadarCursor]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IRadarCursorAdapters extends IXYCursorAdapters, IRadarCursorProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Cursor for [[RadarChart]].\r\n *\r\n * @see {@link IRadarCursorEvents} for a list of available events\r\n * @see {@link IRadarCursorAdapters} for a list of available Adapters\r\n */\r\nexport class RadarCursor extends XYCursor {\r\n\r\n\t/**\r\n\t * Defines available properties\r\n\t */\r\n\tpublic _properties!: IRadarCursorProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters\r\n\t */\r\n\tpublic _adapter!: IRadarCursorAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IRadarCursorEvents;\r\n\r\n\t/**\r\n\t * A reference to chart cursor belongs to.\r\n\t */\r\n\tpublic _chart: RadarChart;\r\n\r\n\r\n\tprotected _prevAngle: number;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"RadarCursor\";\r\n\t\tthis.radius = percent(100);\r\n\t\tthis.innerRadius = percent(0);\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\r\n\t\tthis.mask = undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if point is within bounds of a container.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param point Point to check\r\n\t * @return Fits within container?\r\n\t */\r\n\tpublic fitsToBounds(point: IPoint): boolean {\r\n\t\tlet radius = $math.getDistance(point);\r\n\r\n\t\t//if(!$math.isAngleInRange(angle, this.startAngle, this.endAngle)){\r\n\t\t\t//return false;\r\n\t\t//}\r\n\t\tif (radius < this.truePixelRadius + 1 && radius > this.pixelInnerRadius - 1) { // ok to add/remove some\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * Starting angle of the cursor's radial line.\r\n\t *\r\n\t * @param value Start angle\r\n\t */\r\n\tpublic set startAngle(value: number) {\r\n\t\tthis.setPropertyValue(\"startAngle\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Start angle\r\n\t */\r\n\tpublic get startAngle(): number {\r\n\t\treturn this.getPropertyValue(\"startAngle\");\r\n\t}\r\n\r\n\t/**\r\n\t * End angle of the cursor's radial line.\r\n\t *\r\n\t * @param value End angle\r\n\t */\r\n\tpublic set endAngle(value: number) {\r\n\t\tthis.setPropertyValue(\"endAngle\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return End angle\r\n\t */\r\n\tpublic get endAngle(): number {\r\n\t\treturn this.getPropertyValue(\"endAngle\");\r\n\t}\r\n\r\n\r\n\tprotected triggerMoveReal(point:IPoint) {\r\n\r\n\t\tif (!this.xAxis || (this.xAxis && (!this.xAxis.cursorTooltipEnabled || this.xAxis.tooltip.disabled))) {\r\n\t\t\tthis.updateLineX(this.point);\r\n\t\t}\r\n\t\tif (!this.yAxis || (this.yAxis && (!this.yAxis.cursorTooltipEnabled || this.yAxis.tooltip.disabled))) {\r\n\t\t\tthis.updateLineY(this.point);\r\n\t\t}\r\n\r\n\t\tthis.updateSelection();\r\n\t\tsuper.triggerMoveReal(point);\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)draws the horizontal (circular) cursor's line.\r\n\t *\r\n\t * @param point New target point\r\n\t */\r\n\tprotected updateLineX(point: IPoint) {\r\n\r\n\t\tlet radius: number = this.pixelRadius;\r\n\t\tlet startAngle: number = this.startAngle;\r\n\t\tlet endAngle: number = this.endAngle;\r\n\t\tlet innerRadius: number = this.pixelInnerRadius;\r\n\r\n\t\tif (radius > 0 && $type.isNumber(startAngle) && $type.isNumber(endAngle) && $type.isNumber(innerRadius)) {\r\n\t\t\tlet angle: number = $math.fitAngleToRange($math.getAngle(point), startAngle, endAngle);\r\n\t\t\tlet path: string;\r\n\r\n\t\t\tif (this.lineX && this.lineX.visible) {\r\n\r\n\t\t\t\tthis.lineX.moveTo({ x: 0, y: 0 });\r\n\r\n\t\t\t\t// fill\r\n\t\t\t\tif (this.xAxis && this.fullWidthLineX) {\r\n\r\n\t\t\t\t\tlet startPoint: IPoint = this.xAxis.currentItemStartPoint;\r\n\t\t\t\t\tlet endPoint: IPoint = this.xAxis.currentItemEndPoint;\r\n\r\n\t\t\t\t\tif (startPoint && endPoint) {\r\n\t\t\t\t\t\tlet fillStartAngle: number = $math.fitAngleToRange($math.getAngle(startPoint), startAngle, endAngle);\r\n\t\t\t\t\t\tlet fillEndAngle: number = $math.fitAngleToRange($math.getAngle(endPoint), startAngle, endAngle);\r\n\r\n\t\t\t\t\t\tlet arc: number = fillEndAngle - fillStartAngle;\r\n\r\n\t\t\t\t\t\t// clockwise\r\n\t\t\t\t\t\t// this is needed, normalizeAngle doesn't solve it\r\n\t\t\t\t\t\tif (startAngle < endAngle) {\r\n\t\t\t\t\t\t\tif (arc < 0) {\r\n\t\t\t\t\t\t\t\tarc += 360;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// ccw\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tif (arc > 0) {\r\n\t\t\t\t\t\t\t\tarc -= 360;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tangle -= arc / 2;\r\n\r\n\t\t\t\t\t\tpath = $path.moveTo({ x: innerRadius * $math.cos(angle), y: innerRadius * $math.sin(angle) })\r\n\t\t\t\t\t\t\t+ $path.lineTo({ x: radius * $math.cos(angle), y: radius * $math.sin(angle) })\r\n\t\t\t\t\t\t\t+ $path.arcTo(angle, arc, radius)\r\n\t\t\t\t\t\t\t+ $path.lineTo({ x: innerRadius * $math.cos(angle + arc), y: innerRadius * $math.sin(angle + arc) })\r\n\t\t\t\t\t\t\t+ $path.arcTo(angle + arc, -arc, innerRadius);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// line\r\n\t\t\t\tif (!path) {\r\n\t\t\t\t\tpath = $path.moveTo({ x: innerRadius * $math.cos(angle), y: innerRadius * $math.sin(angle) }) + $path.lineTo({ x: radius * $math.cos(angle), y: radius * $math.sin(angle) });\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.lineX.path = path;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)draws the vertical (radial) cursor's line.\r\n\t *\r\n\t * @param point New target point\r\n\t */\r\n\tprotected updateLineY(point: IPoint) {\r\n\t\tif (this.lineY && this.lineY.visible) {\r\n\t\t\tlet startAngle = this.startAngle;\r\n\t\t\tlet endAngle = this.endAngle;\r\n\t\t\tlet truePixelRadius = this.truePixelRadius;\r\n\t\t\tlet radius = $math.fitToRange($math.getDistance(point), 0, this.truePixelRadius);\r\n\t\t\tif ($type.isNumber(radius) && $type.isNumber(startAngle)) {\r\n\t\t\t\tthis.lineY.moveTo({ x: 0, y: 0 });\r\n\r\n\t\t\t\tlet path: string;\r\n\t\t\t\tlet arc: number = endAngle - startAngle;\r\n\r\n\t\t\t\tif (this.yAxis && this.fullWidthLineY) {\r\n\t\t\t\t\t// fill\r\n\t\t\t\t\tlet startPoint: IPoint = this.yAxis.currentItemStartPoint;\r\n\t\t\t\t\tlet endPoint: IPoint = this.yAxis.currentItemEndPoint;\r\n\r\n\t\t\t\t\tif (startPoint && endPoint) {\r\n\t\t\t\t\t\tlet innerRadius: number = $math.fitToRange($math.getDistance(startPoint), 0, truePixelRadius);\r\n\t\t\t\t\t\tradius = $math.fitToRange($math.getDistance(endPoint), 0, truePixelRadius);\r\n\r\n\t\t\t\t\t\tpath = $path.moveTo({ x: radius * $math.cos(startAngle), y: radius * $math.sin(startAngle) }) + $path.arcTo(startAngle, arc, radius);\r\n\t\t\t\t\t\tpath += $path.moveTo({ x: innerRadius * $math.cos(endAngle), y: innerRadius * $math.sin(endAngle) }) + $path.arcTo(endAngle, -arc, innerRadius);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!path) {\r\n\t\t\t\t\tpath = $path.moveTo({ x: radius * $math.cos(startAngle), y: radius * $math.sin(startAngle) }) + $path.arcTo(startAngle, endAngle - startAngle, radius);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.lineY.path = path;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Updates selection dimensions on size change.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic updateSelection(): void {\r\n\t\tif (this._usesSelection) {\r\n\t\t\tlet downPoint: IPoint = this.downPoint;\r\n\r\n\t\t\tif (downPoint) {\r\n\r\n\t\t\t\tlet point: IPoint = this.point;\r\n\r\n\t\t\t\tlet radius: number = this.pixelRadius;\r\n\t\t\t\tlet truePixelRadius: number = this.truePixelRadius;\r\n\t\t\t\tlet innerRadius: number = this.pixelInnerRadius;\r\n\r\n\t\t\t\tlet startAngle: number = Math.min(this.startAngle, this.endAngle);\r\n\t\t\t\tlet endAngle: number = Math.max(this.startAngle, this.endAngle);\r\n\r\n\t\t\t\tlet downAngle: number = $math.fitAngleToRange($math.getAngle(downPoint), startAngle, endAngle);\r\n\t\t\t\tlet angle: number = $math.fitAngleToRange($math.getAngle(point), startAngle, endAngle);\r\n\r\n\t\t\t\tlet downRadius: number = $math.getDistance(downPoint);\r\n\t\t\t\tif (downRadius < truePixelRadius) {\r\n\r\n\t\t\t\t\tlet currentRadius = $math.fitToRange($math.getDistance(point), 0, truePixelRadius);\r\n\r\n\t\t\t\t\tthis._prevAngle = angle;\r\n\r\n\t\t\t\t\tlet path: string = $path.moveTo({ x: 0, y: 0 });\r\n\r\n\t\t\t\t\tlet downSin: number = $math.sin(downAngle);\r\n\t\t\t\t\tlet downCos: number = $math.cos(downAngle);\r\n\r\n\t\t\t\t\tlet sin: number = $math.sin(angle);\r\n\t\t\t\t\tlet cos: number = $math.cos(angle);\r\n\r\n\t\t\t\t\tlet behavior = this.behavior;\r\n\t\t\t\t\tif (behavior == \"zoomX\" || behavior == \"selectX\") {\r\n\t\t\t\t\t\tpath += $path.lineTo({ x: radius * downCos, y: radius * downSin }) + $path.arcTo(downAngle, angle - downAngle, radius) + $path.lineTo({ x: innerRadius * cos, y: innerRadius * sin }) + $path.arcTo(angle, downAngle - angle, innerRadius);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (behavior == \"zoomY\" || behavior == \"selectY\") {\r\n\t\t\t\t\t\tpath = $path.moveTo({ x: currentRadius * $math.cos(startAngle), y: currentRadius * $math.sin(startAngle) }) + $path.arcTo(startAngle, endAngle - startAngle, currentRadius) + $path.lineTo({ x: downRadius * $math.cos(endAngle), y: downRadius * $math.sin(endAngle) }) + $path.arcTo(endAngle, startAngle - endAngle, downRadius) + $path.closePath();\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (behavior == \"zoomXY\") {\r\n\t\t\t\t\t\tpath = $path.moveTo({ x: currentRadius * $math.cos(downAngle), y: currentRadius * $math.sin(downAngle) }) + $path.arcTo(downAngle, angle - downAngle, currentRadius) + $path.lineTo({ x: downRadius * $math.cos(angle), y: downRadius * $math.sin(angle) }) + $path.arcTo(angle, downAngle - angle, downRadius) + $path.closePath();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.selection.path = path;\r\n\t\t\t\t}\r\n\t\t\t\tthis.selection.moveTo({ x: 0, y: 0 });\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Updates cursors current positions.\r\n\t */\r\n\tprotected getPositions() {\r\n\t\t// positions are used by axes or series\r\n\t\tlet chart: RadarChart = this.chart;\r\n\t\tif (chart) {\r\n\t\t\tlet innerRadius = this.pixelInnerRadius;\r\n\t\t\tlet radius: number = this.truePixelRadius - innerRadius;\r\n\r\n\t\t\tlet startAngle: number = this.startAngle;\r\n\t\t\tlet endAngle: number = this.endAngle;\r\n\r\n\t\t\tlet angle: number = $math.fitAngleToRange($math.getAngle(this.point), startAngle, endAngle);\r\n\t\t\tlet xPosition = ((angle - startAngle) / (endAngle - startAngle));\r\n\t\t\tthis.xPosition = xPosition;\r\n\r\n\t\t\tthis.yPosition = $math.fitToRange(($math.getDistance(this.point) - innerRadius) / radius, 0, 1);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Overriding inherited method, so that nothing happens when it's triggered.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tprotected updatePoint(point: IPoint) {\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Updates Cursor's position when axis tooltip changes horizontal position.\r\n\t *\r\n\t * @param event Axis event\r\n\t */\r\n\tprotected handleXTooltipPosition(event: ISpriteEvents[\"positionchanged\"]): void {\r\n\t\tif (this.xAxis.cursorTooltipEnabled) {\r\n\t\t\tlet tooltip: Tooltip = this.xAxis.tooltip;\r\n\t\t\tthis.updateLineX($utils.svgPointToSprite({ x: tooltip.pixelX, y: tooltip.pixelY }, this));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Updates Cursor's position when axis tooltip changes vertical position.\r\n\t *\r\n\t * @todo Description\r\n\t * @param event Axis event\r\n\t */\r\n\tprotected handleYTooltipPosition(event: ISpriteEvents[\"positionchanged\"]): void {\r\n\t\tif (this.yAxis.cursorTooltipEnabled) {\r\n\t\t\tlet tooltip: Tooltip = this.yAxis.tooltip;\r\n\t\t\tthis.updateLineY($utils.svgPointToSprite({ x: tooltip.pixelX, y: tooltip.pixelY }, this));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * needs to be overriden\r\n\t * @ignore\r\n\t */\r\n\tprotected updateLinePositions(point: IPoint) {\r\n\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * [getRanges description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected getRanges(): void {\r\n\t\tlet downPoint = this.downPoint;\r\n\t\tif (downPoint) {\r\n\t\t\tlet upPoint: IPoint = this.upPoint;\r\n\r\n\t\t\tlet chart: RadarChart = this.chart;\r\n\t\t\tif (chart) {\r\n\t\t\t\tlet radius: number = this.pixelRadius;\r\n\t\t\t\tlet startAngle: number = this.startAngle;\r\n\t\t\t\tlet endAngle: number = this.endAngle;\r\n\r\n\t\t\t\tlet downAngle: number = $math.fitAngleToRange($math.getAngle(downPoint), this.startAngle, this.endAngle);\r\n\t\t\t\tlet upAngle: number = $math.fitAngleToRange($math.getAngle(upPoint), this.startAngle, this.endAngle);\r\n\r\n\t\t\t\tlet downRadius = $math.fitToRange($math.getDistance(downPoint), 0, radius);\r\n\t\t\t\tlet upRadius = $math.fitToRange($math.getDistance(upPoint), 0, radius);\r\n\r\n\t\t\t\tlet startX: number = 0;\r\n\t\t\t\tlet endX: number = 1;\r\n\r\n\t\t\t\tlet startY: number = 0;\r\n\t\t\t\tlet endY: number = 1;\r\n\r\n\t\t\t\tlet behavior = this.behavior;\r\n\t\t\t\tif (behavior == \"zoomX\" || behavior == \"selectX\" || behavior == \"zoomXY\" || behavior == \"selectXY\") {\r\n\t\t\t\t\tlet arc: number = endAngle - startAngle;\r\n\t\t\t\t\tstartX = $math.round((downAngle - startAngle) / arc, 5);\r\n\t\t\t\t\tendX = $math.round((upAngle - startAngle) / arc, 5);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (behavior == \"zoomY\" || behavior == \"selectY\" || behavior == \"zoomXY\" || behavior == \"selectXY\") {\r\n\t\t\t\t\tstartY = $math.round(downRadius / radius, 5);\r\n\t\t\t\t\tendY = $math.round(upRadius / radius, 5);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.xRange = { start: Math.min(startX, endX), end: Math.max(startX, endX) };\r\n\t\t\t\tthis.yRange = { start: Math.min(startY, endY), end: Math.max(startY, endY) };\r\n\r\n\t\t\t\tif (this.behavior == \"selectX\" || this.behavior == \"selectY\" || this.behavior == \"selectXY\") {\r\n\t\t\t\t\t// void\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.selection.hide();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Overriding inherited method, so that nothing happens when `updateSize`\r\n\t * is triggered.\r\n\t *\r\n\t * RadarCursor is quite complicated and needs own sizing logic.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic updateSize(): void { }\r\n\r\n\t/**\r\n\t * Outer radius of the cursor's circular line.\r\n\t * Absolute (px) or relative ([[Percent]]).\r\n\t *\r\n\t * @param value Outer radius\r\n\t */\r\n\tpublic set radius(value: number | Percent) {\r\n\t\tthis.setPercentProperty(\"radius\", value, false, false, 10, false);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Outer radius\r\n\t */\r\n\tpublic get radius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"radius\");\r\n\t}\r\n\r\n\t/**\r\n\t * Outer radius of the circular line in pixels.\r\n\t *\r\n\t * @return Outer radius (px)\r\n\t * @readonly\r\n\t */\r\n\tpublic get pixelRadius(): number {\r\n\t\treturn $utils.relativeRadiusToValue(this.radius, this.truePixelRadius);\r\n\t}\r\n\r\n\t/**\r\n\t * [truePixelRadius description]\r\n\t *\r\n\t * @todo Description\r\n\t * @return Outer radius (px)\r\n\t * @readonly\r\n\t */\r\n\tpublic get truePixelRadius(): number {\r\n\t\treturn $utils.relativeToValue(percent(100), $math.min(this.innerWidth / 2, this.innerHeight / 2));\r\n\t}\r\n\r\n\t/**\r\n\t * Inner radius of the cursor's circular line.\r\n\t * Absolute (px) or relative ([[Percent]]).\r\n\t *\r\n\t * @param value Inner radius\r\n\t */\r\n\tpublic set innerRadius(value: number | Percent) {\r\n\t\tthis.setPercentProperty(\"innerRadius\", value, false, false, 10, false);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Inner radius\r\n\t */\r\n\tpublic get innerRadius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"innerRadius\");\r\n\t}\r\n\r\n\t/**\r\n\t * Inner radius of the circular line in pixels.\r\n\t *\r\n\t * @return Inner radius (px)\r\n\t * @readonly\r\n\t */\r\n\tpublic get pixelInnerRadius(): number {\r\n\r\n\t\tlet innerRadius = this.innerRadius;\r\n\r\n\t\tif (innerRadius instanceof Percent) {\r\n\t\t\tinnerRadius = percent(100 * innerRadius.value * this.chart.innerRadiusModifyer);\r\n\t\t}\r\n\r\n\t\treturn $utils.relativeRadiusToValue(innerRadius, this.truePixelRadius) || 0;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\r\n\tprotected fixPoint(point: IPoint): IPoint {\r\n\t\t// overriding xy method\r\n\t\treturn point;\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"RadarCursor\"] = RadarCursor;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/cursors/RadarCursor.ts","/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { AxisFill, IAxisFillProperties, IAxisFillAdapters, IAxisFillEvents } from \"./AxisFill\";\r\nimport { Axis } from \"./Axis\";\r\nimport { Percent, percent } from \"../../core/utils/Percent\";\r\nimport { AxisRendererCircular } from \"./AxisRendererCircular\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $type from \"../../core/utils/Type\";\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[AxisFillCircular]].\r\n */\r\nexport interface IAxisFillCircularProperties extends IAxisFillProperties {\r\n\r\n\t/**\r\n\t * Inner radius. Relative ir absolute.\r\n\t */\r\n\tinnerRadius?: number | Percent;\r\n\r\n\t/**\r\n\t * Outer radius. Relative or absolute.\r\n\t */\r\n\tradius?: number | Percent;\r\n\r\n\t/**\r\n\t * Corner radius for the fill. In pixels.\r\n\t */\r\n\tcornerRadius?: number;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[AxisFillCircular]].\r\n */\r\nexport interface IAxisFillCircularEvents extends IAxisFillEvents { }\r\n\r\n/**\r\n * Defines adapters for [[AxisFillCircular]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IAxisFillCircularAdapters extends IAxisFillAdapters, IAxisFillCircularProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Provides fill element functionality for circular Axes.\r\n *\r\n * @see {@link IAxisFillCircularEvents} for a list of available events\r\n * @see {@link IAxisFillCircularAdapters} for a list of available Adapters\r\n * @todo Needs description\r\n */\r\nexport class AxisFillCircular extends AxisFill {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IAxisFillCircularProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IAxisFillCircularAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IAxisFillCircularEvents;\r\n\r\n\t/**\r\n\t * An SVG path, used to draw fill shape.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t */\r\n\tpublic fillPath: string;\r\n\r\n\t/**\r\n\t * Constructor.\r\n\t *\r\n\t * @param axis Axis\r\n\t */\r\n\tconstructor(axis: Axis) {\r\n\t\tsuper(axis);\r\n\r\n\t\tthis.className = \"AxisFillCircular\";\r\n\r\n\t\tthis.element = this.paper.add(\"path\");\r\n\r\n\t\tthis.radius = percent(100);\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Draws the fill element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic draw(): void {\r\n\t\tsuper.draw();\r\n\t\tif (this.axis) {\r\n\t\t\tlet renderer: AxisRendererCircular = this.axis.renderer;\r\n\t\t\tthis.fillPath = renderer.getPositionRangePath(this.startPosition, this.endPosition, this.radius, $type.hasValue(this.innerRadius) ? this.innerRadius : renderer.innerRadius, this.cornerRadius);\r\n\t\t\tthis.path = this.fillPath;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Inner radius of the fill. Relative ([[Percent]]) or absolute (pixels).\r\n\t *\r\n\t * @param value Inner radius\r\n\t */\r\n\tpublic set innerRadius(value: number | Percent) {\r\n\t\tthis.setPercentProperty(\"innerRadius\", value, true, false, 10, false);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Inner radius\r\n\t */\r\n\tpublic get innerRadius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"innerRadius\");\r\n\t}\r\n\r\n\t/**\r\n\t * Outer radius of the fill. Relative ([[Percent]]) or absolute (pixels).\r\n\t *\r\n\t * @param value Outer radius\r\n\t */\r\n\tpublic set radius(value: number | Percent) {\r\n\t\tthis.setPercentProperty(\"radius\", value, true, false, 10, false);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Outer radius\r\n\t */\r\n\tpublic get radius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"radius\");\r\n\t}\r\n\r\n\t/**\r\n\t * Corner radius for the fill. In pixels.\r\n\t *\r\n\t * @param value Corner radius (px)\r\n\t */\r\n\tpublic set cornerRadius(value: number) {\r\n\t\tthis.setPropertyValue(\"cornerRadius\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Corner radius (px)\r\n\t */\r\n\tpublic get cornerRadius(): number {\r\n\t\treturn this.getPropertyValue(\"cornerRadius\");\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"AxisFillCircular\"] = AxisFillCircular;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/axes/AxisFillCircular.ts","/**\r\n * A module defining functionality for circular axis grid elements.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Grid, IGridProperties, IGridAdapters, IGridEvents } from \"./Grid\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { Percent } from \"../../core/utils/Percent\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[GridCircular]].\r\n */\r\nexport interface IGridCircularProperties extends IGridProperties {\r\n\r\n\t/**\r\n\t * Inner radius of the circular grid. (absolute or relative)\r\n\t */\r\n\tinnerRadius: number | Percent;\r\n\r\n\t/**\r\n\t * Outer radius of the circular grid. (absolute or relative)\r\n\t */\r\n\tradius: number | Percent;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[GridCircular]].\r\n */\r\nexport interface IGridCircularEvents extends IGridEvents { }\r\n\r\n/**\r\n * Defines adapters for [[GridCircular]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IGridCircularAdapters extends IGridAdapters, IGridCircularProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Creates a circular grid element for circular-type axis.\r\n *\r\n * @see {@link IGridCircularEvents} for a list of available events\r\n * @see {@link IGridCircularAdapters} for a list of available Adapters\r\n * @todo Review: container is better, as we'll be able to attach something to the GridCircular, also with 3d charts we might need some additional elements\r\n */\r\nexport class GridCircular extends Grid {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IGridCircularProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IGridCircularAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IGridCircularEvents;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"GridCircular\";\r\n\t\tthis.pixelPerfect = false;\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Inner radius of the circular grid. (absolute or relative)\r\n\t *\r\n\t * @param value Inner radius\r\n\t */\r\n\tpublic set innerRadius(value: number | Percent) {\r\n\t\tthis.setPercentProperty(\"innerRadius\", value, true, false, 10, false);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Inner radius\r\n\t */\r\n\tpublic get innerRadius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"innerRadius\");\r\n\t}\r\n\r\n\t/**\r\n\t * Outer radius of the circular grid. (absolute or relative)\r\n\t *\r\n\t * @param value Outer radius\r\n\t */\r\n\tpublic set radius(value: number | Percent) {\r\n\t\tthis.setPercentProperty(\"radius\", value, true, false, 10, false);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Outer radius\r\n\t */\r\n\tpublic get radius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"radius\");\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"GridCircular\"] = GridCircular;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/axes/GridCircular.ts","/**\r\n * Module, defining Axis Renderer for circular axes.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { AxisRenderer, IAxisRendererProperties, IAxisRendererAdapters, IAxisRendererEvents } from \"./AxisRenderer\";\r\nimport { Axis } from \"./Axis\";\r\nimport { AxisFillCircular } from \"./AxisFillCircular\";\r\nimport { IPoint } from \"../../core/defs/IPoint\";\r\nimport { AxisTick } from \"./AxisTick\";\r\nimport { GridCircular } from \"./GridCircular\";\r\nimport { AxisLabelCircular } from \"./AxisLabelCircular\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { percent, Percent } from \"../../core/utils/Percent\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport * as $type from \"../../core/utils/Type\";\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[AxisRendererCircular]].\r\n */\r\nexport interface IAxisRendererCircularProperties extends IAxisRendererProperties {\r\n\r\n\t/**\r\n\t * Start angle of the circular axis in degrees (0-360).\r\n\t */\r\n\tstartAngle?: number;\r\n\r\n\t/**\r\n\t * End angle of the circular axis in degrees (0-360).\r\n\t */\r\n\tendAngle?: number;\r\n\r\n\t/**\r\n\t * Outer radius of the circular axis.\r\n\t *\r\n\t * Can either be absolute (pixels) or relative ([[Percent]]).\r\n\t */\r\n\tradius?: number | Percent;\r\n\r\n\t/**\r\n\t * Inner radius of the circular axis.\r\n\t *\r\n\t * Can either be absolute (pixels) or relative ([[Percent]]).\r\n\t */\r\n\tinnerRadius?: number | Percent;\r\n\r\n\t/**\r\n\t * Specifies if axis should use it's own start/end angles or the ones set on chart.\r\n\t */\r\n\tuseChartAngles?: boolean;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[AxisRendererCircular]].\r\n */\r\nexport interface IAxisRendererCircularEvents extends IAxisRendererEvents { }\r\n\r\n/**\r\n * Defines adapters for [[AxisRenderer]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IAxisRendererCircularAdapters extends IAxisRendererAdapters, IAxisRendererCircularProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * A renderer for circular axis.\r\n */\r\nexport class AxisRendererCircular extends AxisRenderer {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IAxisRendererCircularProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IAxisRendererCircularAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IAxisRendererCircularEvents;\r\n\r\n\t/**\r\n\t * Defines type of the grid elements.\r\n\t */\r\n\tpublic _gridType: GridCircular;\r\n\r\n\t/**\r\n\t * Defines type for the fill elements.\r\n\t */\r\n\tpublic _fillType: AxisFillCircular;\r\n\r\n\t/**\r\n\t * Defines type for the label elements.\r\n\t */\r\n\tpublic _labelType: AxisLabelCircular;\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic pixelRadiusReal: number = 0;\r\n\r\n\t/**\r\n\t * Constructor.\r\n\t *\r\n\t * @param axis Related axis\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\r\n\t\t// axis.layout = \"none\"; // does not trigger redraw when size changes\r\n\t\tthis.layout = \"none\";\r\n\r\n\t\tthis.className = \"AxisRendererCircular\";\r\n\t\tthis.isMeasured = false;\r\n\t\tthis.startAngle = -90;\r\n\t\tthis.endAngle = 270;\r\n\r\n\t\tthis.useChartAngles = true;\r\n\t\tthis.radius = percent(100);\r\n\r\n\t\tthis.isMeasured = false;\r\n\r\n\t\tthis.grid.template.location = 0;\r\n\r\n\t\tthis.labels.template.location = 0;\r\n\t\tthis.labels.template.radius = 15;\r\n\r\n\t\tthis.ticks.template.location = 0;\r\n\t\tthis.ticks.template.pixelPerfect = false;\r\n\t\tthis.tooltipLocation = 0;\r\n\r\n\t\tthis.line.strokeOpacity = 0;\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t* @ignore\r\n\t*/\r\n\tpublic setAxis(axis: Axis) {\r\n\t\tsuper.setAxis(axis);\r\n\t\taxis.isMeasured = false;\r\n\r\n\t\t// modify x and y so that tooltip would always be on circle\r\n\t\tlet tooltip = axis.tooltip;\r\n\r\n\t\ttooltip.adapter.add(\"dx\", (x, target) => {\r\n\t\t\tlet point: IPoint = $utils.svgPointToSprite({ x: target.pixelX, y: target.pixelY }, this);\r\n\t\t\treturn this.pixelRadius * Math.cos(Math.atan2(point.y, point.x)) - point.x;\r\n\t\t});\r\n\r\n\t\ttooltip.adapter.add(\"dy\", (y, target) => {\r\n\t\t\tlet point: IPoint = $utils.svgPointToSprite({ x: target.pixelX, y: target.pixelY }, this);\r\n\t\t\treturn this.pixelRadius * Math.sin(Math.atan2(point.y, point.x)) - point.y;\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Validates Axis renderer.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validate() {\r\n\t\t// so that radius would be updated\r\n\t\tif (this.chart && this.chart.invalid) {\r\n\t\t\tthis.chart.validate();\r\n\t\t}\r\n\r\n\t\tsuper.validate();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns actual length of the Axis, in pixels.\r\n\t *\r\n\t * @return Length (px)\r\n\t */\r\n\tpublic get axisLength(): number {\r\n\t\treturn 2 * Math.PI * this.pixelRadius;\r\n\t}\r\n\r\n\t/**\r\n\t * Outer radius of the axis.\r\n\t *\r\n\t * Can be absolute (px) or relative ([[Percent]]).\r\n\t *\r\n\t * @param value Outer radius\r\n\t */\r\n\tpublic set radius(value: number | Percent) {\r\n\t\tif (this.setPercentProperty(\"radius\", value, false, false, 10, false)) {\r\n\t\t\tif (this.axis) {\r\n\t\t\t\tthis.axis.invalidate();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Outer radius\r\n\t */\r\n\tpublic get radius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"radius\");\r\n\t}\r\n\r\n\t/**\r\n\t * Outer radius in pixels.\r\n\t *\r\n\t * @return Outer radius (px)\r\n\t */\r\n\tpublic get pixelRadius(): number {\r\n\t\treturn $utils.relativeRadiusToValue(this.radius, this.pixelRadiusReal) || 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Inner radius of the axis.\r\n\t *\r\n\t * Can be absolute (px) or relative ([[Percent]]).\r\n\t *\r\n\t * @param value Inner radius\r\n\t */\r\n\tpublic set innerRadius(value: number | Percent) {\r\n\t\tif (this.setPercentProperty(\"innerRadius\", value, false, false, 10, false)) {\r\n\t\t\tif (this.axis) {\r\n\t\t\t\tthis.axis.invalidate();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Inner radius\r\n\t */\r\n\tpublic get innerRadius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"innerRadius\");\r\n\t}\r\n\r\n\t/**\r\n\t * Specifies if axis should use its own `startAngle` and `endAngle` or\r\n\t * inherit them from relative properties from chart.\r\n\t *\r\n\t * @default false\r\n\t * @param value Use chart's angles\r\n\t */\r\n\tpublic set useChartAngles(value: boolean) {\r\n\t\tthis.setPropertyValue(\"useChartAngles\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Use chart angles\r\n\t */\r\n\tpublic get useChartAngles(): boolean {\r\n\t\treturn this.getPropertyValue(\"useChartAngles\");\r\n\t}\r\n\r\n\t/**\r\n\t * Inner radius in pixels.\r\n\t *\r\n\t * @return Inner radius (px)\r\n\t */\r\n\tpublic get pixelInnerRadius(): number {\r\n\t\treturn $utils.relativeRadiusToValue(this.innerRadius, this.pixelRadiusReal) || 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Converts relative position on axis to point coordinates.\r\n\t *\r\n\t * @param position Position (0-1)\r\n\t * @return Point\r\n\t */\r\n\tpublic positionToPoint(position: number): IPoint {\r\n\t\tlet coordinate: number = this.positionToCoordinate(position);\r\n\t\tlet angle: number = this.startAngle + (this.endAngle - this.startAngle) * coordinate / this.axisLength;\r\n\t\treturn { x: this.pixelRadius * $math.cos(angle), y: this.pixelRadius * $math.sin(angle) };\r\n\t}\r\n\r\n\t/**\r\n\t * Converts relative position (0-1) on axis to angle in degrees (0-360).\r\n\t *\r\n\t * @param position Position (0-1)\r\n\t * @return Angle (0-360)\r\n\t */\r\n\tpublic positionToAngle(position: number): number {\r\n\t\tlet axis: Axis = this.axis;\r\n\r\n\t\tlet arc: number = (this.endAngle - this.startAngle) / (axis.end - axis.start);\r\n\r\n\t\tlet angle: number;\r\n\r\n\t\tif (axis.renderer.inversed) {\r\n\t\t\tangle = this.startAngle + (axis.end - position) * arc;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tangle = this.startAngle + (position - axis.start) * arc;\r\n\t\t}\r\n\r\n\t\treturn $math.round(angle, 3);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates and positions the axis line element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic updateAxisLine() {\r\n\t\tlet radius: number = this.pixelRadius;\r\n\t\tlet startAngle: number = this.startAngle;\r\n\t\tlet endAngle: number = this.endAngle;\r\n\r\n\t\tlet arc: number = endAngle - startAngle;\r\n\t\tthis.line.path = $path.moveTo({ x: radius * $math.cos(startAngle), y: radius * $math.sin(startAngle) }) + $path.arcTo(startAngle, arc, radius, radius);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates and positions a grid element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param grid Grid element\r\n\t * @param position Starting position\r\n\t * @param endPosition End position\r\n\t */\r\n\tpublic updateGridElement(grid: GridCircular, position: number, endPosition: number) {\r\n\t\tposition = position + (endPosition - position) * grid.location;\r\n\r\n\t\tlet point: IPoint = this.positionToPoint(position);\r\n\t\tif (grid.element) {\r\n\t\t\tlet angle: number = $math.DEGREES * Math.atan2(point.y, point.x);\r\n\t\t\tlet radius: number = $utils.relativeRadiusToValue($type.hasValue(grid.radius) ? grid.radius : percent(100), this.pixelRadius);\r\n\r\n\t\t\tlet gridInnerRadius = $utils.relativeRadiusToValue(grid.innerRadius, this.pixelRadius);\r\n\t\t\tgrid.zIndex = 0;\r\n\r\n\t\t\tlet innerRadius: number = $utils.relativeRadiusToValue($type.isNumber(gridInnerRadius) ? gridInnerRadius : this.innerRadius, this.pixelRadius, true);\r\n\t\t\tgrid.path = $path.moveTo({ x: innerRadius * $math.cos(angle), y: innerRadius * $math.sin(angle) }) + $path.lineTo({ x: radius * $math.cos(angle), y: radius * $math.sin(angle) });\r\n\t\t}\r\n\t\tthis.toggleVisibility(grid, position, 0, 1);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates and positions a tick element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param tick Tick element\r\n\t * @param position Starting position\r\n\t * @param endPosition End position\r\n\t */\r\n\tpublic updateTickElement(tick: AxisTick, position: number, endPosition: number) {\r\n\r\n\t\tposition = position + (endPosition - position) * tick.location;\r\n\r\n\t\tlet point: IPoint = this.positionToPoint(position);\r\n\r\n\t\tif (tick.element) {\r\n\t\t\tlet radius: number = this.pixelRadius;\r\n\t\t\tlet angle: number = $math.DEGREES * Math.atan2(point.y, point.x);\r\n\t\t\tlet tickLength: number = tick.length;\r\n\t\t\tif (tick.inside) {\r\n\t\t\t\ttickLength = -tickLength;\r\n\t\t\t}\r\n\t\t\ttick.zIndex = 1;\r\n\t\t\ttick.path = $path.moveTo({ x: radius * $math.cos(angle), y: radius * $math.sin(angle) }) + $path.lineTo({ x: (radius + tickLength) * $math.cos(angle), y: (radius + tickLength) * $math.sin(angle) });\r\n\t\t}\r\n\r\n\t\tthis.toggleVisibility(tick, position, 0, 1);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates and positions a label element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param label Label element\r\n\t * @param position Starting position\r\n\t * @param endPosition Ending position\r\n\t */\r\n\tpublic updateLabelElement(label: this[\"_labelType\"], position: number, endPosition: number, location?: number) {\r\n\r\n\t\tif (!$type.hasValue(location)) {\r\n\t\t\tlocation = label.location;\r\n\t\t}\r\n\r\n\t\tposition = position + (endPosition - position) * location;\r\n\r\n\t\tlabel.fixPosition(this.positionToAngle(position), this.pixelRadius);\r\n\t\tlabel.zIndex = 2;\r\n\r\n\t\tthis.toggleVisibility(label, position, this.minLabelPosition, this.maxLabelPosition);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if point is within bounds of a container.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param point Point coordinates\r\n\t * @return Fits?\r\n\t */\r\n\tpublic fitsToBounds(point: IPoint): boolean {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Start angle of the axis in degrees (0-360).\r\n\t *\r\n\t * @param value Start angle\r\n\t */\r\n\tpublic set startAngle(value: number) {\r\n\t\t// do not normalize angel here!\r\n\t\tif (this.setPropertyValue(\"startAngle\", value)) {\r\n\t\t\tthis.invalidateAxisItems();\r\n\t\t\tif (this.axis) {\r\n\t\t\t\tthis.axis.invalidateSeries();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Start angle\r\n\t */\r\n\tpublic get startAngle(): number {\r\n\t\treturn this.getPropertyValue(\"startAngle\");\r\n\t}\r\n\r\n\t/**\r\n\t * End angle of the axis in degrees (0-360).\r\n\t *\r\n\t * @param value End angle\r\n\t */\r\n\tpublic set endAngle(value: number) {\r\n\t\t// do not normalize angel here!\r\n\t\tif (this.setPropertyValue(\"endAngle\", value)) {\r\n\t\t\tthis.invalidateAxisItems();\r\n\t\t\tif (this.axis) {\r\n\t\t\t\tthis.axis.invalidateSeries();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return End angle\r\n\t */\r\n\tpublic get endAngle(): number {\r\n\t\treturn this.getPropertyValue(\"endAngle\");\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * [getPositionRangePath description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @param startPosition Starting position\r\n\t * @param endPosition End position\r\n\t * @return SVG path\r\n\t */\r\n\tpublic getPositionRangePath(startPosition: number, endPosition: number, radius?: number | Percent, innerRadius?: number | Percent, cornerRadius?: number): string {\r\n\t\tlet path: string = \"\";\r\n\t\tif ($type.isNumber(startPosition) && $type.isNumber(endPosition)) {\r\n\r\n\t\t\tif (!$type.hasValue(radius)) {\r\n\t\t\t\tradius = this.radius;\r\n\t\t\t}\r\n\r\n\t\t\tstartPosition = $math.max(startPosition, this.axis.start);\r\n\t\t\tendPosition = $math.min(endPosition, this.axis.end);\r\n\r\n\t\t\tif (endPosition < startPosition) {\r\n\t\t\t\tendPosition = startPosition;\r\n\t\t\t}\r\n\r\n\t\t\tlet pixelRadius: number = $utils.relativeRadiusToValue(radius, this.pixelRadius);\r\n\t\t\tlet pixelInnerRadius: number = $utils.relativeRadiusToValue(innerRadius, this.pixelRadius, true);\r\n\r\n\t\t\tlet startAngle: number = this.positionToAngle(startPosition);\r\n\t\t\tlet endAngle: number = this.positionToAngle(endPosition);\r\n\r\n\t\t\tlet arc: number = endAngle - startAngle;\r\n\r\n\t\t\tpath = $path.arc(startAngle, arc, pixelRadius, pixelInnerRadius, pixelRadius, cornerRadius);\r\n\t\t}\r\n\r\n\t\treturn path;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new grid element, suitable for this Axis Renderer type.\r\n\t *\r\n\t * @return Grid element\r\n\t */\r\n\tpublic createGrid(): this[\"_gridType\"] {\r\n\t\treturn new GridCircular();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new fill element, suitable for this Axis Renderer type.\r\n\t *\r\n\t * @return Fill element\r\n\t */\r\n\tpublic createFill(axis: Axis): this[\"_fillType\"] {\r\n\t\treturn new AxisFillCircular(axis);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new label element, suitable for this Axis Renderer type.\r\n\t *\r\n\t * @return Label element\r\n\t */\r\n\tpublic createLabel(): this[\"_labelType\"] {\r\n\t\treturn new AxisLabelCircular();\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Converts a point at specific coordinates to a relative position (0-1)\r\n\t * on the axis.\r\n\t *\r\n\t * @param point Point\r\n\t * @return Position (0-1)\r\n\t */\r\n\tpublic pointToPosition(point: IPoint) {\r\n\t\tlet angle = $math.fitAngleToRange($math.getAngle(point), this.startAngle, this.endAngle);\r\n\t\treturn this.coordinateToPosition((angle - this.startAngle) / 360 * this.axisLength);\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"AxisRendererCircular\"] = AxisRendererCircular;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/axes/AxisRendererCircular.ts","/**\r\n * Module, defining Axis Renderer for radial axes.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { AxisRendererY, IAxisRendererYProperties, IAxisRendererYAdapters, IAxisRendererYEvents } from \"./AxisRendererY\";\r\nimport { Axis } from \"./Axis\";\r\nimport { AxisTick } from \"./AxisTick\";\r\nimport { CategoryAxis } from \"./CategoryAxis\";\r\nimport { RadarChart } from \"../types/RadarChart\";\r\nimport { IPoint } from \"../../core/defs/IPoint\";\r\nimport { Grid } from \"./Grid\";\r\nimport { AxisBreak } from \"./AxisBreak\";\r\nimport { WavedCircle } from \"../../core/elements/WavedCircle\";\r\nimport { PointerOrientation } from \"../../core/elements/Tooltip\";\r\nimport { MutableValueDisposer } from \"../../core/utils/Disposer\";\r\nimport { Percent, percent } from \"../../core/utils/Percent\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport * as $type from \"../../core/utils/Type\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[AxisRendererRadial]].\r\n */\r\nexport interface IAxisRendererRadialProperties extends IAxisRendererYProperties {\r\n\r\n\t/**\r\n\t * Start angle of the radial axis in degrees. (0-360)\r\n\t */\r\n\tstartAngle?: number;\r\n\r\n\t/**\r\n\t * End angle of the radial axis in degrees. (0-360)\r\n\t */\r\n\tendAngle?: number;\r\n\r\n\t/**\r\n\t * A grid type to display: \"circles\" or \"polygons\".\r\n\t *\r\n\t * @default \"circles\"\r\n\t */\r\n\tgridType?: \"circles\" | \"polygons\"; //@todo: move it to GridRadial?\r\n\r\n\t/**\r\n\t * An angle of the axis in degrees. (0-360)\r\n\t */\r\n\taxisAngle?: number;\r\n\r\n\r\n\t/**\r\n\t * Outer radius of the radial axis.\r\n\t *\r\n\t * Can either be absolute (pixels) or relative ([[Percent]]).\r\n\t */\r\n\tradius?: number | Percent;\r\n\r\n\t/**\r\n\t * Inner radius of the radial axis.\r\n\t *\r\n\t * Can either be absolute (pixels) or relative ([[Percent]]).\r\n\t */\r\n\tinnerRadius?: number | Percent;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[AxisRendererRadial]].\r\n */\r\nexport interface IAxisRendererRadialEvents extends IAxisRendererYEvents { }\r\n\r\n/**\r\n * Defines adapters for [[AxisRenderer]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IAxisRendererRadialAdapters extends IAxisRendererYAdapters, IAxisRendererRadialProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * A renderer for radial axis.\r\n */\r\nexport class AxisRendererRadial extends AxisRendererY {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IAxisRendererRadialProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IAxisRendererRadialAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IAxisRendererRadialEvents;\r\n\r\n\t/**\r\n\t * A related chart.\r\n\t */\r\n\tprotected _chart = new MutableValueDisposer();\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic pixelRadiusReal: number = 0;\r\n\r\n\t/**\r\n\t * Constructor.\r\n\t *\r\n\t * @param axis Related axis\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"AxisRendererRadial\";\r\n\t\tthis.isMeasured = false;\r\n\t\tthis.startAngle = -90;\r\n\t\tthis.endAngle = 270;\r\n\t\tthis.minGridDistance = 30;\r\n\t\tthis.gridType = \"circles\";\r\n\t\tthis.axisAngle = -90;\r\n\t\tthis.isMeasured = false;\r\n\t\tthis.layout = \"none\";\r\n\r\n\t\tthis.radius = percent(100);\r\n\r\n\t\tthis.line.strokeOpacity = 0;\r\n\r\n\t\tthis.labels.template.horizontalCenter = \"middle\";\r\n\r\n\t\tthis._disposers.push(this._chart);\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Validates Axis renderer.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validate() {\r\n\t\t// so that radius would be updated\r\n\t\tif (this.chart && this.chart.invalid) {\r\n\t\t\tthis.chart.validate();\r\n\t\t}\r\n\r\n\t\tsuper.validate();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns actual length of the Axis, in pixels.\r\n\t *\r\n\t * @return Length (px)\r\n\t */\r\n\tpublic get axisLength(): number {\r\n\t\treturn this.pixelRadius - this.pixelInnerRadius;\r\n\t}\r\n\r\n\t/**\r\n\t * Outer radius of the axis.\r\n\t *\r\n\t * Can be absolute (px) or relative ([[Percent]]).\r\n\t *\r\n\t * @param value Outer radius\r\n\t */\r\n\tpublic set radius(value: number | Percent) {\r\n\t\tthis.setPercentProperty(\"radius\", value, false, false, 10, false);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Outer radius\r\n\t */\r\n\tpublic get radius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"radius\");\r\n\t}\r\n\r\n\t/**\r\n\t * Outer radius in pixels.\r\n\t *\r\n\t * @return Outer radius (px)\r\n\t */\r\n\tpublic get pixelRadius(): number {\r\n\t\treturn $utils.relativeRadiusToValue(this.radius, this.pixelRadiusReal) || 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Inner radius of the axis.\r\n\t *\r\n\t * Can be absolute (px) or relative ([[Percent]]).\r\n\t *\r\n\t * @param value Outer radius\r\n\t */\r\n\tpublic set innerRadius(value: number | Percent) {\r\n\t\tthis.setPercentProperty(\"innerRadius\", value, false, false, 10, false)\r\n\t}\r\n\r\n\t/**\r\n\t * @return Inner radius\r\n\t */\r\n\tpublic get innerRadius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"innerRadius\");\r\n\t}\r\n\r\n\t/**\r\n\t * Inner radius in pixels.\r\n\t *\r\n\t * @return Inner radius (px)\r\n\t */\r\n\tpublic get pixelInnerRadius(): number {\r\n\t\treturn $utils.relativeRadiusToValue(this.innerRadius, this.pixelRadiusReal) || 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Chart, associated with the Axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param value Chart\r\n\t */\r\n\tpublic set chart(chart: RadarChart) {\r\n\t\tthis._chart.set(chart, null);\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore Exclude from docs\r\n\t * @return Chart\r\n\t */\r\n\tpublic get chart(): RadarChart {\r\n\t\treturn this._chart.get();\r\n\t}\r\n\r\n\t/**\r\n\t * Converts relative position on axis to point coordinates.\r\n\t *\r\n\t * @param position Position (0-1)\r\n\t * @return Point\r\n\t */\r\n\tpublic positionToPoint(position: number): IPoint {\r\n\t\tlet radius: number = $math.fitToRange(this.positionToCoordinate(position), 0, Infinity);\r\n\t\treturn { x: radius * $math.cos(this.axisAngle), y: radius * $math.sin(this.axisAngle) };\r\n\t}\r\n\r\n\t/**\r\n\t * Updates and positions the axis line element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic updateAxisLine() {\r\n\t\tthis.line.path = $path.moveTo({ x: this.pixelInnerRadius * $math.cos(this.axisAngle), y: this.pixelInnerRadius * $math.sin(this.axisAngle) }) + $path.lineTo({ x: this.pixelRadius * $math.cos(this.axisAngle), y: this.pixelRadius * $math.sin(this.axisAngle) });\r\n\r\n\t\tlet title = this.axis.title;\r\n\t\ttitle.valign = \"none\";\r\n\t\ttitle.horizontalCenter = \"middle\";\r\n\t\ttitle.verticalCenter = \"bottom\";\r\n\t\ttitle.y = - this.axisLength / 2;\r\n\t\tlet rotation: number = 90;\r\n\t\tif (this.opposite) {\r\n\t\t\tif (!this.inside) {\r\n\t\t\t\trotation = -90;\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif (this.inside) {\r\n\t\t\t\trotation = -90;\r\n\t\t\t}\r\n\t\t}\r\n\t\ttitle.rotation = rotation;\r\n\t}\r\n\r\n\t/**\r\n\t * Updates and positions a grid element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param grid Grid element\r\n\t * @param position Starting position\r\n\t * @param endPosition End position\r\n\t */\r\n\tpublic updateGridElement(grid: Grid, position: number, endPosition: number) {\r\n\t\tposition = position + (endPosition - position) * grid.location;\r\n\t\tlet point: IPoint = this.positionToPoint(position);\r\n\t\tlet path: string;\r\n\t\tlet radius: number = $math.getDistance(point);\r\n\t\tlet startAngle: number = this.startAngle;\r\n\t\tlet endAngle: number = this.endAngle;\r\n\r\n\t\tif ($type.isNumber(radius) && grid.element) {\r\n\t\t\tlet chart = this.chart;\r\n\t\t\tlet xAxis = chart.xAxes.getIndex(0);\r\n\t\t\tlet count = chart.dataItems.length;\r\n\t\t\tlet series = chart.series.getIndex(0);\r\n\r\n\t\t\t// polygons are only possible if x axis is present\r\n\t\t\t// @todo: review this\r\n\t\t\tif (this.gridType == \"polygons\" && count > 0 && series && xAxis && xAxis instanceof CategoryAxis) {\r\n\t\t\t\tlet gridLocation = xAxis.renderer.grid.template.location;\r\n\r\n\t\t\t\tlet angle: number = xAxis.getAngle(series.dataItems.getIndex(0), \"categoryX\", gridLocation);\r\n\t\t\t\tpath = $path.moveTo({ x: radius * $math.cos(angle), y: radius * $math.sin(angle) });\r\n\t\t\t\tlet count: number = chart.dataItems.length;\r\n\r\n\t\t\t\tfor (let i = 1; i < count; i++) {\r\n\t\t\t\t\tangle = xAxis.getAngle(series.dataItems.getIndex(i), \"categoryX\", gridLocation);\r\n\t\t\t\t\tpath += $path.lineTo({ x: radius * $math.cos(angle), y: radius * $math.sin(angle) });\r\n\t\t\t\t}\r\n\r\n\t\t\t\tangle = xAxis.getAngle(series.dataItems.getIndex(count - 1), \"categoryX\", xAxis.renderer.cellEndLocation);\r\n\t\t\t\tpath += $path.lineTo({ x: radius * $math.cos(angle), y: radius * $math.sin(angle) });\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tpath = $path.moveTo({ x: radius * $math.cos(startAngle), y: radius * $math.sin(startAngle) }) + $path.arcTo(startAngle, endAngle - startAngle, radius, radius);\r\n\t\t\t}\r\n\t\t\tgrid.path = path;\r\n\t\t}\r\n\r\n\t\tthis.toggleVisibility(grid, position, 0, 1);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates and positions a label element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param label Label element\r\n\t * @param position Starting position\r\n\t * @param endPosition Ending position\r\n\t */\r\n\tpublic updateLabelElement(label: this[\"_labelType\"], position: number, endPosition: number, location?: number) {\r\n\r\n\t\tif (!$type.hasValue(location)) {\r\n\t\t\tlocation = label.location;\r\n\t\t}\r\n\r\n\t\tposition = position + (endPosition - position) * location;\r\n\r\n\t\tlet point: IPoint = this.positionToPoint(position);\r\n\r\n\t\tthis.positionItem(label, point);\r\n\t\tthis.toggleVisibility(label, position, this.minLabelPosition, this.maxLabelPosition);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates and positions the base grid element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic updateBaseGridElement(): void {\r\n\t\t// @todo? zero grid for radar chart, is it needed?\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if point is within bounds of a container.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param point Point coordinates\r\n\t * @return Fits?\r\n\t */\r\n\tpublic fitsToBounds(point: IPoint): boolean {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t * Start angle of the axis in degrees. (0-360)\r\n\t *\r\n\t * @param value Start angle\r\n\t */\r\n\tpublic set startAngle(value: number) {\r\n\t\t// do not normalize angle here!\r\n\t\tif (this.setPropertyValue(\"startAngle\", value)) {\r\n\t\t\tthis.invalidateAxisItems();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Start angle\r\n\t */\r\n\tpublic get startAngle(): number {\r\n\t\treturn this.getPropertyValue(\"startAngle\");\r\n\t}\r\n\r\n\t/**\r\n\t * End angle of the axis in degrees. (0-360)\r\n\t *\r\n\t * @param value End angle\r\n\t */\r\n\tpublic set endAngle(value: number) {\r\n\t\t// do not normalize angel here!\r\n\t\tif (this.setPropertyValue(\"endAngle\", value)) {\r\n\t\t\tthis.invalidateAxisItems();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return End angle\r\n\t */\r\n\tpublic get endAngle(): number {\r\n\t\treturn this.getPropertyValue(\"endAngle\");\r\n\t}\r\n\r\n\t/**\r\n\t * Angle of the radial axis in degrees. (0-360)\r\n\t *\r\n\t * @param value Axis angle\r\n\t */\r\n\tpublic set axisAngle(value: number) {\r\n\t\tthis.setPropertyValue(\"axisAngle\", $math.normalizeAngle(value));\r\n\t\tthis.invalidateAxisItems();\r\n\t}\r\n\r\n\t/**\r\n\t * @return Axis angle\r\n\t */\r\n\tpublic get axisAngle(): number {\r\n\t\treturn this.getPropertyValue(\"axisAngle\");\r\n\t\t//return $math.fitToRange(this.getPropertyValue(\"axisAngle\"), this.startAngle, this.endAngle); // no good, as less flexible\r\n\t}\r\n\r\n\t// polygons grid type is only possible under these conditions: xAxis is available and it is CategoryAxis, also at least one series should be added to a chart\r\n\r\n\t/**\r\n\t * Grid type for radial axis.\r\n\t *\r\n\t * A grid on radia axis can either be perfect circles (\"circles\"), or\r\n\t * straight lines (\"polygons\").\r\n\t *\r\n\t * @default \"circles\"\r\n\t * @param value Grid type\r\n\t */\r\n\tpublic set gridType(value: \"circles\" | \"polygons\") {\r\n\t\tthis.setPropertyValue(\"gridType\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * Grid type\r\n\t */\r\n\tpublic get gridType(): \"circles\" | \"polygons\" {\r\n\t\tlet axis: Axis = this.chart.xAxes.getIndex(0);\r\n\t\tif (axis instanceof CategoryAxis) {\r\n\t\t\treturn this.getPropertyValue(\"gridType\");\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn \"circles\";\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * [getPositionRangePath description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @param startPosition Starting position\r\n\t * @param endPosition End position\r\n\t * @return SVG path\r\n\t */\r\n\tpublic getPositionRangePath(startPosition: number, endPosition: number): string {\r\n\t\tlet pixelInnerRadius = this.pixelInnerRadius;\r\n\t\tlet pixelRadius = this.axisLength + pixelInnerRadius;\r\n\t\tlet innerRadius: number = $math.fitToRange(this.positionToCoordinate(startPosition), pixelInnerRadius, pixelRadius);\r\n\t\tlet radius: number = $math.fitToRange(this.positionToCoordinate(endPosition), pixelInnerRadius, pixelRadius);\r\n\r\n\t\t//let angleCount: number = this.angleCount;\r\n\t\tlet startAngle: number = this.startAngle;\r\n\t\tlet endAngle: number = this.endAngle;\r\n\t\tlet arc: number = endAngle - startAngle;\r\n\r\n\t\tlet path: string;\r\n\r\n\t\tlet chart = this.chart;\r\n\t\tlet xAxis = chart.xAxes.getIndex(0);\r\n\t\tlet count = chart.dataItems.length;\r\n\t\tlet series = chart.series.getIndex(0);\r\n\r\n\t\t// polygons are only possible if x axis is present\r\n\t\t// @todo: review this\r\n\t\tif (this.gridType == \"polygons\" && count > 0 && series && xAxis && xAxis instanceof CategoryAxis) {\r\n\t\t\tlet gridLocation = xAxis.renderer.grid.template.location;\r\n\r\n\t\t\tlet angle: number = xAxis.getAngle(series.dataItems.getIndex(0), \"categoryX\", gridLocation);\r\n\t\t\tpath = $path.moveTo({ x: radius * $math.cos(angle), y: radius * $math.sin(angle) });\r\n\t\t\tlet count: number = chart.dataItems.length;\r\n\r\n\t\t\tfor (let i = 1; i < count; i++) {\r\n\t\t\t\tangle = xAxis.getAngle(series.dataItems.getIndex(i), \"categoryX\", gridLocation);\r\n\t\t\t\tpath += $path.lineTo({ x: radius * $math.cos(angle), y: radius * $math.sin(angle) });\r\n\t\t\t}\r\n\r\n\t\t\tangle = xAxis.getAngle(series.dataItems.getIndex(count - 1), \"categoryX\", xAxis.renderer.cellEndLocation);\r\n\t\t\tpath += $path.lineTo({ x: radius * $math.cos(angle), y: radius * $math.sin(angle) });\r\n\r\n\t\t\tpath += $path.moveTo({ x: innerRadius * $math.cos(angle), y: innerRadius * $math.sin(angle) })\r\n\r\n\t\t\tfor (let i = count - 1; i >= 0; i--) {\r\n\t\t\t\tangle = xAxis.getAngle(series.dataItems.getIndex(i), \"categoryX\", gridLocation);\r\n\t\t\t\tpath += $path.lineTo({ x: innerRadius * $math.cos(angle), y: innerRadius * $math.sin(angle) });\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tpath = $path.arc(startAngle, arc, radius, innerRadius);\r\n\t\t}\r\n\t\treturn path;\r\n\t}\r\n\r\n\t/**\r\n\t * Updates and positions an axis break element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param axisBreak Break element\r\n\t */\r\n\tpublic updateBreakElement(axisBreak: AxisBreak) {\r\n\t\t// @todo: someday we might need axis break when gridType is polygons\r\n\r\n\t\tlet startLine: WavedCircle = axisBreak.startLine;\r\n\t\tlet endLine: WavedCircle = axisBreak.endLine;\r\n\t\tlet fillShape: WavedCircle = axisBreak.fillShape;\r\n\r\n\t\tlet startPoint: IPoint = axisBreak.startPoint;\r\n\t\tlet endPoint: IPoint = axisBreak.endPoint;\r\n\r\n\t\tstartLine.radius = Math.abs(startPoint.y);\r\n\t\tendLine.radius = Math.abs(endPoint.y);\r\n\t\tfillShape.radius = Math.abs(endPoint.y);\r\n\t\tfillShape.innerRadius = Math.abs(startPoint.y);\r\n\t}\r\n\r\n\t/**\r\n\t * Creates visual elements for and axis break.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param axisBreak Axis break\r\n\t */\r\n\tpublic createBreakSprites(axisBreak: AxisBreak): void {\r\n\t\taxisBreak.startLine = new WavedCircle();\r\n\t\taxisBreak.endLine = new WavedCircle();\r\n\t\taxisBreak.fillShape = new WavedCircle();\r\n\t}\r\n\r\n\t/**\r\n\t * Updates some of the Axis tooltip's visual properties, related to\r\n\t * rendering of the Axis.\r\n\t *\r\n\t * @todo Description (review)\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic updateTooltip(): void {\r\n\t\tlet axis: Axis = this.axis;\r\n\t\tif (axis) {\r\n\r\n\t\t\tlet bigNum: number = 4000;\r\n\t\t\tlet bbx: number = -4000;\r\n\t\t\tlet bby: number = -4000;\r\n\t\t\tlet bbw: number = bigNum * 2;\r\n\t\t\tlet bbh: number = bigNum * 2;\r\n\t\t\tlet axisAngle: number = this.axisAngle;\r\n\t\t\tif (axisAngle < 0) {\r\n\t\t\t\taxisAngle += 360;\r\n\t\t\t}\r\n\t\t\tlet tooltipOrientation: PointerOrientation = \"vertical\";\r\n\t\t\tif ((axisAngle > 45 && axisAngle < 135) || (axisAngle > 225 && axisAngle < 315)) {\r\n\t\t\t\ttooltipOrientation = \"horizontal\";\r\n\t\t\t}\r\n\t\t\tthis.axis.updateTooltip(tooltipOrientation, { x: bbx, y: bby, width: bbw, height: bbh });\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Updates and positions a tick element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param tick Tick element\r\n\t * @param position Position\r\n\t */\r\n\tpublic updateTickElement(tick: AxisTick, position: number): void {\r\n\t\tlet point: IPoint = this.positionToPoint(position);\r\n\t\tif (tick.element) {\r\n\t\t\tlet angle: number = $math.normalizeAngle(this.axisAngle + 90);\r\n\t\t\tif (angle / 90 != Math.round(angle / 90)) {\r\n\t\t\t\ttick.pixelPerfect = false;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\ttick.pixelPerfect = true;\r\n\t\t\t}\r\n\t\t\tlet tickLength = -tick.length;\r\n\t\t\tif (tick.inside) {\r\n\t\t\t\ttickLength *= -1;\r\n\t\t\t}\r\n\t\t\ttick.path = $path.moveTo({ x: 0, y: 0 }) + $path.lineTo({ x: tickLength * $math.cos(angle), y: tickLength * $math.sin(angle) });\r\n\t\t}\r\n\t\tthis.positionItem(tick, point);\r\n\r\n\t\tthis.toggleVisibility(tick, position, 0, 1);\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a position on the axis to a coordinate in pixels.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param position Position (0-1)\r\n\t * @return Coordinate (px)\r\n\t */\r\n\tpublic positionToCoordinate(position: number): number {\r\n\t\tlet coordinate: number;\r\n\t\tlet axis: Axis = this.axis;\r\n\t\tlet axisFullLength = axis.axisFullLength;\r\n\t\tlet innerRadius = this.pixelInnerRadius;\r\n\r\n\t\tif (axis.renderer.inversed) {\r\n\t\t\tcoordinate = (axis.end - position) * axisFullLength + innerRadius;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tcoordinate = (position - axis.start) * axisFullLength + innerRadius;\r\n\t\t}\r\n\r\n\t\treturn $math.round(coordinate, 1);\r\n\t}\r\n\r\n\t/**\r\n\t * Converts a point at specific coordinates to a relative position (0-1)\r\n\t * on the axis.\r\n\t *\r\n\t * @param point Point\r\n\t * @return Position (0-1)\r\n\t */\r\n\tpublic pointToPosition(point: IPoint) {\r\n\t\tlet coordinate = ($math.getDistance(point) - this.pixelInnerRadius);\r\n\t\treturn this.coordinateToPosition(coordinate);\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"AxisRendererRadial\"] = AxisRendererRadial;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/axes/AxisRendererRadial.ts","/**\r\n * Radar chart module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { XYChart, IXYChartProperties, IXYChartDataFields, IXYChartAdapters, IXYChartEvents, XYChartDataItem } from \"./XYChart\";\r\nimport { percent, Percent } from \"../../core/utils/Percent\";\r\nimport { RadarSeries } from \"../series/RadarSeries\";\r\nimport { RadarColumnSeries } from \"../series/RadarColumnSeries\";\r\nimport { Container } from \"../../core/Container\";\r\nimport { IRectangle } from \"../../core/defs/IRectangle\";\r\nimport { Circle } from \"../../core/elements/Circle\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { RadarCursor } from \"../cursors/RadarCursor\";\r\nimport { Axis } from \"../axes/Axis\";\r\nimport { AxisRenderer } from \"../axes/AxisRenderer\";\r\nimport { AxisRendererCircular } from \"../axes/AxisRendererCircular\";\r\nimport { AxisRendererRadial } from \"../axes/AxisRendererRadial\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[RadarChart]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class RadarChartDataItem extends XYChartDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: RadarChart;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"RadarChartDataItem\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[RadarChart]].\r\n */\r\nexport interface IRadarChartDataFields extends IXYChartDataFields { }\r\n\r\n/**\r\n * Defines properties for [[RadarChart]].\r\n */\r\nexport interface IRadarChartProperties extends IXYChartProperties {\r\n\r\n\t/**\r\n\t * Radius of the Radar face. Absolute or relative.\r\n\t */\r\n\tradius?: number | Percent;\r\n\r\n\t/**\r\n\t * Inner radius of the Radar face. Percent value is relative to radius.\r\n\t *\r\n\t * @todo review desc\r\n\t */\r\n\tinnerRadius?: number | Percent;\r\n\r\n\t/**\r\n\t * An angle radar face starts on. (degrees)\r\n\t *\r\n\t * @default -90\r\n\t */\r\n\tstartAngle?: number;\r\n\r\n\t/**\r\n\t * An angle radar face ends on. (degrees)\r\n\t *\r\n\t * @default 270\r\n\t */\r\n\tendAngle?: number;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[RadarChart]].\r\n */\r\nexport interface IRadarChartEvents extends IXYChartEvents { }\r\n\r\n/**\r\n * Defines adapters for [[RadarChart]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IRadarChartAdapters extends IXYChartAdapters, IRadarChartProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Creates a Radar chart.\r\n *\r\n * @see {@link IRadarChartEvents} for a list of available Events\r\n * @see {@link IRadarChartAdapters} for a list of available Adapters\r\n * @see {@link https://www.amcharts.com/docs/v4/chart-types/radar-chart/} for documentation\r\n * @important\r\n */\r\nexport class RadarChart extends XYChart {\r\n\r\n\t/**\r\n\t * Defines available data fields.\r\n\t */\r\n\tpublic _dataFields: IRadarChartDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IRadarChartProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IRadarChartAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IRadarChartEvents;\r\n\r\n\t/**\r\n\t * Defines a type of series that this chart uses.\r\n\t */\r\n\tpublic _seriesType: RadarSeries | RadarColumnSeries;\r\n\r\n\t/**\r\n\t * Defines X axis renderer type.\r\n\t */\r\n\tpublic _xAxisRendererType: AxisRendererCircular;\r\n\r\n\t/**\r\n\t * Defines Y axis renderer type.\r\n\t */\r\n\tpublic _yAxisRendererType: AxisRendererRadial;\r\n\r\n\t/**\r\n\t * Defines X axis renderer type.\r\n\t */\r\n\tprotected _axisRendererX: typeof AxisRendererCircular = AxisRendererCircular;\r\n\r\n\t/**\r\n\t * Defines Y axis renderer type.\r\n\t */\r\n\tprotected _axisRendererY: typeof AxisRendererRadial = AxisRendererRadial;\r\n\r\n\t/**\r\n\t * [_cursor description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tpublic _cursor: RadarCursor;\r\n\r\n\t/**\r\n\t * A container that holds Radar visual elements.\r\n\t */\r\n\tpublic radarContainer: Container;\r\n\r\n\r\n\t/**\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tprotected _pixelInnerRadius: number;\r\n\r\n\r\n\t/**\r\n\t * used by cursor. We adjust innerradius if start and end angle are close to each other\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic innerRadiusModifyer: number = 1;\r\n\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"RadarChart\";\r\n\r\n\t\tthis.startAngle = -90;\r\n\t\tthis.endAngle = 270;\r\n\r\n\t\tthis.radius = percent(80);\r\n\t\tthis.innerRadius = 0;\r\n\r\n\t\tlet radarContainer = this.plotContainer.createChild(Container);\r\n\t\tradarContainer.shouldClone = false;\r\n\t\tradarContainer.layout = \"absolute\";\r\n\t\tradarContainer.align = \"center\";\r\n\t\tradarContainer.valign = \"middle\";\r\n\r\n\t\tthis.seriesContainer.parent = radarContainer;\r\n\t\tthis.radarContainer = radarContainer;\r\n\t\tthis.bulletsContainer.parent = radarContainer;\r\n\r\n\t\tthis._cursorContainer = radarContainer;\r\n\r\n\t\tthis._bulletMask = radarContainer.createChild(Circle);\r\n\t\tthis._bulletMask.shouldClone = false;\r\n\t\tthis._bulletMask.element = this.paper.add(\"path\");\r\n\t\tthis._bulletMask.opacity = 0;\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Sets defaults that instantiate some objects that rely on parent, so they\r\n\t * cannot be set in constructor.\r\n\t */\r\n\tprotected applyInternalDefaults(): void {\r\n\r\n\t\tsuper.applyInternalDefaults();\r\n\r\n\t\t// Add a default screen reader title for accessibility\r\n\t\t// This will be overridden in screen reader if there are any `titles` set\r\n\t\tif (!$type.hasValue(this.readerTitle)) {\r\n\t\t\tthis.readerTitle = this.language.translate(\"Radar chart\");\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Decorates Axis with required properties for this chart.\r\n\t *\r\n\t * @param axis Axis\r\n\t */\r\n\tprotected processAxis(axis: Axis): void {\r\n\t\tsuper.processAxis(axis);\r\n\t\tlet renderer: AxisRenderer = axis.renderer;\r\n\t\trenderer.gridContainer.parent = renderer;\r\n\t\trenderer.breakContainer.parent = renderer;\r\n\t\taxis.parent = this.radarContainer;\r\n\t\trenderer.toBack();\r\n\t}\r\n\r\n\t/**\r\n\t * Updates all X axes after range change event.\r\n\t */\r\n\tprotected handleXAxisRangeChange() {\r\n\t\tsuper.handleXAxisRangeChange();\r\n\t\t$iter.each(this.yAxes.iterator(), (axis) => {\r\n\t\t\taxis.invalidate();\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Updates all Y axes after range change event.\r\n\t */\r\n\tprotected handleYAxisRangeChange() {\r\n\t\tsuper.handleYAxisRangeChange();\r\n\t\t$iter.each(this.xAxes.iterator(), (axis) => {\r\n\t\t\taxis.invalidate();\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Creates and returns a new Cursor, of type suitable for RadarChart.\r\n\t *\r\n\t * @return Cursor\r\n\t */\r\n\tprotected createCursor(): this[\"_cursor\"] {\r\n\t\treturn new RadarCursor();\r\n\t}\r\n\r\n\t/**\r\n\t * Processes JSON-based config before it is applied to the object.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param config Config\r\n\t */\r\n\tpublic processConfig(config?: { [index: string]: any }): void {\r\n\r\n\t\tif (config) {\r\n\r\n\t\t\t// Set up cursor\r\n\t\t\tif ($type.hasValue(config.cursor) && !$type.hasValue(config.cursor.type)) {\r\n\t\t\t\tconfig.cursor.type = \"RadarCursor\";\r\n\t\t\t}\r\n\r\n\t\t\t// Set up series\r\n\t\t\tif ($type.hasValue(config.series) && $type.isArray(config.series)) {\r\n\t\t\t\tfor (let i = 0, len = config.series.length; i < len; i++) {\r\n\t\t\t\t\tconfig.series[i].type = config.series[i].type || \"RadarSeries\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Set up axes\r\n\t\t\t/*if ($type.hasValue(config.xAxes) && $type.isArray(config.xAxes)) {\r\n\t\t\t\tfor (let i = 0, len = config.xAxes.length; i < len; i++) {\r\n\t\t\t\t\tconfig.xAxes[i].type = config.xAxes[i].type || \"AxisRendererCircular\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif ($type.hasValue(config.yAxes) && $type.isArray(config.yAxes)) {\r\n\t\t\t\tfor (let i = 0, len = config.yAxes.length; i < len; i++) {\r\n\t\t\t\t\tconfig.yAxes[i].type = config.yAxes[i].type || \"AxisRendererRadial\";\r\n\t\t\t\t}\r\n\t\t\t}*/\r\n\r\n\t\t}\r\n\r\n\t\tsuper.processConfig(config);\r\n\t}\r\n\r\n\t/**\r\n\t * Does calculations before drawing the chart.\r\n\t */\r\n\tprotected beforeDraw(): void {\r\n\t\tsuper.beforeDraw();\r\n\r\n\t\tlet plotContainer = this.plotContainer;\r\n\r\n\t\tlet rect = $math.getArcRect(this.startAngle, this.endAngle, 1);\r\n\t\tlet innerRect: IRectangle = { x: 0, y: 0, width: 0, height: 0 };\r\n\r\n\t\tlet wr = plotContainer.innerWidth / rect.width;\r\n\t\tlet hr = plotContainer.innerHeight / rect.height;\r\n\r\n\t\tlet innerRadius = this.innerRadius;\r\n\r\n\t\tif (innerRadius instanceof Percent) {\r\n\t\t\tlet value = innerRadius.value;\r\n\t\t\tlet mr = Math.min(wr, hr);\r\n\t\t\tvalue = Math.max(mr * value, mr - Math.min(plotContainer.innerHeight, plotContainer.innerWidth)) / mr;\r\n\t\t\tinnerRect = $math.getArcRect(this.startAngle, this.endAngle, value);\r\n\r\n\t\t\tthis.innerRadiusModifyer = value / innerRadius.value;\r\n\t\t\tinnerRadius = percent(value * 100);\r\n\t\t}\r\n\t\t// @todo handle this when innerRadius set in pixels (do it for pie also)\r\n\t\trect = $math.getCommonRectangle([rect, innerRect]);\r\n\r\n\t\tlet maxRadius = Math.min(plotContainer.innerWidth / rect.width, plotContainer.innerHeight / rect.height);\r\n\r\n\t\tlet diameter = $utils.relativeRadiusToValue(this.radius, maxRadius) * 2 || 0;\r\n\t\tlet radius = diameter / 2;\r\n\t\tlet startAngle = this.startAngle;\r\n\t\tlet endAngle = this.endAngle;\r\n\r\n\t\tthis._pixelInnerRadius = $utils.relativeRadiusToValue(innerRadius, radius);\r\n\r\n\t\tthis._bulletMask.path = $path.arc(startAngle, endAngle - startAngle, radius, this._pixelInnerRadius);\r\n\r\n\t\t$iter.each(this.xAxes.iterator(), (axis) => {\r\n\t\t\tif(axis.renderer.useChartAngles){\r\n\t\t\t\taxis.renderer.startAngle = startAngle;\r\n\t\t\t\taxis.renderer.endAngle = endAngle;\r\n\t\t\t}\r\n\r\n\t\t\taxis.width = diameter;\r\n\t\t\taxis.height = diameter;\r\n\t\t\t//axis.renderer.width = diameter;\r\n\t\t\t//axis.renderer.height = diameter;\r\n\t\t\taxis.renderer.pixelRadiusReal = radius;\r\n\t\t\taxis.renderer.innerRadius = innerRadius;\r\n\t\t});\r\n\r\n\t\t$iter.each(this.yAxes.iterator(), (axis) => {\r\n\t\t\taxis.renderer.startAngle = startAngle;\r\n\t\t\taxis.renderer.endAngle = endAngle;\r\n\r\n\t\t\taxis.width = diameter;\r\n\t\t\taxis.height = diameter;\r\n\t\t\t//axis.renderer.width = diameter;\r\n\t\t\t//axis.renderer.height = diameter;\r\n\t\t\taxis.renderer.pixelRadiusReal = radius;\r\n\t\t\taxis.renderer.innerRadius = innerRadius;\r\n\t\t});\r\n\r\n\t\tlet cursor = this.cursor;\r\n\t\tif (cursor) {\r\n\t\t\tcursor.width = diameter;\r\n\t\t\tcursor.height = diameter;\r\n\t\t\tcursor.startAngle = startAngle;\r\n\t\t\tcursor.endAngle = endAngle;\r\n\t\t}\r\n\r\n\t\tthis.radarContainer.definedBBox = { x: radius * rect.x, y: radius * rect.y, width: radius * rect.width, height: radius * rect.height };\r\n\t\tthis.radarContainer.validatePosition();\r\n\t}\r\n\r\n\t/**\r\n\t * Creates and returns a new Series, suitable for RadarChart.\r\n\t *\r\n\t * @return New Series\r\n\t */\r\n\tprotected createSeries(): this[\"_seriesType\"] {\r\n\t\treturn new RadarSeries();\r\n\t}\r\n\r\n\t/**\r\n\t * Starting angle of the Radar face. (degrees)\r\n\t *\r\n\t * Normally, a circular radar face begins (the radial axis is drawn) at the\r\n\t * top center. (at -90 degrees)\r\n\t *\r\n\t * You can use `startAngle` to change this setting.\r\n\t *\r\n\t * E.g. setting this to 0 will make the radial axis start horizontally to\r\n\t * the right, as opposed to vertical.\r\n\t *\r\n\t * For a perfect circle the absolute sum of `startAngle` and `endAngle`\r\n\t * needs to be 360.\r\n\t *\r\n\t * However, it's **not** necessary to do so. You can set those to lesser\r\n\t * numbers, to create semi-circles.\r\n\t *\r\n\t * E.g. `startAngle = -90` with `endAngle = 0` will create a radar face that\r\n\t * looks like a quarter of a circle.\r\n\t *\r\n\t * @default -90\r\n\t * @param value Start angle (degrees)\r\n\t */\r\n\tpublic set startAngle(value: number) {\r\n\t\tthis.setPropertyValue(\"startAngle\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Start angle (degrees)\r\n\t */\r\n\tpublic get startAngle(): number {\r\n\t\treturn this.getPropertyValue(\"startAngle\");\r\n\t}\r\n\r\n\t/**\r\n\t * Starting angle of the Radar face. (degrees)\r\n\t *\r\n\t * Normally, a circular radar face ends (the radial axis is drawn) exactly\r\n\t * where it has started, forming a full 360 circle. (at 270 degrees)\r\n\t *\r\n\t * You can use `endAngle` to end the circle somewhere else.\r\n\t *\r\n\t * E.g. setting this to 180 will make the radar face end at horizontal line\r\n\t * to the left off the center.\r\n\t *\r\n\t * For a perfect circle the absolute sum of `startAngle` and `endAngle`\r\n\t * needs to be 360.\r\n\t *\r\n\t * However, it's **not** necessary to do so. You can set those to lesser\r\n\t * numbers, to create semi-circles.\r\n\t *\r\n\t * E.g. `startAngle = -90` with `endAngle = 0` will create a radar face that\r\n\t * looks like a quarter of a circle.\r\n\t *\r\n\t * @default -90\r\n\t * @param value End angle (degrees)\r\n\t */\r\n\tpublic set endAngle(value: number) {\r\n\t\tthis.setPropertyValue(\"endAngle\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return End angle (degrees)\r\n\t */\r\n\tpublic get endAngle(): number {\r\n\t\treturn this.getPropertyValue(\"endAngle\");\r\n\t}\r\n\r\n\t/**\r\n\t * Outer radius of the Radar face.\r\n\t *\r\n\t * This can either be in absolute pixel value, or relative [[Percent]].\r\n\t *\r\n\t * @param value Outer radius\r\n\t */\r\n\tpublic set radius(value: number | Percent) {\r\n\t\tthis.setPercentProperty(\"radius\", value, true, false, 10, false);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Outer radius\r\n\t */\r\n\tpublic get radius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"radius\");\r\n\t}\r\n\r\n\t/**\r\n\t * @return Inner radius in pixels\r\n\t */\r\n\tpublic get pixelInnerRadius(): number {\r\n\t\treturn this._pixelInnerRadius;\r\n\t}\r\n\r\n\t/**\r\n\t * Inner radius of the radar face.\r\n\t *\r\n\t * This can either be in absolute pixel value, or relative [[Percent]].\r\n\t *\r\n\t * If set in Percent, it will be relative to `radius`. (outer radius)\r\n\t *\r\n\t * @param value Inner radius\r\n\t */\r\n\tpublic set innerRadius(value: number | Percent) {\r\n\t\tthis.setPercentProperty(\"innerRadius\", value, true, false, 10, false);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Inner radius\r\n\t */\r\n\tpublic get innerRadius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"innerRadius\");\r\n\t}\r\n\r\n\t/**\r\n\t * Triggers (re)rendering of the horizontal (X) axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param axis Axis\r\n\t */\r\n\tpublic updateXAxis(renderer: AxisRenderer) {\r\n\t\t//do not call super!\r\n\t\tif (renderer) {\r\n\t\t\trenderer.processRenderer();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Triggers (re)rendering of the vertical (Y) axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param axis Axis\r\n\t */\r\n\tpublic updateYAxis(renderer: AxisRenderer) {\r\n\t\t// do not call super!\r\n\t\tif (renderer) {\r\n\t\t\trenderer.processRenderer();\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"RadarChart\"] = RadarChart;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/types/RadarChart.ts","/**\r\n * Functionality for drawing simple ClockHands\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Container, IContainerProperties, IContainerAdapters, IContainerEvents } from \"../../core/Container\";\r\nimport { Circle } from \"../../core/elements/Circle\";\r\nimport { Trapezoid } from \"../../core/elements/Trapezoid\";\r\nimport { Axis } from \"../axes/Axis\";\r\nimport { AxisRendererCircular } from \"../axes/AxisRendererCircular\";\r\nimport { MutableValueDisposer, MultiDisposer } from \"../../core/utils/Disposer\";\r\nimport { percent, Percent } from \"../../core/utils/Percent\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { GaugeChart } from \"../types/GaugeChart\";\r\nimport { InterfaceColorSet } from \"../../core/utils/InterfaceColorSet\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport * as $type from \"../../core/utils/Type\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[ClockHand]].\r\n */\r\nexport interface IClockHandProperties extends IContainerProperties {\r\n\r\n\t/**\r\n\t * Radius of the hand's outer end. (tip)\r\n\t *\r\n\t * Absolute (px) or relative ([[Percent]]).\r\n\t *\r\n\t * @default Percent(100)\r\n\t */\r\n\tradius: number | Percent;\r\n\r\n\t/**\r\n\t * Radius of the hand's inner end. (base)\r\n\t *\r\n\t * Absolute (px) or relative ([[Percent]]).\r\n\t *\r\n\t * @default Percent(0)\r\n\t */\r\n\tinnerRadius: number | Percent;\r\n\r\n\t/**\r\n\t * Width, in pixels, of the clock hand's tip.\r\n\t *\r\n\t * @default 1\r\n\t */\r\n\tendWidth: number;\r\n\r\n\t/**\r\n\t * Width, in pixels, of the clock hand's base.\r\n\t *\r\n\t * @default 5\r\n\t */\r\n\tstartWidth: number;\r\n\r\n\t/**\r\n\t * rotation direction\r\n\t * @default \"any\"\r\n\t */\r\n\trotationDirection: \"any\" | \"clockWise\" | \"CounterClockWise\";\r\n}\r\n\r\n/**\r\n * Defines events for [[ClockHand]].\r\n */\r\nexport interface IClockHandEvents extends IContainerEvents { }\r\n\r\n/**\r\n * Defines adapters for [[ClockHand]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IClockHandAdapters extends IContainerAdapters, IClockHandProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * ClockHand class is capable of drawing a simple pointy shape with optionally\r\n * rounderd corners and an icon.\r\n *\r\n * @see {@link IClockHandEvents} for a list of available events\r\n * @see {@link IClockHandAdapters} for a list of available Adapters\r\n * @todo Improve\r\n * @important\r\n */\r\nexport class ClockHand extends Container {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IClockHandProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IClockHandAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IClockHandEvents;\r\n\r\n\t/**\r\n\t * A circle element used as hand's base.\r\n\t */\r\n\tprotected _pin: Circle;\r\n\r\n\t/**\r\n\t * A trapezoid shape used for hand itself.\r\n\t */\r\n\tprotected _hand: Trapezoid;\r\n\r\n\t/**\r\n\t * An Axis hand is related to.\r\n\t */\r\n\tprotected _axis: MutableValueDisposer = new MutableValueDisposer();\r\n\r\n\t/**\r\n\t * Hand's current value.\r\n\t */\r\n\tprotected _value: any;\r\n\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"ClockHand\";\r\n\r\n\t\tlet interfaceColors = new InterfaceColorSet();\r\n\r\n\t\tthis.fill = interfaceColors.getFor(\"alternativeBackground\");\r\n\t\tthis.stroke = this.fill;\r\n\r\n\t\tlet pin: Circle = new Circle();\r\n\t\tpin.radius = 5;\r\n\t\tthis.pin = pin;\r\n\t\tthis.isMeasured = false;\r\n\r\n\t\tthis.startWidth = 5;\r\n\t\tthis.endWidth = 1;\r\n\r\n\t\tthis.width = percent(100);\r\n\t\tthis.height = percent(100);\r\n\r\n\t\tthis.radius = percent(100);\r\n\t\tthis.innerRadius = percent(0);\r\n\r\n\t\tlet hand: Trapezoid = new Trapezoid();\r\n\t\tthis.hand = hand;\r\n\r\n\t\tthis._disposers.push(this._axis);\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Re(validates) the clock hand, effectively redrawing it.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validate() {\r\n\t\tsuper.validate();\r\n\t\tlet hand = this.hand;\r\n\t\thand.width = this.pixelWidth;\r\n\t\tlet h: number = Math.max(this.startWidth, this.endWidth);\r\n\t\thand.height = h;\r\n\t\thand.leftSide = percent(this.startWidth / h * 100);\r\n\t\thand.rightSide = percent(this.endWidth / h * 100);\r\n\r\n\t\tif (this.axis) {\r\n\t\t\tlet renderer: AxisRendererCircular = this.axis.renderer;\r\n\r\n\t\t\tlet x0: number = $utils.relativeRadiusToValue(this.innerRadius, renderer.pixelRadius);\r\n\t\t\tlet x1: number = $utils.relativeRadiusToValue(this.radius, renderer.pixelRadius);\r\n\r\n\t\t\thand.x = x0;\r\n\t\t\thand.y = - h / 2;\r\n\r\n\t\t\thand.width = x1 - x0;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * A circle element used as hand's base. (pin)\r\n\t *\r\n\t * @param pin Pin element\r\n\t */\r\n\tpublic set pin(pin: Circle) {\r\n\t\tif (this._pin) {\r\n\t\t\tthis.removeDispose(this._pin);\r\n\t\t}\r\n\t\tif (pin) {\r\n\t\t\tthis._pin = pin;\r\n\t\t\tpin.parent = this;\r\n\t\t\tthis._disposers.push(pin);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Pin element\r\n\t */\r\n\tpublic get pin(): Circle {\r\n\t\treturn this._pin;\r\n\t}\r\n\r\n\t/**\r\n\t * A trapezoid shape used for hand itself.\r\n\t *\r\n\t * The shape of the trapezoid is controlled by ClockHand's `startWidth` and\r\n\t * `endWidth` properties.\r\n\t *\r\n\t * Set `endWidth` to 1 (px) to make it pointy.\r\n\t *\r\n\t * @param hand Hand element\r\n\t */\r\n\tpublic set hand(hand: Trapezoid) {\r\n\t\tif (this._hand) {\r\n\t\t\tthis.removeDispose(this._hand);\r\n\t\t}\r\n\t\tif (hand) {\r\n\t\t\tthis._hand = hand;\r\n\t\t\thand.parent = this;\r\n\t\t\tthis._disposers.push(hand);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Hand element\r\n\t */\r\n\tpublic get hand(): Trapezoid {\r\n\t\treturn this._hand;\r\n\t}\r\n\r\n\t/**\r\n\t * Radius of the hand's outer end. (tip)\r\n\t *\r\n\t * Absolute (px) or relative ([[Percent]]).\r\n\t *\r\n\t * @default Percent(0)\r\n\t * @param value Radius\r\n\t */\r\n\tpublic set radius(value: number | Percent) {\r\n\t\tthis.setPercentProperty(\"radius\", value, true, false, 10, false);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Radius\r\n\t */\r\n\tpublic get radius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"radius\");\r\n\t}\r\n\r\n\t/**\r\n\t * Radius of the hand's inner end. (base)\r\n\t *\r\n\t * Absolute (px) or relative ([[Percent]]).\r\n\t *\r\n\t * @default Percent(0)\r\n\t * @param value Radius\r\n\t */\r\n\tpublic set innerRadius(value: number | Percent) {\r\n\t\tthis.setPercentProperty(\"innerRadius\", value, true, false, 10, false);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Radius\r\n\t */\r\n\tpublic get innerRadius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"innerRadius\");\r\n\t}\r\n\r\n\t/**\r\n\t * Width, in pixels, of the clock hand's inner end. (base)\r\n\t *\r\n\t * @default 5\r\n\t * @param value Width (px)\r\n\t */\r\n\tpublic set startWidth(value: number) {\r\n\t\tthis.setPropertyValue(\"startWidth\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Width (px)\r\n\t */\r\n\tpublic get startWidth(): number {\r\n\t\treturn this.getPropertyValue(\"startWidth\");\r\n\t}\r\n\r\n\t/**\r\n\t * Width, in pixels, of the clock hand's outer end. (tip)\r\n\t *\r\n\t * @default 1\r\n\t * @param value Width (px)\r\n\t */\r\n\tpublic set endWidth(value: number) {\r\n\t\tthis.setPropertyValue(\"endWidth\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Width (px)\r\n\t */\r\n\tpublic get endWidth(): number {\r\n\t\treturn this.getPropertyValue(\"endWidth\");\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Rotation direction\r\n\t *\r\n\t * @default any\r\n\t * @param value\r\n\t */\r\n\tpublic set rotationDirection(value: \"any\" | \"clockWise\" | \"counterClockWise\") {\r\n\t\tthis.setPropertyValue(\"rotationDirection\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return rotationDirection\r\n\t */\r\n\tpublic get rotationDirection(): \"any\" | \"clockWise\" | \"counterClockWise\" {\r\n\t\treturn this.getPropertyValue(\"rotationDirection\");\r\n\t}\r\n\r\n\t/**\r\n\t * Moves clock hand to particular value.\r\n\t *\r\n\t * If `duration` is set to a number in milliseconds, the hand will move\r\n\t * to the new position gracefully, rather than jumping rigth to it.\r\n\t *\r\n\t * Alternatively, you can also set `value` directly.\r\n\t *\r\n\t * @param value New value\r\n\t * @param duration Animation duration (ms)\r\n\t * @param easing Animation easing function\r\n\t */\r\n\tpublic showValue(value: any, duration?: number, easing?: (value: number) => number): void {\r\n\t\tthis._value = value;\r\n\t\tif (value != undefined) {\r\n\t\t\tif (!$type.isNumber(duration)) {\r\n\t\t\t\tduration = 0;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.axis) {\r\n\t\t\t\tlet renderer = this.axis.renderer;\r\n\t\t\t\tlet newAngle = renderer.positionToAngle(this.axis.anyToPosition(value));\r\n\t\t\t\tlet currentAngle = this.rotation;\r\n\r\n\t\t\t\tif (this.rotationDirection == \"clockWise\") {\r\n\t\t\t\t\tif (newAngle < currentAngle) {\r\n\t\t\t\t\t\tthis.rotation = currentAngle - 360;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (this.rotationDirection == \"counterClockWise\") {\r\n\t\t\t\t\tif (newAngle > currentAngle) {\r\n\t\t\t\t\t\tthis.rotation = currentAngle + 360;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.animate({ property: \"rotation\", to: newAngle }, duration, easing);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * A current value clock hand is pointing to.\r\n\t *\r\n\t * @param value Value\r\n\t */\r\n\tpublic set value(value: any) {\r\n\t\tthis.showValue(value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Value\r\n\t */\r\n\tpublic get value(): any {\r\n\t\treturn this._value;\r\n\t}\r\n\r\n\t/**\r\n\t * An Axis clock hand is associated with.\r\n\t *\r\n\t * Hand's `value` relates to values on the Axis.\r\n\t *\r\n\t * @param axis Axis\r\n\t */\r\n\tpublic set axis(axis: Axis) {\r\n\t\tif (this.axis != axis) {\r\n\t\t\tthis._axis.set(axis, new MultiDisposer([\r\n\t\t\t\taxis.events.on(\"datavalidated\", this.updateValue, this, false),\r\n\t\t\t\taxis.events.on(\"datarangechanged\", this.updateValue, this, false),\r\n\t\t\t\taxis.events.on(\"dataitemsvalidated\", this.updateValue, this, false),\r\n\t\t\t\taxis.events.on(\"propertychanged\", this.invalidate, this, false)\r\n\t\t\t]));\r\n\t\t}\r\n\t\tif (axis) {\r\n\t\t\tlet chart: GaugeChart = axis.chart;\r\n\t\t\tif (chart) {\r\n\t\t\t\tthis.rotation = chart.startAngle;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.parent = axis.renderer;\r\n\t\tthis.zIndex = 5;\r\n\t}\r\n\r\n\t/**\r\n\t * @return Axis\r\n\t */\r\n\tpublic get axis(): Axis {\r\n\t\treturn this._axis.get();\r\n\t}\r\n\r\n\t/**\r\n\t * Triggers `value` accessor, so that Hand animates to new position, in case\r\n\t * value has changed.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tprotected updateValue() {\r\n\t\tthis.value = this.value;\r\n\t}\r\n\r\n\t/**\r\n * Processes JSON-based config before it is applied to the object.\r\n *\r\n * @ignore Exclude from docs\r\n * @param config Config\r\n */\r\n\tpublic processConfig(config?: { [index: string]: any }): void {\r\n\r\n\t\tif (config) {\r\n\r\n\t\t\t// Connect clock hands with axes\r\n\t\t\tif ($type.hasValue(config.axis) && $type.isString(config.axis) && this.map.hasKey(config.axis)) {\r\n\t\t\t\tconfig.axis = this.map.getKey(config.axis);\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tsuper.processConfig(config);\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"ClockHand\"] = ClockHand;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/elements/ClockHand.ts","/**\r\n * Module for building Gauge charts.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { RadarChart, IRadarChartProperties, IRadarChartDataFields, IRadarChartAdapters, IRadarChartEvents, RadarChartDataItem } from \"./RadarChart\";\r\nimport { ListTemplate, IListEvents, ListDisposer } from \"../../core/utils/List\";\r\nimport { ClockHand } from \"../elements/ClockHand\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $type from \"../../core/utils/Type\";\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[GaugeChart]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class GaugeChartDataItem extends RadarChartDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: GaugeChart;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"GaugeChartDataItem\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[GaugeChart]].\r\n */\r\nexport interface IGaugeChartDataFields extends IRadarChartDataFields { }\r\n\r\n/**\r\n * Defines properties for [[GaugeChart]].\r\n */\r\nexport interface IGaugeChartProperties extends IRadarChartProperties { }\r\n\r\n/**\r\n * Defines events for [[GaugeChart]].\r\n */\r\nexport interface IGaugeChartEvents extends IRadarChartEvents { }\r\n\r\n/**\r\n * Defines adapters for [[GaugeChart]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IGaugeChartAdapters extends IRadarChartAdapters, IGaugeChartProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Creates a Gauge chart.\r\n *\r\n * @see {@link IGaugeChartEvents} for a list of available Events\r\n * @see {@link IGaugeChartAdapters} for a list of available Adapters\r\n * @see {@link https://www.amcharts.com/docs/v4/chart-types/gauge-chart/} for documentation\r\n * @important\r\n */\r\nexport class GaugeChart extends RadarChart {\r\n\r\n\t/**\r\n\t * Defines available data fields.\r\n\t */\r\n\tpublic _dataFields: IGaugeChartDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IGaugeChartProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IGaugeChartAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IGaugeChartEvents;\r\n\r\n\t/**\r\n\t * A list of [[ClockHand]] items displayed on this Gauge chart.\r\n\t */\r\n\tpublic hands: ListTemplate;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"GaugeChart\";\r\n\r\n\t\tthis.startAngle = 180;\r\n\t\tthis.endAngle = 360;\r\n\r\n\t\tthis.hands = new ListTemplate(new ClockHand());\r\n\t\tthis.hands.events.on(\"inserted\", this.processHand, this, false);\r\n\r\n\t\tthis._disposers.push(new ListDisposer(this.hands));\r\n\t\tthis._disposers.push(this.hands.template);\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Sets defaults that instantiate some objects that rely on parent, so they\r\n\t * cannot be set in constructor.\r\n\t */\r\n\tprotected applyInternalDefaults(): void {\r\n\r\n\t\tsuper.applyInternalDefaults();\r\n\r\n\t\t// Add a default screen reader title for accessibility\r\n\t\t// This will be overridden in screen reader if there are any `titles` set\r\n\t\tif (!$type.hasValue(this.readerTitle)) {\r\n\t\t\tthis.readerTitle = this.language.translate(\"Gauge chart\");\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Decorates a [[ClockHand]] when it is added to the chart.\r\n\t *\r\n\t * @param event Event\r\n\t */\r\n\tprotected processHand(event: IListEvents[\"inserted\"]): void {\r\n\t\tlet hand: ClockHand = event.newValue;\r\n\t\tif (!hand.axis) {\r\n\t\t\thand.axis = this.xAxes.getIndex(0);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"GaugeChart\"] = GaugeChart;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/types/GaugeChart.ts","/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\nimport { PieSeries, PieSeriesDataItem, IPieSeriesDataFields, IPieSeriesProperties, IPieSeriesAdapters, IPieSeriesEvents } from \"../series/PieSeries\";\r\nimport { PieChart3D } from \"../types/PieChart3D\";\r\nimport { Slice3D } from \"../../core/elements/3d/Slice3D\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport { Bullet } from \"../elements/Bullet\";\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[PieSeries3D]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class PieSeries3DDataItem extends PieSeriesDataItem {\r\n\r\n\t/**\r\n\t * Defines type of the slice represented by this data item.\r\n\t */\r\n\tpublic _slice: Slice3D;\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: PieSeries3D;\r\n\r\n\t/**\r\n\t * @todo Remove?\r\n\t * @deprecated\r\n\t */\r\n\tpublic component: PieSeries3D;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"PieSeries3DDataItem\";\r\n\r\n\t\tthis.values.depthValue = {};\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Slice depth (height).\r\n\t *\r\n\t * @param value Depth\r\n\t */\r\n\tpublic set depthValue(value: number) {\r\n\t\tthis.setValue(\"depthValue\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Depth\r\n\t */\r\n\tpublic get depthValue(): number {\r\n\t\treturn this.values[\"depthValue\"].value;\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[PieSeries3D]].\r\n */\r\nexport interface IPieSeries3DDataFields extends IPieSeriesDataFields {\r\n\r\n\t/**\r\n\t * Name of the field in data that holds 3D slice depth (height).\r\n\t */\r\n\tdepthValue?: string;\r\n\r\n}\r\n\r\n/**\r\n * Defines properties for [[PieSeries3D]].\r\n */\r\nexport interface IPieSeries3DProperties extends IPieSeriesProperties {\r\n\r\n\t/**\r\n\t * Depth (height) of the pie slice in pixels.\r\n\t */\r\n\tdepth?: number;\r\n\r\n\t/**\r\n\t * Angle of the view point of the 3D pie.\r\n\t */\r\n\tangle?: number;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[PieSeries3D]].\r\n */\r\nexport interface IPieSeries3DEvents extends IPieSeriesEvents { }\r\n\r\n/**\r\n * Defines adapters for [[PieSeries3D]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IPieSeries3DAdapters extends IPieSeriesAdapters, IPieSeries3DProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines [[Series]] for a slice series on a 3D pie chart.\r\n *\r\n * @see {@link IPieSeries3DEvents} for a list of available Events\r\n * @see {@link IPieSeries3DAdapters} for a list of available Adapters\r\n * @todo Example\r\n * @important\r\n */\r\nexport class PieSeries3D extends PieSeries {\r\n\r\n\t/**\r\n\t * Defines the type of data fields used for the series.\r\n\t */\r\n\tpublic _dataFields: IPieSeries3DDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IPieSeries3DProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IPieSeries3DAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IPieSeries3DEvents;\r\n\r\n\t/**\r\n\t * Defines the type of data item.\r\n\t */\r\n\tpublic _dataItem: PieSeries3DDataItem;\r\n\r\n\t/**\r\n\t * A chart series belongs to.\r\n\t */\r\n\tpublic _chart: PieChart3D;\r\n\r\n\tpublic _slice: Slice3D;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"PieSeries3D\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty DataItem of the type appropriate for this object\r\n\t * @see {@link DataItem}\r\n\t * @return Data Item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new PieSeries3DDataItem();\r\n\t}\r\n\r\n\t/**\r\n\t * creates slice\r\n\t */\r\n\tprotected createSlice(): this[\"_slice\"] {\r\n\t\treturn new Slice3D();\r\n\t}\r\n\r\n\t/**\r\n\t * Validates data item's element, effectively redrawing it.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic validateDataElement(dataItem: PieSeries3DDataItem): void {\r\n\r\n\t\tlet slice: Slice3D = dataItem.slice;\r\n\r\n\t\tlet depth: number = this.depth;\r\n\t\tif (!$type.isNumber(depth)) {\r\n\t\t\tdepth = this.chart.depth;\r\n\t\t}\r\n\r\n\t\tlet depthPercent: number = dataItem.values.depthValue.percent;\r\n\t\tif (!$type.isNumber(depthPercent)) {\r\n\t\t\tdepthPercent = 100;\r\n\t\t}\r\n\r\n\t\tslice.depth = depthPercent * depth / 100;\r\n\r\n\t\tlet angle: number = this.angle;\r\n\t\tif (!$type.isNumber(angle)) {\r\n\t\t\tangle = this.chart.angle;\r\n\t\t}\r\n\r\n\t\tslice.angle = angle;\r\n\r\n\t\tsuper.validateDataElement(dataItem);\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)validates the whole series, effectively causing it to redraw.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validate(): void {\r\n\t\tsuper.validate();\r\n\r\n\t\tfor (let i = this._workingStartIndex; i < this._workingEndIndex; i++) {\r\n\t\t\tlet dataItem = this.dataItems.getIndex(i);\r\n\t\t\tlet slice: Slice3D = dataItem.slice;\r\n\r\n\t\t\tvar startAngle = slice.startAngle;\r\n\t\t\t// find quarter\r\n\t\t\t//q0 || q1\r\n\t\t\tif ((startAngle >= -90 && startAngle < 90)) {\r\n\t\t\t\tslice.toFront();\r\n\t\t\t}\r\n\t\t\t//q2 || q3\r\n\t\t\telse if ((startAngle >= 90)) {\r\n\t\t\t\tslice.toBack();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Depth (height) of the pie slice in pixels.\r\n\t *\r\n\t * @param value Depth (px)\r\n\t */\r\n\tpublic set depth(value: number) {\r\n\t\tthis.setPropertyValue(\"depth\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Depth (px)\r\n\t */\r\n\tpublic get depth(): number {\r\n\t\treturn this.getPropertyValue(\"depth\");\r\n\t}\r\n\r\n\t/**\r\n\t * Angle of the view point of the 3D pie. (0-360)\r\n\t *\r\n\t * @param value Angle\r\n\t */\r\n\tpublic set angle(value: number) {\r\n\t\tthis.setPropertyValue(\"angle\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Angle\r\n\t */\r\n\tpublic get angle(): number {\r\n\t\treturn this.getPropertyValue(\"angle\");\r\n\t}\r\n\r\n\t/**\r\n\t * Positions series bullet.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param bullet Bullet\r\n\t */\r\n\tpublic positionBullet(bullet: Bullet): void {\r\n\t\tsuper.positionBullet(bullet);\r\n\r\n\t\tlet dataItem: this[\"_dataItem\"] = bullet.dataItem;\r\n\t\tlet slice = dataItem.slice;\r\n\r\n\t\tbullet.y = bullet.pixelY - slice.depth;\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"PieSeries3D\"] = PieSeries3D;\r\nregistry.registeredClasses[\"PieSeries3DDataItem\"] = PieSeries3DDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/PieSeries3D.ts","/**\r\n * 3D Pie chart module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * Imports\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\nimport { PieChart, IPieChartProperties, IPieChartDataFields, IPieChartAdapters, IPieChartEvents, PieChartDataItem } from \"./PieChart\";\r\nimport { PieSeries3D } from \"../series/PieSeries3D\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $math from \"../../core/utils/Math\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[PieChart3D]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class PieChart3DDataItem extends PieChartDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: PieChart3D;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"PieChart3DDataItem\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[PieChart3D]].\r\n */\r\nexport interface IPieChart3DDataFields extends IPieChartDataFields { }\r\n\r\n/**\r\n * Defines properties for [[PieChart3D]].\r\n */\r\nexport interface IPieChart3DProperties extends IPieChartProperties {\r\n\r\n\t/**\r\n\t * Pie's \"depth\" or \"height\" in pixels.\r\n\t */\r\n\tdepth?: number;\r\n\r\n\t/**\r\n\t * Pie's angle at which we are looking at it. (degrees)\r\n\t */\r\n\tangle?: number;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[PieChart3D]].\r\n */\r\nexport interface IPieChart3DEvents extends IPieChartEvents { }\r\n\r\n/**\r\n * Defines adapters for [[PieChart3D]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IPieChart3DAdapters extends IPieChartAdapters, IPieChart3DProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Creates a 3D Pie chart.\r\n *\r\n * * ```TypeScript\r\n * // Includes\r\n * import * as am4core from \"@amcharts/amcharts4/core\";\r\n * import * as am4charts from \"@amcharts/amcharts4/charts\";\r\n *\r\n * // Create chart\r\n * let chart = am4core.create(\"chartdiv\", am4charts.Pie3DChart);\r\n *\r\n * // Set data\r\n * chart.data = [{\r\n * \t\"country\": \"Lithuania\",\r\n * \t\"litres\": 501.9\r\n * }, {\r\n * \t\"country\": \"Czechia\",\r\n * \t\"litres\": 301.9\r\n * }, {\r\n * \t\"country\": \"Ireland\",\r\n * \t\"litres\": 201.1\r\n * }];\r\n *\r\n * // Create series\r\n * let series = chart.series.push(new am4charts.Pie3DSeries());\r\n * series.dataFields.value = \"litres\";\r\n * series.dataFields.category = \"country\";\r\n * ```\r\n * ```JavaScript\r\n * // Create chart\r\n * var chart = am4core.create(\"chartdiv\", am4charts.Pie3DChart);\r\n *\r\n * // The following would work as well:\r\n * // var chart = am4core.create(\"chartdiv\", \"Pie3DChart\");\r\n *\r\n * // Set data\r\n * chart.data = [{\r\n * \t\"country\": \"Lithuania\",\r\n * \t\"litres\": 501.9\r\n * }, {\r\n * \t\"country\": \"Czechia\",\r\n * \t\"litres\": 301.9\r\n * }, {\r\n * \t\"country\": \"Ireland\",\r\n * \t\"litres\": 201.1\r\n * }];\r\n *\r\n * // Create series\r\n * var series = chart.series.push(new am4charts.Pie3DSeries());\r\n * series.dataFields.value = \"litres\";\r\n * series.dataFields.category = \"country\";\r\n * ```\r\n * ```JSON\r\n * var chart = am4core.createFromConfig({\r\n *\r\n * \t// Series\r\n * \t\"series\": [{\r\n * \t\t\"type\": \"Pie3DSeries\",\r\n * \t\t\"dataFields\": {\r\n * \t\t\t\"value\": \"litres\",\r\n * \t\t\t\"category\": \"country\"\r\n * \t\t}\r\n * \t}],\r\n *\r\n * \t// Data\r\n * \t\"data\": [{\r\n * \t\t\"country\": \"Lithuania\",\r\n * \t\t\"litres\": 501.9\r\n * \t}, {\r\n * \t\t\"country\": \"Czechia\",\r\n * \t\t\"litres\": 301.9\r\n * \t}, {\r\n * \t\t\"country\": \"Ireland\",\r\n * \t\t\"litres\": 201.1\r\n * \t}]\r\n *\r\n * }, \"chartdiv\", \"Pie3DChart\");\r\n * ```\r\n *\r\n * @see {@link IPieChart3DEvents} for a list of available Events\r\n * @see {@link IPieChart3DAdapters} for a list of available Adapters\r\n * @see {@link https://www.amcharts.com/docs/v4/chart-types/pie-chart/} for documentation\r\n * @important\r\n */\r\nexport class PieChart3D extends PieChart {\r\n\r\n\t/**\r\n\t * Available data fields.\r\n\t */\r\n\tpublic _dataFields: IPieChart3DDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IPieChart3DProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IPieChart3DAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IPieChart3DEvents;\r\n\r\n\t/**\r\n\t * Defines a type of series that this chart uses.\r\n\t */\r\n\tpublic _seriesType: PieSeries3D;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"PieChart3D\";\r\n\r\n\t\tthis.depth = 20;\r\n\t\tthis.angle = 10;\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Depth of the 3D pie in pixels.\r\n\t *\r\n\t * This will determine \"height\" of the pie.\r\n\t *\r\n\t * @default 20\r\n\t * @param value Depth (px)\r\n\t */\r\n\tpublic set depth(value: number) {\r\n\t\tif (this.setPropertyValue(\"depth\", value)) {\r\n\t\t\tthis.invalidateDataUsers();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Depth (px)\r\n\t */\r\n\tpublic get depth(): number {\r\n\t\treturn this.getPropertyValue(\"depth\");\r\n\t}\r\n\r\n\t/**\r\n\t * An angle of a \"point of view\" in degrees. Possible range 0 - 90.\r\n\t *\r\n\t * @default 10\r\n\t * @param value Angle (degrees)\r\n\t */\r\n\tpublic set angle(value: number) {\r\n\t\tvalue = $math.fitToRange(value, 0, 90);\r\n\t\tif (this.setPropertyValue(\"angle\", value)) {\r\n\t\t\tthis.invalidateDataUsers();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Angle (degrees)\r\n\t */\r\n\tpublic get angle(): number {\r\n\t\treturn this.getPropertyValue(\"angle\");\r\n\t}\r\n\r\n\t/**\r\n\t * Creates and returns a new Series.\r\n\t *\r\n\t * @return New series\r\n\t */\r\n\tprotected createSeries(): this[\"_seriesType\"] {\r\n\t\treturn new PieSeries3D();\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"PieChart3D\"] = PieChart3D;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/types/PieChart3D.ts","/**\r\n * Sliced chart module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { PercentChart, IPercentChartProperties, IPercentChartDataFields, IPercentChartAdapters, IPercentChartEvents, PercentChartDataItem } from \"./PercentChart\";\r\nimport { FunnelSeries } from \"../series/FunnelSeries\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $type from \"../../core/utils/Type\";\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[SlicedChart]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class SlicedChartDataItem extends PercentChartDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: SlicedChart;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"SlicedChartDataItem\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[SlicedChart]].\r\n */\r\nexport interface ISlicedChartDataFields extends IPercentChartDataFields { }\r\n\r\n/**\r\n * Defines properties for [[SlicedChart]]\r\n */\r\nexport interface ISlicedChartProperties extends IPercentChartProperties { }\r\n\r\n/**\r\n * Defines events for [[SlicedChart]].\r\n */\r\nexport interface ISlicedChartEvents extends IPercentChartEvents { }\r\n\r\n/**\r\n * Defines adapters for [[SlicedChart]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface ISlicedChartAdapters extends IPercentChartAdapters, ISlicedChartProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Creates a Sliced chart.\r\n *\r\n * @see {@link ISlicedChartEvents} for a list of available Events\r\n * @see {@link ISlicedChartAdapters} for a list of available Adapters\r\n * @see {@link https://www.amcharts.com/docs/v4/chart-types/sliced-chart/} for documentation\r\n * @important\r\n */\r\nexport class SlicedChart extends PercentChart {\r\n\r\n\t/**\r\n\t * Defines available data fields.\r\n\t */\r\n\tpublic _dataFields: ISlicedChartDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: ISlicedChartProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: ISlicedChartAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: ISlicedChartEvents;\r\n\r\n\t/**\r\n\t * Defines a type of series that this chart uses.\r\n\t */\r\n\tpublic _seriesType: FunnelSeries;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"SlicedChart\";\r\n\r\n\t\tthis.seriesContainer.layout = \"horizontal\";\r\n\r\n\t\tthis.padding(15, 15, 15, 15);\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Sets defaults that instantiate some objects that rely on parent, so they\r\n\t * cannot be set in constructor.\r\n\t */\r\n\tprotected applyInternalDefaults(): void {\r\n\r\n\t\tsuper.applyInternalDefaults();\r\n\r\n\t\t// Add a default screen reader title for accessibility\r\n\t\t// This will be overridden in screen reader if there are any `titles` set\r\n\t\tif (!$type.hasValue(this.readerTitle)) {\r\n\t\t\tthis.readerTitle = this.language.translate(\"Sliced chart\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)validates the chart, causing it to redraw.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validate(): void {\r\n\t\tsuper.validate();\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"SlicedChart\"] = SlicedChart;\r\nregistry.registeredClasses[\"SlicedChartDataItem\"] = SlicedChartDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/types/SlicedChart.ts","/**\r\n * ChordNode module\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { FlowDiagramNode, IFlowDiagramNodeAdapters, IFlowDiagramNodeEvents, IFlowDiagramNodeProperties } from \"./FlowDiagramNode\";\r\nimport { ChordDiagram, ChordDiagramDataItem } from \"../types/ChordDiagram\";\r\nimport { List } from \"../../core/utils/List\";\r\nimport { AxisLabelCircular } from \"../axes/AxisLabelCircular\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { Slice } from \"../../core/elements/Slice\";\r\nimport { InterfaceColorSet } from \"../../core/utils/InterfaceColorSet\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport { Bullet } from \"../elements/Bullet\";\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[ChordNode]].\r\n */\r\nexport interface IChordNodeProperties extends IFlowDiagramNodeProperties { }\r\n\r\n/**\r\n * Defines events for [[ChordNode]].\r\n */\r\nexport interface IChordNodeEvents extends IFlowDiagramNodeEvents { }\r\n\r\n/**\r\n * Defines adapters for [[ChordNode]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IChordNodeAdapters extends IFlowDiagramNodeAdapters, IChordNodeProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Creates a node in a Chord Diagram.\r\n *\r\n * A Chord node is a block with a value, which represents its size on the\r\n * diagram.\r\n *\r\n * Nodes are connected via [[ChordLink]] elements.\r\n *\r\n * @see {@link IChordNodeEvents} for a list of available events\r\n * @see {@link IChordNodeAdapters} for a list of available Adapters\r\n * @important\r\n */\r\nexport class ChordNode extends FlowDiagramNode {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IChordNodeProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IChordNodeAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IChordNodeEvents;\r\n\r\n\t/**\r\n\t * A list of data items of the items coming in from another node, one level\r\n\t * up.\r\n\t *\r\n\t * These are what ingoing links are build out of.\r\n\t */\r\n\tprotected _incomingDataItems: List;\r\n\r\n\t/**\r\n\t * A list of data items of the items going out of the node.\r\n\t *\r\n\t * These are what outgoing links are build out of.\r\n\t */\r\n\tprotected _outgoingDataItems: List;\r\n\r\n\t/**\r\n\t * Sorted list of incoming items.\r\n\t */\r\n\tprotected _incomingSorted: $iter.Iterator;\r\n\r\n\t/**\r\n\t * Sorted list of outgoing items.\r\n\t */\r\n\tprotected _outgoingSorted: $iter.Iterator;\r\n\r\n\t/**\r\n\t * A chart instance this node is added to.\r\n\t */\r\n\tpublic chart: ChordDiagram;\r\n\r\n\r\n\t/**\r\n\t * Defines the type of the [[ChordDiagramDataItem]] used in the class.\r\n\t */\r\n\tpublic _dataItem: ChordDiagramDataItem;\r\n\r\n\r\n\t/**\r\n\t * Slice sprite of a node\r\n\t */\r\n\tpublic slice: Slice;\r\n\r\n\t/**\r\n\t * A label element which shows node's name.\r\n\t */\r\n\tpublic label: AxisLabelCircular;\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic nextAngle: number;\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic trueStartAngle: number;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"ChordNode\";\r\n\r\n\t\tthis.label = this.createChild(AxisLabelCircular);\r\n\t\tthis.label.location = 0.5;\r\n\t\tthis.label.radius = 5;\r\n\t\tthis.label.text = \"{name}\";\r\n\t\tthis.label.zIndex = 1;\r\n\t\tthis.label.shouldClone = false;\r\n\r\n\t\tthis.layout = \"none\";\r\n\r\n\t\tthis.events.on(\"positionchanged\", this.updateRotation, this, false);\r\n\r\n\t\tthis.isMeasured = false;\r\n\t\tthis.slice = this.createChild(Slice);\r\n\t\tthis.slice.isMeasured = false;\r\n\r\n\t\tlet hiddenState = this.hiddenState;\r\n\t\thiddenState.properties.fill = new InterfaceColorSet().getFor(\"disabledBackground\");\r\n\t\thiddenState.properties.opacity = 0.5;\r\n\t\thiddenState.properties.visible = true;\r\n\r\n\t\tthis.setStateOnChildren = false;\r\n\r\n\t\tthis.slice.hiddenState.properties.visible = true;\r\n\r\n\t\tthis.adapter.add(\"tooltipX\", (tooltipX, target)=>{\r\n\t\t return target.slice.ix * (target.slice.radius - (target.slice.radius - target.slice.pixelInnerRadius) / 2);\r\n\t\t})\r\n\r\n\t\tthis.adapter.add(\"tooltipY\", (tooltipY, target)=>{\r\n\t\t return target.slice.iy * (target.slice.radius - (target.slice.radius - target.slice.pixelInnerRadius) / 2);\r\n\t\t})\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Invalidates all links, attached to this node.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic invalidateLinks(): void {\r\n\t\tsuper.invalidateLinks();\r\n\r\n\t\tlet label = this.label;\r\n\t\tlet slice = this.slice;\r\n\t\tlet chart = this.chart;\r\n\t\tif (chart && slice) {\r\n\r\n\t\t\tlet sum = this.total;\r\n\t\t\tlet arc = slice.arc;\r\n\t\t\tlet sliceStartAngle = slice.startAngle;\r\n\r\n\t\t\tthis.children.each((child) => {\r\n\t\t\t\tif (child instanceof Bullet) {\r\n\t\t\t\t\tlet locationX = child.locationX;\r\n\t\t\t\t\tif (!$type.isNumber(locationX)) {\r\n\t\t\t\t\t\tlocationX = 0.5;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlet locationY = child.locationY;\r\n\t\t\t\t\tif (!$type.isNumber(locationY)) {\r\n\t\t\t\t\t\tlocationY = 1;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tlet childAngle = sliceStartAngle + arc * locationX;\r\n\t\t\t\t\tlet childRadius = locationY * slice.radius;\r\n\r\n\t\t\t\t\tchild.x = childRadius * $math.cos(childAngle);\r\n\t\t\t\t\tchild.y = childRadius * $math.sin(childAngle);\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\r\n\t\t\tlet labelAngle = sliceStartAngle + arc * label.location;\r\n\t\t\tlet startAngle = sliceStartAngle + (1 - sum / this.adjustedTotal) * arc * 0.5; // if value of a node is > then sum of the links, add to center link\r\n\r\n\t\t\tif ($type.isNaN(startAngle)) {\r\n\t\t\t\tstartAngle = sliceStartAngle;\r\n\t\t\t}\r\n\r\n\t\t\tlabel.fixPosition(labelAngle, slice.radius);\r\n\r\n\t\t\tthis.nextAngle = startAngle;\r\n\r\n\t\t\tif (this._outgoingSorted) {\r\n\r\n\t\t\t\t$iter.each(this._outgoingSorted, (dataItem) => {\r\n\t\t\t\t\tlet link = dataItem.link;\r\n\t\t\t\t\tlink.parent = this.chart.linksContainer;\r\n\t\t\t\t\tlet value = dataItem.getWorkingValue(\"value\");\r\n\r\n\t\t\t\t\tif ($type.isNumber(value)) {\r\n\r\n\t\t\t\t\t\tif (chart.nonRibbon) {\r\n\t\t\t\t\t\t\tlet percentWidth = link.percentWidth;\r\n\t\t\t\t\t\t\tif (!$type.isNumber(percentWidth)) {\r\n\t\t\t\t\t\t\t\tpercentWidth = 5;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tpercentWidth = percentWidth / 100;\r\n\r\n\t\t\t\t\t\t\tlink.startAngle = sliceStartAngle + arc / 2 - arc / 2 * percentWidth;\r\n\t\t\t\t\t\t\tlink.arc = arc * percentWidth;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tlink.arc = value * chart.valueAngle;\r\n\t\t\t\t\t\t\tlink.startAngle = this.nextAngle;\r\n\t\t\t\t\t\t\tthis.nextAngle += link.arc;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (!dataItem.toNode) {\r\n\t\t\t\t\t\t\tlink.endAngle = link.startAngle;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tlink.radius = slice.pixelInnerRadius;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t//link.validate();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tif (this._incomingSorted) {\r\n\t\t\t\t$iter.each(this._incomingSorted, (dataItem) => {\r\n\t\t\t\t\tlet link = dataItem.link;\r\n\r\n\t\t\t\t\tlink.radius = slice.pixelInnerRadius;\r\n\r\n\t\t\t\t\tif (chart.nonRibbon) {\r\n\t\t\t\t\t\tlet percentWidth = link.percentWidth;\r\n\t\t\t\t\t\tif (!$type.isNumber(percentWidth)) {\r\n\t\t\t\t\t\t\tpercentWidth = 5;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tpercentWidth = percentWidth / 100;\r\n\r\n\t\t\t\t\t\tlink.endAngle = sliceStartAngle + arc / 2 - arc / 2 * percentWidth;\r\n\t\t\t\t\t\tlink.arc = arc * percentWidth;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tlink.endAngle = this.nextAngle;\r\n\t\t\t\t\t\tlet value = dataItem.getWorkingValue(\"value\");\r\n\t\t\t\t\t\tif ($type.isNumber(value)) {\r\n\t\t\t\t\t\t\tlink.arc = value * chart.valueAngle; // yes, this is needed\r\n\t\t\t\t\t\t\tthis.nextAngle += link.arc;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (!dataItem.fromNode) {\r\n\t\t\t\t\t\tlink.startAngle = link.endAngle;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t//link.validate();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t * updates slice start angle so that when we drag a node it would face the center\r\n\t */\r\n\tprotected updateRotation() {\r\n\t\tlet slice = this.slice;\r\n\t\tlet mAngle = this.trueStartAngle + slice.arc / 2;\r\n\t\tlet radius = slice.radius;\r\n\r\n\t\tlet tx = radius * $math.cos(mAngle);\r\n\t\tlet ty = radius * $math.sin(mAngle);\r\n\r\n\t\tlet angle = $math.getAngle({ x: tx + this.pixelX, y: ty + this.pixelY });\r\n\r\n\t\tslice.startAngle = this.trueStartAngle + (angle - mAngle);\r\n\r\n\t\tthis.dx = - this.pixelX;\r\n\t\tthis.dy = - this.pixelY;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Copies properties and labels from another [[ChordNode]].\r\n\t *\r\n\t * @param source Source node\r\n\t */\r\n\tpublic copyFrom(source: this): void {\r\n\t\tsuper.copyFrom(source);\r\n\t\tthis.label.copyFrom(source.label);\r\n\t\tthis.slice.copyFrom(source.slice);\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"ChordNode\"] = ChordNode;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/elements/ChordNode.ts","/**\r\n * Functionality for drawing quadratic curves.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Line, ILineProperties, ILineAdapters, ILineEvents } from \"./Line\";\r\nimport { IPoint, IOrientationPoint } from \"../defs/IPoint\";\r\nimport { color } from \"../utils/Color\";\r\nimport * as $path from \"../rendering/Path\";\r\nimport * as $math from \"../utils/Math\";\r\nimport * as $type from \"../utils/Type\";\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines available properties for [[QuadraticCurve]].\r\n */\r\nexport interface IQuadraticCurveProperties extends ILineProperties {\r\n\t/**\r\n\t * X coordinate of control point.\r\n\t */\r\n\tcpx?: number;\r\n\r\n\t/**\r\n\t * Y coordinate of control point.\r\n\t */\r\n\tcpy?: number;\r\n}\r\n\r\n/**\r\n * Defines events for [[QuadraticCurve]].\r\n */\r\nexport interface IQuadraticCurveEvents extends ILineEvents { }\r\n\r\n/**\r\n * Defines adapters for [[QuadraticCurve]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IQuadraticCurveAdapters extends ILineAdapters, IQuadraticCurveProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Draws a waved line.\r\n *\r\n * @see {@link IQuadraticCurveEvents} for a list of available events\r\n * @see {@link IQuadraticCurveAdapters} for a list of available Adapters\r\n */\r\nexport class QuadraticCurve extends Line {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IQuadraticCurveProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IQuadraticCurveAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IQuadraticCurveEvents;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"QuadraticCurve\";\r\n\t\tthis.element = this.paper.add(\"path\");\r\n\t\tthis.pixelPerfect = false;\r\n\r\n\t\tthis.fill = color();\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Draws the waved line.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic draw(): void {\r\n\t\t//super.draw();\r\n\t\tif($type.isNumber(this.x1 + this.x2 + this.y1 + this.y2 + this.cpx + this.cpy )){\r\n\r\n\t\t\tlet p1: IPoint = { x: this.x1, y: this.y1 };\r\n\t\t\tlet p2: IPoint = { x: this.x2, y: this.y2 };\r\n\t\t\tlet cp: IPoint = { x: this.cpx, y: this.cpy };\r\n\r\n\t\t\tlet d: string = $path.moveTo(p1) + $path.quadraticCurveTo(p2, cp);\r\n\r\n\t\t\tthis.path = d;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * X coordinate of control point.\r\n\t *\r\n\t * @param value X\r\n\t */\r\n\tpublic set cpx(value: number) {\r\n\t\tthis.setPropertyValue(\"cpx\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return X\r\n\t */\r\n\tpublic get cpx(): number {\r\n\t\treturn this.getPropertyValue(\"cpx\");\r\n\t}\r\n\r\n\t/**\r\n\t * Y coordinate of control point.\r\n\t *\r\n\t * @param value Y\r\n\t */\r\n\tpublic set cpy(value: number) {\r\n\t\tthis.setPropertyValue(\"cpy\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Y\r\n\t */\r\n\tpublic get cpy(): number {\r\n\t\treturn this.getPropertyValue(\"cpy\");\r\n\t}\r\n\r\n\t/**\r\n\t * Converts relative position along the line (0-1) into pixel coordinates.\r\n\t *\r\n\t * @param position Position (0-1)\r\n\t * @return Coordinates\r\n\t */\r\n\tpublic positionToPoint(position: number): IOrientationPoint {\r\n\t\tlet p1 = {x:this.x1, y:this.y1};\r\n\t\tlet cp = {x:this.cpx, y:this.cpy};\r\n\t\tlet p2 = {x:this.x2, y:this.y2};\r\n\r\n\t\tlet point1 = $math.getPointOnQuadraticCurve(p1, p2, cp, position);\r\n\t\tlet point2 = $math.getPointOnQuadraticCurve(p1, p2, cp, position + 0.001);\r\n\r\n\t\treturn {x:point1.x, y:point1.y, angle:$math.getAngle(point1, point2)};\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/core/elements/QuadraticCurve.ts","/**\r\n * ChordLink module\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { ChordDiagramDataItem } from \"../types/ChordDiagram\";\r\nimport { FlowDiagramLink, IFlowDiagramLinkAdapters, IFlowDiagramLinkEvents, IFlowDiagramLinkProperties } from \"./FlowDiagramLink\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { QuadraticCurve } from \"../../core/elements/QuadraticCurve\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[ChordLink]].\r\n */\r\nexport interface IChordLinkProperties extends IFlowDiagramLinkProperties {\r\n\r\n\t/**\r\n\t * [radius description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tradius?: number;\r\n\r\n\r\n\t/**\r\n\t * [arc description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tarc?: number;\r\n}\r\n\r\n/**\r\n * Defines events for [[ChordLink]].\r\n */\r\nexport interface IChordLinkEvents extends IFlowDiagramLinkEvents { }\r\n\r\n/**\r\n * Defines adapters for [[ChordLink]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IChordLinkAdapters extends IFlowDiagramLinkAdapters, IChordLinkProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * This class creates a link (waved color-filled line) between two nodes in a\r\n * Chord Diagram.\r\n *\r\n * @see {@link IChordLinkEvents} for a list of available events\r\n * @see {@link IChordLinkAdapters} for a list of available Adapters\r\n * @important\r\n */\r\nexport class ChordLink extends FlowDiagramLink {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IChordLinkProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IChordLinkAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IChordLinkEvents;\r\n\r\n\t/**\r\n\t * Defines a type of data item used by this class.\r\n\t */\r\n\tpublic _dataItem: ChordDiagramDataItem;\r\n\r\n\t/**\r\n\t * Spline which goes through the middle of a link, used to calculate bullet and tooltip positions, invisible by default\r\n */\r\n\tpublic middleLine: QuadraticCurve;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"ChordLink\";\r\n\r\n\t\tthis.middleLine = this.createChild(QuadraticCurve);\r\n\t\tthis.middleLine.shouldClone = false;\r\n\t\tthis.middleLine.strokeOpacity = 0;\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)validates (redraws) the link.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validate() {\r\n\t\tsuper.validate();\r\n\r\n\t\tif (!this.isTemplate) {\r\n\t\t\tlet startAngle = this.startAngle;\r\n\t\t\tlet endAngle = this.endAngle;\r\n\r\n\t\t\tlet arc = this.arc;\r\n\t\t\tlet radius = this.radius;\r\n\r\n\t\t\tlet fromNode = this.dataItem.fromNode;\r\n\t\t\tlet toNode = this.dataItem.toNode;\r\n\r\n\t\t\tlet fromX = 0;\r\n\t\t\tlet fromY = 0;\r\n\r\n\t\t\tif (fromNode) {\r\n\t\t\t\tfromX = fromNode.pixelX + fromNode.dx;\r\n\t\t\t\tfromY = fromNode.pixelY + fromNode.dy;\r\n\t\t\t}\r\n\r\n\t\t\tlet toX = 0;\r\n\t\t\tlet toY = 0;\r\n\r\n\t\t\tif (toNode) {\r\n\t\t\t\ttoX = toNode.pixelX + toNode.dx;\r\n\t\t\t\ttoY = toNode.pixelY + toNode.dy;\r\n\t\t\t}\r\n\r\n\t\t\tif (radius > 0) {\r\n\t\t\t\tlet x1 = radius * $math.cos(startAngle) + fromX;\r\n\t\t\t\tlet y1 = radius * $math.sin(startAngle) + fromY;\r\n\t\t\t\tlet x2 = radius * $math.cos(endAngle) + toX;\r\n\t\t\t\tlet y2 = radius * $math.sin(endAngle) + toY;\r\n\r\n\t\t\t\t//let cpAngle = startAngle + arc + (endAngle - startAngle - arc) / 2;\r\n\t\t\t\t//let arcWidth = $math.getDistance({x:x1, y:y1}, {x:x4, y:y4});\r\n\r\n\t\t\t\t//let cpx = (arcWidth) * $math.cos(cpAngle);\r\n\t\t\t\t//let cpy = (arcWidth) * $math.sin(cpAngle);\r\n\r\n\t\t\t\tlet cp = { x: 0, y: 0 };\r\n\t\t\t\tlet path = $path.moveTo({ x: x1, y: y1 });\r\n\r\n\t\t\t\tpath += $path.arcTo(startAngle, arc, radius);\r\n\t\t\t\tpath += $path.quadraticCurveTo({ x: x2, y: y2 }, cp);\r\n\t\t\t\tpath += $path.arcTo(endAngle, arc, radius);\r\n\t\t\t\tpath += $path.quadraticCurveTo({ x: x1, y: y1 }, cp);\r\n\r\n\t\t\t\tif (arc > 0) {\r\n\t\t\t\t\tthis.link.path = path;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.link.path = \"\";\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this.maskBullets) {\r\n\t\t\t\t\tthis.bulletsMask.path = path;\r\n\t\t\t\t\tthis.bulletsContainer.mask = this.bulletsMask;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet mAngle1 = startAngle + arc / 2;\r\n\t\t\t\tlet mAngle2 = endAngle + arc / 2;\r\n\r\n\t\t\t\tlet middleLine = this.middleLine;\r\n\r\n\t\t\t\tmiddleLine.x1 = radius * $math.cos(mAngle1) + fromX;\r\n\t\t\t\tmiddleLine.y1 = radius * $math.sin(mAngle1) + fromY;\r\n\t\t\t\tmiddleLine.x2 = radius * $math.cos(mAngle2) + toX;\r\n\t\t\t\tmiddleLine.y2 = radius * $math.sin(mAngle2) + toY;\r\n\r\n\t\t\t\tmiddleLine.cpx = 0;\r\n\t\t\t\tmiddleLine.cpy = 0;\r\n\r\n\t\t\t\tmiddleLine.stroke = this.fill;\r\n\r\n\t\t\t\tthis.positionBullets();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t * [radius description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param value End Y\r\n\t */\r\n\tpublic set radius(value: number) {\r\n\t\tthis.setPropertyValue(\"radius\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return End Y\r\n\t */\r\n\tpublic get radius(): number {\r\n\t\treturn this.getPropertyValue(\"radius\");\r\n\t}\r\n\r\n\t/**\r\n\t * [arc description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param value [description]\r\n\t */\r\n\tpublic set arc(value: number) {\r\n\t\tthis.setPropertyValue(\"arc\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return [description]\r\n\t */\r\n\tpublic get arc(): number {\r\n\t\treturn this.getPropertyValue(\"arc\");\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"ChordLink\"] = ChordLink;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/elements/ChordLink.ts","/**\r\n * Chord diagram module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { FlowDiagram, FlowDiagramDataItem, IFlowDiagramAdapters, IFlowDiagramDataFields, IFlowDiagramEvents, IFlowDiagramProperties } from \"./FlowDiagram\";\r\nimport { percent, Percent } from \"../../core/utils/Percent\";\r\nimport { DictionaryTemplate } from \"../../core/utils/Dictionary\";\r\nimport { Container } from \"../../core/Container\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { ChordNode } from \"../elements/ChordNode\";\r\nimport { ChordLink } from \"../elements/ChordLink\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport { IRectangle } from \"../../core/defs/IRectangle\";\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n//@todo rearange notes after dragged\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[ChordDiagram]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class ChordDiagramDataItem extends FlowDiagramDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: ChordDiagram;\r\n\r\n\t/**\r\n\t * An a link element, connecting two nodes.\r\n\t */\r\n\tpublic _link: ChordLink;\r\n\r\n\t/**\r\n\t * An origin node.\r\n\t */\r\n\tpublic fromNode: ChordNode;\r\n\r\n\t/**\r\n\t * A destination node.\r\n\t */\r\n\tpublic toNode: ChordNode;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"ChordDiagramDataItem\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[ChordDiagram]].\r\n */\r\nexport interface IChordDiagramDataFields extends IFlowDiagramDataFields {\r\n\r\n\t/**\r\n\t * Name of the source node.\r\n\t */\r\n\tfromName?: string;\r\n\r\n\t/**\r\n\t * Name of the target node.\r\n\t */\r\n\ttoName?: string;\r\n\r\n\t/**\r\n\t * Value of the link between two nodes.\r\n\t */\r\n\tvalue?: string;\r\n\r\n\t/**\r\n\t * Color of a from node\r\n\t */\r\n\tcolor?: string;\r\n}\r\n\r\n/**\r\n * Defines properties for [[ChordDiagram]]\r\n */\r\nexport interface IChordDiagramProperties extends IFlowDiagramProperties {\r\n\t/**\r\n\t * Radius of the Chord. Absolute or relative.\r\n\t */\r\n\tradius?: number | Percent;\r\n\r\n\t/**\r\n\t * Inner radius of the Chord nodes. Absolute or relative. Negative value means that the inner radius will be calculated from the radius, not from the center.\r\n\t */\r\n\tinnerRadius?: number | Percent;\r\n\r\n\t/**\r\n\t * An angle radar face starts on. (degrees)\r\n\t *\r\n\t * @default -90\r\n\t */\r\n\tstartAngle?: number;\r\n\r\n\t/**\r\n\t * An angle radar face ends on. (degrees)\r\n\t *\r\n\t * @default 270\r\n\t */\r\n\tendAngle?: number;\r\n\r\n\r\n\t/**\r\n\t * If you set this to true, all the lines will be of the same width.\r\n\t *\r\n\t * @default false\r\n\t */\r\n\tnonRibbon?: boolean;\r\n}\r\n\r\n/**\r\n * Defines events for [[ChordDiagram]].\r\n */\r\nexport interface IChordDiagramEvents extends IFlowDiagramEvents { }\r\n\r\n/**\r\n * Defines adapters for [[ChordDiagram]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IChordDiagramAdapters extends IFlowDiagramAdapters, IChordDiagramProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Creates a Chord Diagram chart.\r\n *\r\n * @see {@link IChordDiagramEvents} for a list of available Events\r\n * @see {@link IChordDiagramAdapters} for a list of available Adapters\r\n * @see {@link https://www.amcharts.com/docs/v4/chart-types/chord-diagram/} for documentation\r\n * @important\r\n */\r\nexport class ChordDiagram extends FlowDiagram {\r\n\r\n\t/**\r\n\t * Defines a type for the DataItem.\r\n\t */\r\n\tpublic _dataItem: ChordDiagramDataItem;\r\n\r\n\t/**\r\n\t * Defines available data fields.\r\n\t */\r\n\tpublic _dataFields: IChordDiagramDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IChordDiagramProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IChordDiagramAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IChordDiagramEvents;\r\n\r\n\t/**\r\n\t * A list of chart's Chord nodes.\r\n\t *\r\n\t * @param {DictionaryTemplate}\r\n\t */\r\n\tpublic nodes: DictionaryTemplate;\r\n\r\n\t/**\r\n\t * An a link element, connecting two nodes.\r\n\t */\r\n\tpublic _link: ChordLink;\r\n\r\n\t/**\r\n\t * Sorted nodes iterator.\r\n\t *\r\n\t * @ignore\r\n\t */\r\n\tprotected _sorted: $iter.Iterator<[string, ChordNode]>;\r\n\r\n\t/**\r\n\t * [valueAngle description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t */\r\n\tpublic valueAngle: number = 0;\r\n\r\n\t/**\r\n\t * A container for chord elemens.\r\n\t */\r\n\tpublic chordContainer:Container;\r\n\r\n\t/**\r\n\t */\r\n\tpublic _node:ChordNode;\r\n\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"ChordDiagram\";\r\n\r\n\t\tthis.startAngle = -90;\r\n\t\tthis.endAngle = 270;\r\n\r\n\t\tthis.radius = percent(80);\r\n\r\n\t\tthis.innerRadius = - 15;\r\n\r\n\t\tthis.nodePadding = 5;\r\n\r\n\t\tlet chordContainer = this.chartContainer.createChild(Container);\r\n\t\tchordContainer.align = \"center\";\r\n\t\tchordContainer.valign = \"middle\";\r\n\t\tchordContainer.shouldClone = false;\r\n\t\tchordContainer.layout = \"absolute\";\r\n\t\tthis.chordContainer = chordContainer;\r\n\r\n\t\tthis.nodesContainer.parent = chordContainer;\r\n\t\tthis.linksContainer.parent = chordContainer;\r\n\r\n\t\tthis.chartContainer.events.on(\"maxsizechanged\", this.invalidate, this, false);\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Redraws the chart.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validate(): void {\r\n\t\tlet chartContainer = this.chartContainer;\r\n\r\n\t\tlet endAngle = this.endAngle;\r\n\t\tlet startAngle = this.startAngle + this.nodePadding / 2;\r\n\r\n\t\tlet rect = $math.getArcRect(this.startAngle, this.endAngle, 1);\r\n\t\tlet innerRect: IRectangle = { x: 0, y: 0, width: 0, height: 0 };\r\n\r\n\t\trect = $math.getCommonRectangle([rect, innerRect]);\r\n\r\n\t\tlet maxRadius = Math.min(chartContainer.innerWidth / rect.width, chartContainer.innerHeight / rect.height);\r\n\r\n\t\tif(!$type.isNumber(maxRadius)){\r\n\t\t\tmaxRadius = 0;\r\n\t\t}\r\n\r\n\t\tlet radius = $utils.relativeRadiusToValue(this.radius, maxRadius);\r\n\t\tlet pixelInnerRadius = $utils.relativeRadiusToValue(this.innerRadius, radius, true);\r\n\r\n\t\tlet total = this.dataItem.values.value.sum;\r\n\t\tlet count = 0;\r\n\r\n\t\tlet newTotal = 0;\r\n\t\t$iter.each(this._sorted, (strNode) => {\r\n\t\t\tlet node = strNode[1];\r\n\t\t\tthis.getNodeValue(node);\r\n\t\t\tcount++;\r\n\t\t\tlet value = node.total;\r\n\t\t\tif(node.total / total < this.minNodeSize){\r\n\t\t\t\tvalue = total * this.minNodeSize;\r\n\t\t\t}\r\n\t\t\tnewTotal += value;\r\n\t\t});\r\n\r\n\t\tthis.valueAngle = (endAngle - this.startAngle - this.nodePadding * count) / newTotal;\r\n\r\n\t\t$iter.each(this._sorted, (strNode) => {\r\n\t\t\tlet node = strNode[1];\r\n\t\t\tlet slice = node.slice;\r\n\r\n\t\t\tslice.radius = radius;\r\n\t\t\tslice.innerRadius = pixelInnerRadius;\r\n\r\n\t\t\tlet value = node.total;\r\n\r\n\t\t\tif(node.total / total < this.minNodeSize){\r\n\t\t\t\tvalue = total * this.minNodeSize;\r\n\t\t\t}\r\n\r\n\t\t\tnode.adjustedTotal = value;\r\n\r\n\t\t\tlet arc: number;\r\n\t\t\tif (this.nonRibbon) {\r\n\t\t\t\tarc = (endAngle - this.startAngle) / count - this.nodePadding;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tarc = this.valueAngle * value;\r\n\t\t\t}\r\n\r\n\t\t\tslice.arc = arc;\r\n\t\t\tslice.startAngle = startAngle;\r\n\t\t\tnode.trueStartAngle = startAngle;\r\n\t\t\tnode.parent = this.nodesContainer;\r\n\t\t\tnode.validate(); // otherwise flickers - nodes are already created, but not yet positioned etc.\r\n\t\t\tstartAngle += arc + this.nodePadding;\r\n\t\t})\r\n\r\n\t\tthis.chordContainer.definedBBox = { x: radius * rect.x, y: radius * rect.y, width: radius * rect.width, height: radius * rect.height };\r\n\t\tthis.chordContainer.invalidateLayout();\r\n\r\n\t\tsuper.validate();\r\n\t}\r\n\r\n\t/**\r\n\t * Sets defaults that instantiate some objects that rely on parent, so they\r\n\t * cannot be set in constructor.\r\n\t */\r\n\tprotected applyInternalDefaults(): void {\r\n\r\n\t\tsuper.applyInternalDefaults();\r\n\r\n\t\t// Add a default screen reader title for accessibility\r\n\t\t// This will be overridden in screen reader if there are any `titles` set\r\n\t\tif (!$type.hasValue(this.readerTitle)) {\r\n\t\t\tthis.readerTitle = this.language.translate(\"Chord diagram\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Creates and returns a new data item.\r\n\t *\r\n\t * @return Data item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new ChordDiagramDataItem();\r\n\t}\r\n\r\n\t/**\r\n\t * Starting angle of the Radar face. (degrees)\r\n\t *\r\n\t * Normally, a circular radar face begins (the radial axis is drawn) at the\r\n\t * top center. (at -90 degrees)\r\n\t *\r\n\t * You can use `startAngle` to change this setting.\r\n\t *\r\n\t * E.g. setting this to 0 will make the radial axis start horizontally to\r\n\t * the right, as opposed to vertical.\r\n\t *\r\n\t * For a perfect circle the absolute sum of `startAngle` and `endAngle`\r\n\t * needs to be 360.\r\n\t *\r\n\t * However, it's **not** necessary to do so. You can set those to lesser\r\n\t * numbers, to create semi-circles.\r\n\t *\r\n\t * E.g. `startAngle = -90` with `endAngle = 0` will create a radar face that\r\n\t * looks like a quarter of a circle.\r\n\t *\r\n\t * @default -90\r\n\t * @param value Start angle (degrees)\r\n\t */\r\n\tpublic set startAngle(value: number) {\r\n\t\tthis.setPropertyValue(\"startAngle\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Start angle (degrees)\r\n\t */\r\n\tpublic get startAngle(): number {\r\n\t\treturn this.getPropertyValue(\"startAngle\");\r\n\t}\r\n\r\n\t/**\r\n\t * Starting angle of the Radar face. (degrees)\r\n\t *\r\n\t * Normally, a circular radar face ends (the radial axis is drawn) exactly\r\n\t * where it has started, forming a full 360 circle. (at 270 degrees)\r\n\t *\r\n\t * You can use `endAngle` to end the circle somewhere else.\r\n\t *\r\n\t * E.g. setting this to 180 will make the radar face end at horizontal line\r\n\t * to the left off the center.\r\n\t *\r\n\t * For a perfect circle the absolute sum of `startAngle` and `endAngle`\r\n\t * needs to be 360.\r\n\t *\r\n\t * However, it's **not** necessary to do so. You can set those to lesser\r\n\t * numbers, to create semi-circles.\r\n\t *\r\n\t * E.g. `startAngle = -90` with `endAngle = 0` will create a radar face that\r\n\t * looks like a quarter of a circle.\r\n\t *\r\n\t * @default -90\r\n\t * @param value End angle (degrees)\r\n\t */\r\n\tpublic set endAngle(value: number) {\r\n\t\tthis.setPropertyValue(\"endAngle\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return End angle (degrees)\r\n\t */\r\n\tpublic get endAngle(): number {\r\n\t\treturn this.getPropertyValue(\"endAngle\");\r\n\t}\r\n\r\n\t/**\r\n\t * Outer radius of the Radar face.\r\n\t *\r\n\t * This can either be in absolute pixel value, or relative [[Percent]].\r\n\t *\r\n\t * @param value Outer radius\r\n\t */\r\n\tpublic set radius(value: number | Percent) {\r\n\t\tthis.setPercentProperty(\"radius\", value, true, false, 10, false);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Outer radius\r\n\t */\r\n\tpublic get radius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"radius\");\r\n\t}\r\n\r\n\t/**\r\n\t * Inner radius of the Chord nodes.\r\n\t *\r\n\t * This can either be in absolute pixel value, or relative [[Percent]].\r\n\t *\r\n\t * @param value Outer radius\r\n\t */\r\n\tpublic set innerRadius(value: number | Percent) {\r\n\t\tthis.setPercentProperty(\"innerRadius\", value, true, false, 10, false);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Inner radius\r\n\t */\r\n\tpublic get innerRadius(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"innerRadius\");\r\n\t}\r\n\r\n\r\n\r\n\t/**\r\n\t *\r\n\t * If you set this to true, all the lines will be of the same width. This is done by making middleLine of a ChordLink visible.\r\n\t *\r\n\t * @param value\r\n\t */\r\n\tpublic set nonRibbon(value: boolean) {\r\n\t\tthis.setPropertyValue(\"nonRibbon\", value, true);\r\n\t\tthis.links.template.middleLine.strokeOpacity = 1;\r\n\t\tthis.links.template.link.fillOpacity = 0;\r\n\t}\r\n\r\n\t/**\r\n\t * @return Non-ribbon\r\n\t */\r\n\tpublic get nonRibbon(): boolean {\r\n\t\treturn this.getPropertyValue(\"nonRibbon\");\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic createNode():this[\"_node\"]{\r\n\t\tlet node = new ChordNode();\r\n\t\tthis._disposers.push(node);\r\n\t\treturn node;\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic createLink():this[\"_link\"]{\r\n\t\tlet link = new ChordLink();\r\n\t\tthis._disposers.push(link);\r\n\t\treturn link;\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"ChordDiagram\"] = ChordDiagram;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/types/ChordDiagram.ts","/**\r\n * Column series module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { XYSeries, IXYSeriesDataFields, XYSeriesDataItem, IXYSeriesProperties, IXYSeriesAdapters, IXYSeriesEvents } from \"./XYSeries\";\r\nimport { Sprite, visualProperties } from \"../../core/Sprite\";\r\nimport { SpriteState } from \"../../core/SpriteState\";\r\nimport { Container } from \"../../core/Container\";\r\nimport { ListTemplate, ListDisposer } from \"../../core/utils/List\";\r\nimport { Dictionary } from \"../../core/utils/Dictionary\";\r\nimport { ValueAxis } from \"../axes/ValueAxis\";\r\nimport { CategoryAxis } from \"../axes/CategoryAxis\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { Bullet } from \"../elements/Bullet\";\r\nimport { Column } from \"../elements/Column\";\r\nimport { RoundedRectangle } from \"../../core/elements/RoundedRectangle\";\r\nimport { percent } from \"../../core/utils/Percent\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $object from \"../../core/utils/Object\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $array from \"../../core/utils/Array\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport { Disposer } from \"../../core/utils/Disposer\";\r\nimport { LegendDataItem } from \"../../charts/Legend\";\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[ColumnSeries]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class ColumnSeriesDataItem extends XYSeriesDataItem {\r\n\r\n\t/**\r\n\t * A Column Element\r\n\t */\r\n\tpublic _column: Column;\r\n\r\n\t/**\r\n\t * Indicates if this data items close value is lower than its open value.\r\n\t */\r\n\tpublic droppedFromOpen: boolean;\r\n\r\n\t/**\r\n\t * Indicates if this items value is lower than previous data item's value.\r\n\t */\r\n\tpublic droppedFromPrevious: boolean;\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for\r\n\t */\r\n\tpublic _component!: ColumnSeries;\r\n\r\n\t/**\r\n\t * A dictionary storing axes ranges columns by axis uid\r\n\t *\r\n\t * @ignore\r\n\t */\r\n\tprotected _rangesColumns: Dictionary;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"ColumnSeriesDataItem\";\r\n\r\n\t\tthis.locations[\"dateX\"] = 0.5;\r\n\t\tthis.locations[\"dateY\"] = 0.5;\r\n\r\n\t\tthis.locations[\"categoryX\"] = 0.5;\r\n\t\tthis.locations[\"categoryY\"] = 0.5;\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * A column used to draw a column for this data item.\r\n\t *\r\n\t * @param column\r\n\t */\r\n\tpublic set column(column: this[\"_column\"]) {\r\n\t\tthis.setColumn(column);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Column\r\n\t */\r\n\tpublic get column(): this[\"_column\"] {\r\n\t\treturn this._column;\r\n\t}\r\n\r\n\tprotected setColumn(column: this[\"_column\"]) {\r\n\t\tif (this._column && column != this._column) {\r\n\t\t\t$array.remove(this.sprites, this._column);\r\n\t\t}\r\n\t\tthis._column = column;\r\n\r\n\t\tif (column) {\r\n\t\t\tlet prevDataItem: ColumnSeriesDataItem = column.dataItem;\r\n\t\t\tif (prevDataItem && prevDataItem != this) {\r\n\t\t\t\tprevDataItem.column = undefined;\r\n\t\t\t}\r\n\t\t\tthis.addSprite(column);\r\n\r\n\t\t\tthis._disposers.push(new Disposer(() => {\r\n\t\t\t\t// TODO investigate why component is undefined\r\n\t\t\t\t// https://codepen.io/team/amcharts/pen/dac4be245d658233a6d7e5597df2208b?editors=0010\r\n\t\t\t\tif (this.component) {\r\n\t\t\t\t\tthis.component.columns.removeValue(column);\r\n\t\t\t\t}\r\n\t\t\t}));\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * A dictionary storing axes ranges columns by axis uid\r\n\t */\r\n\tpublic get rangesColumns(): Dictionary {\r\n\t\tif (!this._rangesColumns) {\r\n\t\t\tthis._rangesColumns = new Dictionary();\r\n\t\t}\r\n\t\treturn this._rangesColumns;\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[ColumnSeries]].\r\n */\r\nexport interface IColumnSeriesDataFields extends IXYSeriesDataFields { }\r\n\r\n/**\r\n * Defines properties for [[ColumnSeries]].\r\n */\r\nexport interface IColumnSeriesProperties extends IXYSeriesProperties {\r\n\r\n\t/**\r\n\t * Cluster this series columns?\r\n\t *\r\n\t * Setting to `false` will make columns overlap with other series.\r\n\t *\r\n\t * @default true\r\n\t */\r\n\tclustered?: boolean;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[ColumnSeries]].\r\n */\r\nexport interface IColumnSeriesEvents extends IXYSeriesEvents { }\r\n\r\n/**\r\n * Defines adapters for [[ColumnSeries]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IColumnSeriesAdapters extends IXYSeriesAdapters, IColumnSeriesProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines [[Series]] for a column graph.\r\n *\r\n * @see {@link IColumnSeriesEvents} for a list of available Events\r\n * @see {@link IColumnSeriesAdapters} for a list of available Adapters\r\n * @todo Example\r\n * @important\r\n */\r\nexport class ColumnSeries extends XYSeries {\r\n\t/**\r\n\t */\r\n\tpublic _column: Column;\r\n\r\n\r\n\t/**\r\n\t * Defines available data fields.\r\n\t */\r\n\tpublic _dataFields: IColumnSeriesDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IColumnSeriesProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IColumnSeriesAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IColumnSeriesEvents;\r\n\r\n\t/**\r\n\t * Defines the type of data item.\r\n\t */\r\n\tpublic _dataItem: ColumnSeriesDataItem;\r\n\r\n\t/**\r\n\t * A list of column elements.\r\n\t */\r\n\tprotected _columns: ListTemplate;\r\n\r\n\t/**\r\n\t * Container to put column elements in.\r\n\t */\r\n\tprotected _columnsContainer: Container;\r\n\r\n\t/**\r\n\t * Start location within cell for columns.\r\n\t */\r\n\tprotected _startLocation: number = 0;\r\n\r\n\t/**\r\n\t * End location within cell for columns.\r\n\t */\r\n\tprotected _endLocation: number = 1;\r\n\r\n\t/**\r\n\t * A state to apply to a column when close value is lower than open value.\r\n\t */\r\n\tprotected _dropFromOpenState: SpriteState;\r\n\r\n\t/**\r\n\t * A state to apply to a column when its value is lower value of a previous\r\n\t * column.\r\n\t */\r\n\tprotected _dropFromPreviousState: SpriteState;\r\n\r\n\t/**\r\n\t * A state to apply to a column when close value is same or higher than open\r\n\t * value.\r\n\t */\r\n\tprotected _riseFromOpenState: SpriteState;\r\n\r\n\t/**\r\n\t * A state to apply to a column when its value is same or higher than value\r\n\t * of a previous column.\r\n\t */\r\n\tprotected _riseFromPreviousState: SpriteState;\r\n\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"ColumnSeries\";\r\n\r\n\t\tthis.width = percent(100);\r\n\t\tthis.height = percent(100);\r\n\r\n\t\tthis.strokeOpacity = 0;\r\n\t\tthis.fillOpacity = 1;\r\n\r\n\t\tthis.clustered = true;\r\n\r\n\t\tlet columnsContainer = this.mainContainer.createChild(Container);\r\n\t\tcolumnsContainer.shouldClone = false;\r\n\t\tcolumnsContainer.isMeasured = false;\r\n\t\tcolumnsContainer.layout = \"none\";\r\n\t\tthis._columnsContainer = columnsContainer;\r\n\r\n\t\tthis.columns;\r\n\t\tthis.columns.template.pixelPerfect = false;\r\n\r\n\t\tthis.tooltipColorSource = this.columns.template;\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * A container that columns are created in.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic get columnsContainer() {\r\n\t\treturn this._columnsContainer;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets defaults that instantiate some objects that rely on parent, so they\r\n\t * cannot be set in constructor.\r\n\t */\r\n\tprotected applyInternalDefaults(): void {\r\n\t\tsuper.applyInternalDefaults();\r\n\t\tif (!$type.hasValue(this.readerTitle)) {\r\n\t\t\tthis.readerTitle = this.language.translate(\"Column Series\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty DataItem of the type appropriate for this object.\r\n\t *\r\n\t * @see {@link DataItem}\r\n\t * @return Data Item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new ColumnSeriesDataItem();\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)validates the whole series, effectively causing it to redraw.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validate(): void {\r\n\t\t//@todo Check if we can do better than use `instanceof`\r\n\t\t// find start/end locations based on clustered/stacked settings\r\n\t\t// go through chart series instead of base axis series, because axis series doesn't maintain order\r\n\t\tlet baseAxisSeries = this.chart.series;\r\n\t\tlet clusterCount: number = 0;\r\n\t\tlet index: number = 0;\r\n\r\n\t\t$iter.each(baseAxisSeries.iterator(), (series) => {\r\n\t\t\tif (series instanceof ColumnSeries) {\r\n\t\t\t\tif (this.baseAxis == series.baseAxis) {\r\n\t\t\t\t\tif ((!series.stacked && series.clustered) || clusterCount === 0) {\r\n\t\t\t\t\t\tclusterCount++;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (series == this) {\r\n\t\t\t\t\t\tindex = clusterCount - 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tlet renderer = this.baseAxis.renderer;\r\n\r\n\t\tlet cellStartLocation: number = renderer.cellStartLocation;\r\n\t\tlet cellEndLocation: number = renderer.cellEndLocation;\r\n\r\n\t\tthis._startLocation = cellStartLocation + (index / clusterCount) * (cellEndLocation - cellStartLocation);\r\n\t\tthis._endLocation = cellStartLocation + (index + 1) / clusterCount * (cellEndLocation - cellStartLocation);\r\n\r\n\t\tsuper.validate();\r\n\r\n\t\tfor (let i = 0; i < this.startIndex; i++) {\r\n\t\t\tlet dataItem = this.dataItems.getIndex(i);\r\n\t\t\tthis.disableUnusedColumns(dataItem);\r\n\t\t}\r\n\r\n\t\tfor (let i = this.dataItems.length - 1; i > this.endIndex; i--) {\r\n\t\t\tlet dataItem = this.dataItems.getIndex(i);\r\n\t\t\tthis.disableUnusedColumns(dataItem);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Validates data item's element, effectively redrawing it.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic validateDataElement(dataItem: this[\"_dataItem\"]): void {\r\n\t\t// important oder here, first real, then super. we need this to know size\r\n\t\tthis.validateDataElementReal(dataItem);\r\n\t\tsuper.validateDataElement(dataItem);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns relative start location for the data item.\r\n\t *\r\n\t * @param dataItem Data item\r\n\t * @return Location (0-1)\r\n\t */\r\n\tprotected getStartLocation(dataItem: this[\"_dataItem\"]): number {\r\n\t\tlet startLocation = this._startLocation;\r\n\r\n\t\tif (this.baseAxis == this.xAxis) {\r\n\t\t\tstartLocation += dataItem.locations[this.xOpenField] - 0.5;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tstartLocation += dataItem.locations[this.yOpenField] - 0.5;\r\n\t\t}\r\n\t\treturn startLocation;\r\n\t}\r\n\r\n\t/**\r\n\t * [handleDataItemWorkingValueChange description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic handleDataItemWorkingValueChange(dataItem?: this[\"_dataItem\"], name?: string): void {\r\n\t\tif (this.simplifiedProcessing) {\r\n\t\t\tthis.validateDataElement(dataItem);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tsuper.handleDataItemWorkingValueChange(dataItem, name);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns relative end location for the data item.\r\n\t *\r\n\t * @param dataItem Data item\r\n\t * @return Location (0-1)\r\n\t */\r\n\tprotected getEndLocation(dataItem: this[\"_dataItem\"]): number {\r\n\t\tlet endLocation = this._endLocation;\r\n\r\n\t\tif (this.baseAxis == this.xAxis) {\r\n\t\t\tendLocation += dataItem.locations[this.xField] - 0.5;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tendLocation += dataItem.locations[this.yField] - 0.5;\r\n\t\t}\r\n\t\treturn endLocation;\r\n\t}\r\n\r\n\t/**\r\n\t * Validates data item's elements.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic validateDataElementReal(dataItem: this[\"_dataItem\"]): void {\r\n\t\t//\tif (dataItem.hasValue([this.xField, this.yField])) { // todo: this doesn't work with categories, think of a better way\r\n\t\tlet l: number;\r\n\t\tlet r: number;\r\n\t\tlet t: number;\r\n\t\tlet b: number;\r\n\r\n\t\tlet startLocation = this.getStartLocation(dataItem);\r\n\t\tlet endLocation = this.getEndLocation(dataItem);\r\n\r\n\t\tlet xField = this.xField;\r\n\t\tlet xOpenField = this.xOpenField;\r\n\t\tlet yField = this.yField;\r\n\t\tlet yOpenField = this.yOpenField;\r\n\r\n\t\tlet template: Sprite = this.columns.template;\r\n\r\n\t\tlet percentWidth: number = template.percentWidth;\r\n\t\tlet percentHeight: number = template.percentHeight;\r\n\r\n\t\tlet pixelWidth: number = template.pixelWidth;\r\n\t\tlet pixelHeight: number = template.pixelHeight;\r\n\r\n\t\tlet maxWidth: number = template.maxWidth;\r\n\t\tlet maxHeight: number = template.maxHeight;\r\n\r\n\t\tlet paddingLeft: number = template.pixelPaddingLeft;\r\n\t\tlet paddingRight: number = template.pixelPaddingRight;\r\n\t\tlet paddingTop: number = template.pixelPaddingTop;\r\n\t\tlet paddingBottom: number = template.pixelPaddingBottom;\r\n\r\n\t\tlet outOfBounds: boolean = false;\r\n\r\n\t\t// two category axes\r\n\t\tif ((this.xAxis instanceof CategoryAxis) && (this.yAxis instanceof CategoryAxis)) {\r\n\r\n\t\t\tif (!dataItem.hasValue(this._xValueFields) || !dataItem.hasValue(this._yValueFields)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tstartLocation = 0;\r\n\t\t\tendLocation = 1;\r\n\t\t\tif (!$type.isNaN(percentWidth)) {\r\n\t\t\t\tlet offset: number = $math.round((endLocation - startLocation) * (1 - percentWidth / 100) / 2, 5);\r\n\t\t\t\tstartLocation += offset;\r\n\t\t\t\tendLocation -= offset;\r\n\t\t\t}\r\n\r\n\t\t\tl = this.xAxis.getX(dataItem, xOpenField, startLocation);\r\n\t\t\tr = this.xAxis.getX(dataItem, xField, endLocation);\r\n\r\n\t\t\t// in case width is set in pixels\r\n\t\t\tif ($type.isNaN(percentWidth)) {\r\n\t\t\t\tlet offset: number = ((r - l) - pixelWidth) / 2;\r\n\t\t\t\tl += offset;\r\n\t\t\t\tr -= offset;\r\n\t\t\t}\r\n\r\n\t\t\t// in case max width is set in pixels\r\n\t\t\tif (!$type.isNaN(maxWidth)) {\r\n\t\t\t\tlet offset: number = ((r - l) - maxWidth) / 2;\r\n\t\t\t\tl += offset;\r\n\t\t\t\tr -= offset;\r\n\t\t\t}\r\n\r\n\t\t\tstartLocation = 0;\r\n\t\t\tendLocation = 1;\r\n\r\n\t\t\tif (!$type.isNaN(percentHeight)) {\r\n\t\t\t\tlet offset: number = $math.round((1 - percentHeight / 100) / 2, 5);\r\n\t\t\t\tstartLocation += offset;\r\n\t\t\t\tendLocation -= offset;\r\n\t\t\t}\r\n\r\n\t\t\tt = this.yAxis.getY(dataItem, yOpenField, startLocation);\r\n\t\t\tb = this.yAxis.getY(dataItem, yField, endLocation);\r\n\r\n\t\t\t// in case width is set in pixels\r\n\t\t\tif ($type.isNaN(percentHeight)) {\r\n\t\t\t\tlet offset: number = ((b - t) - pixelHeight) / 2;\r\n\t\t\t\tb += offset;\r\n\t\t\t\tt -= offset;\r\n\t\t\t}\r\n\r\n\t\t\t// in case max width is set in pixels\r\n\t\t\tif (!$type.isNaN(maxHeight)) {\r\n\t\t\t\tlet offset: number = ((b - t) - maxHeight) / 2;\r\n\t\t\t\tb += offset;\r\n\t\t\t\tt -= offset;\r\n\t\t\t}\r\n\r\n\t\t\tr = this.fixHorizontalCoordinate(r);\r\n\t\t\tl = this.fixHorizontalCoordinate(l);\r\n\t\t\tt = this.fixVerticalCoordinate(t);\r\n\t\t\tb = this.fixVerticalCoordinate(b);\r\n\t\t}\r\n\t\telse if (this.baseAxis == this.xAxis) {\r\n\r\n\t\t\tif (!dataItem.hasValue(this._yValueFields)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// in case width is set in percent\r\n\t\t\tif (!$type.isNaN(percentWidth)) {\r\n\t\t\t\tlet offset: number = $math.round((endLocation - startLocation) * (1 - percentWidth / 100) / 2, 5);\r\n\t\t\t\tstartLocation += offset;\r\n\t\t\t\tendLocation -= offset;\r\n\t\t\t}\r\n\r\n\t\t\tl = this.xAxis.getX(dataItem, xOpenField, startLocation);\r\n\t\t\tr = this.xAxis.getX(dataItem, xField, endLocation);\r\n\r\n\t\t\t// in case width is set in pixels\r\n\t\t\tif ($type.isNaN(percentWidth)) {\r\n\t\t\t\tlet offset: number = ((r - l) - pixelWidth) / 2;\r\n\t\t\t\tl += offset;\r\n\t\t\t\tr -= offset;\r\n\t\t\t}\r\n\r\n\t\t\t// in case width is set in pixels\r\n\t\t\tif (!$type.isNaN(maxWidth)) {\r\n\t\t\t\tlet offset: number = ((r - l) - maxWidth) / 2;\r\n\t\t\t\tl += offset;\r\n\t\t\t\tr -= offset;\r\n\t\t\t}\r\n\r\n\t\t\tlet bottomLocation = dataItem.locations[yOpenField];\r\n\t\t\tlet topLocation = dataItem.locations[yField];\r\n\t\t\t// otherwise gantt chart will start items in the middle of a cell\r\n\t\t\tif (this.yAxis instanceof ValueAxis) {\r\n\t\t\t\tbottomLocation = 0;\r\n\t\t\t\ttopLocation = 0;\r\n\t\t\t}\r\n\r\n\t\t\tb = this.yAxis.getY(dataItem, yOpenField, bottomLocation);\r\n\t\t\tt = this.yAxis.getY(dataItem, yField, topLocation);\r\n\r\n\t\t\t// used to save location for bullets, but it's not a good approach\r\n\t\t\t// dataItem.locations[xField] = startLocation + (endLocation - startLocation) / 2;\r\n\r\n\t\t\tlet axisLenght = this.yAxis.axisLength;\r\n\r\n\t\t\tif ((t < 0 && b < 0) || (t > axisLenght && b > axisLenght)) {\r\n\t\t\t\toutOfBounds = true;\r\n\t\t\t}\r\n\r\n\t\t\tt = this.fixVerticalCoordinate(t);\r\n\t\t\tb = this.fixVerticalCoordinate(b);\r\n\r\n\t\t\tif (Math.abs(r - l) - paddingLeft - paddingRight == 0) {\r\n\t\t\t\toutOfBounds = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\t// horizontal bars\r\n\t\telse {\r\n\t\t\tif (!dataItem.hasValue(this._xValueFields)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (!$type.isNaN(percentHeight)) {\r\n\t\t\t\tlet offset: number = $math.round((endLocation - startLocation) * (1 - percentHeight / 100) / 2, 5);\r\n\t\t\t\tstartLocation += offset;\r\n\t\t\t\tendLocation -= offset;\r\n\t\t\t}\r\n\r\n\t\t\tt = this.yAxis.getY(dataItem, yOpenField, startLocation);\r\n\t\t\tb = this.yAxis.getY(dataItem, yField, endLocation);\r\n\r\n\t\t\t// in case height is set in pixels\r\n\t\t\tif ($type.isNaN(percentHeight)) {\r\n\t\t\t\tlet offset: number = ((b - t) - pixelHeight) / 2;\r\n\t\t\t\tb -= offset;\r\n\t\t\t\tt += offset;\r\n\t\t\t}\r\n\r\n\t\t\t// in case height is set in pixels\r\n\t\t\tif (!$type.isNaN(maxHeight)) {\r\n\t\t\t\tlet offset: number = ((b - t) - maxHeight) / 2;\r\n\t\t\t\tb -= offset;\r\n\t\t\t\tt += offset;\r\n\t\t\t}\r\n\r\n\t\t\tlet rightLocation = dataItem.locations[xField];\r\n\t\t\tlet leftLocation = dataItem.locations[xOpenField];\r\n\t\t\t// otherwise gantt chart will start items in the middle of a cell\r\n\t\t\tif (this.xAxis instanceof ValueAxis) {\r\n\t\t\t\trightLocation = 0;\r\n\t\t\t\tleftLocation = 0;\r\n\t\t\t}\r\n\r\n\t\t\tr = this.xAxis.getX(dataItem, xField, rightLocation);\r\n\t\t\tl = this.xAxis.getX(dataItem, xOpenField, leftLocation);\r\n\t\t\t// used to save location for bullets, but it's not a good approach\r\n\t\t\t// dataItem.locations[yField] = startLocation + (endLocation - startLocation) / 2;\r\n\r\n\t\t\tlet axisLenght = this.xAxis.axisLength;\r\n\r\n\t\t\tif ((r < 0 && l < 0) || (r > axisLenght && l > axisLenght)) {\r\n\t\t\t\toutOfBounds = true;\r\n\t\t\t}\r\n\r\n\t\t\tr = this.fixHorizontalCoordinate(r);\r\n\t\t\tl = this.fixHorizontalCoordinate(l);\r\n\r\n\t\t\tif (Math.abs(t - b) - paddingTop - paddingBottom == 0) {\r\n\t\t\t\toutOfBounds = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet w: number = Math.abs(r - l);\r\n\t\tlet h: number = Math.abs(b - t);\r\n\r\n\t\tlet x: number = Math.min(l, r);\r\n\t\tlet y: number = Math.min(t, b);\r\n\r\n\t\tif (!outOfBounds) {\r\n\t\t\tlet column: this[\"_column\"];\r\n\t\t\tif (!dataItem.column) {\r\n\t\t\t\tcolumn = this.columns.create();\r\n\t\t\t\t//$object.forceCopyProperties(this.columns.template, column, visualProperties);\r\n\t\t\t\t$object.copyProperties(this, column, visualProperties); // need this because 3d columns are not in the same container\r\n\t\t\t\t$object.copyProperties(this.columns.template, column, visualProperties); // second time, no force, so that columns.template would override series properties\r\n\t\t\t\tdataItem.addSprite(column);\r\n\r\n\t\t\t\tdataItem.column = column;\r\n\r\n\t\t\t\t// accessibility\r\n\t\t\t\tif (this.itemsFocusable()) {\r\n\t\t\t\t\tcolumn.role = \"menuitem\";\r\n\t\t\t\t\tcolumn.focusable = true;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tcolumn.role = \"listitem\";\r\n\t\t\t\t\tcolumn.focusable = false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (column.focusable) {\r\n\t\t\t\t\tcolumn.events.once(\"focus\", (ev) => {\r\n\t\t\t\t\t\tcolumn.readerTitle = this.populateString(this.itemReaderText, dataItem);\r\n\t\t\t\t\t}, undefined, false);\r\n\t\t\t\t\tcolumn.events.once(\"blur\", (ev) => {\r\n\t\t\t\t\t\tcolumn.readerTitle = \"\";\r\n\t\t\t\t\t}, undefined, false);\r\n\t\t\t\t}\r\n\t\t\t\tif (column.hoverable) {\r\n\t\t\t\t\tcolumn.events.once(\"over\", (ev) => {\r\n\t\t\t\t\t\tcolumn.readerTitle = this.populateString(this.itemReaderText, dataItem);\r\n\t\t\t\t\t}, undefined, false);\r\n\t\t\t\t\tcolumn.events.once(\"out\", (ev) => {\r\n\t\t\t\t\t\tcolumn.readerTitle = \"\";\r\n\t\t\t\t\t}, undefined, false);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tcolumn = dataItem.column;\r\n\t\t\t}\r\n\r\n\t\t\tcolumn.width = w;\r\n\t\t\tcolumn.height = h;\r\n\r\n\t\t\tcolumn.x = x;\r\n\t\t\tcolumn.y = y;\r\n\r\n\t\t\tcolumn.realX = l;\r\n\t\t\tcolumn.realY = t;\r\n\r\n\t\t\tcolumn.realWidth = r - l;\r\n\t\t\tcolumn.realHeight = b - t;\r\n\r\n\t\t\tcolumn.parent = this.columnsContainer;\r\n\t\t\tcolumn.virtualParent = this;\r\n\r\n\t\t\tthis.setColumnStates(column);\r\n\r\n\t\t\tif (column.invalid) {\r\n\t\t\t\tcolumn.validate(); // validate as if it was used previously, it will flicker with previous dimensions\r\n\t\t\t}\r\n\r\n\t\t\tcolumn.__disabled = false;\r\n\t\t\t//column.returnAfterTemp();\r\n\r\n\t\t\t$iter.each(this.axisRanges.iterator(), (axisRange) => {\r\n\t\t\t\tlet rangeColumn: this[\"_column\"] = dataItem.rangesColumns.getKey(axisRange.uid);\r\n\t\t\t\tif (!rangeColumn) {\r\n\t\t\t\t\trangeColumn = this.columns.create();\r\n\r\n\t\t\t\t\t//$object.forceCopyProperties(this.columns.template, rangeColumn, visualProperties);\r\n\t\t\t\t\t$object.copyProperties(axisRange.contents, rangeColumn, visualProperties); // need this because 3d columns are not in the same container\r\n\r\n\t\t\t\t\tdataItem.addSprite(rangeColumn);\r\n\t\t\t\t\tdataItem.rangesColumns.setKey(axisRange.uid, rangeColumn);\r\n\t\t\t\t}\r\n\r\n\t\t\t\trangeColumn.parent = axisRange.contents;\r\n\r\n\t\t\t\trangeColumn.width = w;\r\n\t\t\t\trangeColumn.height = h;\r\n\t\t\t\trangeColumn.x = x;\r\n\t\t\t\trangeColumn.y = y;\r\n\r\n\t\t\t\tthis.setColumnStates(rangeColumn);\r\n\r\n\t\t\t\tif (rangeColumn.invalid) {\r\n\t\t\t\t\trangeColumn.validate(); // validate as if it was used previously, it will flicker with previous dimensions\r\n\t\t\t\t}\r\n\r\n\t\t\t\trangeColumn.__disabled = false;\r\n\t\t\t\t//rangeColumn.returnAfterTemp();\r\n\t\t\t});\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.disableUnusedColumns(dataItem);\r\n\t\t}\r\n\r\n\t\tdataItem.itemWidth = w;\r\n\t\tdataItem.itemHeight = h;\r\n\t}\r\n\r\n\r\n\tdisableUnusedColumns(dataItem: ColumnSeriesDataItem) {\r\n\t\tif (dataItem) {\r\n\t\t\tif (dataItem.column) {\r\n\t\t\t\t// otherwise might flicker when enabling\r\n\t\t\t\tdataItem.column.width = 0;\r\n\t\t\t\tdataItem.column.height = 0;\r\n\t\t\t\tdataItem.column.__disabled = true;\r\n\t\t\t}\r\n\r\n\t\t\t$iter.each(this.axisRanges.iterator(), (axisRange) => {\r\n\t\t\t\tlet rangeColumn: Sprite = dataItem.rangesColumns.getKey(axisRange.uid);\r\n\t\t\t\tif (rangeColumn) {\r\n\t\t\t\t\t// otherwise might flicker when enabling\r\n\t\t\t\t\trangeColumn.width = 0;\r\n\t\t\t\t\trangeColumn.height = 0;\r\n\t\t\t\t\trangeColumn.__disabled = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Apply different state/coloring to columns based on the change value.\r\n\t *\r\n\t * @param sprite Sprite to apply state to\r\n\t * @todo Do not apply accessibility to wicks of the candlesticks\r\n\t */\r\n\tprotected setColumnStates(sprite: Sprite): void {\r\n\r\n\t\tlet dataItem: this[\"_dataItem\"] = sprite.dataItem;\r\n\r\n\t\tif (this.xAxis instanceof ValueAxis || this.yAxis instanceof ValueAxis) {\r\n\t\t\tlet open: number;\r\n\t\t\tlet value: number;\r\n\t\t\tlet change: number;\r\n\r\n\t\t\tif (this.baseAxis == this.yAxis) {\r\n\t\t\t\tif (this.xOpenField && this.xField) {\r\n\t\t\t\t\topen = dataItem.getValue(this.xOpenField);\r\n\t\t\t\t\tvalue = dataItem.getValue(this.xField);\r\n\t\t\t\t\tchange = dataItem.getValue(this.xAxis.axisFieldName + \"X\", \"previousChange\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tif (this.yOpenField && this.yField) {\r\n\t\t\t\t\topen = dataItem.getValue(this.yOpenField);\r\n\t\t\t\t\tvalue = dataItem.getValue(this.yField);\r\n\t\t\t\t\tchange = dataItem.getValue(this.yAxis.axisFieldName + \"Y\", \"previousChange\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (value < open) {\r\n\t\t\t\tdataItem.droppedFromOpen = true;\r\n\t\t\t\tsprite.defaultState.copyFrom(this._dropFromOpenState)\r\n\t\t\t\tsprite.setState(this._dropFromOpenState, 0);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tdataItem.droppedFromOpen = false;\r\n\t\t\t\tsprite.defaultState.copyFrom(this._riseFromOpenState)\r\n\t\t\t\tsprite.setState(this._riseFromOpenState, 0);\r\n\t\t\t}\r\n\r\n\t\t\tif (change < 0) {\r\n\t\t\t\tdataItem.droppedFromPrevious = true;\r\n\t\t\t\tsprite.defaultState.copyFrom(this._dropFromPreviousState)\r\n\t\t\t\tsprite.setState((this._dropFromPreviousState), 0);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tdataItem.droppedFromPrevious = false;\r\n\t\t\t\tsprite.defaultState.copyFrom(this._riseFromPreviousState)\r\n\t\t\t\tsprite.setState((this._riseFromPreviousState), 0);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * A list of column elements in the series.\r\n\t *\r\n\t * @return Columns\r\n\t */\r\n\tpublic get columns(): ListTemplate {\r\n\t\tif (!this._columns) {\r\n\t\t\tthis._columns = new ListTemplate(this.createColumnTemplate());\r\n\t\t\tthis._disposers.push(new ListDisposer(this._columns));\r\n\t\t\tthis._disposers.push(this._columns.template);\r\n\t\t}\r\n\t\treturn this._columns;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates and returns a column element to use as a template.\r\n\t *\r\n\t * @return Column template\r\n\t */\r\n\tprotected createColumnTemplate(): this[\"_column\"] {\r\n\t\treturn new Column();\r\n\t}\r\n\r\n\t/**\r\n\t * Cluster this series columns?\r\n\t *\r\n\t * Setting to `false` will make columns overlap with other series.\r\n\t *\r\n\t * @default true\r\n\t * @param value Clustered?\r\n\t */\r\n\tpublic set clustered(value: boolean) {\r\n\t\tthis.setPropertyValue(\"clustered\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Clustered?\r\n\t */\r\n\tpublic get clustered(): boolean {\r\n\t\treturn this.getPropertyValue(\"clustered\");\r\n\t}\r\n\r\n\t/**\r\n\t * A state to apply to a column when close value is lower than open value.\r\n\t *\r\n\t * Can be used to differentiate appearance based on value relations.\r\n\t *\r\n\t * NOTE: this will work only if at least one axis is [[ValueAxis]].\r\n\t *\r\n\t * @readonly You can modify state object, but can't overwrite it\r\n\t * @return State\r\n\t */\r\n\tpublic get dropFromOpenState(): SpriteState {\r\n\t\tif (!this._dropFromOpenState) {\r\n\t\t\tthis._dropFromOpenState = this.states.create(\"dropFromOpenState\");\r\n\t\t}\r\n\t\treturn this._dropFromOpenState;\r\n\t}\r\n\r\n\t/**\r\n\t * A state to apply to a column when its value is lower value of a previous\r\n\t * column.\r\n\t *\r\n\t * Can be used to differentiate appearance based on value relations.\r\n\t *\r\n\t * @readonly You can modify state object, but can't overwrite it\r\n\t * @return State\r\n\t */\r\n\tpublic get dropFromPreviousState(): SpriteState {\r\n\t\tif (!this._dropFromPreviousState) {\r\n\t\t\tthis._dropFromPreviousState = this.states.create(\"dropFromPreviousState\");\r\n\t\t}\r\n\t\treturn this._dropFromPreviousState;\r\n\t}\r\n\r\n\t/**\r\n\t * A state to apply to a column when close value is same or higher than open\r\n\t * value.\r\n\t *\r\n\t * Can be used to differentiate appearance based on value relations.\r\n\t *\r\n\t * NOTE: this will work only if at least one axis is [[ValueAxis]].\r\n\t *\r\n\t * @readonly You can modify state object, but can't overwrite it\r\n\t * @return State\r\n\t */\r\n\tpublic get riseFromOpenState(): SpriteState {\r\n\t\tif (!this._riseFromOpenState) {\r\n\t\t\tthis._riseFromOpenState = this.states.create(\"riseFromOpenState\");\r\n\t\t}\r\n\t\treturn this._riseFromOpenState;\r\n\t}\r\n\r\n\t/**\r\n\t * A state to apply to a column when its value is same or higher than value\r\n\t * of a previous column.\r\n\t *\r\n\t * Can be used to differentiate appearance based on value relations.\r\n\t *\r\n\t * @readonly You can modify state object, but can't overwrite it\r\n\t * @return State\r\n\t */\r\n\tpublic get riseFromPreviousState(): SpriteState {\r\n\t\tif (!this._riseFromPreviousState) {\r\n\t\t\tthis._riseFromPreviousState = this.states.create(\"riseFromPreviousState\");\r\n\t\t}\r\n\t\treturn this._riseFromPreviousState;\r\n\t}\r\n\r\n\t/**\r\n\t * Updates value of the related legend item.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic updateLegendValue(dataItem?: this[\"_dataItem\"]) {\r\n\t\tsuper.updateLegendValue(dataItem);\r\n\r\n\t\tif (this.legendDataItem) {\r\n\t\t\tlet marker: Container = this.legendDataItem.marker;\r\n\t\t\tlet fromOpenState: SpriteState;\r\n\t\t\tlet fromPreviousState: SpriteState;\r\n\r\n\t\t\tif (dataItem) {\r\n\t\t\t\tif (dataItem.droppedFromOpen) {\r\n\t\t\t\t\tfromOpenState = this._dropFromOpenState;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tfromOpenState = this._riseFromOpenState;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (dataItem.droppedFromPrevious) {\r\n\t\t\t\t\tfromPreviousState = this._dropFromPreviousState;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tfromPreviousState = this._riseFromPreviousState;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t$iter.each(marker.children.iterator(), (child) => {\r\n\t\t\t\tif (dataItem) {\r\n\t\t\t\t\tchild.setState(fromPreviousState);\r\n\t\t\t\t\tchild.setState(fromOpenState);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t// todo: think what to do here, maybe apply above states based on totals?\r\n\t\t\t\t\tchild.setState(this._riseFromPreviousState);\r\n\t\t\t\t\tchild.setState(this._riseFromOpenState);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Creates elements in related legend container, that mimics the look of this\r\n\t * Series.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param marker Legend item container\r\n\t */\r\n\tpublic createLegendMarker(marker: Container) {\r\n\t\tlet w: number = marker.pixelWidth;\r\n\t\tlet h: number = marker.pixelHeight;\r\n\r\n\t\tmarker.removeChildren();\r\n\r\n\t\tlet column: RoundedRectangle = marker.createChild(RoundedRectangle);\r\n\t\tcolumn.shouldClone = false;\r\n\t\t$object.copyProperties(this, column, visualProperties);\r\n\r\n\t\tcolumn.copyFrom(this.columns.template);\r\n\t\tcolumn.padding(0, 0, 0, 0); // if columns will have padding (which is often), legend marker will be very narrow\r\n\t\tcolumn.width = w;\r\n\t\tcolumn.height = h;\r\n\r\n\t\tlet legendDataItem = marker.dataItem;\r\n\t\tlegendDataItem.color = this.fill;\r\n\t\tlegendDataItem.colorOrig = this.fill;\r\n\t}\r\n\r\n\t/**\r\n\t * Copies all properties from another instance of [[ColumnSeries]].\r\n\t *\r\n\t * @param source Source series\r\n\t */\r\n\tpublic copyFrom(source: this): void {\r\n\t\tsuper.copyFrom(source);\r\n\t\tthis.columns.template.copyFrom(source.columns.template);\r\n\t}\r\n\r\n\t/**\r\n\t* returns bullet x location\r\n\t* @ignore\r\n\t*/\r\n\r\n\tprotected getBulletLocationX(bullet: Bullet, field: string): number {\r\n\t\tif (this.baseAxis == this.xAxis) {\r\n\t\t\treturn (this._startLocation + this._endLocation) / 2;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn super.getBulletLocationX(bullet, field);\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t* returns bullet y location\r\n\t* @ignore\r\n\t*/\r\n\tprotected getBulletLocationY(bullet: Bullet, field: string): number {\r\n\t\tif (this.baseAxis == this.yAxis) {\r\n\t\t\treturn (this._startLocation + this._endLocation) / 2;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn super.getBulletLocationY(bullet, field);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tprotected fixVerticalCoordinate(coordinate: number): number {\r\n\t\tlet paddingBottom = this.columns.template.pixelPaddingBottom;\r\n\t\tlet paddingTop = this.columns.template.pixelPaddingTop;\r\n\r\n\t\tlet minY: number = -paddingTop;\r\n\t\tlet maxY: number = this.yAxis.axisLength + paddingBottom;\r\n\r\n\t\treturn $math.fitToRange(coordinate, minY, maxY);\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tprotected fixHorizontalCoordinate(coordinate: number): number {\r\n\t\tlet paddingLeft = this.columns.template.pixelPaddingLeft;\r\n\t\tlet paddingRight = this.columns.template.pixelPaddingRight;\r\n\r\n\t\tlet minX: number = -paddingLeft;\r\n\t\tlet maxX: number = this.xAxis.axisLength + paddingRight;\r\n\r\n\t\treturn $math.fitToRange(coordinate, minX, maxX);\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic disposeData() {\r\n\t\tsuper.disposeData();\r\n\t\tthis.columns.clear();\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"ColumnSeries\"] = ColumnSeries;\r\nregistry.registeredClasses[\"ColumnSeriesDataItem\"] = ColumnSeriesDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/ColumnSeries.ts","/**\r\n * TreeMap series module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { ColumnSeries, IColumnSeriesProperties, IColumnSeriesDataFields, IColumnSeriesAdapters, IColumnSeriesEvents, ColumnSeriesDataItem } from \"./ColumnSeries\";\r\nimport { visualProperties } from \"../../core/Sprite\";\r\nimport { TreeMap, TreeMapDataItem } from \"../types/TreeMap\";\r\nimport { Animation } from \"../../core/utils/Animation\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { InterfaceColorSet } from \"../../core/utils/InterfaceColorSet\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport { RoundedRectangle } from \"../../core/elements/RoundedRectangle\";\r\nimport { Container } from \"../../core/Container\";\r\nimport * as $object from \"../../core/utils/Object\";\r\nimport { LegendDataItem } from \"../../charts/Legend\";\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[TreeMapSeries]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class TreeMapSeriesDataItem extends ColumnSeriesDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: TreeMapSeries;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"TreeMapSeriesDataItem\";\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Data for the this particular item.\r\n\t *\r\n\t * @param value Item's data\r\n\t */\r\n\t//public set dataContext(value: Object) {\r\n\t//\tthis._dataContext = value;\r\n\t//}\r\n\r\n\r\n\r\n\t/**\r\n\t * @return Item's data\r\n\t */\r\n\t/*\r\n public get dataContext(): Object {\r\n\t // It's because data of tree series is TreeMapDataItems.\r\n\t if (this._dataContext) {\r\n\t\t return (this._dataContext).dataContext;\r\n\t }\r\n }*/\r\n\r\n\t/**\r\n\t * The name of the item's parent item.\r\n\t *\r\n\t * @return Parent name\r\n\t */\r\n\tpublic get parentName(): string {\r\n\t\tlet treeMapDataItem = this.treeMapDataItem;\r\n\t\tif (treeMapDataItem && treeMapDataItem.parent) {\r\n\t\t\treturn treeMapDataItem.parent.name;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Item's numeric value.\r\n\t *\r\n\t * @readonly\r\n\t * @return Value\r\n\t */\r\n\tpublic get value(): number {\r\n\t\treturn this.treeMapDataItem.value;\r\n\t}\r\n\r\n\t/**\r\n\t * A corresponding data item from the tree map.\r\n\t *\r\n\t * @readonly\r\n\t * @return Data item\r\n\t */\r\n\tpublic get treeMapDataItem(): TreeMapDataItem {\r\n\t\treturn this._dataContext;\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[TreeMapSeries]].\r\n */\r\nexport interface ITreeMapSeriesDataFields extends IColumnSeriesDataFields {\r\n\r\n\t/**\r\n\t * Name of the field in data that holds numeric value.\r\n\t */\r\n\tvalue?: string;\r\n\r\n}\r\n\r\n/**\r\n * Defines properties for [[TreeMapSeries]].\r\n */\r\nexport interface ITreeMapSeriesProperties extends IColumnSeriesProperties { }\r\n\r\n/**\r\n * Defines events for [[TreeMapSeries]].\r\n */\r\nexport interface ITreeMapSeriesEvents extends IColumnSeriesEvents { }\r\n\r\n/**\r\n * Defines adapters for [[TreeMapSeries]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface ITreeMapSeriesAdapters extends IColumnSeriesAdapters, ITreeMapSeriesProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines Series for a TreeMap chart.\r\n *\r\n * @see {@link ITreeMapSeriesEvents} for a list of available Events\r\n * @see {@link ITreeMapSeriesAdapters} for a list of available Adapters\r\n * @todo Example\r\n * @important\r\n */\r\nexport class TreeMapSeries extends ColumnSeries {\r\n\r\n\t/**\r\n\t * Defines the type of data fields used for the series.\r\n\t */\r\n\tpublic _dataFields: ITreeMapSeriesDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: ITreeMapSeriesProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: ITreeMapSeriesAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: ITreeMapSeriesEvents;\r\n\r\n\t/**\r\n\t * The level in treemap hierarchy series is at.\r\n\t */\r\n\tpublic level: number;\r\n\r\n\t/**\r\n\t * Type of the data item used by series.\r\n\t */\r\n\tpublic _dataItem: TreeMapSeriesDataItem;\r\n\r\n\t/**\r\n\t * A chart series belongs to.\r\n\t */\r\n\tpublic _chart: TreeMap;\r\n\r\n\t/**\r\n\t * Parent data item of a series.\r\n\t */\r\n\tpublic parentDataItem: TreeMapDataItem;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\r\n\t\tthis.className = \"TreeMapSeries\";\r\n\t\tthis.applyTheme();\r\n\r\n\t\tthis.fillOpacity = 1;\r\n\t\tthis.strokeOpacity = 1;\r\n\t\tthis.minBulletDistance = 0;\r\n\t\tthis.columns.template.tooltipText = \"{parentName} {name}: {value}\"; //@todo add format number?\r\n\t\tthis.columns.template.configField = \"config\";\r\n\r\n\t\tlet interfaceColors = new InterfaceColorSet();\r\n\r\n\t\tthis.stroke = interfaceColors.getFor(\"background\");\r\n\t\tthis.dataFields.openValueX = \"x0\";\r\n\t\tthis.dataFields.valueX = \"x1\";\r\n\t\tthis.dataFields.openValueY = \"y0\";\r\n\t\tthis.dataFields.valueY = \"y1\";\r\n\r\n\t\tthis.sequencedInterpolation = false;\r\n\r\n\t\tthis.showOnInit = false;\r\n\r\n\t\t// otherwise nodes don't stack nicely to each other\r\n\t\tthis.columns.template.pixelPerfect = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Processes data item.\r\n\t *\r\n\t * @param dataItem Data item\r\n\t * @param dataContext Raw data\r\n\t * @param index Index of the data item\r\n\t */\r\n\tprotected processDataItem(dataItem: this[\"_dataItem\"], dataContext?: Object): void {\r\n\t\t(dataContext).seriesDataItem = dataItem; // save a reference here. dataContext is TreeMapDataItem and we need to know dataItem sometimes\r\n\t\tsuper.processDataItem(dataItem, dataContext);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty DataItem of the type appropriate for this object.\r\n\t *\r\n\t * @see {@link DataItem}\r\n\t * @return Data Item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new TreeMapSeriesDataItem();\r\n\t}\r\n\r\n\t/**\r\n\t * Shows series.\r\n\t *\r\n\t * @param duration Duration of fade in (ms)\r\n\t * @return Animation\r\n\t */\r\n\tpublic show(duration?: number): Animation {\r\n\r\n\t\tlet interpolationDuration = this.defaultState.transitionDuration;\r\n\t\tif($type.isNumber(duration)){\r\n\t\t\tinterpolationDuration = duration;\r\n\t\t}\r\n\r\n\t\tthis.dataItems.each((dataItem)=>{\r\n\t\t\tdataItem.treeMapDataItem.setWorkingValue(\"value\", dataItem.treeMapDataItem.values.value.value);\r\n\t\t})\r\n\r\n\t\treturn super.showReal(interpolationDuration);\r\n\t}\r\n\r\n\t/**\r\n\t * Hides series.\r\n\t *\r\n\t * @param duration Duration of fade out (ms)\r\n\t * @return Animation\r\n\t */\r\n\tpublic hide(duration?: number): Animation {\r\n\r\n\t\tlet interpolationDuration = this.defaultState.transitionDuration;\r\n\t\tif($type.isNumber(duration)){\r\n\t\t\tinterpolationDuration = duration;\r\n\t\t}\r\n\r\n\t\tlet animation = super.hideReal(interpolationDuration);\r\n\r\n\t\tthis.dataItems.each((dataItem)=>{\r\n\t\t\tdataItem.treeMapDataItem.setWorkingValue(\"value\", 0);\r\n\t\t})\r\n\t\treturn animation;\r\n\t}\r\n\r\n\t/**\r\n\t * Process values.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic processValues() {\r\n\r\n\t\t// Just overriding so that inherited method does not kick in.\r\n\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic dataChangeUpdate(){\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Processes JSON-based config before it is applied to the object.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param config Config\r\n\t */\r\n\tpublic processConfig(config?: { [index: string]: any }): void {\r\n\r\n\t\tif (config) {\r\n\r\n\t\t\t// Add empty data fields if the they are not set, so that XYSeries\r\n\t\t\t// dataField check does not result in error.\r\n\t\t\tif (!$type.hasValue(config.dataFields) || !$type.isObject(config.dataFields)) {\r\n\t\t\t\tconfig.dataFields = {};\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tsuper.processConfig(config);\r\n\t}\r\n\r\n\t/**\r\n\t * Creates elements in related legend container, that mimics the look of this\r\n\t * Series.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param marker Legend item container\r\n\t */\r\n\tpublic createLegendMarker(marker: Container) {\r\n\t\tlet w: number = marker.pixelWidth;\r\n\t\tlet h: number = marker.pixelHeight;\r\n\r\n\t\tmarker.removeChildren();\r\n\r\n\t\tlet column: RoundedRectangle = marker.createChild(RoundedRectangle);\r\n\t\tcolumn.shouldClone = false;\r\n\t\t$object.copyProperties(this, column, visualProperties);\r\n\r\n\t\t//column.copyFrom(this.columns.template);\r\n\t\tcolumn.padding(0, 0, 0, 0); // if columns will have padding (which is often), legend marker will be very narrow\r\n\t\tcolumn.width = w;\r\n\t\tcolumn.height = h;\r\n\r\n\t\tlet legendDataItem = marker.dataItem;\r\n\t\tlegendDataItem.color = column.fill;\r\n\t\tlegendDataItem.colorOrig = column.fill;\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"TreeMapSeries\"] = TreeMapSeries;\r\nregistry.registeredClasses[\"TreeMapSeriesDataItem\"] = TreeMapSeriesDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/TreeMapSeries.ts","/**\r\n * TreeMap chart module.\r\n *\r\n * Parts of the functionality used in this module are taken from D3.js library\r\n * (https://d3js.org/)\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { XYChart, IXYChartProperties, IXYChartDataFields, IXYChartAdapters, IXYChartEvents, XYChartDataItem } from \"./XYChart\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { DictionaryTemplate, DictionaryDisposer } from \"../../core/utils/Dictionary\";\r\nimport { ValueAxis } from \"../axes/ValueAxis\";\r\nimport { OrderedListTemplate } from \"../../core/utils/SortedList\";\r\nimport { TreeMapSeries } from \"../series/TreeMapSeries\";\r\nimport { Color } from \"../../core/utils/Color\";\r\nimport { TreeMapSeriesDataItem } from \"../series/TreeMapSeries\";\r\nimport { NavigationBar } from \"../elements/NavigationBar\";\r\nimport { ColorSet } from \"../../core/utils/ColorSet\";\r\nimport { MouseCursorStyle } from \"../../core/interaction/Mouse\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $array from \"../../core/utils/Array\";\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[TreeMap]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class TreeMapDataItem extends XYChartDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: TreeMap;\r\n\r\n\t/**\r\n\t * A treemap level this data item is displayed at.\r\n\t */\r\n\tprotected _level: number;\r\n\r\n\t/**\r\n\t * Series of children data items.\r\n\t */\r\n\tprotected _series: TreeMapSeries;\r\n\r\n\t/**\r\n\t * Related series data item.\r\n\t */\r\n\tpublic seriesDataItem: TreeMapSeriesDataItem;\r\n\r\n\t/**\r\n\t * Required for squarify functionality.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic rows: TreeMapDataItem[] = [];\r\n\r\n\t/**\r\n\t * Required for squarify functionality.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic rowsRatio: number;\r\n\r\n\t/**\r\n\t * Required for squarify functionality.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic dice: boolean;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"TreeMapDataItem\";\r\n\r\n\t\tthis.values.value = {};\r\n\r\n\t\tthis.values.x0 = {};\r\n\r\n\t\tthis.values.y0 = {};\r\n\r\n\t\tthis.values.x1 = {};\r\n\r\n\t\tthis.values.y1 = {};\r\n\r\n\t\tthis.hasChildren.children = true;\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a duration (ms) the Data Item should take to animate from one\r\n\t * value to another.\r\n\t *\r\n\t * If the duration is not specified via parameter, this method will try to\r\n\t * request a default duration from the related `Component`.\r\n\t *\r\n\t * @param duration Default duration (ms)\r\n\t * @return Duration (ms)\r\n\t */\r\n\tpublic getDuration(): number {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Numeric value of the item.\r\n\t *\r\n\t * @param value Value\r\n\t */\r\n\tpublic set value(value: number) {\r\n\t\tthis.setValue(\"value\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Value\r\n\t */\r\n\tpublic get value(): number {\r\n\r\n\t\tlet value = 0;\r\n\t\tif (!this.children || this.children.length == 0) {\r\n\t\t\tvalue = this.values[\"value\"].workingValue;\r\n\t\t}\r\n\r\n\t\telse {\r\n\t\t\t$iter.each(this.children.iterator(), (child) => {\r\n\t\t\t\tlet childValue = child.value;\r\n\t\t\t\tif ($type.isNumber(childValue)) {\r\n\t\t\t\t\tvalue += childValue;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t}\r\n\r\n\t\treturn value;\r\n\t\t/*\r\n\t\tlet value = this.values[\"value\"].workingValue;\r\n\r\n\t\tif (!$type.isNumber(value)) {\r\n\t\t\tvalue = 0;\r\n\t\t\tif (this.children) {\r\n\t\t\t\t$iter.each(this.children.iterator(), (child) => {\r\n\t\t\t\t\tif ($type.isNumber(child.value)) {\r\n\t\t\t\t\t\tvalue += child.value;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn value;*/\r\n\t}\r\n\r\n\tpublic get percent(): number {\r\n\t\tif (this.parent) {\r\n\t\t\treturn this.value / this.parent.value * 100;\r\n\t\t}\r\n\t\treturn 100;\r\n\t}\r\n\r\n\t/**\r\n\t * Item's X position.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t * @param value X\r\n\t */\r\n\tpublic set x0(value: number) {\r\n\t\tthis.setValue(\"x0\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return X\r\n\t */\r\n\tpublic get x0(): number {\r\n\t\treturn this.values.x0.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Item's X position.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t * @param value X\r\n\t */\r\n\tpublic set x1(value: number) {\r\n\t\tthis.setValue(\"x1\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return X\r\n\t */\r\n\tpublic get x1(): number {\r\n\t\treturn this.values.x1.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Item's Y position.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t * @param value Y\r\n\t */\r\n\tpublic set y0(value: number) {\r\n\t\tthis.setValue(\"y0\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Y\r\n\t */\r\n\tpublic get y0(): number {\r\n\t\treturn this.values.y0.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Item's Y position.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description (review)\r\n\t * @param value Y\r\n\t */\r\n\tpublic set y1(value: number) {\r\n\t\tthis.setValue(\"y1\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Y\r\n\t */\r\n\tpublic get y1(): number {\r\n\t\treturn this.values.y1.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Item's name.\r\n\t *\r\n\t * @param name Name\r\n\t */\r\n\tpublic set name(name: string) {\r\n\t\tthis.setProperty(\"name\", name);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Name\r\n\t */\r\n\tpublic get name(): string {\r\n\t\treturn this.properties.name;\r\n\t}\r\n\r\n\t/**\r\n\t * A list of item's sub-children.\r\n\t *\r\n\t * Having children means that the TreeMap chat will automatically be\r\n\t * \"drillable\". Clicking on an item with children will zoom to the item, then\r\n\t * display its children.\r\n\t *\r\n\t * Treemap can have any level of nesting.\r\n\t *\r\n\t * @param children Item's children\r\n\t */\r\n\tpublic set children(children: OrderedListTemplate) {\r\n\t\tthis.setProperty(\"children\", children);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Item's children\r\n\t */\r\n\tpublic get children(): OrderedListTemplate {\r\n\t\treturn this.properties.children;\r\n\t}\r\n\r\n\t/**\r\n\t * Depth level in the treemap hierarchy.\r\n\t *\r\n\t * The top-level item will have level set at 0. Its children will have\r\n\t * level 1, and so on.\r\n\t *\r\n\t * @readonly\r\n\t * @return Level\r\n\t */\r\n\tpublic get level(): number {\r\n\t\tif (!this.parent) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn this.parent.level + 1;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Item's color.\r\n\t *\r\n\t * If not set, will use parent's color, or, if that is not set either,\r\n\t * automatically assigned color from chart's color set. (`chart.colors`)\r\n\t *\r\n\t * @param value Color\r\n\t */\r\n\tpublic set color(value: Color) {\r\n\t\tthis.setProperty(\"color\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Color\r\n\t */\r\n\tpublic get color(): Color {\r\n\t\tlet color = this.properties.color;\r\n\r\n\t\tif (color == undefined) {\r\n\t\t\tif (this.parent) {\r\n\t\t\t\tcolor = this.parent.color;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (color == undefined) {\r\n\t\t\tif (this.component) {\r\n\t\t\t\tcolor = this.component.colors.getIndex(this.component.colors.step * this.index);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn color;\r\n\t}\r\n\r\n\t/**\r\n\t * Series of children data items\r\n\t * @todo: proper descrition\r\n\t */\r\n\tpublic set series(series: TreeMapSeries) {\r\n\t\tif (series != this._series) {\r\n\t\t\tif (this._series) {\r\n\t\t\t\tthis.component.series.removeValue(this._series);\r\n\t\t\t\tthis._series.dispose();\r\n\t\t\t}\r\n\t\t\tthis._series = series;\r\n\t\t\tthis._disposers.push(series);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic get series(): TreeMapSeries {\r\n\t\treturn this._series;\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[TreeMap]].\r\n */\r\nexport interface ITreeMapDataFields extends IXYChartDataFields {\r\n\r\n\t/**\r\n\t * A name of the field in data that holds item's numeric value.\r\n\t */\r\n\tvalue?: string;\r\n\r\n\t/**\r\n\t * A name of the field in data that holds item's sub-items.\r\n\t */\r\n\tchildren?: string;\r\n\r\n\t/**\r\n\t * A name of the field in data that holds item's name.\r\n\t */\r\n\tname?: string;\r\n\r\n\t/**\r\n\t * A name of the field in data that holds item's color.\r\n\t *\r\n\t * If not set, a new color will be automatically assigned to each item as\r\n\t * defined by theme.\r\n\t */\r\n\tcolor?: string;\r\n\r\n}\r\n\r\n/**\r\n * Defines properties for [[TreeMap]].\r\n */\r\nexport interface ITreeMapProperties extends IXYChartProperties {\r\n\r\n\t/**\r\n\t * Maximum levels the chart will allow drilling down to.\r\n\t *\r\n\t * @default 2\r\n\t */\r\n\tmaxLevels?: number;\r\n\r\n\t/**\r\n\t * Current drill-down level the treemap is at.\r\n\t */\r\n\tcurrentLevel?: number;\r\n\r\n\t/**\r\n\t * Sorting direction of treemap items.\r\n\t *\r\n\t * @default \"descending\"\r\n\t */\r\n\tsorting?: \"none\" | \"ascending\" | \"descending\";\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[TreeMap]].\r\n */\r\nexport interface ITreeMapEvents extends IXYChartEvents { }\r\n\r\n/**\r\n * Defines adapters for [[TreeMap]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface ITreeMapAdapters extends IXYChartAdapters, ITreeMapProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Creates a TreeMap chart.\r\n *\r\n * @see {@link ITreeMapEvents} for a list of available Events\r\n * @see {@link ITreeMapAdapters} for a list of available Adapters\r\n * @see {@link https://www.amcharts.com/docs/v4/chart-types/treemap/} for documentation\r\n */\r\nexport class TreeMap extends XYChart {\r\n\r\n\t/**\r\n\t * Defines a type of the data item used for this chart.\r\n\t */\r\n\tpublic _dataItem: TreeMapDataItem;\r\n\r\n\t/**\r\n\t * Defines available data fields.\r\n\t */\r\n\tpublic _dataFields: ITreeMapDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: ITreeMapProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: ITreeMapAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: ITreeMapEvents;\r\n\r\n\t/**\r\n\t * A horizontal value axis.\r\n\t *\r\n\t * TreeMap chart is basically an XY chart, which means it has vertical and\r\n\t * horizontal value axes.\r\n\t *\r\n\t * As with any XY-based chart, it can be zoomed.\r\n\t */\r\n\tpublic xAxis: ValueAxis;\r\n\r\n\t/**\r\n\t * A vertical value axis.\r\n\t *\r\n\t * TreeMap chart is basically an XY chart, which means it has vertical and\r\n\t * horizontal value axes.\r\n\t *\r\n\t * As with any XY-based chart, it can be zoomed.\r\n\t */\r\n\tpublic yAxis: ValueAxis;\r\n\r\n\t/**\r\n\t * An algorithm used to divide area into squares based on their value.\r\n\t *\r\n\t * Available options: squarify (default), binaryTree, slice, dice, sliceDice.\r\n\t *\r\n\t * ```TypeScript\r\n\t * chart.layoutAlgorithm = chart.sliceDice;\r\n\t * ```\r\n\t * ```JavaScript\r\n\t * chart.layoutAlgorithm = chart.sliceDice;\r\n\t * ```\r\n\t * ```JSON\r\n\t * {\r\n\t * // ...\r\n\t * \"layoutAlgorithm\": \"sliceDice\",\r\n\t * // ...\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @see {@link https://www.amcharts.com/docs/v4/chart-types/treemap/#Area_division_methods} For more info and examples.\r\n\t * @default squarify\r\n\t */\r\n\tpublic layoutAlgorithm: (parent: TreeMapDataItem) => void = this.squarify;\r\n\r\n\t/**\r\n\t * Defines a type of series that this chart uses.\r\n\t */\r\n\tpublic _seriesType: TreeMapSeries;\r\n\r\n\t/**\r\n\t * [_homeDataItem description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _homeDataItem: TreeMapDataItem;\r\n\r\n\t/**\r\n\t * [_tempSeries description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _tempSeries: TreeMapSeries[];\r\n\r\n\t/**\r\n\t * A text dispalyed on the home button in breadcurmb nav control.\r\n\t */\r\n\tprotected _homeText: string;\r\n\r\n\t/**\r\n\t * A set of colors to be applied automatically to each new chart item, if\r\n\t * not explicitly set.\r\n\t */\r\n\tpublic colors: ColorSet;\r\n\r\n\t/**\r\n\t * Holds series object for each TreeMap level.\r\n\t *\r\n\t * \"0\" is the top-level series.\r\n\t * \"1\" is the second level.\r\n\t * Etc.\r\n\t *\r\n\t * @todo Description\r\n\t * @param Templates for each level\r\n\t */\r\n\tpublic seriesTemplates: DictionaryTemplate;\r\n\r\n\t/**\r\n\t * Is the chart zoomable?\r\n\t *\r\n\t * If the chart is `zoomable`, and items have sub-items, the chart will\r\n\t * drill-down to sub-items when click on their parent item.\r\n\t *\r\n\t * @default true\r\n\t */\r\n\tpublic zoomable: boolean = true;\r\n\r\n\r\n\t/**\r\n\t * A navigation bar used to show \"breadcrumb\" control, indicating current\r\n\t * drill-down path.\r\n\t */\r\n\tprotected _navigationBar: NavigationBar;\r\n\r\n\t/**\r\n\t * Currently selected data item.\r\n\t * @readonly\r\n\t */\r\n\tpublic currentlyZoomed: TreeMapDataItem;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"TreeMap\";\r\n\r\n\t\tthis.maxLevels = 2;\r\n\t\tthis.currentLevel = 0;\r\n\r\n\t\tthis.colors = new ColorSet();\r\n\t\tthis.sorting = \"descending\";\r\n\r\n\t\t// create two value axes for the chart\r\n\t\tlet xAxis = this.xAxes.push(new ValueAxis());\r\n\t\txAxis.title.disabled = true;\r\n\t\txAxis.strictMinMax = true;\r\n\r\n\t\tlet xRenderer = xAxis.renderer;\r\n\t\txRenderer.inside = true;\r\n\t\txRenderer.labels.template.disabled = true;\r\n\t\txRenderer.ticks.template.disabled = true;\r\n\t\txRenderer.grid.template.disabled = true;\r\n\t\txRenderer.axisFills.template.disabled = true;\r\n\t\txRenderer.minGridDistance = 100;\r\n\t\txRenderer.line.disabled = true;\r\n\t\txRenderer.baseGrid.disabled = true;\r\n\t\t//xRenderer.inversed = true;\r\n\r\n\t\tlet yAxis = this.yAxes.push(new ValueAxis());\r\n\t\tyAxis.title.disabled = true;\r\n\t\tyAxis.strictMinMax = true;\r\n\r\n\t\tlet yRenderer = yAxis.renderer;\r\n\t\tyRenderer.inside = true;\r\n\t\tyRenderer.labels.template.disabled = true;\r\n\t\tyRenderer.ticks.template.disabled = true;\r\n\t\tyRenderer.grid.template.disabled = true;\r\n\t\tyRenderer.axisFills.template.disabled = true;\r\n\t\tyRenderer.minGridDistance = 100;\r\n\t\tyRenderer.line.disabled = true;\r\n\t\tyRenderer.baseGrid.disabled = true;\r\n\t\tyRenderer.inversed = true;\r\n\r\n\t\t// shortcuts\r\n\t\tthis.xAxis = xAxis;\r\n\t\tthis.yAxis = yAxis;\r\n\r\n\t\tconst template = new TreeMapSeries();\r\n\t\tthis.seriesTemplates = new DictionaryTemplate(template);\r\n\t\tthis._disposers.push(new DictionaryDisposer(this.seriesTemplates));\r\n\t\tthis._disposers.push(template);\r\n\r\n\t\tthis.zoomOutButton.events.on(\"hit\", () => {\r\n\t\t\tthis.zoomToChartDataItem(this._homeDataItem);\r\n\t\t}, undefined, false)\r\n\r\n\t\tthis.seriesTemplates.events.on(\"insertKey\", (event) => {\r\n\t\t\tevent.newValue.isTemplate = true;\r\n\t\t}, undefined, false)\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * A navigation bar used to show \"breadcrumb\" control, indicating current\r\n\t * drill-down path.\r\n\t */\r\n\tpublic set navigationBar(navigationBar: NavigationBar) {\r\n\t\tif (this._navigationBar != navigationBar) {\r\n\t\t\tthis._navigationBar = navigationBar;\r\n\t\t\tnavigationBar.parent = this;\r\n\t\t\tnavigationBar.toBack();\r\n\t\t\tnavigationBar.links.template.events.on(\"hit\", (event) => {\r\n\t\t\t\tlet dataItem = event.target.dataItem.dataContext;\r\n\t\t\t\tthis.zoomToChartDataItem(dataItem);\r\n\t\t\t\tthis.createTreeSeries(dataItem);\r\n\t\t\t}, undefined, true);\r\n\r\n\t\t\tthis._disposers.push(navigationBar);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns navigationBar if it is added to a chart\r\n\t */\r\n\tpublic get navigationBar(): NavigationBar {\r\n\t\treturn this._navigationBar;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * (Re)validates chart's data.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validateData(): void {\r\n\r\n\t\tthis.series.clear();\r\n\r\n\t\tsuper.validateData();\r\n\r\n\t\tif (this._homeDataItem) {\r\n\t\t\tthis._homeDataItem.dispose();\r\n\t\t}\r\n\r\n\t\tlet homeDataItem = this.dataItems.template.clone(); // cant' use createDataItem here!\r\n\r\n\t\tthis._homeDataItem = homeDataItem;\r\n\r\n\t\t$iter.each(this.dataItems.iterator(), (dataItem) => {\r\n\t\t\tdataItem.parent = homeDataItem;\r\n\t\t});\r\n\r\n\t\thomeDataItem.children = this.dataItems;\r\n\r\n\t\thomeDataItem.x0 = 0;\r\n\t\thomeDataItem.y0 = 0;\r\n\t\thomeDataItem.name = this._homeText;\r\n\r\n\t\tlet maxX = 1000;\r\n\t\tlet maxY = (maxX * this.pixelHeight / this.pixelWidth) || 1000;\r\n\r\n\t\thomeDataItem.x1 = maxX;\r\n\t\thomeDataItem.y1 = maxY;\r\n\r\n\t\tthis.xAxis.min = 0;\r\n\t\tthis.xAxis.max = maxX;\r\n\r\n\t\tthis.yAxis.min = 0;\r\n\t\tthis.yAxis.max = maxY;\r\n\r\n\t\tthis.layoutItems(homeDataItem);\r\n\r\n\t\tthis.createTreeSeries(homeDataItem);\r\n\t}\r\n\r\n\t/**\r\n\t * Layouts and sizes all items according to their value and\r\n\t * `layoutAlgorithm`.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param parent Parent data item\r\n\t */\r\n\tpublic layoutItems(parent: TreeMapDataItem, sorting?: \"none\" | \"ascending\" | \"descending\"): void {\r\n\t\tif (parent) {\r\n\t\t\tlet children = parent.children;\r\n\r\n\t\t\tif (!sorting) {\r\n\t\t\t\tsorting = this.sorting;\r\n\t\t\t}\r\n\r\n\t\t\tif (sorting == \"ascending\") {\r\n\t\t\t\tchildren.values.sort((a, b) => {\r\n\t\t\t\t\treturn a.value - b.value;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tif (sorting == \"descending\") {\r\n\t\t\t\tchildren.values.sort((a, b) => {\r\n\t\t\t\t\treturn b.value - a.value;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis._updateDataItemIndexes(0);\r\n\r\n\t\t\tthis.layoutAlgorithm(parent);\r\n\r\n\t\t\tfor (let i = 0, len = children.length; i < len; i++) {\r\n\r\n\t\t\t\tlet node = children.getIndex(i);\r\n\r\n\t\t\t\tif (node.children) {\r\n\t\t\t\t\tthis.layoutItems(node);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Creates and returns a new treemap series.\r\n\t *\r\n\t * @todo Description\r\n\t * @param dataItem Data item to create series out of\r\n\t */\r\n\tprotected createTreeSeries(dataItem: TreeMapDataItem) {\r\n\t\tthis._tempSeries = [];\r\n\r\n\t\tlet navigationData = [dataItem];\r\n\r\n\t\t// create parent series and navigation data\r\n\t\tlet parentDataItem = dataItem.parent;\r\n\t\twhile (parentDataItem != undefined) {\r\n\t\t\tthis.initSeries(parentDataItem);\r\n\t\t\tnavigationData.push(parentDataItem);\r\n\t\t\tparentDataItem = parentDataItem.parent;\r\n\t\t}\r\n\r\n\t\tnavigationData.reverse();\r\n\r\n\t\tif (this.navigationBar) {\r\n\t\t\tthis.navigationBar.data = navigationData;\r\n\t\t}\r\n\r\n\t\t// create series and children series\r\n\t\tthis.createTreeSeriesReal(dataItem);\r\n\r\n\t\t// add those which are not in the list\r\n\t\t$array.each(this._tempSeries, (series) => {\r\n\t\t\tif (this.series.indexOf(series) == -1) {\r\n\t\t\t\tthis.series.push(series);\r\n\t\t\t}\r\n\t\t\tseries.zIndex = series.level;\r\n\t\t})\r\n\t}\r\n\r\n\t/**\r\n\t * [createTreeSeriesReal description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param dataItem [description]\r\n\t */\r\n\tprotected createTreeSeriesReal(dataItem: TreeMapDataItem) {\r\n\t\tif (dataItem.children) {\r\n\t\t\tlet level = dataItem.level;\r\n\r\n\t\t\tif (level < this.currentLevel + this.maxLevels) {\r\n\r\n\t\t\t\tthis.initSeries(dataItem);\r\n\r\n\t\t\t\tfor (let i = 0; i < dataItem.children.length; i++) {\r\n\t\t\t\t\tlet child = dataItem.children.getIndex(i);\r\n\t\t\t\t\tif (child.children) {\r\n\t\t\t\t\t\tthis.createTreeSeriesReal(child);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ignore\r\n\t * Overriding, as tree map series are created on the fly all the time\r\n\t */\r\n\tprotected seriesAppeared(): boolean {\r\n\t\treturn true;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Initializes the treemap series.\r\n\t *\r\n\t * @todo Description\r\n\t * @param dataItem Chart data item\r\n\t */\r\n\tprotected initSeries(dataItem: TreeMapDataItem) {\r\n\t\tif (!dataItem.series) {\r\n\t\t\tlet series: TreeMapSeries;\r\n\r\n\t\t\tlet template = this.seriesTemplates.getKey(dataItem.level.toString());\r\n\t\t\tif (template) {\r\n\t\t\t\tseries = template.clone();\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tseries = this.series.create();\r\n\t\t\t}\r\n\r\n\t\t\tseries.name = dataItem.name;\r\n\t\t\tseries.parentDataItem = dataItem;\r\n\t\t\tdataItem.series = series;\r\n\r\n\t\t\tlet level = dataItem.level;\r\n\t\t\tseries.level = level;\r\n\r\n\t\t\tlet dataContext: any = dataItem.dataContext;\r\n\t\t\tif (dataContext) {\r\n\t\t\t\tseries.config = dataContext.config;\r\n\t\t\t}\r\n\r\n\t\t\tthis.dataUsers.removeValue(series); // series do not use data directly, that's why we remove it\r\n\t\t\tseries.data = dataItem.children.values;\r\n\t\t\tseries.fill = dataItem.color;\r\n\r\n\t\t\tseries.columnsContainer.hide(0);\r\n\t\t\tseries.bulletsContainer.hide(0);\r\n\r\n\t\t\tseries.columns.template.adapter.add(\"fill\", (fill, target) => {\r\n\t\t\t\tlet dataItem = target.dataItem;\r\n\t\t\t\tif (dataItem) {\r\n\t\t\t\t\tlet treeMapDataItem = dataItem.treeMapDataItem;\r\n\t\t\t\t\tif (treeMapDataItem) {\r\n\t\t\t\t\t\ttarget.fill = treeMapDataItem.color;\r\n\t\t\t\t\t\ttarget.adapter.remove(\"fill\"); //@todo: make it possible adapters applied once?\r\n\t\t\t\t\t\treturn treeMapDataItem.color;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tif (this.zoomable && (dataItem.level > this.currentLevel || (dataItem.children && dataItem.children.length > 0))) {\r\n\t\t\t\tseries.columns.template.cursorOverStyle = MouseCursorStyle.pointer;\r\n\t\t\t\tif (this.zoomable) {\r\n\t\t\t\t\tseries.columns.template.events.on(\"hit\", (event) => {\r\n\t\t\t\t\t\tlet seriesDataItem = event.target.dataItem;\r\n\r\n\t\t\t\t\t\tif (dataItem.level > this.currentLevel) {\r\n\t\t\t\t\t\t\tthis.zoomToChartDataItem(seriesDataItem.treeMapDataItem.parent);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tthis.zoomToSeriesDataItem(seriesDataItem);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}, this, undefined);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._tempSeries.push(dataItem.series);\r\n\t}\r\n\r\n\t/**\r\n\t * Toggles bullets so that labels that belong to current drill level are\r\n\t * shown.\r\n\t *\r\n\t * @param duration Animation duration (ms)\r\n\t */\r\n\tprotected toggleBullets(duration?: number): void {\r\n\t\t// hide all series which are not in tempSeries\r\n\t\t$iter.each(this.series.iterator(), (series) => {\r\n\t\t\tif (this._tempSeries.indexOf(series) == - 1) {\r\n\t\t\t\t//series.hideReal(duration);\r\n\t\t\t\tseries.columnsContainer.hide();\r\n\t\t\t\tseries.bulletsContainer.hide(duration);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t//series.showReal(duration);\r\n\t\t\t\tseries.columnsContainer.show();\r\n\t\t\t\tseries.bulletsContainer.show(duration);\r\n\r\n\t\t\t\tif (series.level < this.currentLevel) {\r\n\t\t\t\t\tseries.bulletsContainer.hide(duration);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Zooms to particular item in series.\r\n\t *\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic zoomToSeriesDataItem(dataItem: TreeMapSeriesDataItem): void {\r\n\t\tthis.zoomToChartDataItem(dataItem.treeMapDataItem);\r\n\t}\r\n\r\n\t/**\r\n\t * Zooms to particular item.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic zoomToChartDataItem(dataItem: TreeMapDataItem): void {\r\n\t\tif (dataItem && dataItem.children) {\r\n\t\t\tthis.xAxis.zoomToValues(dataItem.x0, dataItem.x1);\r\n\t\t\tthis.yAxis.zoomToValues(dataItem.y0, dataItem.y1);\r\n\r\n\t\t\tthis.currentLevel = dataItem.level;\r\n\t\t\tthis.currentlyZoomed = dataItem;\r\n\r\n\t\t\tthis.createTreeSeries(dataItem);\r\n\r\n\t\t\tlet rangeChangeAnimation = this.xAxis.rangeChangeAnimation || this.yAxis.rangeChangeAnimation;\r\n\r\n\t\t\tif (rangeChangeAnimation && !rangeChangeAnimation.isFinished()) {\r\n\t\t\t\tthis._dataDisposers.push(rangeChangeAnimation);\r\n\t\t\t\trangeChangeAnimation.events.once(\"animationended\", () => {\r\n\t\t\t\t\tthis.toggleBullets();\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.toggleBullets();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Sets defaults that instantiate some objects that rely on parent, so they\r\n\t * cannot be set in constructor.\r\n\t */\r\n\tprotected applyInternalDefaults(): void {\r\n\r\n\t\tsuper.applyInternalDefaults();\r\n\r\n\t\t// Add a default screen reader title for accessibility\r\n\t\t// This will be overridden in screen reader if there are any `titles` set\r\n\t\tif (!$type.hasValue(this.readerTitle)) {\r\n\t\t\tthis.readerTitle = this.language.translate(\"TreeMap chart\");\r\n\t\t}\r\n\t\t//this.homeText = this.language.translate(\"Home\");\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty DataItem of the type appropriate for this object.\r\n\t *\r\n\t * @see {@link DataItem}\r\n\t * @return Data Item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new TreeMapDataItem();\r\n\t}\r\n\r\n\t/**\r\n\t * Maximum drill-down levels the chart will allow going to.\r\n\t *\r\n\t * If set, the chart will not drill-down further, even if there are sub-items\r\n\t * available.\r\n\t *\r\n\t * Set to `1` to disable drill down functionality.\r\n\t *\r\n\t * @param value Maximum drill-down level\r\n\t */\r\n\tpublic set maxLevels(value: number) {\r\n\t\tthis.setPropertyValue(\"maxLevels\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Maximum drill-down level\r\n\t */\r\n\tpublic get maxLevels(): number {\r\n\t\treturn this.getPropertyValue(\"maxLevels\");\r\n\t}\r\n\r\n\t/**\r\n\t * Current drill-down level the chart is at.\r\n\t *\r\n\t * @param value Current level\r\n\t */\r\n\tpublic set currentLevel(value: number) {\r\n\t\tthis.setPropertyValue(\"currentLevel\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Current level\r\n\t */\r\n\tpublic get currentLevel(): number {\r\n\t\treturn this.getPropertyValue(\"currentLevel\");\r\n\t}\r\n\r\n\t/**\r\n\t * Sorting direction of treemap items.\r\n\t *\r\n\t * Available options: \"none\", \"ascending\", and \"descending\" (default).\r\n\t *\r\n\t * @default \"descending\"\r\n\t * @param value [description]\r\n\t */\r\n\tpublic set sorting(value: \"none\" | \"ascending\" | \"descending\") {\r\n\t\tthis.setPropertyValue(\"sorting\", value, true);\r\n\t}\r\n\r\n\tpublic get sorting(): \"none\" | \"ascending\" | \"descending\" {\r\n\t\treturn this.getPropertyValue(\"sorting\");\r\n\t}\r\n\r\n\t/**\r\n\t * Creates and returns a new series of the suitable type.\r\n\t *\r\n\t * @return new series\r\n\t */\r\n\tprotected createSeries(): this[\"_seriesType\"] {\r\n\t\treturn new TreeMapSeries();\r\n\t}\r\n\r\n\t/**\r\n\t * A text displayed on the \"home\" button which is used to go back to level 0\r\n\t * after drill into sub-items.\r\n\t *\r\n\t * @param value Home text\r\n\t */\r\n\tpublic set homeText(value: string) {\r\n\t\tthis._homeText = value;\r\n\t\tif (this._homeDataItem) {\r\n\t\t\tthis._homeDataItem.name = this._homeText;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Home text\r\n\t */\r\n\tpublic get homeText(): string {\r\n\t\treturn this._homeText;\r\n\t}\r\n\r\n\t/**\r\n\t * Processes JSON-based config before it is applied to the object.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param config Config\r\n\t */\r\n\tpublic processConfig(config?: { [index: string]: any }): void {\r\n\r\n\t\tif (config) {\r\n\r\n\t\t\t// Instantiate layout algorithm\r\n\t\t\tif ($type.hasValue(config[\"layoutAlgorithm\"]) && $type.isString(config[\"layoutAlgorithm\"])) {\r\n\t\t\t\tswitch (config[\"layoutAlgorithm\"]) {\r\n\t\t\t\t\tcase \"squarify\":\r\n\t\t\t\t\t\tconfig[\"layoutAlgorithm\"] = this.squarify;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"binaryTree\":\r\n\t\t\t\t\t\tconfig[\"layoutAlgorithm\"] = this.binaryTree;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"slice\":\r\n\t\t\t\t\t\tconfig[\"layoutAlgorithm\"] = this.slice;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"dice\":\r\n\t\t\t\t\t\tconfig[\"layoutAlgorithm\"] = this.dice;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"sliceDice\":\r\n\t\t\t\t\t\tconfig[\"layoutAlgorithm\"] = this.sliceDice;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tdelete config[\"layoutAlgorithm\"];\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Set type for navigation bar\r\n\t\t\tif ($type.hasValue(config.navigationBar) && !$type.hasValue(config.navigationBar.type)) {\r\n\t\t\t\tconfig.navigationBar.type = \"NavigationBar\";\r\n\t\t\t}\r\n\r\n\t\t\tsuper.processConfig(config);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Measures the size of container and informs its children of how much size\r\n\t * they can occupy, by setting their relative `maxWidth` and `maxHeight`\r\n\t * properties.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validateLayout() {\r\n\t\tsuper.validateLayout();\r\n\t\tthis.layoutItems(this.currentlyZoomed);\r\n\t}\r\n\r\n\t/**\r\n\t * Validates (processes) data items.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validateDataItems() {\r\n\t\tsuper.validateDataItems();\r\n\t\tthis.layoutItems(this._homeDataItem);\r\n\r\n\t\t$iter.each(this.series.iterator(), (series) => {\r\n\t\t\tseries.validateRawData();\r\n\t\t});\r\n\r\n\t\tthis.zoomToChartDataItem(this._homeDataItem);\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * ==========================================================================\r\n\t * TREEMAP LAYOUT FUNCTIONS\r\n\t * ==========================================================================\r\n\t * @hidden\r\n\t */\r\n\r\n\t/**\r\n\t * The functions below are from D3.js library (https://d3js.org/)\r\n\t *\r\n\t * --------------------------------------------------------------------------\r\n\t * Copyright 2017 Mike Bostock\r\n\t *\r\n\t * Redistribution and use in source and binary forms, with or without\r\n\t * modification, are permitted provided that the following conditions are met:\r\n\t *\r\n\t * 1. Redistributions of source code must retain the above copyright notice,\r\n\t * this list of conditions and the following disclaimer.\r\n\t *\r\n\t * 2. Redistributions in binary form must reproduce the above copyright\r\n\t * notice,this list of conditions and the following disclaimer in the\r\n\t * documentation and/or other materials provided with the distribution.\r\n\t *\r\n\t * 3. Neither the name of the copyright holder nor the names of its\r\n\t * contributors may be used to endorse or promote products derived from\r\n\t * this software without specific prior written permission.\r\n\t *\r\n\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n\t * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n\t * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n\t * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r\n\t * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n\t * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r\n\t * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n\t * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n\t * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n\t * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n\t * POSSIBILITY OF SUCH DAMAGE.\r\n\t * --------------------------------------------------------------------------\r\n\t * @hidden\r\n\t */\r\n\r\n\t/**\r\n\t * Treemap layout algorithm: binaryTree.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param parent Data item\r\n\t */\r\n\tpublic binaryTree(parent: TreeMapDataItem): void {\r\n\t\tlet nodes = parent.children,\r\n\t\t\ti, n = nodes.length,\r\n\t\t\tsum, sums = new Array(n + 1);\r\n\r\n\t\tfor (sums[0] = sum = i = 0; i < n; ++i) {\r\n\t\t\tsums[i + 1] = sum += nodes.getIndex(i).value;\r\n\t\t}\r\n\r\n\t\tpartition(0, n, parent.value, parent.x0, parent.y0, parent.x1, parent.y1);\r\n\r\n\t\tfunction partition(i: number, j: number, value: number, x0: number, y0: number, x1: number, y1: number) {\r\n\t\t\tif (i >= j - 1) {\r\n\t\t\t\tlet node = nodes.getIndex(i);\r\n\t\t\t\tnode.x0 = x0, node.y0 = y0;\r\n\t\t\t\tnode.x1 = x1, node.y1 = y1;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tlet valueOffset = sums[i],\r\n\t\t\t\tvalueTarget = (value / 2) + valueOffset,\r\n\t\t\t\tk = i + 1,\r\n\t\t\t\thi = j - 1;\r\n\r\n\t\t\twhile (k < hi) {\r\n\t\t\t\tlet mid = k + hi >>> 1;\r\n\t\t\t\tif (sums[mid] < valueTarget) k = mid + 1;\r\n\t\t\t\telse hi = mid;\r\n\t\t\t}\r\n\r\n\t\t\tif ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k)--k;\r\n\r\n\t\t\tlet valueLeft = sums[k] - valueOffset,\r\n\t\t\t\tvalueRight = value - valueLeft;\r\n\r\n\t\t\tif ((x1 - x0) > (y1 - y0)) {\r\n\t\t\t\tlet xk = (x0 * valueRight + x1 * valueLeft) / value;\r\n\t\t\t\tpartition(i, k, valueLeft, x0, y0, xk, y1);\r\n\t\t\t\tpartition(k, j, valueRight, xk, y0, x1, y1);\r\n\t\t\t} else {\r\n\t\t\t\tlet yk = (y0 * valueRight + y1 * valueLeft) / value;\r\n\t\t\t\tpartition(i, k, valueLeft, x0, y0, x1, yk);\r\n\t\t\t\tpartition(k, j, valueRight, x0, yk, x1, y1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Treemap layout algorithm: slice.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param parent Data item\r\n\t */\r\n\tpublic slice(parent: TreeMapDataItem): void {\r\n\t\tlet x0 = parent.x0;\r\n\t\tlet x1 = parent.x1;\r\n\t\tlet y0 = parent.y0;\r\n\t\tlet y1 = parent.y1;\r\n\r\n\t\tlet nodes = parent.children,\r\n\t\t\tnode,\r\n\t\t\ti = -1,\r\n\t\t\tn = nodes.length,\r\n\t\t\tk = parent.value && (y1 - y0) / parent.value;\r\n\r\n\t\twhile (++i < n) {\r\n\t\t\tnode = nodes.getIndex(i), node.x0 = x0, node.x1 = x1;\r\n\t\t\tnode.y0 = y0, node.y1 = y0 += node.value * k;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Treemap layout algorithm: dice.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param parent Data item\r\n\t */\r\n\tpublic dice(parent: TreeMapDataItem): void {\r\n\t\tlet x0 = parent.x0;\r\n\t\tlet x1 = parent.x1;\r\n\t\tlet y0 = parent.y0;\r\n\t\tlet y1 = parent.y1;\r\n\r\n\t\tlet nodes = parent.children,\r\n\t\t\tnode,\r\n\t\t\ti = -1,\r\n\t\t\tn = nodes.length,\r\n\t\t\tk = parent.value && (x1 - x0) / parent.value;\r\n\r\n\t\twhile (++i < n) {\r\n\t\t\tnode = nodes.getIndex(i), node.y0 = y0, node.y1 = y1;\r\n\t\t\tnode.x0 = x0, node.x1 = x0 += node.value * k;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Treemap layout algorithm: slideDice.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param parent Data item\r\n\t */\r\n\tpublic sliceDice(parent: TreeMapDataItem): void {\r\n\t\tparent.level & 1 ? this.slice(parent) : this.dice(parent);\r\n\t}\r\n\r\n\t/**\r\n\t * Treemap layout algorithm: squarify.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param parent Data item\r\n\t */\r\n\tpublic squarify(parent: TreeMapDataItem): void {\r\n\t\tlet ratio = (1 + Math.sqrt(5)) / 2;\r\n\r\n\t\tlet x0 = parent.x0;\r\n\t\tlet x1 = parent.x1;\r\n\t\tlet y0 = parent.y0;\r\n\t\tlet y1 = parent.y1;\r\n\r\n\t\tlet nodes = parent.children;\r\n\t\tlet nodeValue;\r\n\t\tlet i0 = 0;\r\n\t\tlet i1 = 0;\r\n\t\tlet n = nodes.length;\r\n\t\tlet dx;\r\n\t\tlet dy;\r\n\t\tlet value = parent.value;\r\n\t\tlet sumValue;\r\n\t\tlet minValue;\r\n\t\tlet maxValue;\r\n\t\tlet newRatio;\r\n\t\tlet minRatio;\r\n\t\tlet alpha;\r\n\t\tlet beta;\r\n\r\n\t\twhile (i0 < n) {\r\n\t\t\tdx = x1 - x0, dy = y1 - y0;\r\n\r\n\t\t\t// Find the next non-empty node.\r\n\t\t\tdo sumValue = nodes.getIndex(i1++).value; while (!sumValue && i1 < n);\r\n\t\t\tminValue = maxValue = sumValue;\r\n\t\t\talpha = Math.max(dy / dx, dx / dy) / (value * ratio);\r\n\t\t\tbeta = sumValue * sumValue * alpha;\r\n\t\t\tminRatio = Math.max(maxValue / beta, beta / minValue);\r\n\r\n\t\t\t// Keep adding nodes while the aspect ratio maintains or improves.\r\n\t\t\tfor (; i1 < n; ++i1) {\r\n\t\t\t\tsumValue += nodeValue = nodes.getIndex(i1).value;\r\n\t\t\t\tif (nodeValue < minValue) {\r\n\t\t\t\t\tminValue = nodeValue;\r\n\t\t\t\t}\r\n\t\t\t\tif (nodeValue > maxValue) {\r\n\t\t\t\t\tmaxValue = nodeValue;\r\n\t\t\t\t}\r\n\t\t\t\tbeta = sumValue * sumValue * alpha;\r\n\t\t\t\tnewRatio = Math.max(maxValue / beta, beta / minValue);\r\n\t\t\t\tif (newRatio > minRatio) {\r\n\t\t\t\t\tsumValue -= nodeValue; break;\r\n\t\t\t\t}\r\n\t\t\t\tminRatio = newRatio;\r\n\t\t\t}\r\n\r\n\t\t\t// Position and record the row orientation.\r\n\t\t\tlet row = this.dataItems.template.clone();\r\n\t\t\trow.value = sumValue;\r\n\t\t\trow.dice = dx < dy;\r\n\t\t\trow.children = nodes.slice(i0, i1);\r\n\t\t\trow.x0 = x0;\r\n\t\t\trow.y0 = y0;\r\n\t\t\trow.x1 = x1;\r\n\t\t\trow.y1 = y1;\r\n\r\n\t\t\tif (row.dice) {\r\n\t\t\t\trow.y1 = value ? y0 += dy * sumValue / value : y1;\r\n\t\t\t\tthis.dice(row);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\trow.x1 = value ? x0 += dx * sumValue / value : x1, y1;\r\n\t\t\t\tthis.slice(row);\r\n\t\t\t}\r\n\t\t\tvalue -= sumValue, i0 = i1;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * [handleDataItemValueChange description]\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t */\r\n\tpublic handleDataItemValueChange(dataItem?: this[\"_dataItem\"], name?: string): void {\r\n\t\tif (name == \"value\") {\r\n\t\t\tthis.invalidateDataItems();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic handleDataItemWorkingValueChange(dataItem?: this[\"_dataItem\"], name?: string): void {\r\n\t\tif (name == \"value\") {\r\n\t\t\tthis.invalidateDataItems();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Setups the legend to use the chart's data.\r\n\t * @ignore\r\n\t */\r\n\tpublic feedLegend(): void {\r\n\t\tlet legend = this.legend;\r\n\t\tif (legend) {\r\n\t\t\tlet legendData: Array = [];\r\n\r\n\t\t\t$iter.each(this.series.iterator(), (series) => {\r\n\t\t\t\tif (series.level == 1) {\r\n\t\t\t\t\tif (!series.hiddenInLegend) {\r\n\t\t\t\t\t\tlegendData.push(series);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tlegend.dataFields.name = \"name\";\r\n\t\t\tlegend.data = legendData;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic disposeData() {\r\n\r\n\t\tsuper.disposeData();\r\n\r\n\t\tthis._homeDataItem = undefined;\r\n\r\n\t\tthis.series.clear();\r\n\r\n\t\tif (this.navigationBar) {\r\n\t\t\tthis.navigationBar.disposeData();\r\n\t\t}\r\n\r\n\t\tthis.xAxis.disposeData();\r\n\t\tthis.yAxis.disposeData();\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"TreeMap\"] = TreeMap;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/types/TreeMap.ts","/**\r\n * Module, defining Axis Renderer for horizontal 3D axes.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { AxisRendererX, IAxisRendererXProperties, IAxisRendererXAdapters, IAxisRendererXEvents } from \"../axes/AxisRendererX\";\r\nimport { Sprite, ISpriteEvents, AMEvent } from \"../../core/Sprite\";\r\nimport { XYChart3D } from \"../types/XYChart3D\";\r\nimport { Grid } from \"../axes/Grid\";\r\nimport { IPoint } from \"../../core/defs/IPoint\";\r\nimport { MutableValueDisposer } from \"../../core/utils/Disposer\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[AxisRendererX3D]].\r\n */\r\nexport interface IAxisRendererX3DProperties extends IAxisRendererXProperties { }\r\n\r\n/**\r\n * Defines events for [[AxisRendererX3D]].\r\n */\r\nexport interface IAxisRendererX3DEvents extends IAxisRendererXEvents { }\r\n\r\n/**\r\n * Defines adapters for [[AxisRendererX3D]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IAxisRendererX3DAdapters extends IAxisRendererXAdapters, IAxisRendererX3DProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Renderer for horizontal 3D axis.\r\n *\r\n * @see {@link IAxisRendererX3DEvents} for a list of available events\r\n * @see {@link IAxisRendererX3DAdapters} for a list of available Adapters\r\n */\r\nexport class AxisRendererX3D extends AxisRendererX {\r\n\r\n\t/**\r\n\t * Defines available properties\r\n\t */\r\n\tpublic _properties!: IAxisRendererX3DProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters\r\n\t */\r\n\tpublic _adapter!: IAxisRendererX3DAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IAxisRendererX3DEvents;\r\n\r\n\t/**\r\n\t * A related chart.\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _chart = new MutableValueDisposer();\r\n\r\n\t/**\r\n\t * Constructor.\r\n\t *\r\n\t * @param axis Related axis\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"AxisRendererX3D\";\r\n\r\n\t\tthis._disposers.push(this._chart);\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Updates and positions a grid element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param grid Grid element\r\n\t * @param position Starting position\r\n\t * @param endPosition End position\r\n\t */\r\n\tpublic updateGridElement(grid: Grid, position: number, endPosition: number) {\r\n\t\tposition = position + (endPosition - position) * grid.location;\r\n\t\tlet point: IPoint = this.positionToPoint(position);\r\n\r\n\t\tif (grid.element) {\r\n\r\n\t\t\tlet dx: number = this.chart.dx3D;\r\n\t\t\tlet dy: number = this.chart.dy3D;\r\n\r\n\t\t\tlet h: number = this.getHeight();\r\n\r\n\t\t\tgrid.path = $path.moveTo({ x: dx, y: dy }) + $path.lineTo({ x: dx, y: h + dy }) + $path.lineTo({ x: 0, y: h });\r\n\t\t}\r\n\t\tthis.positionItem(grid, point);\r\n\r\n\t\tthis.toggleVisibility(grid, position, 0, 1);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates and positions the base grid element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic updateBaseGridElement() {\r\n\t\tsuper.updateBaseGridElement();\r\n\r\n\t\tlet h = this.getHeight();\r\n\t\tlet dx = this.chart.dx3D;\r\n\t\tlet dy = this.chart.dy3D;\r\n\t\tthis.baseGrid.path = $path.moveTo({ x: dx, y: dy }) + $path.lineTo({ x: dx, y: h + dy }) + $path.lineTo({ x: 0, y: h });\r\n\t}\r\n\r\n\t/**\r\n\t * Chart, associated with the Axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param value Chart\r\n\t */\r\n\tpublic set chart(chart: XYChart3D) {\r\n\t\tif (chart) {\r\n\t\t\tthis._chart.set(chart, chart.events.on(\"propertychanged\", this.handle3DChanged, this, false));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore Exclude from docs\r\n\t * @return Chart\r\n\t */\r\n\tpublic get chart(): XYChart3D {\r\n\t\treturn this._chart.get();\r\n\t}\r\n\r\n\t/**\r\n\t * Invoked when 3D-related settings change, like depth or angle.\r\n\t *\r\n\t * @param event Event\r\n\t */\r\n\tprotected handle3DChanged(event: AMEvent[\"propertychanged\"]): void {\r\n\t\tif (event.property == \"depth\" || event.property == \"angle\") {\r\n\t\t\tthis.invalidate();\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"AxisRendererX3D\"] = AxisRendererX3D;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/axes/AxisRendererX3D.ts","/**\r\n * Module, defining Axis Renderer for vertical 3D axes.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { AxisRendererY, IAxisRendererYProperties, IAxisRendererYAdapters, IAxisRendererYEvents } from \"../axes/AxisRendererY\";\r\nimport { Sprite, ISpriteEvents, AMEvent } from \"../../core/Sprite\";\r\nimport { XYChart3D } from \"../types/XYChart3D\";\r\nimport { Grid } from \"../axes/Grid\";\r\nimport { IPoint } from \"../../core/defs/IPoint\";\r\nimport { MutableValueDisposer } from \"../../core/utils/Disposer\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[AxisRendererY3D]].\r\n */\r\nexport interface IAxisRendererY3DProperties extends IAxisRendererYProperties { }\r\n\r\n/**\r\n * Defines events for [[AxisRendererY3D]].\r\n */\r\nexport interface IAxisRendererY3DEvents extends IAxisRendererYEvents { }\r\n\r\n/**\r\n * Defines adapters for [[AxisRendererY3D]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IAxisRendererY3DAdapters extends IAxisRendererYAdapters, IAxisRendererY3DProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Renderer for vertical 3D axis.\r\n *\r\n * @see {@link IAxisRendererY3DEvents} for a list of available events\r\n * @see {@link IAxisRendererY3DAdapters} for a list of available Adapters\r\n */\r\nexport class AxisRendererY3D extends AxisRendererY {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IAxisRendererY3DProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IAxisRendererY3DAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IAxisRendererY3DEvents;\r\n\r\n\t/**\r\n\t * A related chart.\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _chart = new MutableValueDisposer();\r\n\r\n\t/**\r\n\t * Constructor.\r\n\t *\r\n\t * @param axis Related axis\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"AxisRendererY3D\";\r\n\t\tthis._disposers.push(this._chart);\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Updates and positions a grid element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param grid Grid element\r\n\t * @param position Starting position\r\n\t * @param endPosition End position\r\n\t */\r\n\tpublic updateGridElement(grid: Grid, position: number, endPosition: number): void {\r\n\t\tposition = position + (endPosition - position) * grid.location;\r\n\r\n\t\tlet point: IPoint = this.positionToPoint(position);\r\n\t\tif (grid.element) {\r\n\r\n\t\t\tlet dx: number = this.chart.dx3D;\r\n\t\t\tlet dy: number = this.chart.dy3D;\r\n\r\n\t\t\tlet w: number = this.getWidth();\r\n\r\n\t\t\tgrid.path = $path.moveTo({ x: 0, y: 0 }) + $path.lineTo({ x: dx, y: dy }) + $path.lineTo({ x: w + dx, y: dy });\r\n\t\t}\r\n\t\tthis.positionItem(grid, point);\r\n\r\n\t\tthis.toggleVisibility(grid, position, 0, 1);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates and positions the base grid element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic updateBaseGridElement(): void {\r\n\t\tsuper.updateBaseGridElement();\r\n\r\n\t\tlet w: number = this.getWidth();\r\n\t\tthis.baseGrid.path = $path.moveTo({ x: 0, y: 0 })\r\n\t\t\t\t+ $path.lineTo({ x: w, y: 0 })\r\n\t\t\t\t+ $path.lineTo({ x: w + this.chart.dx3D, y: this.chart.dy3D });\r\n\t}\r\n\r\n\t/**\r\n\t * Chart, associated with the Axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param value Chart\r\n\t */\r\n\tpublic set chart(chart: XYChart3D) {\r\n\t\tif (chart) {\r\n\t\t\tthis._chart.set(chart, chart.events.on(\"propertychanged\", this.handle3DChanged, this, false));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore Exclude from docs\r\n\t * @return Chart\r\n\t */\r\n\tpublic get chart(): XYChart3D {\r\n\t\treturn this._chart.get();\r\n\t}\r\n\r\n\t/**\r\n\t * Invoked when 3D-related settings change, like depth or angle.\r\n\t *\r\n\t * @param event Event\r\n\t */\r\n\tprotected handle3DChanged(event: AMEvent[\"propertychanged\"]): void {\r\n\t\tif (event.property == \"depth\" || event.property == \"angle\") {\r\n\t\t\tthis.invalidate();\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/axes/AxisRendererY3D.ts","/**\r\n * 3D column series module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { ColumnSeries, IColumnSeriesProperties, IColumnSeriesDataFields, IColumnSeriesAdapters, IColumnSeriesEvents, ColumnSeriesDataItem } from \"../series/ColumnSeries\";\r\nimport { Container } from \"../../core/Container\";\r\nimport { XYChart3D } from \"../types/XYChart3D\";\r\nimport { Column3D } from \"../elements/Column3D\";\r\nimport { registry } from \"../../core/Registry\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\nexport class ColumnSeries3DDataItem extends ColumnSeriesDataItem {\r\n\r\n\t/**\r\n\t * A sprite used to draw the column.\r\n\t */\r\n\tpublic _column: Column3D;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"ColumnSeries3DDataItem\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[ColumnSeries3D]].\r\n */\r\nexport interface IColumnSeries3DDataFields extends IColumnSeriesDataFields { }\r\n\r\n/**\r\n * Defines properties for [[ColumnSeries3D]].\r\n */\r\nexport interface IColumnSeries3DProperties extends IColumnSeriesProperties {\r\n\r\n\t/**\r\n\t * Depth (height) of the slices in the series in pixels.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tdepth?: number;\r\n\r\n\t/**\r\n\t * Angle of view for the slices in series. (0-360)\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tangle?: number;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[ColumnSeries3D]].\r\n */\r\nexport interface IColumnSeries3DEvents extends IColumnSeriesEvents { }\r\n\r\n/**\r\n * Defines adapters for [[ColumnSeries3D]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IColumnSeries3DAdapters extends IColumnSeriesAdapters, IColumnSeries3DProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines [[Series]] for a 3D column graph.\r\n *\r\n * @see {@link IColumnSeries3DEvents} for a list of available Events\r\n * @see {@link IColumnSeries3DAdapters} for a list of available Adapters\r\n * @todo Example\r\n * @important\r\n */\r\nexport class ColumnSeries3D extends ColumnSeries {\r\n\r\n\t/**\r\n\t */\r\n\tpublic _dataItem: ColumnSeries3DDataItem;\r\n\r\n\t/**\r\n\t */\r\n\tpublic _column: Column3D;\r\n\r\n\t/**\r\n\t * Defines the type for data fields.\r\n\t */\r\n\tpublic _dataFields: IColumnSeries3DDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IColumnSeries3DProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IColumnSeries3DAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IColumnSeries3DEvents;\r\n\r\n\t/**\r\n\t * Specifies how deep in 3d space columns should be drawn.\r\n\t *\r\n\t * Internal use only.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic depthIndex: number;\r\n\r\n\t/**\r\n\t * A chart series belongs to.\r\n\t */\r\n\tpublic _chart: XYChart3D;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\r\n\t\tthis.className = \"ColumnSeries3D\";\r\n\r\n\t\tthis.columns.template.column3D.applyOnClones = true;\r\n\t\tthis.columns.template.hiddenState.properties.visible = true;\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tpublic get columnsContainer(): Container {\r\n\t\tif (this.chart && this.chart.columnsContainer) {\r\n\t\t\treturn this.chart.columnsContainer;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn this._columnsContainer;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Validates data item's elements.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic validateDataElementReal(dataItem: this[\"_dataItem\"]): void {\r\n\t\tsuper.validateDataElementReal(dataItem);\r\n\t\tif(dataItem.column){\r\n\t\t\tdataItem.column.dx = this.dx;\r\n\t\t\tdataItem.column.dy = this.dy;\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Validates data item's elements.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validateDataElements(): void {\r\n\t\tsuper.validateDataElements();\r\n\t\tif(this.chart){\r\n\t\t\tthis.chart.invalidateLayout();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an element to use for 3D bar.\r\n\t * @ignore\r\n\t * @return Element.\r\n\t */\r\n\tprotected createColumnTemplate(): this[\"_column\"] {\r\n\t\treturn new Column3D();\r\n\t}\r\n\r\n\r\n\r\n\t/**\r\n\t * Depth (height) of the slices in the series in pixels.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param value Depth (px)\r\n\t */\r\n\tpublic set depth(value: number) {\r\n\t\tthis.setPropertyValue(\"depth\", value, true);\r\n\t\tlet template = this.columns.template; // todo: Cone is not Rectangle3D, maybe we should do some I3DShape?\r\n\t\ttemplate.column3D.depth = value;\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore Exclude from docs\r\n\t * @return Depth (px)\r\n\t */\r\n\tpublic get depth(): number {\r\n\t\treturn this.getPropertyValue(\"depth\");\r\n\t}\r\n\r\n\t/**\r\n\t * Angle of view for the slices in series. (0-360)\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param value Angle (0-360)\r\n\t */\r\n\tpublic set angle(value: number) {\r\n\t\tthis.setPropertyValue(\"angle\", value);\r\n\t\tlet template = this.columns.template;\r\n\t\ttemplate.column3D.angle = value;\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore Exclude from docs\r\n\t * @return Angle (0-360)\r\n\t */\r\n\tpublic get angle(): number {\r\n\t\treturn this.getPropertyValue(\"angle\");\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"ColumnSeries3D\"] = ColumnSeries3D;\r\nregistry.registeredClasses[\"ColumnSeries3DDataItem\"] = ColumnSeries3DDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/ColumnSeries3D.ts","/**\r\n * Module for building 3D serial charts.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * Imports\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { XYChart, IXYChartProperties, IXYChartDataFields, IXYChartAdapters, IXYChartEvents, XYChartDataItem } from \"./XYChart\";\r\nimport { Container } from \"../../core/Container\";\r\nimport { Sprite } from \"../../core/Sprite\";\r\nimport { AxisRendererX3D } from \"../axes/AxisRendererX3D\";\r\nimport { AxisRendererY3D } from \"../axes/AxisRendererY3D\";\r\nimport { ColumnSeries3D } from \"../series/ColumnSeries3D\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[XYChart3D]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class XYChart3DDataItem extends XYChartDataItem {\r\n\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"XYChart3DDataItem\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[XYChart3D]].\r\n */\r\nexport interface IXYChart3DDataFields extends IXYChartDataFields { }\r\n\r\n/**\r\n * Defines available properties for [[XYChart3D]].\r\n */\r\nexport interface IXYChart3DProperties extends IXYChartProperties {\r\n\r\n\t/**\r\n\t * Depths of the chart in pixels.\r\n\t */\r\n\tdepth?: number;\r\n\r\n\t/**\r\n\t * Angle the chart is viewed at.\r\n\t */\r\n\tangle?: number;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[XYChart3D]].\r\n */\r\nexport interface IXYChart3DEvents extends IXYChartEvents { }\r\n\r\n/**\r\n * Defines adapters for [[XYChart3D]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IXYChart3DAdapters extends IXYChartAdapters, IXYChart3DProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Creates a 3D XY chart.\r\n *\r\n * @see {@link IXYChart3DEvents} for a list of available Events\r\n * @see {@link IXYChart3DAdapters} for a list of available Adapters\r\n * @see {@link https://www.amcharts.com/docs/v4/chart-types/xy-chart/} for documentation\r\n * @important\r\n */\r\nexport class XYChart3D extends XYChart {\r\n\r\n\t/**\r\n\t * Available data fields.\r\n\t */\r\n\tpublic _dataFields: IXYChart3DDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IXYChart3DProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IXYChart3DAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IXYChart3DEvents;\r\n\r\n\t/**\r\n\t * Type of the axis renderer to use for X axes.\r\n\t */\r\n\tprotected _axisRendererX: typeof AxisRendererX3D = AxisRendererX3D;\r\n\r\n\t/**\r\n\t * Type of the axis renderer to use for Y axes.\r\n\t */\r\n\tprotected _axisRendererY: typeof AxisRendererY3D = AxisRendererY3D;\r\n\r\n\t/**\r\n\t * A container to add 3D column elements to.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic columnsContainer: Container;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"XYChart3D\";\r\n\r\n\t\t// Set defaults\r\n\t\tthis.depth = 30;\r\n\t\tthis.angle = 30;\r\n\r\n\t\t// Creeate container for columns\r\n\t\tlet columnsContainer = this.seriesContainer.createChild(Container);\r\n\t\tcolumnsContainer.shouldClone = false;\r\n\t\tcolumnsContainer.isMeasured = false;\r\n\t\tcolumnsContainer.layout = \"none\";\r\n\t\tthis.columnsContainer = columnsContainer;\r\n\r\n\t\tthis.columnsContainer.mask = this.createChild(Sprite);\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Depth of the 3D chart / columns in pixels.\r\n\t *\r\n\t * @param value Depth (px)\r\n\t */\r\n\tpublic set depth(value: number) {\r\n\t\tthis.setPropertyValue(\"depth\", value);\r\n\t\tthis.fixLayout();\r\n\t\tthis.invalidateDataUsers();\r\n\t}\r\n\r\n\t/**\r\n\t * @return Depth (px)\r\n\t */\r\n\tpublic get depth(): number {\r\n\t\treturn this.getPropertyValue(\"depth\");\r\n\t}\r\n\r\n\t/**\r\n\t * Angle the chart is viewed at.\r\n\t *\r\n\t * @todo Description (review)\r\n\t * @param value Angle\r\n\t */\r\n\tpublic set angle(value: number) {\r\n\t\tthis.setPropertyValue(\"angle\", value);\r\n\t\tthis.fixLayout();\r\n\t\tthis.invalidateDataUsers();\r\n\t}\r\n\r\n\t/**\r\n\t * @return Angle\r\n\t */\r\n\tpublic get angle(): number {\r\n\t\treturn this.getPropertyValue(\"angle\");\r\n\t}\r\n\r\n\t/**\r\n\t * A calculated horizontal 3D offset (px).\r\n\t *\r\n\t * @readonly\r\n\t * @return Offset (px)\r\n\t */\r\n\tpublic get dx3D(): number {\r\n\t\treturn $math.cos(this.angle) * this.depth;\r\n\t}\r\n\r\n\t/**\r\n\t * A calculated vertical 3D offset (px).\r\n\t *\r\n\t * @readonly\r\n\t * @return Offset (px)\r\n\t */\r\n\tpublic get dy3D(): number {\r\n\t\treturn -$math.sin(this.angle) * this.depth;\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)validates layout\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validateLayout() {\r\n\t\tsuper.validateLayout();\r\n\t\tthis.fixColumns();\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the layout (padding and scrollbar positions) to accommodate for\r\n\t * 3D depth and angle.\r\n\t */\r\n\tprotected fixLayout(): void {\r\n\r\n\t\tthis.chartContainer.marginTop = -this.dy3D;\r\n\t\tthis.chartContainer.paddingRight = this.dx3D;\r\n\r\n\t\tif (this.scrollbarX) {\r\n\t\t\tthis.scrollbarX.dy = this.dy3D;\r\n\t\t\tthis.scrollbarX.dx = this.dx3D;\r\n\t\t}\r\n\r\n\t\tif (this.scrollbarY) {\r\n\t\t\tthis.scrollbarY.dy = this.dy3D;\r\n\t\t\tthis.scrollbarY.dx = this.dx3D;\r\n\t\t}\r\n\r\n\t\tthis.fixColumns();\r\n\r\n\t\tsuper.fixLayout();\r\n\t}\r\n\r\n\t/**\r\n\t * Updates column positions, offset and dimensions based on chart's angle\r\n\t * and depth.\r\n\t */\r\n\tprotected fixColumns(): void {\r\n\t\tlet count: number = 1;\r\n\t\tlet i = 0;\r\n\t\t$iter.each(this.series.iterator(), (series) => {\r\n\t\t\tif (series instanceof ColumnSeries3D) {\r\n\r\n\t\t\t\tif (!series.clustered && i > 0) {\r\n\t\t\t\t\tcount++;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tseries.depthIndex = count - 1;\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tlet s: number = 0;\r\n\r\n\t\t$iter.each(this.series.iterator(), (series) => {\r\n\t\t\tif (series instanceof ColumnSeries3D) {\r\n\r\n\t\t\t\tseries.depth = this.depth / (count );\r\n\t\t\t\tseries.angle = this.angle;\r\n\t\t\t\tseries.dx = this.depth / (count) * $math.cos(this.angle) * (series.depthIndex);\r\n\t\t\t\tseries.dy = -this.depth / (count) * $math.sin(this.angle) * (series.depthIndex);\r\n\r\n\t\t\t\tlet i: number = 1;\r\n\t\t\t\tseries.columns.each((column) => {\r\n\t\t\t\t\tcolumn.zIndex = 1000 * i + s - series.depthIndex * 100;\r\n\t\t\t\t\ti++;\r\n\t\t\t\t});\r\n\r\n\t\t\t\ts++;\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis.maskColumns();\r\n\t}\r\n\r\n\t/**\r\n\t * Processes JSON-based config before it is applied to the object.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param config Config\r\n\t */\r\n\tpublic processConfig(config?: { [index: string]: any }): void {\r\n\r\n\t\tif (config) {\r\n\r\n\t\t\t// Set up series\r\n\t\t\tif ($type.hasValue(config.series) && $type.isArray(config.series)) {\r\n\t\t\t\tfor (let i = 0, len = config.series.length; i < len; i++) {\r\n\t\t\t\t\tconfig.series[i].type = config.series[i].type || \"ColumnSeries3D\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tsuper.processConfig(config);\r\n\r\n\t}\r\n\r\n\tprotected maskColumns() {\r\n\t\tlet w: number = this.plotContainer.pixelWidth;\r\n\t\tlet h: number = this.plotContainer.pixelHeight;\r\n\r\n\t\tlet dx: number = this.dx3D;\r\n\t\tlet dy: number = this.dy3D;\r\n\r\n\t\tlet path = $path.moveTo({ x: 0, y: 0 }) + $path.lineTo({ x: dx, y: dy }) + $path.lineTo({ x: w + dx, y: dy }) + $path.lineTo({ x: w + dx, y: h + dy }) + $path.lineTo({ x: w, y: h }) + $path.lineTo({ x: w, y: h }) + $path.lineTo({ x: 0, y: h }) + $path.closePath();\r\n\r\n\t\tlet columnsContainer = this.columnsContainer;\r\n\t\tif (columnsContainer && columnsContainer.mask) {\r\n\t\t\tcolumnsContainer.mask.path = path;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"XYChart3D\"] = XYChart3D;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/types/XYChart3D.ts","/**\r\n * Module that defines everything related to building Candlesticks.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Column, IColumnProperties, IColumnAdapters, IColumnEvents } from \"./Column\";\r\nimport { Line } from \"../../core/elements/Line\";\r\nimport { registry } from \"../../core/Registry\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[Candlestick]].\r\n */\r\nexport interface ICandlestickProperties extends IColumnProperties { }\r\n\r\n/**\r\n * Defines events for [[Candlestick]].\r\n */\r\nexport interface ICandlestickEvents extends IColumnEvents { }\r\n\r\n/**\r\n * Defines adapters for [[Candlestick]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface ICandlestickAdapters extends IColumnAdapters, ICandlestickProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Class used to creates Candlesticks.\r\n *\r\n * @see {@link ICandlestickEvents} for a list of available events\r\n * @see {@link ICandlestickAdapters} for a list of available Adapters\r\n * @todo Usage example\r\n * @important\r\n */\r\nexport class Candlestick extends Column {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: ICandlestickProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: ICandlestickAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: ICandlestickEvents;\r\n\r\n\t/**\r\n\t * Low line element\r\n\t */\r\n\tpublic lowLine: Line;\r\n\r\n\t/**\r\n\t * High line element\r\n\t */\r\n\tpublic highLine: Line;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"Candlestick\";\r\n\t\tthis.layout = \"none\";\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tprotected createAssets() {\r\n\t\tsuper.createAssets();\r\n\r\n\t\tthis.lowLine = this.createChild(Line);\r\n\t\tthis.lowLine.shouldClone = false;\r\n\r\n\t\tthis.highLine = this.createChild(Line);\r\n\t\tthis.highLine.shouldClone = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Copies all parameters from another [[Candlestick]].\r\n\t *\r\n\t * @param source Source Candlestick\r\n\t */\r\n\tpublic copyFrom(source: this) {\r\n\t\tsuper.copyFrom(source)\r\n\t\tif (this.lowLine) {\r\n\t\t\tthis.lowLine.copyFrom(source.lowLine);\r\n\t\t}\r\n\t\tif (this.highLine) {\r\n\t\t\tthis.highLine.copyFrom(source.highLine);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"Candlestick\"] = Candlestick;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/elements/Candlestick.ts","/**\r\n * Candlestick Series module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { ColumnSeries, ColumnSeriesDataItem, IColumnSeriesDataFields, IColumnSeriesProperties, IColumnSeriesAdapters, IColumnSeriesEvents } from \"./ColumnSeries\";\r\nimport { visualProperties } from \"../../core/Sprite\";\r\nimport { Line } from \"../../core/elements/Line\";\r\nimport { Container } from \"../../core/Container\";\r\nimport { Candlestick } from \"../elements/Candlestick\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { InterfaceColorSet } from \"../../core/utils/InterfaceColorSet\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport * as $object from \"../../core/utils/Object\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport { LegendDataItem } from \"../../charts/Legend\";\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[CandlestickSeries]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class CandlestickSeriesDataItem extends ColumnSeriesDataItem {\r\n\r\n\t/**\r\n\t * A sprite used to draw the column.\r\n\t */\r\n\tpublic _column: Candlestick;\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for\r\n\t * @todo Disabled to work around TS bug (see if we can re-enable it again)\r\n\t */\r\n\t//public _component!: CandlestickSeries;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\r\n\t\tthis.values.lowValueX = {};\r\n\t\tthis.values.lowValueY = {};\r\n\t\tthis.values.highValueX = {};\r\n\t\tthis.values.highValueY = {};\r\n\r\n\t\tthis.className = \"CandlestickSeriesDataItem\";\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Low value for horizontal axis.\r\n\t *\r\n\t * @param value Value\r\n\t */\r\n\tpublic set lowValueX(value: number) {\r\n\t\tthis.setValue(\"lowValueX\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Value\r\n\t */\r\n\tpublic get lowValueX(): number {\r\n\t\treturn this.values.lowValueX.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Low value for vertical axis.\r\n\t *\r\n\t * @param value Value\r\n\t */\r\n\tpublic set lowValueY(value: number) {\r\n\t\tthis.setValue(\"lowValueY\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Value\r\n\t */\r\n\tpublic get lowValueY(): number {\r\n\t\treturn this.values.lowValueY.value;\r\n\t}\r\n\r\n\t/**\r\n\t * High value for horizontal axis.\r\n\t *\r\n\t * @param value Value\r\n\t */\r\n\tpublic set highValueX(value: number) {\r\n\t\tthis.setValue(\"highValueX\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Value\r\n\t */\r\n\tpublic get highValueX(): number {\r\n\t\treturn this.values.highValueX.value;\r\n\t}\r\n\r\n\t/**\r\n\t * High value for vertical axis.\r\n\t *\r\n\t * @param value Value\r\n\t */\r\n\tpublic set highValueY(value: number) {\r\n\t\tthis.setValue(\"highValueY\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Value\r\n\t */\r\n\tpublic get highValueY(): number {\r\n\t\treturn this.values.highValueY.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Close value for horizontal axis.\r\n\t *\r\n\t * This is an alias for `valueX` added for convenience only.\r\n\t *\r\n\t * @param value Value\r\n\t */\r\n\tpublic set closeValueX(value: number) {\r\n\t\tthis.setValue(\"valueX\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Value\r\n\t */\r\n\tpublic get closeValueX(): number {\r\n\t\treturn this.values.valueX.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Close value for vertical axis.\r\n\t *\r\n\t * This is an alias for `valueX` added for convenience only.\r\n\t *\r\n\t * @param value Value\r\n\t */\r\n\tpublic set closeValueY(value: number) {\r\n\t\tthis.setValue(\"valueY\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Value\r\n\t */\r\n\tpublic get closeValueY(): number {\r\n\t\treturn this.values.valueY.value;\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[CandlestickSeries]].\r\n */\r\nexport interface ICandlestickSeriesDataFields extends IColumnSeriesDataFields {\r\n\r\n\t/**\r\n\t * Field name in data which holds low numeric value for horizontal axis.\r\n\t */\r\n\tlowValueX?: string;\r\n\r\n\t/**\r\n\t * Field name in data which holds low numeric value for vertical axis.\r\n\t */\r\n\tlowValueY?: string;\r\n\r\n\t/**\r\n\t * Field name in data which holds high numeric value for horizontal axis.\r\n\t */\r\n\thighValueX?: string;\r\n\r\n\t/**\r\n\t * Field name in data which holds low numeric value for vertical axis.\r\n\t */\r\n\thighValueY?: string;\r\n\r\n\t/**\r\n\t * Field name in data which holds low date for horizontal axis.\r\n\t */\r\n\tlowDateX?: string;\r\n\r\n\t/**\r\n\t * Field name in data which holds low date for vertical axis.\r\n\t */\r\n\tlowDateY?: string;\r\n\r\n\t/**\r\n\t * Field name in data which holds high date for horizontal axis.\r\n\t */\r\n\thighDateX?: string;\r\n\r\n\t/**\r\n\t * Field name in data which holds high date for vertical axis.\r\n\t */\r\n\thighDateY?: string;\r\n\r\n}\r\n\r\n/**\r\n * Defines properties for [[CandlestickSeries]].\r\n */\r\nexport interface ICandlestickSeriesProperties extends IColumnSeriesProperties { }\r\n\r\n/**\r\n * Defines events for [[CandlestickSeries]].\r\n */\r\nexport interface ICandlestickSeriesEvents extends IColumnSeriesEvents { }\r\n\r\n/**\r\n * Defines adapters for [[CandlestickSeries]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface ICandlestickSeriesAdapters extends IColumnSeriesAdapters, ICandlestickSeriesProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines [[Series]] for a candlestick graph.\r\n *\r\n * @see {@link ICandlestickSeriesEvents} for a list of available Events\r\n * @see {@link ICandlestickSeriesAdapters} for a list of available Adapters\r\n * @todo Example\r\n * @important\r\n */\r\nexport class CandlestickSeries extends ColumnSeries {\r\n\r\n\t/**\r\n\t * Defines the type of data item.\r\n\t */\r\n\tpublic _dataItem: CandlestickSeriesDataItem;\r\n\r\n\r\n\t/**\r\n\t */\r\n\tpublic _column: Candlestick;\r\n\r\n\t/**\r\n\t * Defines available data fields.\r\n\t */\r\n\tpublic _dataFields: ICandlestickSeriesDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: ICandlestickSeriesProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: ICandlestickSeriesAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: ICandlestickSeriesEvents;\r\n\r\n\t/**\r\n\t * A data field to look for \"low\" value for horizontal axis.\r\n\t */\r\n\tprotected _xLowField: $type.Keyof;\r\n\r\n\t/**\r\n\t * A data field to look for \"low\" value for vertical axis.\r\n\t */\r\n\tprotected _yLowField: $type.Keyof;\r\n\r\n\t/**\r\n\t * A data field to look for \"high\" value for horizontal axis.\r\n\t */\r\n\tprotected _xHighField: $type.Keyof;\r\n\r\n\t/**\r\n\t * A data field to look for \"high\" value for vertical axis.\r\n\t */\r\n\tprotected _yHighField: $type.Keyof;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"CandlestickSeries\";\r\n\r\n\t\tthis.strokeOpacity = 1;\r\n\r\n\t\tlet interfaceColors = new InterfaceColorSet();\r\n\t\tlet positiveColor = interfaceColors.getFor(\"positive\");\r\n\t\tlet negativeColor = interfaceColors.getFor(\"negative\");\r\n\r\n\t\tthis.dropFromOpenState.properties.fill = negativeColor;\r\n\t\tthis.dropFromOpenState.properties.stroke = negativeColor;\r\n\r\n\t\tthis.riseFromOpenState.properties.fill = positiveColor;\r\n\t\tthis.riseFromOpenState.properties.stroke = positiveColor;\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Sets defaults that instantiate some objects that rely on parent, so they\r\n\t * cannot be set in constructor.\r\n\t */\r\n\tprotected applyInternalDefaults(): void {\r\n\t\tsuper.applyInternalDefaults();\r\n\t\tif (!$type.hasValue(this.readerTitle)) {\r\n\t\t\tthis.readerTitle = this.language.translate(\"Candlestick Series\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty DataItem of the type appropriate for this object.\r\n\t *\r\n\t * @see {@link DataItem}\r\n\t * @return Data Item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new CandlestickSeriesDataItem();\r\n\t}\r\n\r\n\t/**\r\n\t * Validates data item's element, effectively redrawing it.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic validateDataElementReal(dataItem: this[\"_dataItem\"]): void {\r\n\t\tsuper.validateDataElementReal(dataItem);\r\n\t\tthis.validateCandlestick(dataItem);\r\n\t}\r\n\r\n\tprotected validateCandlestick(dataItem: this[\"dataItem\"]) {\r\n\t\tlet column: Candlestick = dataItem.column;\r\n\t\tif (column) {\r\n\t\t\tlet lowLine = column.lowLine;\r\n\t\t\tlet highLine = column.highLine;\r\n\r\n\t\t\tif (this.baseAxis == this.xAxis) {\r\n\t\t\t\tlet x: number = column.pixelWidth / 2;\r\n\r\n\t\t\t\tlowLine.x = x;\r\n\t\t\t\thighLine.x = x;\r\n\r\n\t\t\t\tlet open = dataItem.getWorkingValue(this.yOpenField);\r\n\t\t\t\tlet close = dataItem.getWorkingValue(this.yField);\r\n\r\n\t\t\t\tlet yOpen = this.yAxis.getY(dataItem, this.yOpenField);\r\n\t\t\t\tlet yClose = this.yAxis.getY(dataItem, this.yField);\r\n\t\t\t\tlet yLow = this.yAxis.getY(dataItem, this.yLowField);\r\n\t\t\t\tlet yHigh = this.yAxis.getY(dataItem, this.yHighField);\r\n\r\n\t\t\t\tlet pixelY = column.pixelY;\r\n\r\n\t\t\t\tlowLine.y1 = yLow - pixelY;\r\n\t\t\t\thighLine.y1 = yHigh - pixelY;\r\n\r\n\t\t\t\tif (open < close) {\r\n\t\t\t\t\tlowLine.y2 = yOpen - pixelY;\r\n\t\t\t\t\thighLine.y2 = yClose - pixelY;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tlowLine.y2 = yClose - pixelY;\r\n\t\t\t\t\thighLine.y2 = yOpen - pixelY;\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t\tif (this.baseAxis == this.yAxis) {\r\n\t\t\t\tlet y: number = column.pixelHeight / 2;\r\n\r\n\t\t\t\tlowLine.y = y;\r\n\t\t\t\thighLine.y = y;\r\n\r\n\t\t\t\tlet open = dataItem.getWorkingValue(this.xOpenField);\r\n\t\t\t\tlet close = dataItem.getWorkingValue(this.xField);\r\n\r\n\t\t\t\tlet xOpen = this.xAxis.getX(dataItem, this.xOpenField);\r\n\t\t\t\tlet xClose = this.xAxis.getX(dataItem, this.xField);\r\n\t\t\t\tlet xLow = this.xAxis.getX(dataItem, this.xLowField);\r\n\t\t\t\tlet xHigh = this.xAxis.getX(dataItem, this.xHighField);\r\n\r\n\t\t\t\tlet pixelX = column.pixelX;\r\n\r\n\t\t\t\tlowLine.x1 = xLow - pixelX;\r\n\t\t\t\thighLine.x1 = xHigh - pixelX;\r\n\r\n\t\t\t\tif (open < close) {\r\n\t\t\t\t\tlowLine.x2 = xOpen - pixelX;\r\n\t\t\t\t\thighLine.x2 = xClose - pixelX;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tlowLine.x2 = xClose - pixelX;\r\n\t\t\t\t\thighLine.x2 = xOpen - pixelX;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t$iter.each(this.axisRanges.iterator(), (axisRange) => {\r\n\t\t\t\t// LOW LINE\r\n\t\t\t\tlet rangeColumn = dataItem.rangesColumns.getKey(axisRange.uid);\r\n\t\t\t\tif (rangeColumn) {\r\n\t\t\t\t\tlet rangeLowLine = rangeColumn.lowLine;\r\n\t\t\t\t\trangeLowLine.x = lowLine.x;\r\n\t\t\t\t\trangeLowLine.y = lowLine.y;\r\n\t\t\t\t\trangeLowLine.x1 = lowLine.x1;\r\n\t\t\t\t\trangeLowLine.x2 = lowLine.x2;\r\n\t\t\t\t\trangeLowLine.y1 = lowLine.y1;\r\n\t\t\t\t\trangeLowLine.y2 = lowLine.y2;\r\n\r\n\t\t\t\t\t// HIGH LINE\r\n\t\t\t\t\tlet rangehighLine = rangeColumn.highLine;\r\n\t\t\t\t\trangehighLine.x = highLine.x;\r\n\t\t\t\t\trangehighLine.y = highLine.y;\r\n\t\t\t\t\trangehighLine.x1 = highLine.x1;\r\n\t\t\t\t\trangehighLine.x2 = highLine.x2;\r\n\t\t\t\t\trangehighLine.y1 = highLine.y1;\r\n\t\t\t\t\trangehighLine.y2 = highLine.y2;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * A data field to look for \"low\" value for horizontal axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @return Field name\r\n\t */\r\n\tpublic get xLowField(): string {\r\n\t\treturn this._xLowField;\r\n\t}\r\n\r\n\t/**\r\n\t * A data field to look for \"low\" value for vertical axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @return Field name\r\n\t */\r\n\tpublic get yLowField(): string {\r\n\t\treturn this._yLowField;\r\n\t}\r\n\r\n\t/**\r\n\t * A data field to look for \"high\" value for horizontal axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @return Field name\r\n\t */\r\n\tpublic get xHighField(): string {\r\n\t\treturn this._xHighField;\r\n\t}\r\n\r\n\t/**\r\n\t * A data field to look for \"high\" value for vertical axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @return Field name\r\n\t */\r\n\tpublic get yHighField(): string {\r\n\t\treturn this._yHighField;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets up which data fields to use for data access.\r\n\t */\r\n\tprotected defineFields() {\r\n\t\tsuper.defineFields();\r\n\r\n\t\tif (this.baseAxis == this.xAxis) {\r\n\t\t\tlet yAxisFieldName: string = $utils.capitalize(this.yAxis.axisFieldName);\r\n\t\t\tthis._yLowField = <$type.Keyof>(\"low\" + yAxisFieldName + \"Y\");\r\n\t\t\tthis._yHighField = <$type.Keyof>(\"high\" + yAxisFieldName + \"Y\");\r\n\t\t}\r\n\r\n\t\tif (this.baseAxis == this.yAxis) {\r\n\t\t\tlet xAxisFieldName: string = $utils.capitalize(this.xAxis.axisFieldName);\r\n\t\t\tthis._xLowField = <$type.Keyof>(\"low\" + xAxisFieldName + \"X\");\r\n\t\t\tthis._xHighField = <$type.Keyof>(\"high\" + xAxisFieldName + \"X\");\r\n\t\t}\r\n\r\n\t\tthis.addValueField(this.xAxis, this._xValueFields, this._xLowField);\r\n\t\tthis.addValueField(this.xAxis, this._xValueFields, this._xHighField);\r\n\r\n\t\tthis.addValueField(this.yAxis, this._yValueFields, this._yLowField);\r\n\t\tthis.addValueField(this.yAxis, this._yValueFields, this._yHighField);\r\n\t}\r\n\r\n\t/**\r\n\t * Creates elements in related legend container, that mimics the look of this\r\n\t * Series.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param marker Legend item container\r\n\t */\r\n\tpublic createLegendMarker(marker: Container): void {\r\n\r\n\t\tlet w: number = marker.pixelWidth;\r\n\t\tlet h: number = marker.pixelHeight;\r\n\r\n\t\tmarker.removeChildren();\r\n\r\n\t\tlet column: Candlestick = marker.createChild(Candlestick);\r\n\t\tcolumn.shouldClone = false;\r\n\t\tcolumn.copyFrom(this.columns.template);\r\n\r\n\t\tlet cw: number;\r\n\t\tlet ch: number;\r\n\r\n\t\tlet highLine: Line = column.lowLine;\r\n\t\tlet lowLine: Line = column.highLine;\r\n\r\n\t\tif (this.baseAxis == this.yAxis) {\r\n\t\t\tcw = w / 3;\r\n\t\t\tch = h;\r\n\r\n\t\t\thighLine.y = h / 2;\r\n\t\t\tlowLine.y = h / 2;\r\n\r\n\t\t\thighLine.x2 = w / 3;\r\n\t\t\tlowLine.x2 = w / 3;\r\n\t\t\tlowLine.x = w / 3 * 2;\r\n\t\t\tcolumn.column.x = w / 3;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tcw = w;\r\n\t\t\tch = h / 3;\r\n\t\t\thighLine.x = w / 2;\r\n\t\t\tlowLine.x = w / 2;\r\n\r\n\t\t\thighLine.y2 = h / 3;\r\n\t\t\tlowLine.y2 = h / 3;\r\n\t\t\tlowLine.y = h / 3 * 2;\r\n\t\t\tcolumn.column.y = h / 3;\r\n\t\t}\r\n\t\tcolumn.width = cw;\r\n\t\tcolumn.height = ch;\r\n\r\n\t\t$object.copyProperties(this, marker, visualProperties);\r\n\t\t$object.copyProperties(this.columns.template, column, visualProperties);\r\n\r\n\t\tcolumn.stroke = this.riseFromOpenState.properties.stroke;\r\n\t\tcolumn.fill = column.stroke;\r\n\r\n\t\tlet legendDataItem = marker.dataItem;\r\n\t\tlegendDataItem.color = column.fill;\r\n\t\tlegendDataItem.colorOrig = column.fill;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an element to use for Candlestick\r\n\t * @ignore\r\n\t * @return Element.\r\n\t */\r\n\tprotected createColumnTemplate(): this[\"_column\"] {\r\n\t\treturn new Candlestick();\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"CandlestickSeries\"] = CandlestickSeries;\r\nregistry.registeredClasses[\"CandlestickSeriesDataItem\"] = CandlestickSeriesDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/CandlestickSeries.ts","/**\r\n * Module that defines everything related to building OHLCs.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Candlestick, ICandlestickProperties, ICandlestickAdapters, ICandlestickEvents } from \"./Candlestick\";\r\nimport { Line } from \"../../core/elements/Line\";\r\nimport { registry } from \"../../core/Registry\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[OHLC]].\r\n */\r\nexport interface IOHLCProperties extends ICandlestickProperties { }\r\n\r\n/**\r\n * Defines events for [[OHLC]].\r\n */\r\nexport interface IOHLCEvents extends ICandlestickEvents { }\r\n\r\n/**\r\n * Defines adapters for [[OHLC]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IOHLCAdapters extends ICandlestickAdapters, IOHLCProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Class used to creates OHLCs.\r\n *\r\n * @see {@link IOHLCEvents} for a list of available events\r\n * @see {@link IOHLCAdapters} for a list of available Adapters\r\n * @todo Usage example\r\n * @important\r\n */\r\nexport class OHLC extends Candlestick {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IOHLCProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IOHLCAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IOHLCEvents;\r\n\r\n\r\n\t/**\r\n\t * Open line element\r\n\t */\r\n\tpublic openLine: Line;\r\n\r\n\t/**\r\n\t * Close line element\r\n\t */\r\n\tpublic closeLine: Line;\r\n\r\n\t/**\r\n\t * High-low line element\r\n\t */\r\n\tpublic highLowLine: Line;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"OHLC\";\r\n\t\tthis.layout = \"none\";\r\n\t}\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tprotected createAssets() {\r\n\t\t//super.createAssets();\r\n\r\n\t\tthis.openLine = this.createChild(Line);\r\n\t\tthis.openLine.shouldClone = false;\r\n\r\n\t\tthis.highLowLine = this.createChild(Line);\r\n\t\tthis.highLowLine.shouldClone = false;\r\n\r\n\t\tthis.closeLine = this.createChild(Line);\r\n\t\tthis.closeLine.shouldClone = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Copies all parameters from another [[OHLC]].\r\n\t *\r\n\t * @param source Source OHLC\r\n\t */\r\n\tpublic copyFrom(source: this) {\r\n\t\tsuper.copyFrom(source)\r\n\t\tif (this.openLine) {\r\n\t\t\tthis.openLine.copyFrom(source.openLine);\r\n\t\t}\r\n\t\tif (this.highLowLine) {\r\n\t\t\tthis.highLowLine.copyFrom(source.highLowLine);\r\n\t\t}\r\n\t\tif (this.closeLine) {\r\n\t\t\tthis.closeLine.copyFrom(source.closeLine);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"OHLC\"] = OHLC;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/elements/OHLC.ts","/**\r\n * Candlestick Series module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { CandlestickSeries, CandlestickSeriesDataItem, ICandlestickSeriesDataFields, ICandlestickSeriesProperties, ICandlestickSeriesAdapters, ICandlestickSeriesEvents } from \"./CandlestickSeries\";\r\nimport { visualProperties } from \"../../core/Sprite\";\r\nimport { Line } from \"../../core/elements/Line\";\r\nimport { Container } from \"../../core/Container\";\r\nimport { OHLC } from \"../elements/OHLC\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $object from \"../../core/utils/Object\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport { LegendDataItem } from \"../../charts/Legend\";\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[OHLCSeries]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class OHLCSeriesDataItem extends CandlestickSeriesDataItem {\r\n\r\n\t/**\r\n\t * A sprite used to draw the OHLC elements.\r\n\t */\r\n\tpublic _column: OHLC;\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for\r\n\t * @todo Disabled to work around TS bug (see if we can re-enable it again)\r\n\t */\r\n\t//public _component!: OHLCSeries;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\r\n\t\tthis.className = \"OHLCSeriesDataItem\";\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[OHLCSeries]].\r\n */\r\nexport interface IOHLCSeriesDataFields extends ICandlestickSeriesDataFields { }\r\n\r\n/**\r\n * Defines properties for [[OHLCSeries]].\r\n */\r\nexport interface IOHLCSeriesProperties extends ICandlestickSeriesProperties { }\r\n\r\n/**\r\n * Defines events for [[OHLCSeries]].\r\n */\r\nexport interface IOHLCSeriesEvents extends ICandlestickSeriesEvents { }\r\n\r\n/**\r\n * Defines adapters for [[OHLCSeries]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IOHLCSeriesAdapters extends ICandlestickSeriesAdapters, IOHLCSeriesProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines [[Series]] for a candlestick graph.\r\n *\r\n * @see {@link IOHLCSeriesEvents} for a list of available Events\r\n * @see {@link IOHLCSeriesAdapters} for a list of available Adapters\r\n * @todo Example\r\n * @important\r\n */\r\nexport class OHLCSeries extends CandlestickSeries {\r\n\r\n\t/**\r\n\t * Defines the type of data item.\r\n\t */\r\n\tpublic _dataItem: OHLCSeriesDataItem;\r\n\r\n\r\n\t/**\r\n\t */\r\n\tpublic _column: OHLC;\r\n\r\n\t/**\r\n\t * Defines available data fields.\r\n\t */\r\n\tpublic _dataFields: IOHLCSeriesDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IOHLCSeriesProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IOHLCSeriesAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IOHLCSeriesEvents;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"OHLCSeries\";\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Sets defaults that instantiate some objects that rely on parent, so they\r\n\t * cannot be set in constructor.\r\n\t */\r\n\tprotected applyInternalDefaults(): void {\r\n\t\tsuper.applyInternalDefaults();\r\n\t\tif (!$type.hasValue(this.readerTitle)) {\r\n\t\t\tthis.readerTitle = this.language.translate(\"OHLC Series\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty DataItem of the type appropriate for this object.\r\n\t *\r\n\t * @see {@link DataItem}\r\n\t * @return Data Item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new OHLCSeriesDataItem();\r\n\t}\r\n\r\n\r\n\tprotected validateCandlestick(dataItem: this[\"_dataItem\"]) {\r\n\t\tlet column: OHLC = dataItem.column;\r\n\t\tif (column) {\r\n\t\t\tlet openLine = column.openLine;\r\n\t\t\tlet highLowLine = column.highLowLine;\r\n\t\t\tlet closeLine = column.closeLine;\r\n\r\n\t\t\tif (this.baseAxis == this.xAxis) {\r\n\t\t\t\tlet x: number = column.pixelWidth / 2;\r\n\t\t\t\thighLowLine.x = x;\r\n\r\n\t\t\t\t// TODO can these be removed ?\r\n\t\t\t\tdataItem.getWorkingValue(this.yOpenField);\r\n\t\t\t\tdataItem.getWorkingValue(this.yField);\r\n\r\n\t\t\t\tlet yOpen = this.yAxis.getY(dataItem, this.yOpenField);\r\n\t\t\t\tlet yClose = this.yAxis.getY(dataItem, this.yField);\r\n\t\t\t\tlet yLow = this.yAxis.getY(dataItem, this.yLowField);\r\n\t\t\t\tlet yHigh = this.yAxis.getY(dataItem, this.yHighField);\r\n\r\n\t\t\t\tlet pixelY = column.pixelY;\r\n\r\n\t\t\t\topenLine.y1 = yOpen - pixelY;\r\n\t\t\t\topenLine.y2 = yOpen - pixelY;\r\n\t\t\t\topenLine.x1 = 0;\r\n\t\t\t\topenLine.x2 = x;\r\n\r\n\t\t\t\tcloseLine.y1 = yClose - pixelY;\r\n\t\t\t\tcloseLine.y2 = yClose - pixelY;\r\n\t\t\t\tcloseLine.x1 = x;\r\n\t\t\t\tcloseLine.x2 = 2 * x;\r\n\r\n\t\t\t\thighLowLine.y1 = yHigh - pixelY;\r\n\t\t\t\thighLowLine.y2 = yLow - pixelY;\r\n\r\n\t\t\t}\r\n\t\t\tif (this.baseAxis == this.yAxis) {\r\n\t\t\t\tlet y: number = column.pixelHeight / 2;\r\n\r\n\t\t\t\thighLowLine.y = y;\r\n\r\n\t\t\t\t// TODO can these be removed ?\r\n\t\t\t\tdataItem.getWorkingValue(this.xOpenField);\r\n\t\t\t\tdataItem.getWorkingValue(this.xField);\r\n\r\n\t\t\t\tlet xOpen = this.xAxis.getX(dataItem, this.xOpenField);\r\n\t\t\t\tlet xClose = this.xAxis.getX(dataItem, this.xField);\r\n\t\t\t\tlet xLow = this.xAxis.getX(dataItem, this.xLowField);\r\n\t\t\t\tlet xHigh = this.xAxis.getX(dataItem, this.xHighField);\r\n\r\n\t\t\t\tlet pixelX = column.pixelX;\r\n\r\n\t\t\t\topenLine.x1 = xOpen - pixelX;\r\n\t\t\t\topenLine.x2 = xOpen - pixelX;\r\n\t\t\t\topenLine.y1 = y;\r\n\t\t\t\topenLine.y2 = 2 * y;\r\n\r\n\t\t\t\tcloseLine.x1 = xClose - pixelX;\r\n\t\t\t\tcloseLine.x2 = xClose - pixelX;\r\n\t\t\t\tcloseLine.y1 = 0;\r\n\t\t\t\tcloseLine.y2 = y;\r\n\r\n\t\t\t\thighLowLine.x1 = xHigh - pixelX;\r\n\t\t\t\thighLowLine.x2 = xLow - pixelX;\r\n\t\t\t}\r\n\r\n\t\t\t$iter.each(this.axisRanges.iterator(), (axisRange) => {\r\n\r\n\t\t\t\tlet rangeColumn = dataItem.rangesColumns.getKey(axisRange.uid);\r\n\t\t\t\tif (rangeColumn) {\r\n\t\t\t\t\tlet rangeOpenLine = rangeColumn.openLine;\r\n\t\t\t\t\trangeOpenLine.x = openLine.x;\r\n\t\t\t\t\trangeOpenLine.y = openLine.y;\r\n\t\t\t\t\trangeOpenLine.x1 = openLine.x1;\r\n\t\t\t\t\trangeOpenLine.x2 = openLine.x2;\r\n\t\t\t\t\trangeOpenLine.y1 = openLine.y1;\r\n\t\t\t\t\trangeOpenLine.y2 = openLine.y2;\r\n\r\n\t\t\t\t\tlet rangeCloseLine = rangeColumn.closeLine;\r\n\t\t\t\t\trangeCloseLine.x = closeLine.x;\r\n\t\t\t\t\trangeCloseLine.y = closeLine.y;\r\n\t\t\t\t\trangeCloseLine.x1 = closeLine.x1;\r\n\t\t\t\t\trangeCloseLine.x2 = closeLine.x2;\r\n\t\t\t\t\trangeCloseLine.y1 = closeLine.y1;\r\n\t\t\t\t\trangeCloseLine.y2 = closeLine.y2;\r\n\r\n\t\t\t\t\tlet rangeHighLowLine = rangeColumn.highLowLine;\r\n\t\t\t\t\trangeHighLowLine.x = highLowLine.x;\r\n\t\t\t\t\trangeHighLowLine.y = highLowLine.y;\r\n\t\t\t\t\trangeHighLowLine.x1 = highLowLine.x1;\r\n\t\t\t\t\trangeHighLowLine.x2 = highLowLine.x2;\r\n\t\t\t\t\trangeHighLowLine.y1 = highLowLine.y1;\r\n\t\t\t\t\trangeHighLowLine.y2 = highLowLine.y2;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Creates elements in related legend container, that mimics the look of this\r\n\t * Series.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param marker Legend item container\r\n\t */\r\n\tpublic createLegendMarker(marker: Container): void {\r\n\r\n\t\tlet w: number = marker.pixelWidth;\r\n\t\tlet h: number = marker.pixelHeight;\r\n\r\n\t\tmarker.removeChildren();\r\n\r\n\t\tlet column: OHLC = marker.createChild(OHLC);\r\n\t\tcolumn.shouldClone = false;\r\n\t\tcolumn.copyFrom(this.columns.template);\r\n\r\n\t\tlet cw: number;\r\n\t\tlet ch: number;\r\n\r\n\t\tlet openLine: Line = column.openLine;\r\n\t\tlet closeLine: Line = column.closeLine;\r\n\t\tlet highLowLine: Line = column.highLowLine;\r\n\r\n\t\tif (this.baseAxis == this.yAxis) {\r\n\t\t\tcw = w / 3;\r\n\t\t\tch = h;\r\n\r\n\t\t\thighLowLine.y = h / 2;\r\n\t\t\thighLowLine.x2 = w;\r\n\r\n\t\t\topenLine.x = w / 3 * 2;\r\n\t\t\topenLine.y2 = h / 2;\r\n\r\n\t\t\tcloseLine.x = w / 3;\r\n\t\t\tcloseLine.y2 = h;\r\n\t\t\tcloseLine.y1 = h / 2;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tcw = w;\r\n\t\t\tch = h / 3;\r\n\r\n\t\t\thighLowLine.x = w / 2;\r\n\t\t\thighLowLine.y2 = h;\r\n\r\n\t\t\topenLine.y = h / 3 * 2;\r\n\t\t\topenLine.x2 = w / 2;\r\n\r\n\t\t\tcloseLine.y = h / 3;\r\n\t\t\tcloseLine.x2 = w;\r\n\t\t\tcloseLine.x1 = w / 2;\r\n\t\t}\r\n\t\tcolumn.width = cw;\r\n\t\tcolumn.height = ch;\r\n\r\n\t\t$object.copyProperties(this, marker, visualProperties);\r\n\t\t$object.copyProperties(this.columns.template, column, visualProperties);\r\n\r\n\t\tcolumn.stroke = this.riseFromOpenState.properties.stroke;\r\n\r\n\t\tlet legendDataItem = marker.dataItem;\r\n\t\tlegendDataItem.color = column.stroke;\r\n\t\tlegendDataItem.colorOrig = column.stroke;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an element to use for Candlestick\r\n\t * @ignore\r\n\t * @return Element.\r\n\t */\r\n\tprotected createColumnTemplate(): this[\"_column\"] {\r\n\t\treturn new OHLC();\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"OHLCSeries\"] = OHLCSeries;\r\nregistry.registeredClasses[\"OHLCSeriesDataItem\"] = OHLCSeriesDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/OHLCSeries.ts","/**\r\n * Line series segment module.\r\n * @todo Add description about what this is\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { ILineSeriesSegmentAdapters, ILineSeriesSegmentEvents, ILineSeriesSegmentProperties, LineSeriesSegment } from \"./LineSeriesSegment\";\r\nimport { Sprite } from \"../../core/Sprite\";\r\nimport { IPoint } from \"../../core/defs/IPoint\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[StepLineSeriesSegment]].\r\n */\r\nexport interface IStepLineSeriesSegmentProperties extends ILineSeriesSegmentProperties { }\r\n\r\n/**\r\n * Defines events for [[StepLineSeriesSegment]].\r\n */\r\nexport interface IStepLineSeriesSegmentEvents extends ILineSeriesSegmentEvents { }\r\n\r\n/**\r\n * Defines adapters for [[StepLineSeriesSegment]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IStepLineSeriesSegmentAdapters extends ILineSeriesSegmentAdapters, IStepLineSeriesSegmentProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Represents a line series segment.\r\n *\r\n * A line segment can be used to apply different properties to a part of the\r\n * line series, between two data points.\r\n *\r\n * @see {@link IStepLineSeriesSegmentEvents} for a list of available events\r\n * @see {@link IStepLineSeriesSegmentAdapters} for a list of available Adapters\r\n * @todo Example\r\n */\r\nexport class StepLineSeriesSegment extends LineSeriesSegment {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IStepLineSeriesSegmentProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IStepLineSeriesSegmentAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IStepLineSeriesSegmentEvents;\r\n\r\n\t/**\r\n\t * Segment's line element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic strokeSprite: Sprite;\r\n\r\n\t/**\r\n\t * Segment's fill element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic fillSprite: Sprite;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"StepLineSeriesSegment\";\r\n\t}\r\n\r\n\t/**\r\n\t * Draws the series segment.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param points Points to connect\r\n\t * @param closePoints ?\r\n\t * @param smoothnessX Horizontal bezier setting (?)\r\n\t * @param smoothnessY Vertical bezier setting (?)\r\n\t */\r\n\tpublic drawSegment(points: IPoint[], closePoints: IPoint[], smoothnessX: number, smoothnessY: number, noRisers?: boolean, vertical?: boolean): void {\r\n\t\tif (points.length > 0 && closePoints.length > 0) {\r\n\r\n\t\t\tif (noRisers) {\r\n\t\t\t\tlet path: string = $path.moveTo(points[0]);\r\n\t\t\t\tif (points.length > 0) {\r\n\t\t\t\t\tfor (let i = 1; i < points.length; i++) {\r\n\t\t\t\t\t\tlet point = points[i];\r\n\t\t\t\t\t\tif (i / 2 == Math.round(i / 2)) {\r\n\t\t\t\t\t\t\tpath += $path.moveTo(point);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tpath += $path.lineTo(point);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.strokeSprite.path = path;\r\n\r\n\t\t\t\tif (this.fillOpacity > 0 || this.fillSprite.fillOpacity > 0) { // helps to avoid drawing fill object if fill is not visible\r\n\t\t\t\t\tpath = $path.moveTo(points[0]) + $path.polyline(points);\r\n\t\t\t\t\tpath += $path.lineTo(closePoints[0]) + $path.polyline(closePoints);\r\n\t\t\t\t\tpath += $path.lineTo(points[0]);\r\n\t\t\t\t\tpath += $path.closePath();\r\n\r\n\t\t\t\t\tthis.fillSprite.path = path;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tlet path: string = $path.moveTo(points[0]) + $path.polyline(points);\r\n\r\n\t\t\t\tthis.strokeSprite.path = path;\r\n\r\n\t\t\t\tif (this.fillOpacity > 0 || this.fillSprite.fillOpacity > 0) { // helps to avoid drawing fill object if fill is not visible\r\n\t\t\t\t\tpath += $path.lineTo(closePoints[0]) + $path.polyline(closePoints);\r\n\t\t\t\t\tpath += $path.lineTo(points[0]);\r\n\t\t\t\t\tpath += $path.closePath();\r\n\r\n\t\t\t\t\tthis.fillSprite.path = path;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"StepLineSeriesSegment\"] = StepLineSeriesSegment;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/StepLineSeriesSegment.ts","/**\r\n * Step line series module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { LineSeries, LineSeriesDataItem, ILineSeriesDataFields, ILineSeriesProperties, ILineSeriesAdapters, ILineSeriesEvents } from \"./LineSeries\";\r\nimport { StepLineSeriesSegment } from \"./StepLineSeriesSegment\";\r\nimport { IPoint } from \"../../core/defs/IPoint\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $math from \"../../core/utils/Math\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[StepLineSeries]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class StepLineSeriesDataItem extends LineSeriesDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: StepLineSeries;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"StepLineSeriesDataItem\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[StepLineSeries]].\r\n */\r\nexport interface IStepLineSeriesDataFields extends ILineSeriesDataFields { }\r\n\r\n/**\r\n * Defines properties for [[StepLineSeries]].\r\n */\r\nexport interface IStepLineSeriesProperties extends ILineSeriesProperties {\r\n\tnoRisers?: boolean;\r\n\r\n\tstartLocation?: number;\r\n\r\n\tendLocation?: number;\r\n}\r\n\r\n/**\r\n * Defines events for [[StepLineSeries]].\r\n */\r\nexport interface IStepLineSeriesEvents extends ILineSeriesEvents { }\r\n\r\n/**\r\n * Defines adapters for [[StepLineSeries]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IStepLineSeriesAdapters extends ILineSeriesAdapters, IStepLineSeriesProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines [[Series]] for a step line graph.\r\n *\r\n * @see {@link IStepLineSeriesEvents} for a list of available Events\r\n * @see {@link IStepLineSeriesAdapters} for a list of available Adapters\r\n * @todo Example\r\n * @important\r\n */\r\nexport class StepLineSeries extends LineSeries {\r\n\r\n\t/**\r\n\t * Defines the type of data fields used for the series.\r\n\t */\r\n\tpublic _dataFields: IStepLineSeriesDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IStepLineSeriesProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IStepLineSeriesAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IStepLineSeriesEvents;\r\n\r\n\t/**\r\n\t * Defines the type of data item.\r\n\t */\r\n\tpublic _dataItem: StepLineSeriesDataItem;\r\n\r\n\t/**\r\n\t */\r\n\tpublic _segment: StepLineSeriesSegment;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"StepLineSeries\";\r\n\t\tthis.applyTheme();\r\n\t\tthis.startLocation = 0;\r\n\t\tthis.endLocation = 1;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty DataItem of the type appropriate for this object.\r\n\t *\r\n\t * @see {@link DataItem}\r\n\t * @return Data Item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new StepLineSeriesDataItem();\r\n\t}\r\n\r\n\t/**\r\n\t * [addPoints description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param points [description]\r\n\t * @param dataItem [description]\r\n\t * @param xField [description]\r\n\t * @param yField [description]\r\n\t * @param backwards [description]\r\n\t */\r\n\tprotected addPoints(points: IPoint[], dataItem: this[\"_dataItem\"], xField: string, yField: string, backwards?: boolean): void {\r\n\r\n\t\tlet startLocation = this.startLocation;\r\n\t\tlet endLocation = this.endLocation;\r\n\r\n\t\tlet x0: number = this.xAxis.getX(dataItem, xField, startLocation);\r\n\t\tlet y0: number = this.yAxis.getY(dataItem, yField, startLocation);\r\n\r\n\t\tlet x1: number = this.xAxis.getX(dataItem, xField, endLocation);\r\n\t\tlet y1: number = this.yAxis.getY(dataItem, yField, endLocation);\r\n\r\n\t\tx0 = $math.fitToRange(x0, -20000, 20000); // from geometric point of view this is not right, but practically it's ok. this is done to avoid too big objects.\r\n\t\ty0 = $math.fitToRange(y0, -20000, 20000); // from geometric point of view this is not right, but practically it's ok. this is done to avoid too big objects.\r\n\r\n\t\tx1 = $math.fitToRange(x1, -20000, 20000); // from geometric point of view this is not right, but practically it's ok. this is done to avoid too big objects.\r\n\t\ty1 = $math.fitToRange(y1, -20000, 20000); // from geometric point of view this is not right, but practically it's ok. this is done to avoid too big objects.\r\n\r\n\t\t// this might make an impression that points are duplicated, and they indeed are, but this is needed to handle gaps in data\r\n\t\tif (!this.noRisers && this.connect) {\r\n\t\t\tif (points.length > 1) {\r\n\t\t\t\tlet prevPoint: IPoint = points[points.length - 1];\r\n\t\t\t\tif (this.baseAxis == this.xAxis) {\r\n\t\t\t\t\tif (backwards) {\r\n\t\t\t\t\t\tpoints.push({ x: prevPoint.x, y: y1 });\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tpoints.push({ x: x0, y: prevPoint.y });\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (this.baseAxis == this.yAxis) {\r\n\t\t\t\t\tif (backwards) {\r\n\t\t\t\t\t\tpoints.push({ x: x1, y: prevPoint.y });\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tpoints.push({ x: prevPoint.x, y: y0 });\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet point0: IPoint = { x: x0, y: y0 };\r\n\t\tlet point1: IPoint = { x: x1, y: y1 };\r\n\r\n\t\tif (backwards) {\r\n\t\t\tpoints.push(point1, point0);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tpoints.push(point0, point1);\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Draws the line segment.\r\n\t *\r\n\t * @param segment Segment\r\n\t * @param points Segment points\r\n\t * @param closePoints Segment close points\r\n\t */\r\n\tprotected drawSegment(segment: StepLineSeriesSegment, points: IPoint[], closePoints: IPoint[]): void {\r\n\t\tlet vertical = false;\r\n\t\tif (this.yAxis == this.baseAxis) {\r\n\t\t\tvertical = true;\r\n\t\t}\r\n\t\tsegment.drawSegment(points, closePoints, this.tensionX, this.tensionY, this.noRisers, vertical);\r\n\t}\r\n\r\n\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tprotected createSegment(): this[\"_segment\"] {\r\n\t\treturn new StepLineSeriesSegment();\r\n\t}\r\n\r\n\t/**\r\n\t * Specifies if step line series should draw only horizontal (or only\r\n\t * vertical, depending on base axis) lines, instead of connecting them with\r\n\t * vertical (or horizontal) lines.\r\n\t *\r\n\t * @default false\r\n\t * @param value No risers\r\n\t */\r\n\tpublic set noRisers(value: boolean) {\r\n\t\tthis.setPropertyValue(\"noRisers\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return No risers\r\n\t */\r\n\tpublic get noRisers(): boolean {\r\n\t\treturn this.getPropertyValue(\"noRisers\");\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * start location of the step\r\n\t *\r\n\t * @param value Location (0-1)\r\n\t * @default 0\r\n\t */\r\n\tpublic set startLocation(value: number) {\r\n\t\tthis.setPropertyValue(\"startLocation\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Location (0-1)\r\n\t */\r\n\tpublic get startLocation(): number {\r\n\t\treturn this.getPropertyValue(\"startLocation\");\r\n\t}\r\n\r\n\t/**\r\n\t * Step end location.\r\n\t *\r\n\t * @param value Location (0-1)\r\n\t * #default 1\r\n\t */\r\n\tpublic set endLocation(value: number) {\r\n\t\tthis.setPropertyValue(\"endLocation\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Location (0-1)\r\n\t */\r\n\tpublic get endLocation(): number {\r\n\t\treturn this.getPropertyValue(\"endLocation\");\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"StepLineSeries\"] = StepLineSeries;\r\nregistry.registeredClasses[\"StepLineSeriesDataItem\"] = StepLineSeriesDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/StepLineSeries.ts","/**\r\n * Module that defines everything related to building RadarColumns.\r\n * It is a container which has radarColumn element which is a Slice.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Column, IColumnProperties, IColumnAdapters, IColumnEvents } from \"./Column\";\r\nimport { Slice } from \"../../core/elements/Slice\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $type from \"../../core/utils/Type\";\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[RadarColumn]].\r\n */\r\nexport interface IRadarColumnProperties extends IColumnProperties { }\r\n\r\n/**\r\n * Defines events for [[RadarColumn]].\r\n */\r\nexport interface IRadarColumnEvents extends IColumnEvents { }\r\n\r\n/**\r\n * Defines adapters for [[RadarColumn]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IRadarColumnAdapters extends IColumnAdapters, IRadarColumnProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Class used to creates RadarColumns.\r\n *\r\n * @see {@link IRadarColumnEvents} for a list of available events\r\n * @see {@link IRadarColumnAdapters} for a list of available Adapters\r\n * @todo Usage example\r\n * @important\r\n */\r\nexport class RadarColumn extends Column {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IRadarColumnProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IRadarColumnAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IRadarColumnEvents;\r\n\r\n\r\n\t/**\r\n\t * Radar column element\r\n\t */\r\n\tpublic radarColumn: Slice;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"RadarColumn\";\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tprotected createAssets() {\r\n\t\tthis.radarColumn = this.createChild(Slice);\r\n\t\tthis.radarColumn.shouldClone = false;\r\n\t\tthis.radarColumn.strokeOpacity = undefined;\r\n\t\t// some dirty hack so that if user access column, it won't get error\r\n\t\tthis.column = this.radarColumn;\r\n\t}\r\n\r\n\t/**\r\n\t * Copies all parameters from another [[RadarColumn]].\r\n\t *\r\n\t * @param source Source RadarColumn\r\n\t */\r\n\tpublic copyFrom(source: this) {\r\n\t\tsuper.copyFrom(source)\r\n\t\tif (this.radarColumn) {\r\n\t\t\tthis.radarColumn.copyFrom(source.radarColumn);\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * X coordinate for the slice tooltip.\r\n\t *\r\n\t * @return X\r\n\t */\r\n\tprotected getTooltipX(): number {\r\n\t\tlet value = this.getPropertyValue(\"tooltipX\");\r\n\t\tif (!$type.isNumber(value)) {\r\n\t\t\tvalue = this.radarColumn.tooltipX;\r\n\t\t}\r\n\t\treturn value;\r\n\t}\r\n\r\n\t/**\r\n\t * Y coordinate for the slice tooltip.\r\n\t *\r\n\t * @return Y\r\n\t */\r\n\tprotected getTooltipY(): number {\r\n\t\tlet value = this.getPropertyValue(\"tooltipX\");\r\n\t\tif (!$type.isNumber(value)) {\r\n\t\t\tvalue = this.radarColumn.tooltipY;\r\n\t\t}\r\n\t\treturn value;\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"RadarColumn\"] = RadarColumn;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/elements/RadarColumn.ts","/**\r\n * Radar column series module.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { ColumnSeries, IColumnSeriesProperties, IColumnSeriesDataFields, IColumnSeriesAdapters, IColumnSeriesEvents, ColumnSeriesDataItem } from \"../series/ColumnSeries\";\r\nimport { Sprite, visualProperties } from \"../../core/Sprite\";\r\nimport { RadarChart } from \"../types/RadarChart\";\r\nimport { AxisRendererRadial } from \"../axes/AxisRendererRadial\";\r\nimport { RadarColumn } from \"../elements/RadarColumn\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $object from \"../../core/utils/Object\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\nimport * as $array from \"../../core/utils/Array\";\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[RadarColumnSeries]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class RadarColumnSeriesDataItem extends ColumnSeriesDataItem {\r\n\r\n\t/**\r\n\t * A sprite used to draw the column.\r\n\t */\r\n\tpublic _column: RadarColumn;\r\n\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: RadarColumnSeries;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"ColumnSeriesDataItem\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[RadarColumnSeries]].\r\n */\r\nexport interface IRadarColumnSeriesDataFields extends IColumnSeriesDataFields { }\r\n\r\n/**\r\n * Defines properties for [[RadarColumnSeries]].\r\n */\r\nexport interface IRadarColumnSeriesProperties extends IColumnSeriesProperties { }\r\n\r\n/**\r\n * Defines events for [[RadarColumnSeries]].\r\n */\r\nexport interface IRadarColumnSeriesEvents extends IColumnSeriesEvents { }\r\n\r\n/**\r\n * Defines adapters for [[RadarColumnSeries]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IRadarColumnSeriesAdapters extends IColumnSeriesAdapters, IRadarColumnSeriesProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines [[Series]] for a 3D column graph.\r\n *\r\n * @see {@link IRadarColumnSeriesEvents} for a list of available Events\r\n * @see {@link IRadarColumnSeriesAdapters} for a list of available Adapters\r\n * @todo Example\r\n * @important\r\n */\r\nexport class RadarColumnSeries extends ColumnSeries {\r\n\r\n\t/**\r\n\t */\r\n\tpublic _dataItem: RadarColumnSeriesDataItem;\r\n\r\n\t/**\r\n\t */\r\n\tpublic _column: RadarColumn;\r\n\r\n\t/**\r\n\t * Defines the type of data fields used for the series.\r\n\t */\r\n\tpublic _dataFields: IRadarColumnSeriesDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IRadarColumnSeriesProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IRadarColumnSeriesAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IRadarColumnSeriesEvents;\r\n\r\n\t/**\r\n\t * A chart series belongs to.\r\n\t */\r\n\tpublic _chart: RadarChart;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"RadarColumnSeries\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Creates and returns a RadarColumn element to use as column in radar chart.\r\n\t *\r\n\t * @return RadarColumn.\r\n\t */\r\n\tprotected createColumnTemplate(): this[\"_column\"] {\r\n\t\treturn new RadarColumn();\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)validates the whole series, effectively causing it to redraw.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validate(): void {\r\n\r\n\t\t// so that radius would be updated\r\n\t\tif (this.chart.invalid) {\r\n\t\t\tthis.chart.validate();\r\n\t\t}\r\n\r\n\t\tsuper.validate();\r\n\t}\r\n\r\n\t/**\r\n\t * Validates data item's element, effectively redrawing it.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic validateDataElementReal(dataItem: this[\"_dataItem\"]): void {\r\n\t\tlet startAngle = this.chart.startAngle;\r\n\t\tlet endAngle = this.chart.endAngle;\r\n\r\n\t\tlet yField: string = this.yField;\r\n\t\tlet yOpenField: string = this.yOpenField;\r\n\t\tlet xField: string = this.xField;\r\n\t\tlet xOpenField: string = this.xOpenField;\r\n\r\n\t\tlet lAngle: number;\r\n\t\tlet rAngle: number;\r\n\r\n\t\tlet tRadius: number;\r\n\t\tlet bRadius: number;\r\n\r\n\t\tlet startLocation = this.getStartLocation(dataItem);\r\n\t\tlet endLocation = this.getEndLocation(dataItem);\r\n\r\n\t\tlet cellAngle = (endAngle - startAngle) / (this.dataItems.length * (this.end - this.start));\r\n\r\n\t\tstartAngle = startAngle + startLocation * cellAngle;\r\n\t\tendAngle = endAngle - (1 - endLocation) * cellAngle;\r\n\r\n\t\tlet template: Sprite = this.columns.template;\r\n\r\n\t\tlet percentWidth: number = template.percentWidth;\r\n\r\n\t\tif ($type.isNaN(percentWidth)) {\r\n\t\t\tpercentWidth = 100;\r\n\t\t}\r\n\r\n\t\tlet offset: number = $math.round((endLocation - startLocation) * (1 - percentWidth / 100) / 2, 5);\r\n\t\tstartLocation += offset;\r\n\t\tendLocation -= offset;\r\n\r\n\t\tif (this.baseAxis == this.xAxis) {\r\n\t\t\ttRadius = $math.getDistance({ x: this.yAxis.getX(dataItem, yField, dataItem.locations[yField], \"valueY\"), y: this.yAxis.getY(dataItem, yField, dataItem.locations[yField], \"valueY\") });\r\n\t\t\tbRadius = $math.getDistance({ x: this.yAxis.getX(dataItem, yOpenField, dataItem.locations[yOpenField], \"valueY\"), y: this.yAxis.getY(dataItem, yOpenField, dataItem.locations[yOpenField], \"valueY\") });\r\n\r\n\t\t\tlAngle = this.xAxis.getAngle(dataItem, xOpenField, startLocation, \"valueX\");\r\n\t\t\trAngle = this.xAxis.getAngle(dataItem, xField, endLocation, \"valueX\");\r\n\t\t}\r\n\t\telse {\r\n\t\t\ttRadius = $math.getDistance({ x: this.yAxis.getX(dataItem, yField, startLocation, \"valueY\"), y: this.yAxis.getY(dataItem, yField, startLocation, \"valueY\") });\r\n\t\t\tbRadius = $math.getDistance({ x: this.yAxis.getX(dataItem, yOpenField, endLocation, \"valueY\"), y: this.yAxis.getY(dataItem, yOpenField, endLocation, \"valueY\") });\r\n\r\n\t\t\tlAngle = this.xAxis.getAngle(dataItem, xField, dataItem.locations[xField], \"valueX\");\r\n\t\t\trAngle = this.xAxis.getAngle(dataItem, xOpenField, dataItem.locations[xOpenField], \"valueX\");\r\n\t\t}\r\n\r\n\t\tif (rAngle < lAngle) {\r\n\t\t\tlet temp = rAngle;\r\n\t\t\trAngle = lAngle;\r\n\t\t\tlAngle = temp;\r\n\t\t}\r\n\r\n\t\tlAngle = $math.fitToRange(lAngle, startAngle, endAngle);\r\n\t\trAngle = $math.fitToRange(rAngle, startAngle, endAngle);\r\n\r\n\t\tlet radarColumn = dataItem.column;\r\n\t\tif (!radarColumn) {\r\n\t\t\tradarColumn = this.columns.create();\r\n\t\t\tdataItem.column = radarColumn;\r\n\t\t\t$object.forceCopyProperties(this.columns.template, radarColumn, visualProperties);\r\n\t\t\tdataItem.addSprite(radarColumn);\r\n\t\t\tthis.setColumnStates(radarColumn);\r\n\t\t}\r\n\r\n\t\tlet slice = radarColumn.radarColumn;\r\n\r\n\t\tslice.startAngle = lAngle;\r\n\r\n\t\tlet arc = rAngle - lAngle;\r\n\r\n\t\tif (arc > 0) {\r\n\t\t\tslice.arc = arc;\r\n\t\t\tslice.radius = tRadius;\r\n\t\t\tslice.innerRadius = bRadius;\r\n\t\t\tradarColumn.__disabled = false;\r\n\r\n\t\t\tradarColumn.parent = this.columnsContainer;\r\n\r\n\t\t\t$iter.each(this.axisRanges.iterator(), (axisRange) => {\r\n\t\t\t\tlet rangeColumn = dataItem.rangesColumns.getKey(axisRange.uid);\r\n\t\t\t\tif (!rangeColumn) {\r\n\t\t\t\t\trangeColumn = this.columns.create();\r\n\r\n\t\t\t\t\t$object.forceCopyProperties(this.columns.template, rangeColumn, visualProperties);\r\n\t\t\t\t\t$object.copyProperties(axisRange.contents, rangeColumn, visualProperties); // need this because 3d columns are not in the same container\r\n\r\n\t\t\t\t\tif (rangeColumn.dataItem) {\r\n\t\t\t\t\t\t$array.remove(rangeColumn.dataItem.sprites, rangeColumn);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdataItem.addSprite(rangeColumn);\r\n\t\t\t\t\tthis.setColumnStates(rangeColumn);\r\n\t\t\t\t\tdataItem.rangesColumns.setKey(axisRange.uid, rangeColumn);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet slice = radarColumn.radarColumn;\r\n\t\t\t\tslice.startAngle = lAngle;\r\n\t\t\t\tslice.arc = arc;\r\n\t\t\t\tslice.radius = tRadius;\r\n\t\t\t\tslice.innerRadius = bRadius;\r\n\r\n\t\t\t\tif (slice.invalid) {\r\n\t\t\t\t\tslice.validate(); // validate as if it was used previously, it will flicker with previous dimensions\r\n\t\t\t\t}\r\n\r\n\t\t\t\trangeColumn.__disabled = false;\r\n\t\t\t\trangeColumn.parent = this.columnsContainer;\r\n\t\t\t});\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.disableUnusedColumns(dataItem);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * [getPoint description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param dataItem [description]\r\n\t * @param xKey [description]\r\n\t * @param yKey [description]\r\n\t * @param locationX [description]\r\n\t * @param locationY [description]\r\n\t * @param stackKeyX [description]\r\n\t * @param stackKeyY [description]\r\n\t */\r\n\tprotected getPoint(dataItem: RadarColumnSeriesDataItem, xKey: string, yKey: string, locationX?: number, locationY?: number, stackKeyX?: string, stackKeyY?: string) {\r\n\r\n\t\tif (!stackKeyX) {\r\n\t\t\tstackKeyX = \"valueX\";\r\n\t\t}\r\n\t\tif (!stackKeyY) {\r\n\t\t\tstackKeyY = \"valueY\";\r\n\t\t}\r\n\r\n\t\tlet x: number = this.yAxis.getX(dataItem, yKey, locationY, stackKeyY);\r\n\t\tlet y: number = this.yAxis.getY(dataItem, yKey, locationY, stackKeyY);\r\n\r\n\t\tlet radius: number = $math.getDistance({ x: x, y: y });\r\n\t\t// hack to be able to determine angle later\r\n\t\tif(radius == 0){\r\n\t\t\tradius = 0.00001;\r\n\t\t}\r\n\r\n\t\tlet angle: number = this.xAxis.getAngle(dataItem, xKey, locationX, stackKeyX);\r\n\r\n\t\treturn { x: radius * $math.cos(angle), y: radius * $math.sin(angle) };\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Returns an SVG path to be used as a mask for the series.\r\n\t *\r\n\t * @return SVG path\r\n\t */\r\n\tprotected getMaskPath(): string {\r\n\t\tlet renderer: AxisRendererRadial = this.yAxis.renderer;\r\n\t\treturn $path.arc(renderer.startAngle, renderer.endAngle - renderer.startAngle, renderer.pixelRadius, renderer.pixelInnerRadius);\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"RadarColumnSeries\"] = RadarColumnSeries;\r\nregistry.registeredClasses[\"RadarColumnSeriesDataItem\"] = RadarColumnSeriesDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/RadarColumnSeries.ts","/**\r\n * Defines Pyramid Series.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { IFunnelSeriesAdapters, IFunnelSeriesDataFields, IFunnelSeriesEvents, IFunnelSeriesProperties, FunnelSeries, FunnelSeriesDataItem } from \"./FunnelSeries\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport { Percent, percent } from \"../../core/utils/Percent\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n//@todo: sequenced?\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[PyramidSeries]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class PyramidSeriesDataItem extends FunnelSeriesDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: PyramidSeries;\r\n\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"PyramidSeriesDataItem\";\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[PyramidSeries]].\r\n */\r\nexport interface IPyramidSeriesDataFields extends IFunnelSeriesDataFields { }\r\n\r\n/**\r\n * Defines properties for [[PyramidSeries]].\r\n */\r\nexport interface IPyramidSeriesProperties extends IFunnelSeriesProperties {\r\n\r\n\t/**\r\n\t * Bottom width in pixels or percent\r\n\t */\r\n\tbottomWidth?: number | Percent;\r\n\r\n\t/**\r\n\t * Top width in pixels or percent\r\n\t */\r\n\ttopWidth?: number | Percent;\r\n\r\n\t/**\r\n\t * Height of pyramid\r\n\t */\r\n\tpyramidHeight?: number | Percent;\r\n\r\n\t/**\r\n\t * Indicates whether slice value should sould influence its height or area\r\n\t * size.\r\n\t *\r\n\t * @default \"area\"\r\n\t */\r\n\tvalueIs?: \"height\" | \"area\";\r\n}\r\n\r\n/**\r\n * Defines events for [[PyramidSeries]].\r\n */\r\nexport interface IPyramidSeriesEvents extends IFunnelSeriesEvents { }\r\n\r\n/**\r\n * Defines adapters for [[PyramidSeries]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IPyramidSeriesAdapters extends IFunnelSeriesAdapters, IPyramidSeriesProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines [[Series]] for a FunnelSlice series on a [[SlicedChart]].\r\n *\r\n * @see {@link IPyramidSeriesEvents} for a list of available Events\r\n * @see {@link IPyramidSeriesAdapters} for a list of available Adapters\r\n * @see {@link https://www.amcharts.com/docs/v4/chart-types/sliced-chart/} for documentation\r\n * @important\r\n */\r\nexport class PyramidSeries extends FunnelSeries {\r\n\r\n\t/**\r\n\t * Defines the type of data fields used for the series.\r\n\t */\r\n\tpublic _dataFields: IPyramidSeriesDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IPyramidSeriesProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IPyramidSeriesAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IPyramidSeriesEvents;\r\n\r\n\t/**\r\n\t * Defines the type of data item.\r\n\t */\r\n\tpublic _dataItem: PyramidSeriesDataItem;\r\n\r\n\t/**\r\n\t * [_nextWidth description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _nextWidth: number;\r\n\r\n\tprotected _pyramidHeight: number;\r\n\r\n\tprotected _pyramidWidth: number;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\r\n\t\tthis.className = \"PyramidSeries\";\r\n\t\tthis.topWidth = percent(0);\r\n\t\tthis.bottomWidth = percent(100);\r\n\t\tthis.pyramidHeight = percent(100);\r\n\t\tthis.valueIs = \"area\";\r\n\r\n\t\tthis.sliceLinks.template.width = 0;\r\n\t\tthis.sliceLinks.template.height = 0;\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Sets defaults that instantiate some objects that rely on parent, so they\r\n\t * cannot be set in constructor.\r\n\t */\r\n\tprotected applyInternalDefaults(): void {\r\n\t\tsuper.applyInternalDefaults();\r\n\t\tif (!$type.hasValue(this.readerTitle)) {\r\n\t\t\tthis.readerTitle = this.language.translate(\"Pyramid Series\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty DataItem of the type appropriate for this object.\r\n\t *\r\n\t * @see {@link DataItem}\r\n\t * @return Data Item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new PyramidSeriesDataItem();\r\n\t}\r\n\r\n\t/**\r\n\t * (Re)validates the whole series, effectively causing it to redraw.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validate(): void {\r\n\t\tsuper.validate();\r\n\t\tthis._nextWidth = undefined;\r\n\t}\r\n\r\n\t/**\r\n\t * [getNextValue description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param dataItem [description]\r\n\t * @return [description]\r\n\t */\r\n\tprotected getNextValue(dataItem: FunnelSeriesDataItem): number {\r\n\t\tlet index = dataItem.index;\r\n\t\tlet nextValue: number = dataItem.getWorkingValue(\"value\");\r\n\t\tif (index < this.dataItems.length - 1) {\r\n\t\t\tlet nextItem = this.dataItems.getIndex(index + 1);\r\n\t\t\tnextValue = nextItem.getWorkingValue(\"value\");\r\n\t\t}\r\n\t\tif (nextValue == 0) {\r\n\t\t\tnextValue = 0.000001;\r\n\t\t}\r\n\t\treturn nextValue;\r\n\t}\r\n\r\n\t/**\r\n\t * [validateDataElements description]\r\n\t *\r\n\t * @todo Description\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validateDataElements() {\r\n\t\tlet maxWidth = this.slicesContainer.innerWidth;\r\n\t\tlet maxHeight = this.slicesContainer.innerHeight;\r\n\r\n\t\tthis.dataItems.each((dataItem) => {\r\n\t\t\tlet relValue = dataItem.getWorkingValue(\"value\") / dataItem.value;\r\n\t\t\tlet sliceLink = dataItem.sliceLink;\r\n\t\t\tif (this.orientation == \"vertical\") {\r\n\t\t\t\tmaxHeight -= (sliceLink.pixelHeight * relValue);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tmaxWidth -= (sliceLink.pixelWidth * relValue);\r\n\t\t\t}\r\n\r\n\t\t})\r\n\r\n\t\tthis._pyramidHeight = $utils.relativeToValue(this.pyramidHeight, maxHeight);\r\n\t\tthis._pyramidWidth = $utils.relativeToValue(this.pyramidHeight, maxWidth);\r\n\r\n\t\tif (this.orientation == \"vertical\") {\r\n\t\t\tlet y = (maxHeight - this._pyramidHeight) / 2;\r\n\t\t\tthis.slicesContainer.y = y\r\n\t\t\tthis.labelsContainer.y = y;\r\n\t\t\tthis.ticksContainer.y = y;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet x = (maxWidth - this._pyramidWidth) / 2;\r\n\t\t\tthis.slicesContainer.x = x;\r\n\t\t\tthis.labelsContainer.x = x;\r\n\t\t\tthis.ticksContainer.x = x;\r\n\t\t}\r\n\r\n\t\tsuper.validateDataElements();\r\n\t}\r\n\r\n\t/**\r\n\t * [decorateSlice description]\r\n\t *\r\n\t * @todo Description\r\n\t * @param dataItem [description]\r\n\t */\r\n\tprotected decorateSlice(dataItem: this[\"_dataItem\"]) {\r\n\r\n\t\tlet sum = this.dataItem.values.value.sum;\r\n\r\n\t\tif(sum == 0){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet slice = dataItem.slice;\r\n\t\tlet sliceLink = dataItem.sliceLink;\r\n\t\tlet label = dataItem.label;\r\n\t\tlet tick = dataItem.tick;\r\n\r\n\t\t// TODO can this be removed ?\r\n\t\tthis.getNextValue(dataItem);\r\n\r\n\t\tlet workingValue = dataItem.getWorkingValue(\"value\");\r\n\r\n\t\tif (workingValue == 0) {\r\n\t\t\tworkingValue = 0.000001;\r\n\t\t}\r\n\r\n\t\tlet pyramidWidth = this._pyramidWidth;\r\n\t\tlet pyramidHeight = this._pyramidHeight;\r\n\r\n\t\tlet maxWidth = this.slicesContainer.innerWidth;\r\n\t\tlet maxHeight = this.slicesContainer.innerHeight;\r\n\r\n\t\tlet linkWidth = sliceLink.pixelWidth;\r\n\t\tlet linkHeight = sliceLink.pixelHeight;\r\n\r\n\t\tif (this.orientation == \"vertical\") {\r\n\t\t\tlet topWidth = $utils.relativeToValue(this.topWidth, maxWidth);\r\n\r\n\t\t\tif (!$type.isNumber(this._nextWidth)) {\r\n\t\t\t\tthis._nextWidth = topWidth;\r\n\t\t\t}\r\n\r\n\r\n\t\t\tlet bottomWidth = $utils.relativeToValue(this.bottomWidth, maxWidth);\r\n\t\t\tlet sliceTopWidth = this._nextWidth;\r\n\r\n\t\t\tlet angle = Math.atan2(pyramidHeight, topWidth - bottomWidth);\r\n\t\t\tlet c = Math.tan(Math.PI / 2 - angle);\r\n\t\t\tif (c == 0) {\r\n\t\t\t\tc = 0.00000001;\r\n\t\t\t}\r\n\r\n\t\t\tlet sliceHeight: number;\r\n\t\t\tlet sliceBottomWidth: number;\r\n\r\n\t\t\tif (this.valueIs == \"area\") {\r\n\t\t\t\tlet totalSquare = (topWidth + bottomWidth) / 2 * pyramidHeight;\r\n\t\t\t\tlet square = totalSquare * workingValue / sum;\r\n\r\n\t\t\t\tlet s = Math.abs(sliceTopWidth * sliceTopWidth - 2 * square * c);\r\n\r\n\t\t\t\tsliceHeight = (sliceTopWidth - Math.sqrt(s)) / c;\r\n\t\t\t\tsliceBottomWidth = (2 * square - sliceHeight * sliceTopWidth) / sliceHeight;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tlet sum = this.dataItem.values.value.sum;\r\n\t\t\t\tsliceHeight = pyramidHeight * workingValue / sum;\r\n\t\t\t\tsliceBottomWidth = sliceTopWidth - sliceHeight * c;\r\n\t\t\t}\r\n\r\n\r\n\t\t\tslice.height = sliceHeight;\r\n\t\t\tslice.width = maxWidth;\r\n\t\t\tslice.bottomWidth = sliceBottomWidth;\r\n\t\t\tslice.topWidth = sliceTopWidth;\r\n\r\n\t\t\tsliceLink.topWidth = slice.bottomWidth;\r\n\t\t\tsliceLink.bottomWidth = slice.bottomWidth;\r\n\r\n\t\t\tslice.y = this._nextY;\r\n\t\t\t//slice.x = maxWidth / 2;\r\n\r\n\t\t\tif (!this.alignLabels) {\r\n\t\t\t\tlabel.x = maxWidth / 2;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tlabel.x = 0;\r\n\t\t\t}\r\n\r\n\t\t\tlabel.y = slice.pixelY + slice.pixelHeight * tick.locationY + slice.dy;\r\n\r\n\t\t\tthis._nextY += slice.pixelHeight + linkHeight * workingValue / dataItem.value;\r\n\t\t\tsliceLink.y = this._nextY - linkHeight;\r\n\t\t\tsliceLink.x = maxWidth / 2;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet topWidth = $utils.relativeToValue(this.topWidth, maxHeight);\r\n\r\n\t\t\tif (!$type.isNumber(this._nextWidth)) {\r\n\t\t\t\tthis._nextWidth = topWidth;\r\n\t\t\t}\r\n\r\n\t\t\tlet bottomWidth = $utils.relativeToValue(this.bottomWidth, maxHeight);\r\n\t\t\tlet sliceTopWidth = this._nextWidth;\r\n\r\n\t\t\tlet angle = Math.atan2(pyramidWidth, topWidth - bottomWidth);\r\n\t\t\tlet c = Math.tan(Math.PI / 2 - angle);\r\n\t\t\tif (c == 0) {\r\n\t\t\t\tc = 0.00000001;\r\n\t\t\t}\r\n\r\n\t\t\tlet sliceWidth: number;\r\n\t\t\tlet sliceBottomWidth: number;\r\n\r\n\t\t\tif (this.valueIs == \"area\") {\r\n\t\t\t\tlet totalSquare = (topWidth + bottomWidth) / 2 * pyramidWidth;\r\n\t\t\t\tlet square = totalSquare * workingValue / this.dataItem.values.value.sum;\r\n\t\t\t\tsliceWidth = (sliceTopWidth - Math.sqrt(sliceTopWidth * sliceTopWidth - 2 * square * c)) / c;\r\n\t\t\t\tsliceBottomWidth = (2 * square - sliceWidth * sliceTopWidth) / sliceWidth;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tsliceWidth = pyramidWidth * workingValue / this.dataItem.values.value.sum;\r\n\t\t\t\tsliceBottomWidth = sliceTopWidth - sliceWidth * c;\r\n\t\t\t}\r\n\r\n\t\t\tslice.width = sliceWidth;\r\n\t\t\tslice.height = maxHeight;\r\n\t\t\tslice.bottomWidth = sliceBottomWidth;\r\n\t\t\tslice.topWidth = sliceTopWidth;\r\n\r\n\t\t\tsliceLink.topWidth = slice.bottomWidth;\r\n\t\t\tsliceLink.bottomWidth = slice.bottomWidth;\r\n\r\n\t\t\tslice.x = this._nextY;\r\n\r\n\t\t\tif (!this.alignLabels) {\r\n\t\t\t\tlabel.y = maxHeight / 2;\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\tlabel.y = this.labelsContainer.measuredHeight;\r\n\t\t\t}\r\n\r\n\t\t\tlabel.x = slice.pixelX + slice.pixelWidth * tick.locationX + slice.dx;\r\n\r\n\t\t\tthis._nextY += slice.pixelWidth + linkWidth * workingValue / dataItem.value;\r\n\t\t\tsliceLink.x = this._nextY - linkWidth;\r\n\t\t\tsliceLink.y = maxHeight / 2;\r\n\t\t}\r\n\r\n\t\tthis._nextWidth = slice.bottomWidth;\r\n\t}\r\n\r\n\t/**\r\n\t * Width of the pyramid's tip in pixels or relative (`Percent`).\r\n\t *\r\n\t * `0%` (default) means the pyramid will be perfectly pointy.\r\n\t * `50%` will have a cut off / blunt top that is half the width of the chart.\r\n\t * `100%` will take the whole width of the chart.\r\n\t *\r\n\t * If you need the downward-pointing pyramid, you might want to `topWidth` to\r\n\t * `100%` and `bottomWidth` to `0%`.\r\n\t *\r\n\t * @default 0%\r\n\t * @param {number | Percent}\r\n\t */\r\n\tpublic set topWidth(value: number | Percent) {\r\n\t\tif (this.setPercentProperty(\"topWidth\", value, false, false, 10, false)) {\r\n\t\t\tthis.invalidate();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return {number | Percent}\r\n\t */\r\n\tpublic get topWidth(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"topWidth\");\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Height of pyramid\r\n\t *\r\n\t *\r\n\t * @default 100%\r\n\t * @param {number | Percent}\r\n\t */\r\n\tpublic set pyramidHeight(value: number | Percent) {\r\n\t\tif (this.setPercentProperty(\"pyramidHeight\", value, false, false, 10, false)) {\r\n\t\t\tthis.invalidate();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return {number | Percent}\r\n\t */\r\n\tpublic get pyramidHeight(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"pyramidHeight\");\r\n\t}\r\n\r\n\t/**\r\n\t * Width of the pyramid's bottom (bsae) in pixels or relative (`Percent`).\r\n\t *\r\n\t * `0%` means the pyramid's botto will be pointy.\r\n\t * `50%` will have a cut off / blunt bottom that is half the width of the chart.\r\n\t * `100%` (default) will take the whole width of the chart.\r\n\t *\r\n\t * If you need the downward-pointing pyramid, you might want to `topWidth` to\r\n\t * `100%` and `bottomWidth` to `0%`.\r\n\t *\r\n\t * @param {number | Percent}\r\n\t */\r\n\tpublic set bottomWidth(value: number | Percent) {\r\n\t\tif (this.setPercentProperty(\"bottomWidth\", value, false, false, 10, false)) {\r\n\t\t\tthis.invalidate();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return {number | Percent}\r\n\t */\r\n\tpublic get bottomWidth(): number | Percent {\r\n\t\treturn this.getPropertyValue(\"bottomWidth\");\r\n\t}\r\n\r\n\t/**\r\n\t * Indicates how slice's value will influence its size.\r\n\t *\r\n\t * `\"area\"` (default) means that the whole area of the pyramid (counting in\r\n\t * modifications by `topWidth` and `bottomWidth`) will be divvied up between\r\n\t * slices based on their value.\r\n\t *\r\n\t * With this setting at `\"area\"` the area of the trapezoids of each slice\r\n\t * will represent their value relatively to values of the other slices.\r\n\t *\r\n\t * This is a correct way to depict \"weight\" of each slice based on their\r\n\t * values.\r\n\t *\r\n\t * `\"height\"` means whole height (as opposed to area) of the pyramid will be\r\n\t * divvied up between slices. Actual slice width or area is not counted in.\r\n\t *\r\n\t * From the data-viz standpoint this does not make a lot of sense, since\r\n\t * slices with lesser values might appear more prominent if they are placed\r\n\t * towards thick end of the pyramid since their areas will be bigger.\r\n\t *\r\n\t * @default \"area\"\r\n\t * @param {\"area\" | \"height\"}\r\n\t */\r\n\tpublic set valueIs(value: \"area\" | \"height\") {\r\n\t\tif (this.setPropertyValue(\"valueIs\", value)) {\r\n\t\t\tthis.invalidate();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return {\"area\" | \"height\"}\r\n\t */\r\n\tpublic get valueIs(): \"area\" | \"height\" {\r\n\t\treturn this.getPropertyValue(\"valueIs\");\r\n\t}\r\n}\r\n\r\n/**\r\n * bboxter class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"PyramidSeries\"] = PyramidSeries;\r\nregistry.registeredClasses[\"PyramidSeriesDataItem\"] = PyramidSeriesDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/PyramidSeries.ts","/**\r\n * Defines Pictorial Stacked Series.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { IPyramidSeriesAdapters, IPyramidSeriesDataFields, IPyramidSeriesEvents, IPyramidSeriesProperties, PyramidSeries, PyramidSeriesDataItem } from \"./PyramidSeries\";\r\nimport { Sprite } from \"../../core/Sprite\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $math from \"../../core/utils/Math\";\r\nimport * as $type from \"../../core/utils/Type\";\r\nimport { percent } from \"../../core/utils/Percent\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n//@todo: sequenced?\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[PictorialStackedSeries]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class PictorialStackedSeriesDataItem extends PyramidSeriesDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: PictorialStackedSeries;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"PictorialStackedSeriesDataItem\";\r\n\r\n\t\tthis.applyTheme();\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[PictorialStackedSeries]].\r\n */\r\nexport interface IPictorialStackedSeriesDataFields extends IPyramidSeriesDataFields { }\r\n\r\n/**\r\n * Defines properties for [[PictorialStackedSeries]].\r\n */\r\nexport interface IPictorialStackedSeriesProperties extends IPyramidSeriesProperties {\r\n\r\n\t/**\r\n\t * Relative location to start series from.\r\n\t *\r\n\t * @default 0\r\n\t */\r\n\tstartLocation?: number;\r\n\r\n\t/**\r\n\t * Relative location to end series at.\r\n\t *\r\n\t * @default 1\r\n\t */\r\n\tendLocation?: number;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[PictorialStackedSeries]].\r\n */\r\nexport interface IPictorialStackedSeriesEvents extends IPyramidSeriesEvents { }\r\n\r\n/**\r\n * Defines adapters for [[PictorialStackedSeries]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IPictorialStackedSeriesAdapters extends IPyramidSeriesAdapters, IPictorialStackedSeriesProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines [[Series]] for a PictorialStacked series on a [[SlicedChart]].\r\n *\r\n * @see {@link IPictorialStackedSeriesEvents} for a list of available Events\r\n * @see {@link IPictorialStackedSeriesAdapters} for a list of available Adapters\r\n * @see {@link https://www.amcharts.com/docs/v4/chart-types/sliced-chart/} for documentation\r\n * @important\r\n */\r\nexport class PictorialStackedSeries extends PyramidSeries {\r\n\r\n\t/**\r\n\t * Defines the type of data fields used for the series.\r\n\t */\r\n\tpublic _dataFields: IPictorialStackedSeriesDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IPictorialStackedSeriesProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IPictorialStackedSeriesAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IPictorialStackedSeriesEvents;\r\n\r\n\t/**\r\n\t * Defines the type of data item.\r\n\t */\r\n\tpublic _dataItem: PictorialStackedSeriesDataItem;\r\n\r\n\t/**\r\n\t * Holds a Sprite that acts as an intelligent mask for the serries.\r\n\t */\r\n\tprotected _maskSprite: Sprite;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\r\n\t\tthis.className = \"PictorialStackedSeries\";\r\n\t\tthis.topWidth = percent(100);\r\n\t\tthis.bottomWidth = percent(100);\r\n\t\tthis.valueIs = \"height\";\r\n\r\n\t\tthis.applyTheme();\r\n\r\n\t\tthis.startLocation = 0;\r\n\t\tthis.endLocation = 1;\r\n\r\n\t\tthis._maskSprite = this.slicesContainer.createChild(Sprite);\r\n\t\tthis._maskSprite.visible = false;\r\n\t\tthis._maskSprite.zIndex = 100;\r\n\t}\r\n\r\n\t/**\r\n\t * Sizes the mask to fit the series.\r\n\t *\r\n\t * @ignore\r\n\t */\r\n\tpublic validateDataElements(): void {\r\n\r\n\t\tlet maxWidth = this.slicesContainer.maxWidth;\r\n\t\tlet maxHeight = this.slicesContainer.maxHeight;\r\n\r\n\t\tlet maskSprite = this._maskSprite;\r\n\t\t//maskSprite.validatePosition(); // for some reason size of the maskSprite is 0x0 after we removed validatePosition in afterdraw\r\n\r\n\t\tlet pictureWidth = maskSprite.measuredWidth / maskSprite.scale;\r\n\t\tlet pictureHeight = maskSprite.measuredHeight / maskSprite.scale;\r\n\r\n\t\tlet scale = $math.min(maxHeight / pictureHeight, maxWidth / pictureWidth);\r\n\r\n\t\tif (scale == Infinity) {\r\n\t\t\tscale = 1; // can't return here, won't draw legend properly\r\n\t\t}\r\n\r\n\t\tscale = $math.max(0.001, scale);\r\n\r\n\t\tlet startLocation = this.startLocation;\r\n\t\tlet endLocation = this.endLocation;\r\n\r\n\t\tlet newWidth = $math.min(maxWidth, pictureWidth * scale);\r\n\t\tlet newHeight = $math.min(maxHeight, pictureHeight * scale);\r\n\r\n\t\tmaskSprite.scale = scale;\r\n\r\n\t\tif (this.orientation == \"vertical\") {\r\n\t\t\tthis.topWidth = newWidth + 4;\r\n\t\t\tthis.bottomWidth = newWidth + 4;\r\n\t\t\tthis.pyramidHeight = newHeight * (endLocation - startLocation);\r\n\t\t\tmaskSprite.x = maxWidth / 2;\r\n\t\t\tmaskSprite.y = newHeight / 2;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.topWidth = newHeight + 4;\r\n\t\t\tthis.bottomWidth = newHeight + 4;\r\n\t\t\tthis.pyramidHeight = newWidth * (endLocation - startLocation);\r\n\t\t\tmaskSprite.valign = \"middle\";\r\n\t\t\tmaskSprite.x = newWidth / 2;\r\n\t\t\tmaskSprite.y = maxHeight / 2;\r\n\t\t}\r\n\r\n\t\tmaskSprite.verticalCenter = \"middle\";\r\n\t\tmaskSprite.horizontalCenter = \"middle\";\r\n\r\n\t\tsuper.validateDataElements();\r\n\r\n\t\tif (this.orientation == \"vertical\") {\r\n\t\t\tlet y = (maxHeight - newHeight) / 2;\r\n\t\t\tthis.slicesContainer.y = y;\r\n\t\t\tthis.labelsContainer.y = y;\r\n\t\t\tthis.ticksContainer.y = y;\r\n\t\t\tthis.slices.template.dy = startLocation * newHeight;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tlet x = (maxWidth - newWidth) / 2;\r\n\t\t\tthis.slicesContainer.x = x;\r\n\t\t\tthis.labelsContainer.x = x;\r\n\t\t\tthis.ticksContainer.x = x;\r\n\t\t\tthis.slices.template.dx = startLocation * newWidth;\r\n\t\t}\r\n\r\n\t\tthis.slicesContainer.mask = this._maskSprite;\r\n\t}\r\n\r\n\t/**\r\n\t * Sets defaults that instantiate some objects that rely on parent, so they\r\n\t * cannot be set in constructor.\r\n\t */\r\n\tprotected applyInternalDefaults(): void {\r\n\t\tsuper.applyInternalDefaults();\r\n\t\tif (!$type.hasValue(this.readerTitle)) {\r\n\t\t\tthis.readerTitle = this.language.translate(\"Pyramid Series\");\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a new/empty DataItem of the type appropriate for this object.\r\n\t *\r\n\t * @see {@link DataItem}\r\n\t * @return Data Item\r\n\t */\r\n\tprotected createDataItem(): this[\"_dataItem\"] {\r\n\t\treturn new PictorialStackedSeriesDataItem();\r\n\t}\r\n\r\n\t/**\r\n\t * A [[Sprite]] element that is used as a series mask.\r\n\t *\r\n\t * If set, this element's shape will be used to apply shape to the whole\r\n\t * stacked pictorial series.\r\n\t *\r\n\t * You can use this element's `path` property to set an SVG path for the\r\n\t * shape:\r\n\t *\r\n\t * ```TypeScript\r\n\t * let iconPath = \"M511.82,329.991c-0.256-1.212-1.064-2.244-2.192-2.784l-24.396-11.684c17.688-29.776,11.804-68.912-15.58-91.88 c-53.756-45.084-131.696-70.936-213.828-70.936c-82.128,0-160.068,25.856-213.82,70.936c-27.416,22.992-33.28,62.18-15.524,91.972 L2.276,327.203c-1.128,0.54-1.936,1.572-2.192,2.792c-0.256,1.22,0.08,2.496,0.896,3.436l21.204,24.388 c0.764,0.88,1.868,1.376,3.02,1.376c0.084,0,0.172,0,0.26-0.008c1.244-0.084,2.384-0.74,3.072-1.776l14.852-22.376 c12.648,10.112,28.392,15.776,44.916,15.776c16.872,0,33.284-5.98,46.232-16.836c27.828-23.34,73.172-37.272,121.288-37.272 c48.12,0,93.464,13.932,121.296,37.272c12.944,10.856,29.36,16.836,46.228,16.836c16.596,0,32.4-5.724,45.08-15.916l14.94,22.512 c0.692,1.04,1.824,1.696,3.076,1.776c0.084,0.008,0.172,0.008,0.256,0.008c1.156,0,2.256-0.496,3.02-1.376l21.2-24.388C511.74,332.487,512.068,331.211,511.82,329.991z\";\r\n\t * // ...\r\n\t * series.maskSprite.path = iconPath;\r\n\t * ```\r\n\t * ```JavaScript\r\n\t * let iconPath = \"M511.82,329.991c-0.256-1.212-1.064-2.244-2.192-2.784l-24.396-11.684c17.688-29.776,11.804-68.912-15.58-91.88 c-53.756-45.084-131.696-70.936-213.828-70.936c-82.128,0-160.068,25.856-213.82,70.936c-27.416,22.992-33.28,62.18-15.524,91.972 L2.276,327.203c-1.128,0.54-1.936,1.572-2.192,2.792c-0.256,1.22,0.08,2.496,0.896,3.436l21.204,24.388 c0.764,0.88,1.868,1.376,3.02,1.376c0.084,0,0.172,0,0.26-0.008c1.244-0.084,2.384-0.74,3.072-1.776l14.852-22.376 c12.648,10.112,28.392,15.776,44.916,15.776c16.872,0,33.284-5.98,46.232-16.836c27.828-23.34,73.172-37.272,121.288-37.272 c48.12,0,93.464,13.932,121.296,37.272c12.944,10.856,29.36,16.836,46.228,16.836c16.596,0,32.4-5.724,45.08-15.916l14.94,22.512 c0.692,1.04,1.824,1.696,3.076,1.776c0.084,0.008,0.172,0.008,0.256,0.008c1.156,0,2.256-0.496,3.02-1.376l21.2-24.388C511.74,332.487,512.068,331.211,511.82,329.991z\";\r\n\t * // ...\r\n\t * series.maskSprite.path = iconPath;\r\n\t * ```\r\n\t * ```JSON\r\n\t * let iconPath = \"M511.82,329.991c-0.256-1.212-1.064-2.244-2.192-2.784l-24.396-11.684c17.688-29.776,11.804-68.912-15.58-91.88 c-53.756-45.084-131.696-70.936-213.828-70.936c-82.128,0-160.068,25.856-213.82,70.936c-27.416,22.992-33.28,62.18-15.524,91.972 L2.276,327.203c-1.128,0.54-1.936,1.572-2.192,2.792c-0.256,1.22,0.08,2.496,0.896,3.436l21.204,24.388 c0.764,0.88,1.868,1.376,3.02,1.376c0.084,0,0.172,0,0.26-0.008c1.244-0.084,2.384-0.74,3.072-1.776l14.852-22.376 c12.648,10.112,28.392,15.776,44.916,15.776c16.872,0,33.284-5.98,46.232-16.836c27.828-23.34,73.172-37.272,121.288-37.272 c48.12,0,93.464,13.932,121.296,37.272c12.944,10.856,29.36,16.836,46.228,16.836c16.596,0,32.4-5.724,45.08-15.916l14.94,22.512 c0.692,1.04,1.824,1.696,3.076,1.776c0.084,0.008,0.172,0.008,0.256,0.008c1.156,0,2.256-0.496,3.02-1.376l21.2-24.388C511.74,332.487,512.068,331.211,511.82,329.991z\";\r\n\t * // ...\r\n\t * {\r\n\t * // ...\r\n\t * \"series\": [{\r\n\t * \"type\": \"PictorialStackedSeries\",\r\n\t * // ...\r\n\t * \"maskSprite\": {\r\n\t * \"path\": iconPath\r\n\t * }\r\n\t * }]\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @return Mask sprite\r\n\t */\r\n\tpublic get maskSprite(): Sprite {\r\n\t\treturn this._maskSprite;\r\n\t}\r\n\r\n\t/**\r\n\t * Inits FunnelSlice.\r\n\t *\r\n\t * @param slice to init\r\n\t */\r\n\tprotected initSlice(slice: this[\"_slice\"]) {\r\n\t\tsuper.initSlice(slice);\r\n\r\n\t\tlet hs = slice.states.getKey(\"hover\");\r\n\t\tif (hs) {\r\n\t\t\ths.properties.expandDistance = 0;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Relative location to start series from.\r\n\t *\r\n\t * Range of values: 0 to 1.\r\n\t *\r\n\t * This setting indicates where actual slices will start relatively to the\r\n\t * whole height/width of the series.\r\n\t *\r\n\t * For example, if we want slices to start at 30% from the top/left of the\r\n\t * series, we can set `startLocation = 0.3`.\r\n\t *\r\n\t * To fill shape outside of the location range, use background of the\r\n\t * property `slicesContainer`.\r\n\t *\r\n\t * ```TypeScript\r\n\t * series.startLocation = 0.2;\r\n\t * series.endLocation = 0.8;\r\n\t * series.slicesContainer.background.fill = am4core.color(\"#eee\");\r\n\t * ```\r\n\t * ```JavaScript\r\n\t * series.startLocation = 0.2;\r\n\t * series.endLocation = 0.8;\r\n\t * series.slicesContainer.background.fill = am4core.color(\"#eee\");\r\n\t * ```\r\n\t * ```JSON\r\n\t * {\r\n\t * // ...\r\n\t * \"series\": [{\r\n\t * // ...\r\n\t * \"startLocation\": 0.2,\r\n\t * \"endLocation\": 0.8,\r\n\t * \"slicesContainer\": {\r\n\t * \"background\": {\r\n\t * \"fill\": \"#eee\"\r\n\t * }\r\n\t * }\r\n\t * }]\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @default 0\r\n\t * @since 4.1.13\r\n\t * @param value Start location\r\n\t */\r\n\tpublic set startLocation(value: number) {\r\n\t\tif (this.setPropertyValue(\"startLocation\", value)) {\r\n\t\t\tthis.invalidateDataItems();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Start location\r\n\t */\r\n\tpublic get startLocation(): number {\r\n\t\treturn this.getPropertyValue(\"startLocation\");\r\n\t}\r\n\r\n\t/**\r\n\t * Relative location to end series at.\r\n\t *\r\n\t * Range of values: 0 to 1.\r\n\t *\r\n\t * This setting indicates where actual slices will end relatively to the\r\n\t * whole height/width of the series.\r\n\t *\r\n\t * For example, if we want slices to end at 70% from the top/left of the\r\n\t * series, we can set `endLocation = 0.7`.\r\n\t *\r\n\t * To fill shape outside of the location range, use background of the\r\n\t * property `slicesContainer`.\r\n\t *\r\n\t * ```TypeScript\r\n\t * series.startLocation = 0.2;\r\n\t * series.endLocation = 0.8;\r\n\t * series.slicesContainer.background.fill = am4core.color(\"#eee\");\r\n\t * ```\r\n\t * ```JavaScript\r\n\t * series.startLocation = 0.2;\r\n\t * series.endLocation = 0.8;\r\n\t * series.slicesContainer.background.fill = am4core.color(\"#eee\");\r\n\t * ```\r\n\t * ```JSON\r\n\t * {\r\n\t * // ...\r\n\t * \"series\": [{\r\n\t * // ...\r\n\t * \"startLocation\": 0.2,\r\n\t * \"endLocation\": 0.8,\r\n\t * \"slicesContainer\": {\r\n\t * \"background\": {\r\n\t * \"fill\": \"#eee\"\r\n\t * }\r\n\t * }\r\n\t * }]\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @default 1\r\n\t * @since 4.1.13\r\n\t * @param value End location\r\n\t */\r\n\tpublic set endLocation(value: number) {\r\n\t\tif (this.setPropertyValue(\"endLocation\", value)) {\r\n\t\t\tthis.invalidateDataItems();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return End location\r\n\t */\r\n\tpublic get endLocation(): number {\r\n\t\treturn this.getPropertyValue(\"endLocation\");\r\n\t}\r\n}\r\n\r\n/**\r\n * bboxter class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"PictorialStackedSeries\"] = PictorialStackedSeries;\r\nregistry.registeredClasses[\"PictorialStackedSeriesDataItem\"] = PictorialStackedSeriesDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/PictorialStackedSeries.ts","/**\r\n * Module that defines everything related to building Cone Columns.\r\n * It is a container which has coneColumn element which is a Cone.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Column, IColumnProperties, IColumnAdapters, IColumnEvents } from \"./Column\";\r\nimport { Cone } from \"../../core/elements/3d/Cone\";\r\nimport { registry } from \"../../core/Registry\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[ConeColumn]].\r\n */\r\nexport interface IConeColumnProperties extends IColumnProperties { }\r\n\r\n/**\r\n * Defines events for [[ConeColumn]].\r\n */\r\nexport interface IConeColumnEvents extends IColumnEvents { }\r\n\r\n/**\r\n * Defines adapters for [[ConeColumn]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IConeColumnAdapters extends IColumnAdapters, IConeColumnProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Class used to creates ConeColumns.\r\n *\r\n * @see {@link IConeColumnEvents} for a list of available events\r\n * @see {@link IConeColumnAdapters} for a list of available Adapters\r\n * @todo Usage example\r\n * @important\r\n */\r\nexport class ConeColumn extends Column {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IConeColumnProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IConeColumnAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IConeColumnEvents;\r\n\r\n\r\n\t/**\r\n\t * Cone column element\r\n\t */\r\n\tpublic coneColumn: Cone;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"ConeColumn\";\r\n\t}\r\n\r\n\t/**\r\n\t * @ignore\r\n\t */\r\n\tcreateAssets() {\r\n\t\tthis.coneColumn = this.createChild(Cone);\r\n\t\tthis.coneColumn.shouldClone = false;\r\n\r\n\t\t// some dirty hack so that if user access column, it won't get error\r\n\t\tthis.column = this.coneColumn;\r\n\t}\r\n\r\n\t/**\r\n\t * Copies all parameters from another [[ConeColumn]].\r\n\t *\r\n\t * @param source Source ConeColumn\r\n\t */\r\n\tcopyFrom(source: this) {\r\n\t\tsuper.copyFrom(source)\r\n\t\tif (this.coneColumn) {\r\n\t\t\tthis.coneColumn.copyFrom(source.coneColumn);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"ConeColumn\"] = ConeColumn;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/elements/ConeColumn.ts","/**\r\n * ConeSeries module\r\n * Not recommended using if you use scrollbars or your chart is zoomable in some other way.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { ColumnSeries, IColumnSeriesDataFields, IColumnSeriesProperties, IColumnSeriesAdapters, IColumnSeriesEvents, ColumnSeriesDataItem } from \"./ColumnSeries\";\r\nimport { ConeColumn } from \"../elements/ConeColumn\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[ConeSeries]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class ConeSeriesDataItem extends ColumnSeriesDataItem {\r\n\r\n\t/**\r\n\t * A sprite used to draw the column.\r\n\t */\r\n\tpublic _column: ConeColumn;\r\n\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: ConeSeries;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"ConeSeriesDataItem\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[ConeSeries]].\r\n */\r\nexport interface IConeSeriesDataFields extends IColumnSeriesDataFields { }\r\n\r\n/**\r\n * Defines properties for [[ConeSeries]].\r\n */\r\nexport interface IConeSeriesProperties extends IColumnSeriesProperties { }\r\n\r\n/**\r\n * Defines events for [[ConeSeries]].\r\n */\r\nexport interface IConeSeriesEvents extends IColumnSeriesEvents { }\r\n\r\n/**\r\n * Defines adapters for [[ConeSeries]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IConeSeriesAdapters extends IColumnSeriesAdapters, IConeSeriesProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines [[Series]] for a cone graph.\r\n *\r\n * @see {@link IConeSeriesEvents} for a list of available Events\r\n * @see {@link IConeSeriesAdapters} for a list of available Adapters\r\n * @todo Example\r\n * @important\r\n */\r\nexport class ConeSeries extends ColumnSeries {\r\n\r\n\tpublic _column: ConeColumn;\r\n\r\n\t/**\r\n\t */\r\n\tpublic _dataItem: ConeSeriesDataItem;\r\n\r\n\t/**\r\n\t * Defines the type of data fields used for the series.\r\n\t */\r\n\tpublic _dataFields: IConeSeriesDataFields\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IConeSeriesProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IConeSeriesAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IConeSeriesEvents;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\r\n\t\tthis.className = \"ConeSeries\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an element to use for Candlestick\r\n\t * @ignore\r\n\t * @return Element.\r\n\t */\r\n\tprotected createColumnTemplate(): this[\"_column\"] {\r\n\t\treturn new ConeColumn();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an SVG path to use as series mask.\r\n\t *\r\n\t * @return SVG path\r\n\t */\r\n\tprotected getMaskPath(): string {\r\n\t\tlet dx = 0;\r\n\t\tlet dy = 0;\r\n\t\tlet column = this.columns.getIndex(0);\r\n\t\tif(column){\r\n\t\t\tif (this.baseAxis == this.xAxis) {\r\n\t\t\t\tdy = column.coneColumn.bottom.radiusY + 1;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tdx = column.coneColumn.bottom.radiusY + 1;\r\n\t\t\t}\r\n\r\n\t\t\treturn $path.rectToPath({\r\n\t\t\t\tx: -dx,\r\n\t\t\t\ty: 0,\r\n\t\t\t\twidth: this.xAxis.axisLength + dx,\r\n\t\t\t\theight: this.yAxis.axisLength + dy\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Validates data item's elements.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic validateDataElementReal(dataItem: this[\"_dataItem\"]): void {\r\n\t\tsuper.validateDataElementReal(dataItem);\r\n\t\tlet column = dataItem.column;\r\n\t\tif(column){\r\n\t\t\tlet coneColumn = dataItem.column.coneColumn;\r\n\r\n\t\t\tconeColumn.fill = dataItem.column.fill;\r\n\r\n\t\t\tif (this.baseAxis == this.yAxis) {\r\n\t\t\t\tconeColumn.orientation = \"horizontal\";\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconeColumn.orientation = \"vertical\";\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"ConeSeries\"] = ConeSeries;\r\nregistry.registeredClasses[\"ConeSeriesDataItem\"] = ConeSeriesDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/ConeSeries.ts","/**\r\n * Module that defines everything related to building Curved Columns.\r\n * It is a container which has CurvedColumn element which is a Sprite.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Column, IColumnProperties, IColumnAdapters, IColumnEvents } from \"./Column\";\r\nimport { Sprite } from \"../../core/Sprite\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\nimport * as $utils from \"../../core/utils/Utils\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $smoothing from \"../../core/rendering/Smoothing\";\r\nimport { Orientation } from \"../../core/defs/Orientation\";\r\nimport { IPoint } from \"../../core/defs/IPoint\";\r\nimport { percent } from \"../../core/utils/Percent\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[CurvedColumn]].\r\n */\r\nexport interface ICurvedColumnProperties extends IColumnProperties {\r\n\r\n\t/**\r\n\t * Horizontal tension setting of the line (0-1).\r\n\t *\r\n\t * Used for smoothed lines.\r\n\t *\r\n\t * @default 1\r\n\t */\r\n\ttensionX?: number;\r\n\r\n\t/**\r\n\t * Tension\r\n\t */\r\n\ttension?: number;\r\n\r\n\t/**\r\n\t * Orientation of the column\r\n\t *\r\n\t * @default \"vertical\"\r\n\t */\r\n\torientation?: Orientation;\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[CurvedColumn]].\r\n */\r\nexport interface ICurvedColumnEvents extends IColumnEvents { }\r\n\r\n/**\r\n * Defines adapters for [[CurvedColumn]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface ICurvedColumnAdapters extends IColumnAdapters, ICurvedColumnProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Class used to creates CurvedColumns.\r\n *\r\n * @see {@link ICurvedColumnEvents} for a list of available events\r\n * @see {@link ICurvedColumnAdapters} for a list of available Adapters\r\n * @important\r\n */\r\nexport class CurvedColumn extends Column {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: ICurvedColumnProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: ICurvedColumnAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: ICurvedColumnEvents;\r\n\r\n\t/**\r\n\t * The element that holds curved column shape.\r\n\t */\r\n\tpublic curvedColumn: Sprite;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"CurvedColumn\";\r\n\t}\r\n\r\n\t/**\r\n\t * [createAssets description]\r\n\t *\r\n\t * @todo Description\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tprotected createAssets(): void {\r\n\t\tthis.curvedColumn = this.createChild(Sprite);\r\n\t\tthis.curvedColumn.shouldClone = false;\r\n\r\n\t\tthis.setPropertyValue(\"tension\", 0.7);\r\n\r\n\t\tthis.width = percent(120);\r\n\t\tthis.height = percent(120);\r\n\r\n\t\t// some dirty hack so that if user access column, it won't get error\r\n\t\tthis.column = this.curvedColumn;\r\n\t}\r\n\r\n\t/**\r\n\t * Draws the element.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic draw(): void {\r\n\t\tsuper.draw();\r\n\t\tlet w = this.realWidth;\r\n\t\tlet h = this.realHeight;\r\n\t\tlet x = this.realX - this.pixelX;\r\n\t\tlet y = this.realY - this.pixelY;\r\n\r\n\t\tlet points: IPoint[];\r\n\r\n\t\t// TODO can this be removed ?\r\n\t\t$utils.used(this.width);\r\n\r\n\t\tlet tensionX = 1;\r\n\t\tlet tensionY = 1;\r\n\r\n\t\tif (this.orientation == \"vertical\") {\r\n\t\t\ttensionX = this.tension;\r\n\t\t\tpoints = [{ x: 0, y: h + y }, { x: w / 2, y: y }, { x: w, y: h + y }];\r\n\t\t}\r\n\t\telse {\r\n\t\t\ttensionY = this.tension;\r\n\t\t\tpoints = [{ x: x, y: 0 }, { x: x + w, y: h / 2 }, { x: x, y: h }];\r\n\t\t}\r\n\r\n\t\tlet path = $path.moveTo(points[0]) + new $smoothing.Tension(tensionX, tensionY).smooth(points);\r\n\t\tthis.column.path = path;\r\n\t}\r\n\r\n\t/**\r\n\t * Copies all parameters from another [[CurvedColumn]].\r\n\t *\r\n\t * @param source Source CurvedColumn\r\n\t */\r\n\tpublic copyFrom(source: this): void {\r\n\t\tsuper.copyFrom(source)\r\n\t\tif (this.curvedColumn) {\r\n\t\t\tthis.curvedColumn.copyFrom(source.curvedColumn);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Horizontal tension of the curve.\r\n\t *\r\n\t * Tension defines how \"lose\" the line will be.\r\n\t *\r\n\t * 1 is the maximum tension which would result in pointy columns with\r\n\t * straight edges.\r\n\t *\r\n\t * The smaller the tension th wider the column will be.\r\n\t *\r\n\t * @default 0.7\r\n\t * @param value tension (0-1)\r\n\t */\r\n\tpublic set tension(value: number) {\r\n\t\tthis.setPropertyValue(\"tension\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Tension (0-1)\r\n\t */\r\n\tpublic get tension(): number {\r\n\t\treturn this.getPropertyValue(\"tension\");\r\n\t}\r\n\r\n\t/**\r\n\t * Orientation of the column.\r\n\t *\r\n\t * Available options: \"vertical\" (default) and \"horizontal\".\r\n\t *\r\n\t * @default \"vertical\"\r\n\t * @param value Orientation\r\n\t */\r\n\tpublic set orientation(value: Orientation) {\r\n\t\tthis.setPropertyValue(\"orientation\", value, true);\r\n\t}\r\n\r\n\t/**\r\n\t * Orientation\r\n\t */\r\n\tpublic get orientation(): Orientation {\r\n\t\treturn this.getPropertyValue(\"orientation\");\r\n\t}\r\n\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"CurvedColumn\"] = CurvedColumn;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/elements/CurvedColumn.ts","/**\r\n * CurvedColumnSeries module.\r\n *\r\n * Not recommended using if you use scrollbars or your chart is zoomable in some other way.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { ColumnSeries, IColumnSeriesDataFields, IColumnSeriesProperties, IColumnSeriesAdapters, IColumnSeriesEvents, ColumnSeriesDataItem } from \"./ColumnSeries\";\r\nimport { CurvedColumn } from \"../elements/CurvedColumn\";\r\nimport { registry } from \"../../core/Registry\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[CurvedColumnSeries]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class CurvedColumnSeriesDataItem extends ColumnSeriesDataItem {\r\n\r\n\t/**\r\n\t * A sprite used to draw the column.\r\n\t */\r\n\tpublic _column: CurvedColumn;\r\n\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: CurvedColumnSeries;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"CurvedColumnSeriesDataItem\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[CurvedColumnSeries]].\r\n */\r\nexport interface ICurvedColumnSeriesDataFields extends IColumnSeriesDataFields { }\r\n\r\n/**\r\n * Defines properties for [[CurvedColumnSeries]].\r\n */\r\nexport interface ICurvedColumnSeriesProperties extends IColumnSeriesProperties { }\r\n\r\n/**\r\n * Defines events for [[CurvedColumnSeries]].\r\n */\r\nexport interface ICurvedColumnSeriesEvents extends IColumnSeriesEvents { }\r\n\r\n/**\r\n * Defines adapters for [[CurvedColumnSeries]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface ICurvedColumnSeriesAdapters extends IColumnSeriesAdapters, ICurvedColumnSeriesProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines [[Series]] for a curved columns graph.\r\n *\r\n * @see {@link ICurvedColumnSeriesEvents} for a list of available Events\r\n * @see {@link ICurvedColumnSeriesAdapters} for a list of available Adapters\r\n * @important\r\n */\r\nexport class CurvedColumnSeries extends ColumnSeries {\r\n\r\n\t/**\r\n\t * Dfines type of the column.\r\n\t */\r\n\tpublic _column: CurvedColumn;\r\n\r\n\t/**\r\n\t * Defines type of the data item.\r\n\t */\r\n\tpublic _dataItem: CurvedColumnSeriesDataItem;\r\n\r\n\t/**\r\n\t * Defines the type of data fields used for the series.\r\n\t */\r\n\tpublic _dataFields: ICurvedColumnSeriesDataFields\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: ICurvedColumnSeriesProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: ICurvedColumnSeriesAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: ICurvedColumnSeriesEvents;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\r\n\t\tthis.className = \"CurvedColumnSeries\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an element to use for the curved column.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @return Element.\r\n\t */\r\n\tprotected createColumnTemplate(): this[\"_column\"] {\r\n\t\treturn new CurvedColumn();\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Validates data item's elements.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic validateDataElementReal(dataItem: this[\"_dataItem\"]): void {\r\n\r\n\t\tlet column = dataItem.column;\r\n\t\tif (column) {\r\n\t\t\tlet curvedColumn = dataItem.column.curvedColumn;\r\n\r\n\t\t\tcurvedColumn.fill = dataItem.column.fill;\r\n\r\n\t\t\tif (this.baseAxis == this.yAxis) {\r\n\t\t\t\tcolumn.orientation = \"horizontal\";\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tcolumn.orientation = \"vertical\";\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsuper.validateDataElementReal(dataItem);\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"CurvedColumnSeries\"] = CurvedColumnSeries;\r\nregistry.registeredClasses[\"CurvedColumnSeriesDataItem\"] = CurvedColumnSeriesDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/series/CurvedColumnSeries.ts","/**\r\n * DurationAxis module\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { ValueAxis, ValueAxisDataItem, IValueAxisProperties, IValueAxisDataFields, IValueAxisAdapters, IValueAxisEvents } from \"./ValueAxis\";\r\nimport { AxisRenderer } from \"./AxisRenderer\";\r\nimport { TimeUnit } from \"../../core/defs/TimeUnit\";\r\nimport { IMinMaxStep } from \"./ValueAxis\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $math from \"../../core/utils/Math\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data item for [[DurationAxis]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class DurationAxisDataItem extends ValueAxisDataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: DurationAxis;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"DurationAxisDataItem\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[DurationAxis]].\r\n */\r\nexport interface IDurationAxisDataFields extends IValueAxisDataFields { }\r\n\r\n/**\r\n * Defines properties for [[DurationAxis]].\r\n */\r\nexport interface IDurationAxisProperties extends IValueAxisProperties { }\r\n\r\n/**\r\n * Defines events for [[DurationAxis]].\r\n */\r\nexport interface IDurationAxisEvents extends IValueAxisEvents { }\r\n\r\n/**\r\n * Defines adapters for [[DurationAxis]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface IDurationAxisAdapters extends IValueAxisAdapters, IDurationAxisProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Used to create an axis that shows time durations.\r\n *\r\n * ```TypeScript\r\n * // Create the axis\r\n * let xAxis = chart.xAxes.push(new am4charts.DurationAxis());\r\n *\r\n * // Set settings\r\n * xAxis.title.text = \"Time\";\r\n * ```\r\n * ```JavaScript\r\n * // Create the axis\r\n * var valueAxis = chart.xAxes.push(new am4charts.DurationAxis());\r\n *\r\n * // Set settings\r\n * valueAxis.title.text = \"Time\";\r\n * ```\r\n * ```JSON\r\n * \"xAxes\": [{\r\n * \"type\": \"DurationAxis\",\r\n * \"title\": {\r\n * \"text\": \"Time\"\r\n * }\r\n * }]\r\n * ```\r\n *\r\n * @see {@link https://www.amcharts.com/docs/v4/concepts/formatters/formatting-duration/} for mor information about duration formatters.\r\n * @see {@link IDurationAxisEvents} for a list of available Events\r\n * @see {@link IDurationAxisAdapters} for a list of available Adapters\r\n * @important\r\n */\r\nexport class DurationAxis extends ValueAxis {\r\n\r\n\t/**\r\n\t * Defines data fields.\r\n\t */\r\n\tpublic _dataFields: IDurationAxisDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IDurationAxisProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IDurationAxisAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IDurationAxisEvents;\r\n\r\n\t/**\r\n\t * Defines the type of the Date Items.\r\n\t */\r\n\tpublic _dataItem: DurationAxisDataItem;\r\n\r\n\t/**\r\n\t * A base unit (granularity) of data.\r\n\t *\r\n\t * Used to indicate what are the base units of your data.\r\n\t */\r\n\tprotected _baseUnit: TimeUnit = \"second\";\r\n\r\n\t/**\r\n\t * A special duration format to apply axis tooltips.\r\n\t *\r\n\t * Will use same format as for labels, if not set.\r\n\t */\r\n\tprotected _tooltipDurationFormat: string;\r\n\r\n\t/**\r\n\t * Axis date format chosen dynamically based on min/max and baseUnit.\r\n\t *\r\n\t * @readonly\r\n\t */\r\n\tpublic axisDurationFormat: string;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"DurationAxis\";\r\n\r\n\t\tthis.setPropertyValue(\"maxZoomFactor\", 1000000);\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Formats the value according to axis' own [[DurationFormatter]].\r\n\t *\r\n\t * @param value Source value\r\n\t * @return Formatted value\r\n\t */\r\n\tpublic formatLabel(value: number, format?: string): string {\r\n\t\treturn this.durationFormatter.format(value, format || this.axisDurationFormat);\r\n\t}\r\n\r\n\t/**\r\n\t * Adjusts actual min and max scale values so that the axis starts and ends\r\n\t * at \"nice\" values, unless `strictMinMax` is set.\r\n\t *\r\n\t * The `difference` can be something else than `max - min`, because of the\r\n\t * axis breaks.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @todo Description\r\n\t * @param min [description]\r\n\t * @param max [description]\r\n\t * @param difference [description]\r\n\t * @param gridCount [description]\r\n\t * @param strictMode [description]\r\n\t * @return [description]\r\n\t */\r\n\tpublic adjustMinMax(min: number, max: number, difference: number, gridCount: number, strictMode?: boolean): IMinMaxStep {\r\n\r\n\t\tlet minMaxStep: IMinMaxStep;\r\n\r\n\t\tlet timeUnit = this.baseUnit;\r\n\t\t// we don't allow to go to smaller units, setting so to avoid invalidation\r\n\t\tthis.setPropertyValue(\"maxPrecision\", 0);\r\n\r\n\t\tif (timeUnit == \"millisecond\" || timeUnit == \"second\" || timeUnit == \"minute\" || timeUnit == \"hour\") {\r\n\t\t\t// will fail if 0\r\n\t\t\tif (gridCount <= 1) {\r\n\t\t\t\tgridCount = 1;\r\n\t\t\t}\r\n\r\n\t\t\tgridCount = Math.round(gridCount);\r\n\r\n\t\t\tlet initialMin: number = min;\r\n\t\t\tlet initialMax: number = max;\r\n\r\n\t\t\t// in case min and max is the same, use max\r\n\t\t\tif (difference === 0) {\r\n\t\t\t\tdifference = Math.abs(max);\r\n\t\t\t}\r\n\r\n\t\t\tlet step = difference / gridCount;\r\n\r\n\t\t\tlet divisors = [60, 30, 20, 15, 10, 2, 1];\r\n\t\t\tlet realDivisor = 1;\r\n\r\n\t\t\tif (timeUnit == \"hour\") {\r\n\t\t\t\tdivisors = [24, 12, 6, 4, 2, 1];\r\n\t\t\t}\r\n\r\n\t\t\tfor (let divisor of divisors) {\r\n\t\t\t\tif (difference / divisor > gridCount) {\r\n\t\t\t\t\trealDivisor = divisor;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tlet count = Math.ceil(((max - min) / realDivisor) / gridCount);\r\n\r\n\t\t\tlet exponent: number = Math.log(Math.abs(count)) * Math.LOG10E;\r\n\t\t\tlet power = Math.pow(10, Math.floor(exponent)) / 10;\r\n\t\t\tlet reducedCount = count / power;\r\n\r\n\t\t\t// find closest to divisor\r\n\t\t\tlet closest = $math.closest(divisors, reducedCount);\r\n\t\t\tcount = closest * power;\r\n\r\n\t\t\tstep = realDivisor * count;\r\n\r\n\t\t\t// TODO can this be removed ?\r\n\t\t\tthis.durationFormatter.getValueUnit(step, this.baseUnit);\r\n\r\n\t\t\tmin = Math.floor(min / step) * step;\r\n\t\t\tmax = Math.ceil(max / step) * step;\r\n\r\n\t\t\tif (strictMode) {\r\n\t\t\t\tmin -= step;\r\n\t\t\t\tif (min < 0 && initialMin >= 0) {\r\n\t\t\t\t\tmin = 0;\r\n\t\t\t\t}\r\n\t\t\t\tmax += step;\r\n\r\n\t\t\t\tif (max > 0 && initialMax <= 0) {\r\n\t\t\t\t\tmax = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tminMaxStep = { min: min, max: max, step: step };\r\n\t\t}\r\n\t\telse {\r\n\t\t\tminMaxStep = super.adjustMinMax(min, max, difference, gridCount, strictMode);\r\n\t\t}\r\n\r\n\t\t// choose duration formatter based on step\r\n\t\tthis.axisDurationFormat = this.durationFormatter.getFormat(minMaxStep.step, minMaxStep.max, this.baseUnit);\r\n\r\n\t\treturn minMaxStep;\r\n\t}\r\n\r\n\t/**\r\n\t * A special duration format to apply axis tooltips.\r\n\t *\r\n\t * Will use same format as for labels, if not set.\r\n\t *\r\n\t * @see {@link https://www.amcharts.com/docs/v4/concepts/formatters/formatting-duration/} for mor information.\r\n\t * @param value Duration format for axis labels\r\n\t */\r\n\tpublic set tooltipDurationFormat(value: string) {\r\n\t\tthis._tooltipDurationFormat = value;\r\n\t}\r\n\r\n\t/**\r\n\t * @return Duration format for axis labels\r\n\t */\r\n\tpublic get tooltipDurationFormat(): string {\r\n\t\treturn this._tooltipDurationFormat;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns text to show in a axis tooltip, based on specific position within\r\n\t * axis.\r\n\t *\r\n\t * The label will be formatted as per [[NumberFormatter]] set for the whole\r\n\t * chart, or explicitly for this Axis.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param position Position (px)\r\n\t * @return Label (numeric value)\r\n\t */\r\n\tpublic getTooltipText(position: number): string {\r\n\t\tlet value: number = $math.round(this.positionToValue(position), this._stepDecimalPlaces);\r\n\t\treturn this.adapter.apply(\"getTooltipText\", this.formatLabel(value, this.tooltipDurationFormat));\r\n\t}\r\n\r\n\t/**\r\n\t * A base unit (granularity) of data.\r\n\t *\r\n\t * Used to indicate what are the base units of your data.\r\n\t *\r\n\t * Available options: \"millisecond\", \"second\" (default), \"minute\", \"hour\",\r\n\t * \"day\", \"week\", \"month\", \"year\".\r\n\t *\r\n\t * @default \"second\"\r\n\t * @param timeUnit\r\n\t */\r\n\tpublic set baseUnit(timeUnit: TimeUnit) {\r\n\t\tif (this._baseUnit != timeUnit) {\r\n\t\t\tthis._baseUnit = timeUnit;\r\n\t\t\tthis.durationFormatter.baseUnit = timeUnit;\r\n\t\t\tthis.invalidate();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @return Base unit\r\n\t */\r\n\tpublic get baseUnit(): TimeUnit {\r\n\t\treturn this._baseUnit;\r\n\t}\r\n\r\n\t/**\r\n\t * Copies all properties and related data from a different instance of Axis.\r\n\t *\r\n\t * @param source Source Axis\r\n\t */\r\n\tpublic copyFrom(source: this): void {\r\n\t\tsuper.copyFrom(source);\r\n\t\tthis.baseUnit = source.baseUnit;\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"DurationAxis\"] = DurationAxis;\r\nregistry.registeredClasses[\"DurationAxisDataItem\"] = DurationAxisDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/axes/DurationAxis.ts","/**\r\n * Bullet module\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Bullet, IBulletProperties, IBulletAdapters, IBulletEvents } from \"./Bullet\";\r\nimport { Circle } from \"../../core/elements/Circle\";\r\nimport { registry } from \"../../core/Registry\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[Bullet]]\r\n */\r\nexport interface ICircleBulletProperties extends IBulletProperties { }\r\n\r\n/**\r\n * Defines events for [[Bullet]]\r\n */\r\nexport interface ICircleBulletEvents extends IBulletEvents { }\r\n\r\n/**\r\n * Defines adapters\r\n * Includes both the [[Adapter]] definitions and properties\r\n * @see {@link Adapter}\r\n */\r\nexport interface ICircleBulletAdapters extends IBulletAdapters, ICircleBulletProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Creates a bullet with a textual label.\r\n *\r\n * Uses [[Label]] instance to draw the label, so the label itself is\r\n * configurable.\r\n *\r\n * @see {@link IBulletEvents} for a list of available events\r\n * @see {@link IBulletAdapters} for a list of available Adapters\r\n * @todo Usage example\r\n * @important\r\n */\r\nexport class CircleBullet extends Bullet {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: ICircleBulletProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: ICircleBulletAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: ICircleBulletEvents;\r\n\r\n\t/**\r\n\t * A label (textual) element for the bullet.\r\n\t */\r\n\tpublic circle: Circle;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\r\n\t\tthis.className = \"CircleBullet\";\r\n\r\n\t\tlet circle = this.createChild(Circle);\r\n\t\tcircle.shouldClone = false;\r\n\t\tcircle.radius = 5;\r\n\t\tcircle.isMeasured = false;\r\n\t\tthis.circle = circle;\r\n\t}\r\n\r\n\t/**\r\n\t * Copies all proprities and related stuff from another instance of\r\n\t * [[CircleBullet]].\r\n\t *\r\n\t * @param source Source element\r\n\t */\r\n\tpublic copyFrom(source: this): void {\r\n\t\tsuper.copyFrom(source);\r\n\t\tthis.circle.copyFrom(source.circle);\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"CircleBullet\"] = CircleBullet;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/elements/CircleBullet.ts","/**\r\n * Bullet module\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Bullet, IBulletProperties, IBulletAdapters, IBulletEvents } from \"./Bullet\";\r\nimport { Sprite } from \"../../core/Sprite\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport * as $path from \"../../core/rendering/Path\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines properties for [[Bullet]]\r\n */\r\nexport interface IErrorBulletProperties extends IBulletProperties { }\r\n\r\n/**\r\n * Defines events for [[Bullet]]\r\n */\r\nexport interface IErrorBulletEvents extends IBulletEvents { }\r\n\r\n/**\r\n * Defines adapters\r\n * Includes both the [[Adapter]] definitions and properties\r\n * @see {@link Adapter}\r\n */\r\nexport interface IErrorBulletAdapters extends IBulletAdapters, IErrorBulletProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Creates a bullet with a textual label.\r\n *\r\n * Uses [[Label]] instance to draw the label, so the label itself is\r\n * configurable.\r\n *\r\n * @see {@link IBulletEvents} for a list of available events\r\n * @see {@link IBulletAdapters} for a list of available Adapters\r\n * @todo Usage example\r\n * @important\r\n */\r\nexport class ErrorBullet extends Bullet {\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: IErrorBulletProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: IErrorBulletAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: IErrorBulletEvents;\r\n\r\n\tpublic errorLine:Sprite;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\r\n\t\tthis.className = \"ErrorBullet\";\r\n\t\tthis.errorLine = this.createChild(Sprite);\r\n\t\tthis.errorLine.shouldClone = false;\r\n\t\tthis.width = 20;\r\n\t\tthis.height = 20;\r\n\t\tthis.strokeOpacity = 1;\r\n\t\tthis.isDynamic = true;\r\n\t}\r\n\r\n\r\n\tvalidatePosition(){\r\n\t\tsuper.validatePosition();\r\n\t\tlet w = this.pixelWidth / 2;\r\n\t\tlet h = this.pixelHeight / 2;\r\n\r\n\t\tthis.errorLine.path = $path.moveTo({x:-w, y:-h}) + $path.lineTo({x:w, y:-h}) + $path.moveTo({x:0, y:-h}) + $path.lineTo({x:0, y:h}) + $path.moveTo({x:-w, y:h}) + $path.lineTo({x:w, y:h});\r\n\t}\r\n\r\n\t/**\r\n\t * Copies all proprities and related stuff from another instance of\r\n\t * [[ErrorBullet]].\r\n\t *\r\n\t * @param source Source element\r\n\t */\r\n\tpublic copyFrom(source: this): void {\r\n\t\tsuper.copyFrom(source);\r\n\t\tthis.errorLine.copyFrom(source.errorLine);\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"ErrorBullet\"] = ErrorBullet;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/elements/ErrorBullet.ts","/**\r\n * Functionality for drawing simple NavigationBar.\r\n */\r\n\r\n/**\r\n * ============================================================================\r\n * IMPORTS\r\n * ============================================================================\r\n * @hidden\r\n */\r\nimport { Component, IComponentProperties, IComponentAdapters, IComponentEvents, IComponentDataFields } from \"../../core/Component\";\r\nimport { Sprite } from \"../../core/Sprite\";\r\nimport { DataItem } from \"../../core/DataItem\";\r\nimport { ListTemplate, ListDisposer } from \"../../core/utils/List\";\r\nimport { TextLink } from \"../../core/elements/TextLink\";\r\nimport { Triangle } from \"../../core/elements/Triangle\";\r\nimport { registry } from \"../../core/Registry\";\r\nimport { InterfaceColorSet } from \"../../core/utils/InterfaceColorSet\";\r\nimport { percent } from \"../../core/utils/Percent\";\r\nimport * as $iter from \"../../core/utils/Iterator\";\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * DATA ITEM\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines a [[DataItem]] for [[NavigationBar]].\r\n *\r\n * @see {@link DataItem}\r\n */\r\nexport class NavigationBarDataItem extends DataItem {\r\n\r\n\t/**\r\n\t * Defines a type of [[Component]] this data item is used for.\r\n\t */\r\n\tpublic _component!: NavigationBar;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.className = \"NavigationBarDataItem\";\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Name of the navigation bar item.\r\n\t *\r\n\t * @param value Name\r\n\t */\r\n\tpublic set name(value: string) {\r\n\t\tthis.setProperty(\"name\", value);\r\n\t}\r\n\r\n\t/**\r\n\t * @return Name\r\n\t */\r\n\tpublic get name(): string {\r\n\t\treturn this.properties[\"name\"];\r\n\t}\r\n\r\n}\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * REQUISITES\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * Defines data fields for [[NavigationBar]].\r\n */\r\nexport interface INavigationBarDataFields extends IComponentDataFields {\r\n\r\n\t/**\r\n\t * Name of nav var item.\r\n\t */\r\n\tname?: string;\r\n\r\n}\r\n\r\n/**\r\n * Defines properties for [[NavigationBar]].\r\n */\r\nexport interface INavigationBarProperties extends IComponentProperties {\r\n\r\n}\r\n\r\n/**\r\n * Defines events for [[NavigationBar]].\r\n */\r\nexport interface INavigationBarEvents extends IComponentEvents { }\r\n\r\n/**\r\n * Defines adapters for [[NavigationBar]].\r\n *\r\n * @see {@link Adapter}\r\n */\r\nexport interface INavigationBarAdapters extends IComponentAdapters, INavigationBarProperties { }\r\n\r\n\r\n/**\r\n * ============================================================================\r\n * MAIN CLASS\r\n * ============================================================================\r\n * @hidden\r\n */\r\n\r\n/**\r\n * NavigationBar class can be used to create a multi-level breadcrumb-style\r\n * navigation control.\r\n *\r\n * @see {@link INavigationBarEvents} for a list of available events\r\n * @see {@link INavigationBarAdapters} for a list of available Adapters\r\n * @todo Implement better\r\n * @important\r\n */\r\nexport class NavigationBar extends Component {\r\n\r\n\t/**\r\n\t * Defines data fields.\r\n\t */\r\n\tpublic _dataFields: INavigationBarDataFields;\r\n\r\n\t/**\r\n\t * Defines available properties.\r\n\t */\r\n\tpublic _properties!: INavigationBarProperties;\r\n\r\n\t/**\r\n\t * Defines available adapters.\r\n\t */\r\n\tpublic _adapter!: INavigationBarAdapters;\r\n\r\n\t/**\r\n\t * Defines available events.\r\n\t */\r\n\tpublic _events!: INavigationBarEvents;\r\n\r\n\t/**\r\n\t * A list of breadcrumbs (links) in the nav bar.\r\n\t */\r\n\tpublic links: ListTemplate;\r\n\r\n\t/**\r\n\t * [_linksIterator description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _linksIterator: $iter.ListIterator;\r\n\r\n\t/**\r\n\t * [_separatorsIterator description]\r\n\t *\r\n\t * @todo Description\r\n\t */\r\n\tprotected _separatorsIterator: $iter.ListIterator;\r\n\r\n\t/**\r\n\t * A reference to the link which is currently active.\r\n\t */\r\n\tpublic activeLink: TextLink;\r\n\r\n\t/**\r\n\t * A list of elements used as nav bar item separators.\r\n\t */\r\n\tpublic separators: ListTemplate;\r\n\r\n\t/**\r\n\t * Identifies the type of the [[DataItem]] used in this element.\r\n\t */\r\n\tpublic _dataItem!: NavigationBarDataItem;\r\n\r\n\t/**\r\n\t * Constructor\r\n\t */\r\n\tconstructor() {\r\n\r\n\t\t// Init\r\n\t\tsuper();\r\n\t\tthis.className = \"NavigationBar\";\r\n\r\n\t\tlet interfaceColors = new InterfaceColorSet();\r\n\r\n\t\tlet textLink = new TextLink();\r\n\t\ttextLink.valign = \"middle\";\r\n\t\ttextLink.paddingTop = 8;\r\n\t\ttextLink.paddingBottom = 8;\r\n\r\n\t\tthis.paddingBottom = 2;\r\n\r\n\t\tthis.links = new ListTemplate(textLink);\r\n\t\tthis._disposers.push(new ListDisposer(this.links));\r\n\t\tthis._disposers.push(textLink);\r\n\r\n\t\tthis._linksIterator = new $iter.ListIterator(this.links, () => this.links.create());\r\n\t\tthis._linksIterator.createNewItems = true;\r\n\r\n\t\tlet triangle = new Triangle();\r\n\t\ttriangle.direction = \"right\";\r\n\t\ttriangle.width = 8;\r\n\t\ttriangle.height = 12;\r\n\t\ttriangle.fill = interfaceColors.getFor(\"alternativeBackground\");\r\n\t\ttriangle.fillOpacity = 0.5;\r\n\t\ttriangle.valign = \"middle\";\r\n\t\ttriangle.marginLeft = 10;\r\n\t\ttriangle.marginRight = 10;\r\n\r\n\t\tthis.separators = new ListTemplate(triangle);\r\n\t\tthis._disposers.push(new ListDisposer(this.separators));\r\n\t\tthis._disposers.push(triangle);\r\n\r\n\t\tlet activeLink = new TextLink();\r\n\t\tthis.activeLink = activeLink;\r\n\t\tactiveLink.copyFrom(textLink);\r\n\t\tactiveLink.valign = \"middle\";\r\n\t\tactiveLink.fontWeight = \"bold\";\r\n\r\n\t\tthis.width = percent(100);\r\n\t\tthis.layout = \"grid\";\r\n\t\tthis.dataFields.name = \"name\";\r\n\r\n\t\t// Apply theme\r\n\t\tthis.applyTheme();\r\n\t}\r\n\r\n\t/**\r\n\t * Completely redraws the navigation bar.\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t */\r\n\tpublic validateDataElements(): void {\r\n\t\tthis.removeChildren();\r\n\t\tthis._linksIterator.reset();\r\n\t\tsuper.validateDataElements();\r\n\t\t//@todo: dispose\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a visual element for a data item (nav item).\r\n\t *\r\n\t * @ignore Exclude from docs\r\n\t * @param dataItem Data item\r\n\t */\r\n\tpublic validateDataElement(dataItem: this[\"_dataItem\"]): void {\r\n\t\tsuper.validateDataElement(dataItem);\r\n\r\n\t\tlet textLink: TextLink;\r\n\t\tif (dataItem.index < this.dataItems.length - 1) {\r\n\t\t\ttextLink = this._linksIterator.getLast();\r\n\t\t\ttextLink.parent = this;\r\n\t\t\tlet separator = this.separators.create();\r\n\t\t\tseparator.parent = this;\r\n\t\t\tseparator.valign = \"middle\";\r\n\t\t}\r\n\t\telse {\r\n\t\t\ttextLink = this.activeLink;\r\n\t\t\ttextLink.events.copyFrom(this.links.template.events);\r\n\t\t\ttextLink.hide(0);\r\n\t\t\ttextLink.show();\r\n\t\t\ttextLink.parent = this;\r\n\t\t}\r\n\t\ttextLink.dataItem = dataItem;\r\n\t\ttextLink.text = dataItem.name;\r\n\t\ttextLink.validate();\r\n\t}\r\n}\r\n\r\n/**\r\n * Register class in system, so that it can be instantiated using its name from\r\n * anywhere.\r\n *\r\n * @ignore\r\n */\r\nregistry.registeredClasses[\"NavigationBar\"] = NavigationBar;\r\nregistry.registeredClasses[\"NavigationBarDataItem\"] = NavigationBarDataItem;\r\n\n\n\n// WEBPACK FOOTER //\n// ../../../../../src/.internal/charts/elements/NavigationBar.ts","import * as m from \"../es2015/charts\";\nwindow.am4charts = m;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./charts.js\n// module id = null\n// module chunks = "],"sourceRoot":""}