blue-chestnut-solar-expert 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/eraser-icon.house-icon.icon-selector.map-draw.move-icon.octagon-minus-icon.search-icon.solar-expert.solar-system-form.entry.cjs.js.map +1 -0
- package/dist/cjs/{map-draw_3.cjs.entry.js → eraser-icon_9.cjs.entry.js} +376 -52
- package/dist/cjs/eraser-icon_9.cjs.entry.js.map +1 -0
- package/dist/cjs/{index-BFx4q5Ui.js → index-C_q90Wl2.js} +3 -3
- package/dist/cjs/{index-BFx4q5Ui.js.map → index-C_q90Wl2.js.map} +1 -1
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/solar-calculator.cjs.entry.js +4 -4
- package/dist/cjs/solar-calculator.cjs.entry.js.map +1 -1
- package/dist/cjs/solar-calculator.entry.cjs.js.map +1 -1
- package/dist/cjs/stencil-library.cjs.js +2 -2
- package/dist/collection/collection-manifest.json +6 -0
- package/dist/collection/components/icons/eraser.js +18 -0
- package/dist/collection/components/icons/eraser.js.map +1 -0
- package/dist/collection/components/icons/house.js +18 -0
- package/dist/collection/components/icons/house.js.map +1 -0
- package/dist/collection/components/icons/icon.js +57 -0
- package/dist/collection/components/icons/icon.js.map +1 -0
- package/dist/collection/components/icons/move.js +18 -0
- package/dist/collection/components/icons/move.js.map +1 -0
- package/dist/collection/components/icons/octagonMinus.js +18 -0
- package/dist/collection/components/icons/octagonMinus.js.map +1 -0
- package/dist/collection/components/icons/search.js +18 -0
- package/dist/collection/components/icons/search.js.map +1 -0
- package/dist/collection/components/map-draw/map-draw.js +10 -8
- package/dist/collection/components/map-draw/map-draw.js.map +1 -1
- package/dist/collection/components/solar-calculator/solar-calculator.js +2 -2
- package/dist/collection/components/solar-calculator/solar-calculator.js.map +1 -1
- package/dist/collection/components/solar-expert/solar-expert.js +25 -13
- package/dist/collection/components/solar-expert/solar-expert.js.map +1 -1
- package/dist/collection/components/solar-system-form/solar-system-form.js +107 -24
- package/dist/collection/components/solar-system-form/solar-system-form.js.map +1 -1
- package/dist/collection/output.css +24 -0
- package/dist/collection/types/lang.js.map +1 -1
- package/dist/collection/utils/lang/english.js +40 -0
- package/dist/collection/utils/lang/english.js.map +1 -1
- package/dist/collection/utils/lang/general.js +23 -3
- package/dist/collection/utils/lang/general.js.map +1 -1
- package/dist/collection/utils/lang/german.js +74 -0
- package/dist/collection/utils/lang/german.js.map +1 -1
- package/dist/collection/utils/lang/spanish.js +75 -0
- package/dist/collection/utils/lang/spanish.js.map +1 -0
- package/dist/components/eraser-icon.d.ts +11 -0
- package/dist/components/eraser-icon.js +9 -0
- package/dist/components/eraser-icon.js.map +1 -0
- package/dist/components/house-icon.d.ts +11 -0
- package/dist/components/house-icon.js +9 -0
- package/dist/components/house-icon.js.map +1 -0
- package/dist/components/icon-selector.d.ts +11 -0
- package/dist/components/icon-selector.js +9 -0
- package/dist/components/icon-selector.js.map +1 -0
- package/dist/components/index.js +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/map-draw.js +1 -1
- package/dist/components/move-icon.d.ts +11 -0
- package/dist/components/move-icon.js +9 -0
- package/dist/components/move-icon.js.map +1 -0
- package/dist/components/octagon-minus-icon.d.ts +11 -0
- package/dist/components/octagon-minus-icon.js +9 -0
- package/dist/components/octagon-minus-icon.js.map +1 -0
- package/dist/components/p-C1W188Ni.js +81 -0
- package/dist/components/p-C1W188Ni.js.map +1 -0
- package/dist/components/p-CPzvPKKZ.js +33 -0
- package/dist/components/p-CPzvPKKZ.js.map +1 -0
- package/dist/components/p-Ca4aCGPQ.js +33 -0
- package/dist/components/p-Ca4aCGPQ.js.map +1 -0
- package/dist/components/{p-DuF8Bxfn.js → p-CzP6SYTZ.js} +289 -28
- package/dist/components/p-CzP6SYTZ.js.map +1 -0
- package/dist/components/p-DFkHeRrz.js +33 -0
- package/dist/components/p-DFkHeRrz.js.map +1 -0
- package/dist/components/{p-C2Mo0x2g.js → p-DRNQUQ1y.js} +51 -57
- package/dist/components/p-DRNQUQ1y.js.map +1 -0
- package/dist/components/p-Dpqxsv0f.js +33 -0
- package/dist/components/p-Dpqxsv0f.js.map +1 -0
- package/dist/components/p-KbJZx_Vg.js +33 -0
- package/dist/components/p-KbJZx_Vg.js.map +1 -0
- package/dist/components/search-icon.d.ts +11 -0
- package/dist/components/search-icon.js +9 -0
- package/dist/components/search-icon.js.map +1 -0
- package/dist/components/solar-calculator.js +3 -3
- package/dist/components/solar-calculator.js.map +1 -1
- package/dist/components/solar-expert.js +65 -18
- package/dist/components/solar-expert.js.map +1 -1
- package/dist/components/solar-system-form.js +1 -1
- package/dist/esm/eraser-icon.house-icon.icon-selector.map-draw.move-icon.octagon-minus-icon.search-icon.solar-expert.solar-system-form.entry.js.map +1 -0
- package/dist/esm/{map-draw_3.entry.js → eraser-icon_9.entry.js} +372 -54
- package/dist/esm/eraser-icon_9.entry.js.map +1 -0
- package/dist/esm/{index-D0YnIAAN.js → index-aHOvta3L.js} +3 -3
- package/dist/esm/{index-D0YnIAAN.js.map → index-aHOvta3L.js.map} +1 -1
- package/dist/esm/loader.js +3 -3
- package/dist/esm/solar-calculator.entry.js +4 -4
- package/dist/esm/solar-calculator.entry.js.map +1 -1
- package/dist/esm/stencil-library.js +3 -3
- package/dist/stencil-library/eraser-icon.house-icon.icon-selector.map-draw.move-icon.octagon-minus-icon.search-icon.solar-expert.solar-system-form.entry.esm.js.map +1 -0
- package/dist/stencil-library/p-3342721a.entry.js +44 -0
- package/dist/stencil-library/p-3342721a.entry.js.map +1 -0
- package/dist/stencil-library/{p-D0YnIAAN.js → p-aHOvta3L.js} +3 -3
- package/dist/stencil-library/{p-D0YnIAAN.js.map → p-aHOvta3L.js.map} +1 -1
- package/dist/stencil-library/p-f22828b8.entry.js +2 -0
- package/dist/stencil-library/p-f22828b8.entry.js.map +1 -0
- package/dist/stencil-library/solar-calculator.entry.esm.js.map +1 -1
- package/dist/stencil-library/stencil-library.esm.js +1 -1
- package/dist/types/components/icons/eraser.d.ts +3 -0
- package/dist/types/components/icons/house.d.ts +3 -0
- package/dist/types/components/icons/icon.d.ts +4 -0
- package/dist/types/components/icons/move.d.ts +3 -0
- package/dist/types/components/icons/octagonMinus.d.ts +3 -0
- package/dist/types/components/icons/search.d.ts +3 -0
- package/dist/types/components/solar-expert/solar-expert.d.ts +0 -1
- package/dist/types/components/solar-system-form/solar-system-form.d.ts +9 -3
- package/dist/types/components.d.ts +88 -0
- package/dist/types/types/lang.d.ts +40 -0
- package/dist/types/utils/lang/german.d.ts +2 -0
- package/dist/types/utils/lang/spanish.d.ts +2 -0
- package/package.json +1 -1
- package/dist/cjs/map-draw.solar-expert.solar-system-form.entry.cjs.js.map +0 -1
- package/dist/cjs/map-draw_3.cjs.entry.js.map +0 -1
- package/dist/components/p-C2Mo0x2g.js.map +0 -1
- package/dist/components/p-DuF8Bxfn.js.map +0 -1
- package/dist/esm/map-draw.solar-expert.solar-system-form.entry.js.map +0 -1
- package/dist/esm/map-draw_3.entry.js.map +0 -1
- package/dist/stencil-library/map-draw.solar-expert.solar-system-form.entry.esm.js.map +0 -1
- package/dist/stencil-library/p-319691e6.entry.js +0 -2
- package/dist/stencil-library/p-319691e6.entry.js.map +0 -1
- package/dist/stencil-library/p-642688b2.entry.js +0 -44
- package/dist/stencil-library/p-642688b2.entry.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["renderRGB","rgb","mask","canvas","document","createElement","width","height","dw","dh","ctx","getContext","img","getImageData","y","x","rgbIdx","Math","floor","imgIdx","factor","data","round","rasters","putImageData","renderSolarPanel","solarPanel","panelWidth","panelHeight","azimuthAngle","pitchAngle","pixelPosition","cos","PI","horizontal","save","translate","rotate","fillStyle","fillRect","strokeStyle","lineWidth","strokeRect","restore","renderCombinedWithZoom","zoom","rgbCanvas","undefined","imgData","zoomedWidth","zoomedHeight","startX","startY","zoomedImgData","ImageData","i","zoomedX","zoomedY","zoomedI","DOTTED_LINE_COLOR","ROW_SPACING","COLUMN_SPACING","BORDER_INSET","DEFAULT_SUNNINESS","projectPointPerpendicularToLine","lastPoint","secondLastPoint","dx","dy","perpDx","perpDy","perpLength","sqrt","normalizedPerpDx","normalizedPerpDy","vectorToMouse","projectionLength","drawPolygon","polygonCtx","polygonCanvas","polygon","shiftKeyPressed","mousePoint","strokeColor","fillColor","beginPath","points","forEach","point","index","moveTo","lineTo","closed","fill","length","stroke","projectedPoint","drawPerpendicularDottedLine","startPoint","endPoint","drawCircle","radius","distance","pow","arc","dashPattern","setLineDash","isPointInPolygon","num_vertices","inside","p1","p2","min","max","x_intersection","polygonKeyboardCombinations","key","description","moveTool","name","ariaLabel","icon","cursor","keyboardShortcut","explanation","roofTool","keyboardCombinations","obstructionTool","deleteTool","tools","DEFAULT_SOLAR_EXPERT_CONFIG","openRoofColor","closedRoofColor","openObstructionColor","closedObstructionColor","roofPolygonFillColor","obstructionPolygonFillColor","roofPolygonHoverFillColor","obstructionPolygonHoverFillColor","roofPolygonSelectedFillColor","obstructionPolygonSelectedFillColor","DEFAULT_SOLAR_PANEL_TYPE","widthMeters","heightMeters","kWattPeak","efficiency","price","getFillColor","selectedPolygon","hoveredPolygon","_id","config","isHovered","type","isSelected","byteToHex","push","toString","slice","unsafeStringify","arr","offset","toLowerCase","getRandomValues","rnds8","Uint8Array","rng","crypto","bind","Error","randomUUID","native","v4","options","buf","rnds","random","calculatePolygonArea","area","j","abs","azimuthToCardinal","azimuth","latLngToPixel","bounds","latLng","latToPixel","lat","south","north","lngToPixel","lng","west","east","longitude","latitude","getPixelInMeters","rgbTiff","latDiff","pixelHeight","pixelInMeters","projectPoint","angle","sin","projectPolygon","map","details","offsetPolygon","offsetX","offsetY","minX","minY","maxX","maxY","newPoints","equalsPoints","point1","point2","intersects","line1","line2","start","end","p3","p4","d1","d2","d3","d4","getBestFittingRoofSegment","roof","roofSegmentStats","polygonBounds","p","bestSegment","bestIoU","segment","sw","boundingBox","ne","segmentBounds","interLeft","interRight","interTop","interBottom","interWidth","interHeight","intersectionArea","polygonArea","segmentArea","unionArea","iou","generateGrid","minMax","anker","rowSpacing","columnSpacing","grid","widthCount","ceil","heightCount","widthOffset","heightOffset","row","positionedSolarPanel","panel","getSolarPanelLines","lines","solarPanelInObstacle","obstacle","nextPoint","border","line","solarPanelInPolygon","isPanelObstructed","obstacles","getSolarPanelsInPolygon","solarPanels","newRow","isObstructed","getOptimalSolarPosition","console","log","horizontalSolarPanel","verticalSolarPanel","numberOfPanels","solarPanelsInPolygon","numberOfPanelsInPolygon","reduce","acc","projectObstacles","inset","result","offsetObstacle","projectedObstacle","insetObstacle","insetPolygon","isClockwise","sum","curr","next","isClockwisePolygon","insetPoints","prev","v1","v2","perp1","perp2","length1","length2","bisector","bisectorLength","insetPoint","getOptimalSolarPositionFully","insetRoof","projectedOffset","projectedObstacles","horizontalSolarPanels","unprojectedPanels","flat","unprojectedPanel","offsetPosition","en","mapDraw","noPolygonSelected","noAddressSelected","information","calculateSolarPanels","panels","pitch","obstruction","delete","move","languageStrings","es","de","getLanguageStrings","lang","outputCss","FACTOR","MapDraw","language","apiKey","loadingState","draggedPointIndex","hoveredPointIndex","altKeyPressed","currentTool","roofPolygons","roofPolygonsSolarPanels","obstructionPolygons","buildingInsights","showAzimuth","canvasElement","getCurrentPolygon","this","componentDidLoad","requestAnimationFrame","rect","getBoundingClientRect","drawMap","sizeCanvas","getBuildingInsights","sameLocation","center","clearRect","fetchSolarData","alert","getBuildingImages","handleMouseMove","event","clientX","left","clientY","top","currentPolygon","newHoveredPointIndex","findIndex","newHoveredPolygon","Object","values","JSON","stringify","drawPolygons","convertedSolarPanel","positionedPanels","deletePolygon","handleKeyDown","target","HTMLInputElement","shiftKey","altKey","pop","pressedKey","tool","find","t","handleKeyUp","handleMouseDown","contains","pointIndex","newPolygon","uuidv4","firstPoint","closePolygon","handleMouseUp","metersInPixels","bestMatch","solarPotential","azimuthDegrees","pitchDegrees","sunniness","assignedRoofStats","stats","sunshineQuantiles","buildingStats","handlePitchChange","parseFloat","value","handleAzimuthChange","handleToolSelect","render","h","class","toolStrings","title","onClick","style","ref","el","toFixed","onKeyDown","e","blur","systemConfigs","Eraser","d","House","Move","OctagonMinus","SolarExpert","Env","GOOGLE_MAPS_API_KEY","isLoaded","autocomplete","place","inputElement","componentWillLoad","loadGoogleMapsScript","loader","Loader","libraries","places","importLibrary","initializeAutocomplete","error","Autocomplete","addListener","getPlace","geometry","location","createIcons","icons","Search","nameAttr","placeholder","v","lim","l","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","a","b","c","f","hex","h1","h2","eq","isShort","r","g","hexParse","str","len","ret","alpha","hexString","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","hueValue","rgb2hsl","range","calln","Array","isArray","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","m","exec","deg","hslString","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","unpack","unpacked","keys","tkeys","ok","nk","replace","parseInt","names","nameParse","transparent","RGB_RE","rgbParse","rgbString","to","from","interpolate","rgb1","rgb2","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","charAt","Color","constructor","_rgb","_valid","valid","obj","mix","color","weight","c1","c2","w2","w1","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","noop","uid","id","isNullOrUndef","prototype","call","isObject","isNumberFinite","Number","isFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","toDimension","callback","fn","args","thisArg","apply","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","datasetIndex","source","create","klen","isValidKey","indexOf","_merger","tval","sval","merge","sources","merger","current","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","o","_splitKey","parts","split","part","_getKeyResolver","resolveObjectKey","resolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","size","item","has","_isClickEvent","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","niceNum","roundedRange","niceRange","fraction","niceFraction","_factorize","sort","isNonPrimitive","Symbol","toPrimitive","isNumber","isNaN","almostWhole","rounded","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","atan2","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","_lookup","table","cmp","hi","lo","mid","_lookupByKey","last","ti","_rlookupByKey","_filterBetween","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","defineProperty","configurable","enumerable","method","base","res","object","unlistenArrayEvents","stub","splice","_arrayUnique","items","set","Set","requestAnimFrame","window","throttled","argsToUse","ticking","debounce","delay","timeout","clearTimeout","setTimeout","_toLeftRightCenter","align","_alignStartEnd","_textX","right","rtl","check","_getStartAndCountOfVisiblePoints","meta","animationsDisabled","pointCount","count","_sorted","iScale","vScale","_parsed","spanGaps","dataset","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","distanceToDefinedLo","distanceToDefinedHi","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","colors","applyAnimationsDefaults","defaults","duration","easing","loop","describe","_fallback","_indexable","_scriptable","properties","active","animation","resize","show","animations","visible","hide","applyLayoutsDefaults","autoPadding","padding","bottom","intlCache","Map","getNumberFormat","locale","cacheKey","formatter","get","Intl","NumberFormat","formatNumber","num","format","formatters","numeric","tickValue","ticks","chart","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","includes","Ticks","applyScaleDefaults","display","beginAtZero","clip","grace","drawOnChartArea","drawTicks","tickLength","tickWidth","_ctx","tickColor","dash","dashOffset","text","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","startsWith","overrides","descriptors","getScope$1","node","root","scope","Defaults","_descriptors","_appliers","backgroundColor","borderColor","datasets","devicePixelRatio","context","platform","getDevicePixelRatio","elements","events","font","family","lineHeight","hover","hoverBackgroundColor","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","override","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","writable","local","appliers","toFontString","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","jlen","thing","nestedThing","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","resetTransform","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","rad","drawImage","ellipse","closePath","SQRT1_2","borderWidth","_isPointInArea","margin","clipArea","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","setRenderOpts","opts","translation","textAlign","textBaseline","decorateText","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","decorationWidth","drawBackdrop","oldColor","renderText","strokeWidth","backdrop","strokeText","maxWidth","fillText","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","matches","match","numberOrZero","_readValueToProps","props","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","warn","resolve","inputs","info","_addGrace","minmax","change","keepZero","add","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","finalRootScopes","_resolve","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","proxy","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","isScriptable","isIndexable","readKey","prefix","needsSubResolver","_resolveScriptable","_resolveArray","getValue","join","createSubResolver","filter","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","parse","EPSILON","getPoint","skip","getValueAxis","splineCurve","middlePoint","afterPoint","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","controlPoints","cubicInterpolationMode","tension","_isDomSupported","_getParentNode","domNode","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","ownerDocument","defaultView","getStyle","getPropertyValue","positions","getPositionedStyle","styles","suffix","pos","useOffsetPos","shadowRoot","getCanvasPosition","touches","box","getRelativePosition","borderBox","boxSizing","paddings","borders","getContainerSize","maxHeight","container","clientWidth","clientHeight","containerStyle","containerBorder","containerPadding","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","maintainHeight","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","addEventListener","removeEventListener","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRightToLeftAdapter","rectX","setWidth","xPlus","leftForLtr","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","getSegment","startBound","endBound","_boundSegment","subStart","prevValue","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","segments","sub","findStartAndEnd","solidSegments","cur","stop","_computeSegments","segmentOptions","_loop","splitByStyles","completeLoop","_fullLoop","doSplitByStyles","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","replacer","getSizeForArea","chartArea","field","getDatasetArea","getDatasetClipArea","_clip","disabled","Animator","_request","_charts","_running","_lastDate","_notify","anims","date","callbacks","numSteps","initial","currentStep","_refresh","_update","Date","now","remaining","running","draw","_active","_total","tick","_getAnims","charts","complete","progress","listen","cb","_duration","cancel","remove","animator","interpolators","boolean","c0","number","Animation","cfg","currentValue","_fn","_easing","_start","_target","_prop","_from","_to","_promises","update","elapsed","wait","promises","Promise","rej","resolved","Animations","_properties","configure","animationOptions","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","resolveTargetOptions","_createAnimations","$shared","awaitAll","$animations","then","anim","all","scaleClip","allowedOverflow","defaultClip","toClip","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","found","convertObjectDataToArray","iAxisKey","vAxisKey","adata","isStacked","stacked","getStackKey","indexScale","valueScale","NEGATIVE_INFINITY","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","positive","getMatchingVisibleMetas","updateStacks","controller","_cachedMeta","_stacks","iAxis","vAxis","itemStacks","_top","_bottom","visualValues","_visualValues","getFirstScaleId","shift","createDatasetContext","createDataContext","dataIndex","raw","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","createStack","canStack","hidden","_stacked","DatasetController","static","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","initialize","linkScales","addElements","isPluginEnabled","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","reset","_destroy","_dataCheck","isExtensible","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","otherScale","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","label","getLabelForValue","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","transition","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","updateElements","removed","_sync","_dataChanges","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","getAllScaleValues","_cache","$bar","visibleMetas","concat","computeMinSampleSize","_length","updateMinAndPrev","getPixelForTick","computeFitCategoryTraits","ruler","stackCount","thickness","barThickness","categoryPercentage","barPercentage","chunk","pixels","computeFlexCategoryTraits","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","_custom","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","isHorizontal","borderProps","setBorderSkipped","edge","borderSkipped","enableBorderRadius","parseEdge","swap","startEnd","orig","setInflateAmount","inflateAmount","BarController","grouped","_index_","_value_","super","bars","getBasePixel","_getRuler","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","_getStacks","currentParsed","iScaleValue","skipNull","_getStackCount","_getStackIndex","_startPixel","_endPixel","baseValue","minBarLength","floating","getDataVisibility","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","stackIndex","rects","BubbleController","getRatioAndOffset","circumference","cutout","ratioX","ratioY","startAngle","endAngle","endX","endY","calcMax","calcMin","DoughnutController","animateRotate","animateScale","spacing","legend","generateLabels","fontColor","legendItem","toggleDataVisibility","innerRadius","outerRadius","getter","_getRotation","_getCircumference","_getRotationExtents","isDatasetVisible","arcs","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","_circumference","calculateCircumference","animationOpts","centerX","centerY","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","updateControlPoints","PolarAreaController","angleLines","circular","pointLabels","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","PieController","RadarController","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","controllers","__proto__","abstract","DateAdapterBase","members","init","formats","diff","startOf","endOf","adapters","_date","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","position","handler","getSortedVisibleDatasetMetas","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","useFinalPosition","isPointInArea","evaluationFunc","inRange","getNearestRadialItems","getProps","getNearestCartesianItems","distanceMetric","minDistance","getCenterPoint","pointInArea","getNearestItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","wrap","placed","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","buildLayoutBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","handleMaxPadding","updatePos","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","minPadding","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","initCanvas","renderHeight","getAttribute","renderWidth","displayWidth","displayHeight","eventListenerOptions","removeListener","fromNativeEvent","nodeListContains","nodeList","createAttachObserver","observer","MutationObserver","entries","trigger","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","ResizeObserver","contentRect","releaseObserver","disconnect","createProxyAndListen","DomPlatform","removeAttribute","setAttribute","proxies","$proxies","handlers","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","Element","tooltipPosition","hasValue","final","tickOpts","determinedMaxTicks","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","enabled","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","_tickSize","maxScale","maxChart","_maxLength","evenMajorSpacing","getEvenSpacing","factors","majorStart","majorEnd","reverseAlign","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","fit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","widths","heights","widestLabelSize","highestLabelSize","tickFont","fontString","nestedLabel","_resolveTickFontOptions","valueAt","idx","decimal","getDecimalForPixel","getBaseValue","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","lineDashOffset","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","tz","gz","bz","axisID","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","registerDefaults","unregister","itemDefaults","defaultRoutes","routeDefaults","routes","propertyParts","sourceName","sourceScope","Registry","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","component","camelMethod","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","cancelable","invalidate","_oldCache","_notifyStateChanges","allPlugins","createDescriptors","previousDescriptors","some","localIds","getOpts","pluginOpts","pluginScopeKeys","getIndexAxis","datasetDefaults","datasetOptions","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","idMatchesAxis","axisFromPosition","determineAxis","scaleOptions","getAxisFromDataset","retrieveAxisFromDatasets","boundDs","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","_scopeCache","_resolverCache","clearCache","clear","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","needContext","subResolver","resolverCache","hasFunction","version","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","moveNumericKeys","intKey","determineLastEvent","lastEvent","inChartArea","isClick","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","_initialize","bindEvents","_resize","_resizeBeforeDraw","newSize","newRatio","onResize","ensureScalesHaveIDs","scalesOptions","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","scaleClass","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","destroy","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","eventFilter","_handleEvent","_getActiveElements","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","borderRadius","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","drawArc","fullCircles","inner","lineJoin","ArcElement","chartX","chartY","rAdjust","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","fix","radiusOffset","setStyle","lineCap","getLineMethod","stepped","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","avgX","countX","prevX","lastY","drawX","truncX","_getSegmentMethod","useFastPath","_getInterpolationMethod","strokePathWithCache","path","_path","Path2D","strokePathDirect","segmentMethod","usePath2D","LineElement","_points","_segments","_pointsUpdated","_interpolate","interpolated","inRange$1","hitRadius","PointElement","hoverRadius","mouseX","mouseY","inXRange","inYRange","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","boundingRects","outer","skipX","skipY","skipBoth","hasRadius","addNormalRectPath","inflateRect","amount","refRect","BarElement","addRectPath","BORDER_COLORS","BACKGROUND_COLORS","getBorderColor","getBackgroundColor","colorizeDefaultDataset","colorizeDoughnutDataset","colorizePolarAreaDataset","getColorizer","containsColorsDefinitions","containsColorsDefinition","containsDefaultColorsDefenitions","plugin_colors","forceOverride","_args","chartOptions","containsColorDefenition","colorizer","lttbDecimation","samples","decimated","bucketWidth","sampledIndex","endIndex","maxAreaPoint","maxArea","nextA","avgY","avgRangeStart","avgRangeEnd","avgRangeLength","rangeOffs","rangeTo","pointAx","pointAy","minMaxDecimation","minIndex","maxIndex","startIndex","xMin","xMax","lastIndex","intermediateIndex1","intermediateIndex2","cleanDecimatedDataset","cleanDecimatedData","getStartAndCountOfVisiblePointsSimplified","plugin_decimation","algorithm","beforeElementsUpdate","xAxis","threshold","tpoints","_findSegmentEnd","_getBounds","targetSegments","tgt","subBounds","fillSources","fillSource","_getEdge","_pointsFromSegments","boundary","linePoints","_createBoundaryLine","_shouldApplyFill","_resolveTarget","propagate","visited","_decodeFill","parseFillOption","decodeTargetIndex","firstCh","_getTargetPixel","_getTargetValue","fillOption","_buildStackLine","sourcePoints","linesBelow","getLinesBelow","addPointsBelow","below","unshift","sourcePoint","postponed","findPoint","pointValue","firstValue","lastValue","simpleArc","getLineByIndex","computeBoundary","computeCircularBoundary","computeLinearBoundary","_drawfill","lineOpts","above","doFill","clipVertical","clipY","lineLoop","src","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","afterDatasetsUpdate","$filler","beforeDraw","drawTime","beforeDatasetsDraw","beforeDatasetDraw","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","itemsEqual","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","halfFontSize","drawLegendBox","lineDash","drawOptions","SQRT2","yBoxTop","xBoxLeft","textDirection","realX","fontLineHeight","calculateLegendItemHeight","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","handleEvent","isListened","hoveredItem","sameItem","onLeave","calculateItemWidth","calculateItemHeight","legendItemText","plugin_legend","_element","afterEvent","ci","useBorderRadius","Title","_padding","textSize","_drawArgs","fontOpts","createTitle","titleBlock","plugin_title","WeakMap","plugin_subtitle","positioners","average","xSet","xAverage","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","String","createTooltipItem","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","bodyLineHeight","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","caret","caretSize","caretPadding","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","defaultCallbacks","beforeTitle","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","drawBody","bodyAlign","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","Colors","Decimation","Filler","SubTitle","addIfString","addedLabels","findOrAddLabel","lastIndexOf","_getLabelForValue","CategoryScale","_startValue","_valueRange","_addedLabels","added","generateTicks$1","generationOptions","dataRange","MIN_SPACING","precision","maxTicks","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","LinearScaleBase","_endValue","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","numericGeneratorOptions","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","startExp","generateTicks","minExp","exp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","hLimits","vLimits","updateLimits","setCenterPoint","_pointLabelItems","buildPointLabelItems","createPointLabelItem","itemOpts","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","isNotOverlapped","apexesInArea","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawPointLabels","pathRadiusLine","drawRadiusLine","gridLineOpts","createPointLabelContext","RadialLinearScale","animate","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","distanceFromCenter","getBasePosition","getPointLabelPosition","INTERVALS","millisecond","common","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","timestamp","setMajorTicks","majorUnit","ticksFromTimestamps","TimeScale","displayFormats","_unit","_majorUnit","_offsets","_normalized","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","initOffsets","offsetAfterAutoskip","getDecimalForValue","weekday","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","registerables","SOLAR_RADIATION","CONSUMPTION_PROFILES","mostly_at_home","mostly_away","SolarSystemForm","householdConsumption","consumptionProfile","hasHeatPump","hasElectricCar","electricCarConsumption","electricityPrice","compensationRate","autonomy","costSavings","panelPeakPower","email","nameError","emailError","chartRef","updateSystemConfigs","recalculate","updateChart","norm","peakKwh","production","radiation","energyUsageOfProduction","energyDifference","soldEnergy","hours","_","validateForm","isValid","trim","emailRegex","test","handleRequestOffer","systemConfig","consumption","readOnly","readonly","onInput","onChange","selected","xmlns","viewBox"],"sources":["src/utils/visualize.ts","src/constants.ts","src/utils/render/projection.ts","src/utils/render/polygon.ts","src/utils/render/tools.ts","src/config.ts","src/utils/render/color.ts","../../node_modules/uuid/dist/esm-browser/stringify.js","../../node_modules/uuid/dist/esm-browser/rng.js","../../node_modules/uuid/dist/esm-browser/native.js","../../node_modules/uuid/dist/esm-browser/v4.js","src/utils/utils.ts","src/utils/geometry/fitting.ts","src/utils/geometry/gridMatch.ts","src/utils/lang/english.ts","src/utils/lang/general.ts","src/output.css?tag=map-draw","src/components/map-draw/map-draw.tsx","../../node_modules/lucide/dist/esm/icons/eraser.js","../../node_modules/lucide/dist/esm/icons/house.js","../../node_modules/lucide/dist/esm/icons/move.js","../../node_modules/lucide/dist/esm/icons/octagon-minus.js","src/output.css?tag=solar-expert","src/components/solar-expert/solar-expert.tsx","../../node_modules/@kurkle/color/dist/color.esm.js","../../node_modules/chart.js/dist/chunks/helpers.dataset.js","../../node_modules/chart.js/dist/chart.js","../../node_modules/chart.js/auto/auto.js","src/output.css?tag=solar-system-form&encapsulation=shadow","src/components/solar-system-form/solar-system-form.tsx"],"sourcesContent":["/*\r\n Copyright 2023 Google LLC\r\n\r\n Licensed under the Apache License, Version 2.0 (the \"License\");\r\n you may not use this file except in compliance with the License.\r\n You may obtain a copy of the License at\r\n\r\n https://www.apache.org/licenses/LICENSE-2.0\r\n\r\n Unless required by applicable law or agreed to in writing, software\r\n distributed under the License is distributed on an \"AS IS\" BASIS,\r\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n See the License for the specific language governing permissions and\r\n limitations under the License.\r\n */\r\n\r\n import { PositionedSolarPanel } from './geometry/fitting';\r\nimport type { Bounds, GeoTiff, InternalSolarPanelConfig } from './solar';\r\n\r\n // [START visualize_render_rgb]\r\n /**\r\n * Renders an RGB GeoTiff image into an HTML canvas.\r\n *\r\n * The GeoTiff image must include 3 rasters (bands) which\r\n * correspond to [Red, Green, Blue] in that order.\r\n *\r\n * @param {GeoTiff} rgb GeoTiff with RGB values of the image.\r\n * @param {GeoTiff} mask Optional mask for transparency, defaults to opaque.\r\n * @return {HTMLCanvasElement} Canvas element with the rendered image.\r\n */\r\n export function renderRGB(rgb: GeoTiff, mask?: GeoTiff, canvas?: HTMLCanvasElement | null): HTMLCanvasElement {\r\n // Create an HTML canvas to draw the image.\r\n // https://www.w3schools.com/tags/canvas_createimagedata.asp\r\n if (!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n // Set the canvas size to the mask size if it's available,\r\n // otherwise set it to the RGB data layer size.\r\n canvas.width = mask ? mask.width : rgb.width;\r\n canvas.height = mask ? mask.height : rgb.height;\r\n \r\n // Since the mask size can be different than the RGB data layer size,\r\n // we calculate the \"delta\" between the RGB layer size and the canvas/mask\r\n // size. For example, if the RGB layer size is the same as the canvas size,\r\n // the delta is 1. If the RGB layer size is smaller than the canvas size,\r\n // the delta would be greater than 1.\r\n // This is used to translate the index from the canvas to the RGB layer.\r\n const dw = rgb.width / canvas.width;\r\n const dh = rgb.height / canvas.height;\r\n \r\n // Get the canvas image data buffer.\r\n const ctx = canvas.getContext('2d')!;\r\n const img = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n \r\n // Fill in every pixel in the canvas with the corresponding RGB layer value.\r\n // Since Javascript doesn't support multidimensional arrays or tensors,\r\n // everything is stored in flat arrays and we have to keep track of the\r\n // indices for each row and column ourselves.\r\n for (let y = 0; y < canvas.height; y++) {\r\n for (let x = 0; x < canvas.width; x++) {\r\n // RGB index keeps track of the RGB layer position.\r\n // This is multiplied by the deltas since it might be a different\r\n // size than the image size.\r\n const rgbIdx = Math.floor(y * dh) * rgb.width + Math.floor(x * dw);\r\n // Mask index keeps track of the mask layer position.\r\n const maskIdx = y * canvas.width + x;\r\n \r\n // Image index keeps track of the canvas image position.\r\n // HTML canvas expects a flat array with consecutive RGBA values.\r\n // Each value in the image buffer must be between 0 and 255.\r\n // The Alpha value is the transparency of that pixel,\r\n // if a mask was not provided, we default to 255 which is opaque.\r\n const imgIdx = y * canvas.width * 4 + x * 4;\r\n const factor = 0.65;\r\n img.data[imgIdx + 0] = Math.round(rgb.rasters[0][rgbIdx] * factor); // Red\r\n img.data[imgIdx + 1] = Math.round(rgb.rasters[1][rgbIdx] * factor); // Green\r\n img.data[imgIdx + 2] = Math.round(rgb.rasters[2][rgbIdx] * factor); // Blue\r\n img.data[imgIdx + 3] = mask // Alpha\r\n ? mask.rasters[0][maskIdx] * 255\r\n : 255;\r\n }\r\n }\r\n \r\n // Draw the image data buffer into the canvas context.\r\n ctx.putImageData(img, 0, 0);\r\n return canvas;\r\n }\r\n // [END visualize_render_rgb]\r\n \r\n // [START visualize_render_palette]\r\n /**\r\n * Renders a single value GeoTiff image into an HTML canvas.\r\n *\r\n * The GeoTiff image must include 1 raster (band) which contains\r\n * the values we want to display.\r\n *\r\n * @param {GeoTiff} data GeoTiff with the values of interest.\r\n * @param {GeoTiff} mask Optional mask for transparency, defaults to opaque.\r\n * @param {string[]} colors Hex color palette, defaults to ['000000', 'ffffff'].\r\n * @param {number} min Minimum value of the data range, defaults to 0.\r\n * @param {number} max Maximum value of the data range, defaults to 1.\r\n * @param {number} index Raster index for the data, defaults to 0.\r\n * @return {HTMLCanvasElement} Canvas element with the rendered image.\r\n */\r\n export function renderPalette({\r\n data,\r\n mask,\r\n colors,\r\n min,\r\n max,\r\n index,\r\n canvas,\r\n }: {\r\n data: GeoTiff;\r\n mask?: GeoTiff;\r\n colors?: string[];\r\n min?: number;\r\n max?: number;\r\n index?: number;\r\n canvas?: HTMLCanvasElement | null\t;\r\n }): HTMLCanvasElement {\r\n // First create a palette from a list of hex colors.\r\n const palette = createPalette(colors ?? ['000000', 'ffffff']);\r\n // Normalize each value of our raster/band of interest into indices,\r\n // such that they always map into a value within the palette.\r\n const indices = data.rasters[index ?? 0]\r\n .map((x) => normalize(x, max ?? 1, min ?? 0))\r\n .map((x) => Math.round(x * (palette.length - 1)));\r\n return renderRGB(\r\n {\r\n ...data,\r\n // Map each index into the corresponding RGB values.\r\n rasters: [\r\n indices.map((i: number) => palette[i].r),\r\n indices.map((i: number) => palette[i].g),\r\n indices.map((i: number) => palette[i].b),\r\n ],\r\n },\r\n mask,\r\n canvas,\r\n );\r\n }\r\n \r\n /**\r\n * Creates an {r, g, b} color palette from a hex list of colors.\r\n *\r\n * Each {r, g, b} value is a number between 0 and 255.\r\n * The created palette is always of size 256, regardless of the number of\r\n * hex colors passed in. Inbetween values are interpolated.\r\n *\r\n * @param {string[]} hexColors List of hex colors for the palette.\r\n * @return {{r, g, b}[]} RGB values for the color palette.\r\n */\r\n export function createPalette(hexColors: string[]): { r: number; g: number; b: number }[] {\r\n // Map each hex color into an RGB value.\r\n const rgb = hexColors.map(colorToRGB);\r\n // Create a palette with 256 colors derived from our rgb colors.\r\n const size = 256;\r\n const step = (rgb.length - 1) / (size - 1);\r\n return Array(size)\r\n .fill(0)\r\n .map((_, i) => {\r\n // Get the lower and upper indices for each color.\r\n const index = i * step;\r\n const lower = Math.floor(index);\r\n const upper = Math.ceil(index);\r\n // Interpolate between the colors to get the shades.\r\n return {\r\n r: lerp(rgb[lower].r, rgb[upper].r, index - lower),\r\n g: lerp(rgb[lower].g, rgb[upper].g, index - lower),\r\n b: lerp(rgb[lower].b, rgb[upper].b, index - lower),\r\n };\r\n });\r\n }\r\n \r\n /**\r\n * Convert a hex color into an {r, g, b} color.\r\n *\r\n * @param {string} color Hex color like 0099FF or #0099FF.\r\n * @return {{r, g, b}} RGB values for that color.\r\n */\r\n export function colorToRGB(color: string): { r: number; g: number; b: number } {\r\n const hex = color.startsWith('#') ? color.slice(1) : color;\r\n return {\r\n r: parseInt(hex.substring(0, 2), 16),\r\n g: parseInt(hex.substring(2, 4), 16),\r\n b: parseInt(hex.substring(4, 6), 16),\r\n };\r\n }\r\n \r\n /**\r\n * Normalizes a number to a given data range.\r\n *\r\n * @param {number} x Value of interest.\r\n * @param {number} max Maximum value in data range, defaults to 1.\r\n * @param {number} min Minimum value in data range, defaults to 0.\r\n * @return {number} Normalized value.\r\n */\r\n export function normalize(x: number, max: number = 1, min: number = 0): number {\r\n const y = (x - min) / (max - min);\r\n return clamp(y, 0, 1);\r\n }\r\n \r\n /**\r\n * Calculates the linear interpolation for a value within a range.\r\n *\r\n * @param {number} x Lower value in the range, when `t` is 0.\r\n * @param {number} y Upper value in the range, when `t` is 1.\r\n * @param {number} t \"Time\" between 0 and 1.\r\n * @return {number} Inbetween value for that \"time\".\r\n */\r\n export function lerp(x: number, y: number, t: number): number {\r\n return x + t * (y - x);\r\n }\r\n \r\n /**\r\n * Clamps a value to always be within a range.\r\n *\r\n * @param {number} x Value to clamp.\r\n * @param {number} min Minimum value in the range.\r\n * @param {number} max Maximum value in the range.\r\n * @return {number} Clamped value.\r\n */\r\n export function clamp(x: number, min: number, max: number): number {\r\n return Math.min(Math.max(x, min), max);\r\n }\r\n // [END visualize_render_palette]\r\n \r\n export function rgbToColor({ r, g, b }: { r: number; g: number; b: number }): string {\r\n const f = (x: number) => {\r\n const hex = Math.round(x).toString(16);\r\n return hex.length == 1 ? `0${hex}` : hex;\r\n };\r\n return `#${f(r)}${f(g)}${f(b)}`;\r\n }\r\n\r\n export function renderAzimuth(azimuth: number, ctx: CanvasRenderingContext2D) {\r\n if (azimuth === undefined) {\r\n return;\r\n }\r\n ctx.save();\r\n ctx.moveTo(0, 0);\r\n ctx.rotate((azimuth - 90) * Math.PI / 180);\r\n ctx.translate(ctx.canvas.width-100, 100);\r\n \r\n // Set arrow style\r\n ctx.strokeStyle = 'rgba(255, 255, 255, 0.8)';\r\n ctx.fillStyle = 'rgba(255, 255, 255, 0.8)';\r\n ctx.lineWidth = 2;\r\n\r\n ctx.moveTo(-50, 0);\r\n ctx.lineTo(50,0);\r\n ctx.lineTo(40,-10);\r\n ctx.moveTo(50,0);\r\n ctx.lineTo(40,10);\r\n ctx.stroke();\r\n\r\n ctx.moveTo(0, 0);\r\n ctx.beginPath();\r\n ctx.arc(0, 0, 50, 0, Math.PI * 2);\r\n ctx.stroke();\r\n\r\n // Arrow parameters\r\n // const arrowLength = 100;\r\n // const arrowHeadLength = 15;\r\n // const arrowHeadAngle = Math.PI / 6; // 30 degrees\r\n\r\n // // Convert azimuth to radians (subtract 90 degrees to align with standard compass)\r\n // const angle = (azimuth - 90) * Math.PI / 180;\r\n\r\n // // Calculate arrow end point\r\n // const endX = arrowLength * Math.cos(angle);\r\n // const endY = arrowLength * Math.sin(angle);\r\n\r\n // // Draw main arrow line\r\n // ctx.beginPath();\r\n // ctx.moveTo(0, 0);\r\n // ctx.lineTo(endX, endY);\r\n // ctx.stroke();\r\n\r\n // // Calculate arrowhead points\r\n // const arrowHeadAngle1 = angle + Math.PI - arrowHeadAngle;\r\n // const arrowHeadAngle2 = angle + Math.PI + arrowHeadAngle;\r\n\r\n // const arrowHead1X = endX + arrowHeadLength * Math.cos(arrowHeadAngle1);\r\n // const arrowHead1Y = endY + arrowHeadLength * Math.sin(arrowHeadAngle1);\r\n // const arrowHead2X = endX + arrowHeadLength * Math.cos(arrowHeadAngle2);\r\n // const arrowHead2Y = endY + arrowHeadLength * Math.sin(arrowHeadAngle2);\r\n\r\n // // Draw arrowhead\r\n // ctx.beginPath();\r\n // ctx.moveTo(endX, endY);\r\n // ctx.lineTo(arrowHead1X, arrowHead1Y);\r\n // ctx.lineTo(arrowHead2X, arrowHead2Y);\r\n // ctx.closePath();\r\n // ctx.fill();\r\n\r\n // ctx.translate(ctx.canvas.width/2, 50);\r\n\r\n ctx.restore();\r\n\r\n console.log(\"renderAzimuth\", azimuth);\r\n }\r\n\r\n export function renderSolarPanel(solarPanel: PositionedSolarPanel, ctx: CanvasRenderingContext2D, panelWidth: number, panelHeight: number, azimuthAngle: number, pitchAngle: number) {\r\n const { x, y } = solarPanel.pixelPosition;\r\n let width = panelWidth;\r\n let height = panelHeight * Math.cos(pitchAngle * Math.PI / 180);\r\n if (solarPanel.horizontal) {\r\n width = panelHeight;\r\n height = panelWidth * Math.cos(pitchAngle * Math.PI / 180);\r\n }\r\n\r\n // Save the current context state\r\n ctx.save();\r\n \r\n // Translate to the panel's center point\r\n ctx.translate(x, y);\r\n \r\n // Rotate by the azimuth angle (convert to radians)\r\n ctx.rotate((azimuthAngle * Math.PI) / 180);\r\n \r\n // Draw panel rectangle centered at origin (since we translated)\r\n ctx.fillStyle = 'rgba(115, 143, 255, 1)';\r\n ctx.fillRect(-width/2, -height/2, width, height);\r\n \r\n // Draw panel border\r\n ctx.strokeStyle = 'rgba(0, 0, 0, 0.8)';\r\n ctx.lineWidth = 1;\r\n ctx.strokeRect(-width/2, -height/2, width, height);\r\n \r\n // Restore the context state\r\n ctx.restore();\r\n}\r\n\r\n export function renderPanels({canvas, panelConfig, bounds, zoom, roofSegments}: \r\n {canvas: HTMLCanvasElement | null, panelConfig: InternalSolarPanelConfig, bounds: Bounds, zoom: number, roofSegments: Record<number, { pitchDegrees: number; azimuthDegrees: number }>}): HTMLCanvasElement {\r\n if (!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n const ctx = canvas.getContext(\"2d\")!;\r\n\r\n // Calculate pre zoomed dimensions the canvas is already zoomed\r\n const preZoomedWidth = Math.floor(canvas.width / zoom);\r\n const preZoomedHeight = Math.floor(canvas.height / zoom);\r\n const startX = Math.floor((preZoomedWidth - canvas.width) / 2);\r\n const startY = Math.floor((preZoomedHeight - canvas.height) / 2);\r\n\r\n // Calculate the scale factors to convert lat/lng to pixel coordinates\r\n const latToPixel = (lat: number) => {\r\n return preZoomedHeight * (1 - (lat - bounds.south) / (bounds.north - bounds.south)) - startY;\r\n };\r\n \r\n const lngToPixel = (lng: number) => {\r\n return preZoomedWidth * (lng - bounds.west) / (bounds.east - bounds.west) - startX;\r\n };\r\n \r\n // Draw each panel\r\n for (const panel of panelConfig.panels) {\r\n // Convert panel center coordinates to pixel coordinates\r\n const centerX = lngToPixel(panel.center.longitude);\r\n const centerY = latToPixel(panel.center.latitude);\r\n \r\n // Calculate panel dimensions (assuming standard panel size)\r\n const panelWidth = panel.orientation === 'LANDSCAPE' ? 19 : 10; // pixels\r\n const panelHeight = panel.orientation === 'LANDSCAPE' ? 10 : 19;\r\n \r\n // Get the roof segment's azimuth angle for this panel\r\n const roofSegment = roofSegments[panel.segmentIndex];\r\n const azimuthAngle = roofSegment ? roofSegment.azimuthDegrees : 0;\r\n \r\n // Save the current context state\r\n ctx.save();\r\n \r\n // Translate to the panel's center point\r\n ctx.translate(centerX, centerY);\r\n \r\n // Rotate by the azimuth angle (convert to radians)\r\n ctx.rotate((azimuthAngle * Math.PI) / 180);\r\n \r\n // Draw panel rectangle centered at origin (since we translated)\r\n ctx.fillStyle = 'rgba(115, 143, 255, 1)';\r\n ctx.fillRect(-panelWidth/2, -panelHeight/2, panelWidth, panelHeight);\r\n \r\n // Draw panel border\r\n ctx.strokeStyle = 'rgba(0, 0, 0, 0.8)';\r\n ctx.lineWidth = 1;\r\n ctx.strokeRect(-panelWidth/2, -panelHeight/2, panelWidth, panelHeight);\r\n \r\n // Restore the context state\r\n ctx.restore();\r\n }\r\n \r\n return canvas;\r\n }\r\n \r\n export function renderCombinedWithZoom({\r\n rgb,\r\n zoom = 1,\r\n canvas,\r\n}: {\r\n rgb: GeoTiff;\r\n zoom?: number;\r\n canvas?: HTMLCanvasElement | null;\r\n}): HTMLCanvasElement {\r\n // First render the RGB image\r\n const rgbCanvas = renderRGB(rgb, undefined, canvas);\r\n const ctx = rgbCanvas.getContext(\"2d\")!;\r\n const imgData = ctx.getImageData(0, 0, rgbCanvas.width, rgbCanvas.height);\r\n\r\n // Calculate the center portion to show based on zoom\r\n const width = rgbCanvas.width;\r\n const height = rgbCanvas.height;\r\n const zoomedWidth = Math.floor(width * zoom);\r\n const zoomedHeight = Math.floor(height * zoom);\r\n const startX = Math.floor((width - zoomedWidth) / 2);\r\n const startY = Math.floor((height - zoomedHeight) / 2);\r\n\r\n // Create a new image data for the zoomed portion\r\n const zoomedImgData = new ImageData(zoomedWidth, zoomedHeight);\r\n \r\n // Copy RGB data and apply palette where mask is non-zero\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const i = (y * width + x) * 4;\r\n \r\n if (x >= startX && x < startX + zoomedWidth && \r\n y >= startY && y < startY + zoomedHeight) {\r\n // Calculate position in zoomed image\r\n const zoomedX = x - startX;\r\n const zoomedY = y - startY;\r\n const zoomedI = (zoomedY * zoomedWidth + zoomedX) * 4;\r\n \r\n zoomedImgData.data[zoomedI] = imgData.data[i];\r\n zoomedImgData.data[zoomedI + 1] = imgData.data[i + 1];\r\n zoomedImgData.data[zoomedI + 2] = imgData.data[i + 2];\r\n zoomedImgData.data[zoomedI + 3] = 255; // Alpha channel\r\n }\r\n }\r\n }\r\n\r\n // Resize canvas to match zoomed dimensions\r\n rgbCanvas.width = zoomedWidth;\r\n rgbCanvas.height = zoomedHeight;\r\n \r\n // Put the zoomed image data back to the canvas\r\n ctx.putImageData(zoomedImgData, 0, 0);\r\n return rgbCanvas;\r\n}\r\n ","\r\nconst OPEN_POLYGON_COLOR = \"red\"; //\"#ffffff\";\r\nconst CLOSED_POLYGON_COLOR = \"#fcba03\";\r\nconst DOTTED_LINE_COLOR = \"rgba(0, 0, 0, 0.5)\";\r\n\r\nconst ROW_SPACING = 1;\r\nconst COLUMN_SPACING = 1;\r\n\r\nconst BORDER_INSET = 0.2;\r\nconst DEFAULT_SUNNINESS = 600;\r\n\r\nexport { OPEN_POLYGON_COLOR, CLOSED_POLYGON_COLOR, DOTTED_LINE_COLOR, ROW_SPACING, COLUMN_SPACING, BORDER_INSET, DEFAULT_SUNNINESS };\r\n","import { Point } from \"../../types/shapes\";\r\n\r\nexport function projectPointPerpendicularToLine({\r\n x,\r\n y,\r\n lastPoint,\r\n secondLastPoint,\r\n}: {\r\n x: number;\r\n y: number;\r\n lastPoint: { x: number; y: number };\r\n secondLastPoint: { x: number; y: number };\r\n}): Point {\r\n\r\n // Calculate the direction vector of the last line\r\n const dx = lastPoint.x - secondLastPoint.x;\r\n const dy = lastPoint.y - secondLastPoint.y;\r\n\r\n // Calculate perpendicular vector (rotate 90 degrees)\r\n const perpDx = -dy;\r\n const perpDy = dx;\r\n\r\n // Normalize the perpendicular vector\r\n const perpLength = Math.sqrt(perpDx * perpDx + perpDy * perpDy);\r\n const normalizedPerpDx = perpDx / perpLength;\r\n const normalizedPerpDy = perpDy / perpLength;\r\n\r\n // Project the mouse point onto the perpendicular line\r\n const vectorToMouse = {\r\n x: x - lastPoint.x,\r\n y: y - lastPoint.y,\r\n };\r\n\r\n // Calculate the projection length (dot product)\r\n const projectionLength = vectorToMouse.x * normalizedPerpDx +\r\n vectorToMouse.y * normalizedPerpDy;\r\n\r\n // Calculate the new point position using the projected length\r\n x = lastPoint.x + normalizedPerpDx * projectionLength;\r\n y = lastPoint.y + normalizedPerpDy * projectionLength;\r\n return { x, y };\r\n}\r\n","import { DOTTED_LINE_COLOR } from \"../../constants\";\r\nimport { Point, Polygon } from \"../../types/shapes\";\r\nimport { projectPointPerpendicularToLine } from \"./projection\";\r\n\r\nexport interface DrawPolygonProps {\r\n polygonCtx: CanvasRenderingContext2D;\r\n polygonCanvas: HTMLCanvasElement;\r\n polygon: Polygon;\r\n pixelInMeters: number;\r\n shiftKeyPressed: boolean;\r\n mousePoint: Point | null;\r\n strokeColor: string;\r\n fillColor?: string;\r\n}\r\n\r\nexport interface Line{\r\n start: Point;\r\n end: Point;\r\n}\r\n\r\nexport interface DrawCircleProps {\r\n ctx: CanvasRenderingContext2D;\r\n x: number;\r\n y: number;\r\n radius: number;\r\n strokeStyle?: string;\r\n lineWidth?: number;\r\n}\r\n\r\nexport function drawPolygon({\r\n polygonCtx, polygonCanvas, polygon, shiftKeyPressed, mousePoint, strokeColor, fillColor\r\n}: DrawPolygonProps) {\r\n if (!polygonCtx || !polygonCanvas) return;\r\n\r\n // Draw the polygon\r\n polygonCtx.beginPath();\r\n polygonCtx.strokeStyle = strokeColor;\r\n polygonCtx.lineWidth = 2;\r\n\r\n polygon.points.forEach((point, index) => {\r\n if (index === 0) {\r\n polygonCtx.moveTo(point.x, point.y);\r\n } else {\r\n polygonCtx.lineTo(point.x, point.y);\r\n }\r\n });\r\n\r\n if (polygon.closed) {\r\n polygonCtx.lineTo(polygon.points[0].x, polygon.points[0].y);\r\n if (fillColor) {\r\n polygonCtx.fillStyle = fillColor;\r\n polygonCtx.fill();\r\n }\r\n }\r\n\r\n if (polygon.points.length > 0) {\r\n polygonCtx.stroke();\r\n }\r\n\r\n if (polygon.points.length > 1 && !polygon.closed && shiftKeyPressed) {\r\n const projectedPoint = projectPointPerpendicularToLine({\r\n x: mousePoint.x,\r\n y: mousePoint.y,\r\n lastPoint: polygon.points[polygon.points.length - 1],\r\n secondLastPoint: polygon.points[polygon.points.length - 2],\r\n });\r\n drawPerpendicularDottedLine({\r\n ctx: polygonCtx,\r\n startPoint: projectedPoint,\r\n endPoint: polygon.points[polygon.points.length - 1],\r\n strokeStyle: DOTTED_LINE_COLOR,\r\n });\r\n }\r\n\r\n if (shiftKeyPressed && polygon.points.length > 1 && !polygon.closed) {\r\n const projectedPoint = projectPointPerpendicularToLine({\r\n x: mousePoint.x,\r\n y: mousePoint.y,\r\n lastPoint: polygon.points[polygon.points.length - 1],\r\n secondLastPoint: polygon.points[polygon.points.length - 2],\r\n });\r\n drawCircle({\r\n ctx: polygonCtx,\r\n x: projectedPoint.x,\r\n y: projectedPoint.y,\r\n radius: 5,\r\n strokeStyle: DOTTED_LINE_COLOR,\r\n });\r\n }\r\n\r\n // Draw circles around each point\r\n polygon.points.forEach((point) => {\r\n polygonCtx.beginPath();\r\n const strokeStyle = strokeColor;\r\n const distance = Math.sqrt(\r\n Math.pow(point.x - mousePoint.x, 2) + Math.pow(point.y - mousePoint.y, 2)\r\n );\r\n\r\n // Highlight the point if it's being hovered or dragged\r\n if (\r\n distance < 10\r\n ) {\r\n drawCircle({\r\n ctx: polygonCtx,\r\n x: point.x,\r\n y: point.y,\r\n strokeStyle,\r\n radius: 8,\r\n });\r\n } else {\r\n drawCircle({\r\n ctx: polygonCtx,\r\n x: point.x,\r\n y: point.y,\r\n strokeStyle,\r\n radius: 5,\r\n });\r\n }\r\n\r\n polygonCtx.stroke();\r\n });\r\n}\r\n\r\nexport function drawCircle({\r\n ctx,\r\n x,\r\n y,\r\n radius,\r\n strokeStyle = \"black\",\r\n lineWidth = 2\r\n}: DrawCircleProps) {\r\n ctx.beginPath();\r\n ctx.strokeStyle = strokeStyle;\r\n ctx.lineWidth = lineWidth;\r\n \r\n ctx.arc(x, y, radius, 0, 2 * Math.PI);\r\n ctx.stroke();\r\n}\r\n\r\nexport function drawPerpendicularDottedLine({\r\n ctx,\r\n startPoint,\r\n endPoint,\r\n dashPattern = [5, 5],\r\n strokeStyle = \"black\",\r\n lineWidth = 2\r\n}: {\r\n ctx: CanvasRenderingContext2D;\r\n startPoint: Point;\r\n endPoint: Point;\r\n dashPattern?: number[];\r\n strokeStyle?: string;\r\n lineWidth?: number;\r\n}) {\r\n // Set up the line style\r\n ctx.beginPath();\r\n ctx.strokeStyle = strokeStyle;\r\n ctx.lineWidth = lineWidth;\r\n ctx.setLineDash(dashPattern);\r\n \r\n // Draw the dotted line\r\n ctx.moveTo(startPoint.x, startPoint.y);\r\n ctx.lineTo(endPoint.x, endPoint.y);\r\n ctx.stroke();\r\n \r\n // Reset the line dash\r\n ctx.setLineDash([]);\r\n}\r\n\r\nexport function isPointOnBorder(point: Point, polygon: Polygon): boolean {\r\n if (!polygon.closed || polygon.points.length < 3) return false;\r\n\r\n const x = point.x;\r\n const y = point.y;\r\n\r\n // For each edge of the polygon\r\n for (let i = 0; i < polygon.points.length; i++) {\r\n const p1 = polygon.points[i];\r\n const p2 = polygon.points[(i + 1) % polygon.points.length];\r\n // calculate the distance from point p1 to p2\r\n const distance = Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));\r\n const distanceToPoint = Math.sqrt(Math.pow(p1.x - x, 2) + Math.pow(p1.y - y, 2));\r\n const distanceFromPoint = Math.sqrt(Math.pow(p2.x - x, 2) + Math.pow(p2.y - y, 2));\r\n if (distance === distanceToPoint + distanceFromPoint) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport function isPointInPolygon(point: Point, polygon: Polygon): boolean {\r\n if (!polygon.closed || polygon.points.length < 3) return false;\r\n\r\n const num_vertices = polygon.points.length;\r\n const x = point.x;\r\n const y = point.y;\r\n let inside = false;\r\n\r\n let p1 = polygon.points[0];\r\n let p2: Point;\r\n\r\n for (let i = 1; i <= num_vertices; i++) {\r\n p2 = polygon.points[i % num_vertices];\r\n\r\n if (y > Math.min(p1.y, p2.y)) {\r\n if (y <= Math.max(p1.y, p2.y)) {\r\n if (x <= Math.max(p1.x, p2.x)) {\r\n const x_intersection = ((y - p1.y) * (p2.x - p1.x)) / (p2.y - p1.y) + p1.x;\r\n\r\n if (p1.x === p2.x || x <= x_intersection) {\r\n inside = !inside;\r\n }\r\n }\r\n }\r\n }\r\n\r\n p1 = p2;\r\n }\r\n\r\n return inside;\r\n}","export type ToolType = \"move\" | \"roof\" | \"obstruction\" | \"delete\";\r\n\r\nexport interface KeyboardCombination {\r\n key: string;\r\n description: string;\r\n}\r\n\r\nexport interface Tool {\r\n name: ToolType;\r\n ariaLabel: string;\r\n icon: string;\r\n cursor: string;\r\n keyboardShortcut?: string;\r\n keyboardCombinations?: KeyboardCombination[];\r\n explanation?: string;\r\n}\r\n\r\nconst polygonKeyboardCombinations: KeyboardCombination[] = [\r\n {\r\n key: \"shift\",\r\n description: \"add one point on perpendicular line\",\r\n },\r\n // {\r\n // key: \"alt\",\r\n // description: \"add parallel line\",\r\n // },\r\n];\r\n\r\nexport const moveTool: Tool = {\r\n name: \"move\",\r\n ariaLabel: \"Move\",\r\n icon: \"move\",\r\n cursor: \"move\",\r\n keyboardShortcut: \"m\",\r\n explanation: \"Move points of the active polygon\",\r\n}\r\n\r\nexport const roofTool: Tool = {\r\n name: \"roof\",\r\n ariaLabel: \"Roof Area\",\r\n icon: \"house\",\r\n cursor: \"crosshair\",\r\n keyboardShortcut: \"r\",\r\n keyboardCombinations: polygonKeyboardCombinations,\r\n explanation: \"Draw the roof of the building\",\r\n}\r\n\r\nexport const obstructionTool: Tool = {\r\n name: \"obstruction\",\r\n ariaLabel: \"Obstruction\",\r\n icon: \"octagon-minus\",\r\n cursor: \"crosshair\",\r\n keyboardShortcut: \"o\",\r\n keyboardCombinations: polygonKeyboardCombinations,\r\n explanation: \"Draw the obstruction of the building\",\r\n}\r\n\r\nexport const deleteTool: Tool = {\r\n name: \"delete\",\r\n ariaLabel: \"Delete\",\r\n icon: \"eraser\",\r\n cursor: \"default\",\r\n keyboardShortcut: \"d\",\r\n explanation: \"Delete the active polygon\",\r\n}\r\n\r\nexport const tools: Tool[] = [\r\n moveTool,\r\n roofTool,\r\n obstructionTool,\r\n deleteTool,\r\n];\r\n","import { SolarPanelType } from \"./utils/solar\";\r\n\r\nexport interface SolarExpertConfig {\r\n openRoofColor: string;\r\n closedRoofColor: string;\r\n openObstructionColor: string;\r\n closedObstructionColor: string;\r\n roofPolygonFillColor: string;\r\n obstructionPolygonFillColor: string;\r\n roofPolygonHoverFillColor: string;\r\n obstructionPolygonHoverFillColor: string;\r\n roofPolygonSelectedFillColor: string;\r\n obstructionPolygonSelectedFillColor: string;\r\n}\r\n\r\nexport const DEFAULT_SOLAR_EXPERT_CONFIG: SolarExpertConfig = {\r\n openRoofColor: \"#d6eeff\",\r\n closedRoofColor: \"#ffffff\",\r\n openObstructionColor: \"#f57242\",\r\n closedObstructionColor: \"rgba(255, 132, 107, 0.8)\",\r\n roofPolygonFillColor: \"rgba(92, 187, 255, 0.5)\",\r\n obstructionPolygonFillColor: \"rgba(255, 132, 107, 0.5)\",\r\n roofPolygonHoverFillColor: \"rgba(92, 187, 255, 0.8)\",\r\n obstructionPolygonHoverFillColor: \"rgba(255, 132, 107, 0.8)\",\r\n roofPolygonSelectedFillColor: \"rgba(92, 187, 255, 0.7)\",\r\n obstructionPolygonSelectedFillColor: \"rgba(255, 132, 107, 0.7)\",\r\n}\r\n\r\nexport const DEFAULT_SOLAR_PANEL_TYPE: SolarPanelType = {\r\n widthMeters: 1.134,\r\n heightMeters: 1.762,\r\n kWattPeak: 0.455,\r\n efficiency: 0.224,\r\n price: 77.68,\r\n}\r\n","import { Polygon, SelectedPolygon } from \"../../types/shapes\";\r\nimport { SolarExpertConfig } from \"../../config\";\r\n\r\n\r\nexport function getFillColor(selectedPolygon: SelectedPolygon | null, hoveredPolygon: SelectedPolygon | null, _id: string, polygon: Polygon, config: SolarExpertConfig): string | undefined {\r\n const isHovered = hoveredPolygon?.type === polygon.type && hoveredPolygon?._id === _id;\r\n if (isHovered) {\r\n return polygon.type === \"roof\" ? config.roofPolygonHoverFillColor : config.obstructionPolygonHoverFillColor;\r\n }\r\n \r\n const isSelected = selectedPolygon?.type === polygon.type && selectedPolygon?._id === _id;\r\n\r\n if (isSelected) {\r\n return polygon.type === \"roof\" ? config.roofPolygonSelectedFillColor : config.obstructionPolygonSelectedFillColor;\r\n }\r\n\r\n if (polygon.type === \"roof\") {\r\n return polygon.closed ? config.roofPolygonFillColor : undefined;\r\n }\r\n return polygon.closed ? config.obstructionPolygonFillColor : undefined;\r\n}\r\n","import validate from './validate.js';\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n //\n // Note to future-self: No, you can't remove the `toLowerCase()` call.\n // REF: https://github.com/uuidjs/uuid/pull/677#issuecomment-1757351351\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n var uuid = unsafeStringify(arr, offset);\n // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\n\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n return getRandomValues(rnds8);\n}","var randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n offset = offset || 0;\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;","import { Point } from \"../types/shapes\";\r\nimport { Bounds, GeoTiff, LatLng } from \"./solar\";\r\n\r\nexport function calculatePolygonArea(points: Point[]): number {\r\n let area = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n const j = (i + 1) % points.length;\r\n area += points[i].x * points[j].y;\r\n area -= points[j].x * points[i].y;\r\n }\r\n return Math.abs(area / 2);\r\n};\r\n\r\nexport function azimuthToCardinal(azimuth: number): string {\r\n // Convert angle to cardinal direction\r\n if (azimuth >= 337.5 || azimuth < 22.5) return \"North\";\r\n if (azimuth >= 22.5 && azimuth < 67.5) return \"Northeast\";\r\n if (azimuth >= 67.5 && azimuth < 112.5) return \"East\";\r\n if (azimuth >= 112.5 && azimuth < 157.5) return \"Southeast\";\r\n if (azimuth >= 157.5 && azimuth < 202.5) return \"South\";\r\n if (azimuth >= 202.5 && azimuth < 247.5) return \"Southwest\";\r\n if (azimuth >= 247.5 && azimuth < 292.5) return \"West\";\r\n return \"Northwest\";\r\n}\r\n\r\nexport function calculatePolygonOrientation(points: Point[]): number {\r\n if (points.length < 3) return 0;\r\n\r\n // Calculate the average direction of the polygon\r\n let totalAngle = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n const j = (i + 1) % points.length;\r\n const angle = Math.atan2(\r\n points[j].y - points[i].y,\r\n points[j].x - points[i].x,\r\n );\r\n totalAngle += angle;\r\n }\r\n\r\n const avgAngle = (totalAngle / points.length) * (180 / Math.PI);\r\n const normalizedAngle = (avgAngle + 360) % 360;\r\n return normalizedAngle;\r\n};\r\n\r\nexport function calculatePolygonAngle(points: Point[]): number {\r\n if (points.length < 3) return 0;\r\n\r\n // Calculate the average angle of the polygon\r\n let totalAngle = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n const j = (i + 1) % points.length;\r\n const k = (i + 2) % points.length;\r\n\r\n const v1 = {\r\n x: points[j].x - points[i].x,\r\n y: points[j].y - points[i].y,\r\n };\r\n const v2 = {\r\n x: points[k].x - points[j].x,\r\n y: points[k].y - points[j].y,\r\n };\r\n\r\n const dot = v1.x * v2.x + v1.y * v2.y;\r\n const mag1 = Math.sqrt(v1.x * v1.x + v1.y * v1.y);\r\n const mag2 = Math.sqrt(v2.x * v2.x + v2.y * v2.y);\r\n\r\n const angle = Math.acos(dot / (mag1 * mag2));\r\n totalAngle += angle;\r\n }\r\n\r\n return (totalAngle / points.length) * (180 / Math.PI);\r\n};\r\n\r\nexport function latLngToPixel(bounds: Bounds, canvas: HTMLCanvasElement, latLng: LatLng): Point {\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) {\r\n throw new Error('Canvas context not found');\r\n }\r\n const latToPixel = (lat: number) => {\r\n return canvas.height * (1 - (lat - bounds.south) / (bounds.north - bounds.south));\r\n };\r\n \r\n const lngToPixel = (lng: number) => {\r\n return canvas.width * (lng - bounds.west) / (bounds.east - bounds.west);\r\n };\r\n\r\n return {\r\n x: lngToPixel(latLng.longitude),\r\n y: latToPixel(latLng.latitude),\r\n };\r\n}\r\n\r\nexport function getPixelInMeters(rgbTiff: GeoTiff): number {\r\n const latDiff = rgbTiff.bounds.north - rgbTiff.bounds.south;\r\n // const lngDiff = rgbTiff.bounds.east - rgbTiff.bounds.west;\r\n // const pixelWidth = rgbTiff.width;\r\n const pixelHeight = rgbTiff.height;\r\n const pixelInMeters = latDiff * 111320 / pixelHeight;\r\n // const latAvg = (rgbTiff.bounds.north + rgbTiff.bounds.south) / 2;\r\n // const pixelInMetersLng = lngDiff * 111320 * Math.cos(latAvg * Math.PI / 180) / pixelWidth;\r\n return pixelInMeters\r\n}","import { LineSegment, Polygon, SegmentMatch } from \"../../types/shapes\";\r\nimport { Bounds, LatLng, RoofSegmentSizeAndSunshineStats, SolarPanelType } from \"../solar\";\r\nimport { latLngToPixel } from \"../utils\";\r\nimport { Point } from \"../../types/shapes\";\r\nimport { isPointInPolygon, isPointOnBorder, Line } from \"../render/polygon\";\r\n\r\n\r\nexport interface SolarPanelSystemPart {\r\n positionedPanels: PositionedSolarPanel[];\r\n sunniness: number;\r\n}\r\n\r\nexport interface PositionedSolarPanel {\r\n panel: SolarPanelType;\r\n pixelPosition: {\r\n x: number;\r\n y: number;\r\n };\r\n horizontal: boolean;\r\n}\r\n\r\n/**\r\n * Get the intersections of a line parallel to the x-axis of the projected coordinate system with a polygon.\r\n * @param projectedPoint the point to draw the line from\r\n * @param projectedPolygon the polygon to get the intersections with\r\n * @returns the intersections of the line with the polygon\r\n */\r\nexport function getIntersections(projectedPoint: Point, projectedPolygon: Polygon): Point[] {\r\n const intersections: Point[] = [];\r\n\r\n if (projectedPolygon.points.length === 0) {\r\n return intersections;\r\n }\r\n \r\n // For each edge of the polygon\r\n for (let i = 0; i < projectedPolygon.points.length; i++) {\r\n const p1 = projectedPolygon.points[i];\r\n const p2 = projectedPolygon.points[(i + 1) % projectedPolygon.points.length];\r\n \r\n // Calculate intersection point\r\n const t = (projectedPoint.y - p1.y) / (p2.y - p1.y);\r\n const x = p1.x + t * (p2.x - p1.x);\r\n \r\n if (t > 0 && t <= 1) {\r\n intersections.push({ x, y: projectedPoint.y });\r\n }\r\n if (t === 0) {\r\n intersections.push({ x: p1.x, y: projectedPoint.y });\r\n }\r\n }\r\n \r\n // Sort intersections by y-coordinate\r\n return intersections.sort((a, b) => a.x - b.x);\r\n}\r\n\r\nexport function projectPoint(point: Point, azimuth: number): Point {\r\n const angle = azimuth * (Math.PI / 180);\r\n const x = point.x * Math.cos(angle) - point.y * Math.sin(angle);\r\n const y = point.x * Math.sin(angle) + point.y * Math.cos(angle);\r\n return { x, y };\r\n}\r\n\r\nexport function projectPolygon(polygon: Polygon, azimuth: number): Polygon {\r\n return {\r\n points: polygon.points.map((point) => projectPoint(point, azimuth)),\r\n type: polygon.type,\r\n closed: polygon.closed,\r\n _id: polygon._id,\r\n details: polygon.details,\r\n };\r\n}\r\n\r\nexport function offsetPolygon(polygon: Polygon, offset?: {x: number, y: number}): {polygon: Polygon, offset: {x: number, y: number}} {\r\n if (polygon.points.length === 0) {\r\n return { polygon: polygon, offset: {x: 0, y: 0} };\r\n }\r\n\r\n let offsetX = 0;\r\n let offsetY = 0;\r\n if (!offset) {\r\n const minX = Math.min(...polygon.points.map((point) => point.x));\r\n const minY = Math.min(...polygon.points.map((point) => point.y));\r\n const maxX = Math.max(...polygon.points.map((point) => point.x));\r\n const maxY = Math.max(...polygon.points.map((point) => point.y));\r\n\r\n offsetX = minX + (maxX - minX) / 2;\r\n offsetY = minY + (maxY - minY) / 2;\r\n }\r\n else {\r\n offsetX = offset.x;\r\n offsetY = offset.y;\r\n }\r\n\r\n const newPoints = polygon.points.map((point) => ({\r\n x: point.x - offsetX,\r\n y: point.y - offsetY,\r\n }));\r\n\r\n return { polygon: { ...polygon, points: newPoints }, offset: {x: offsetX, y: offsetY} };\r\n}\r\n\r\nfunction equalsPoints(point1: Point, point2: Point): boolean {\r\n return point1.x === point2.x && point1.y === point2.y;\r\n}\r\n\r\n/**\r\n * Checks if two lines intersect.\r\n * if the lines intersect in a start or end point they are not considered as intersecting\r\n * @param line1 The first line.\r\n * @param line2 The second line.\r\n * @returns True if the lines intersect, false otherwise.\r\n */\r\nexport function intersects(line1: Line, line2: Line): boolean {\r\n // Get the points of each line\r\n const p1 = line1.start;\r\n const p2 = line1.end;\r\n const p3 = line2.start;\r\n const p4 = line2.end;\r\n\r\n if (equalsPoints(p1, p3) || equalsPoints(p1, p4) || equalsPoints(p2, p3) || equalsPoints(p2, p4)) {\r\n return false;\r\n }\r\n\r\n // Calculate the cross products\r\n const d1 = (p4.x - p3.x) * (p1.y - p3.y) - (p4.y - p3.y) * (p1.x - p3.x);\r\n const d2 = (p4.x - p3.x) * (p2.y - p3.y) - (p4.y - p3.y) * (p2.x - p3.x);\r\n const d3 = (p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x);\r\n const d4 = (p2.x - p1.x) * (p4.y - p1.y) - (p2.y - p1.y) * (p4.x - p1.x);\r\n\r\n // Check if the lines intersect\r\n return (d1 * d2 < 0) && (d3 * d4 < 0);\r\n}\r\n\r\nexport function undoOffsetPolygon(polygon: Polygon, offset: {x: number, y: number}): Polygon {\r\n return {\r\n ...polygon,\r\n points: polygon.points.map((point) => ({\r\n x: point.x + offset.x,\r\n y: point.y + offset.y,\r\n })),\r\n };\r\n}\r\n\r\nexport function segmentPolygon(polygon: Polygon) {\r\n const segments: LineSegment[] = [];\r\n const segmentsMap: Record<string, boolean> = {};\r\n\r\n for (const point of polygon.points) {\r\n const intersections = getIntersections(point, polygon);\r\n for (const [index, intersection] of intersections.slice(0, -1).entries()) {\r\n const nextIntersection = intersections[index + 1];\r\n \r\n const halfPoint = {\r\n x: (intersection.x + nextIntersection.x) / 2,\r\n y: (intersection.y + nextIntersection.y) / 2,\r\n };\r\n\r\n const isInner = isPointInPolygon(halfPoint, polygon);\r\n const isOnBorder = isPointOnBorder(halfPoint, polygon);\r\n const key = `${intersection.x}-${intersection.y}-${nextIntersection.x}-${nextIntersection.y}`;\r\n \r\n if (segmentsMap[key]) {\r\n continue;\r\n }\r\n segments.push({ start: intersection, end: nextIntersection, type: isOnBorder ? \"border\" : (isInner ? \"inner\" : \"outer\") });\r\n segmentsMap[key] = true;\r\n }\r\n }\r\n return segments;\r\n}\r\n\r\n/**\r\n * for each segment this method will find all the following segments that are connected to it\r\n * \r\n * first the method subdivides the segments into y levels (all segments that have the same y coordinate are in the same level)\r\n * then it will check for each segment in each level if there is a following segment that is connected to it by checking it the \r\n * start point of the top segment to the end point of the bottom segment does not intersect with any of the polygon borders and the center point of the connection is in the polygon\r\n * \r\n * @param segments \r\n * @param roof \r\n * @returns \r\n */\r\nexport function matchSegments(segments: LineSegment[], roof: Polygon): {matches: SegmentMatch[], map: Record<string, LineSegment>} {\r\n const matches: SegmentMatch[] = [];\r\n const map: Record<string, LineSegment> = {};\r\n\r\n for (const segment of segments) {\r\n map[`${segment.start.x}-${segment.start.y}-${segment.end.x}-${segment.end.y}`] = segment;\r\n }\r\n \r\n // Group segments by y-coordinate (level)\r\n const levels: Record<number, LineSegment[]> = {};\r\n segments.forEach(segment => {\r\n const y = segment.start.y;\r\n if (!levels[y]) {\r\n levels[y] = [];\r\n }\r\n levels[y].push(segment);\r\n });\r\n\r\n // Sort levels by y-coordinate\r\n const sortedLevels = Object.keys(levels).map(Number).sort((a, b) => a - b);\r\n\r\n // For each level except the last one\r\n for (let i = 0; i < sortedLevels.length - 1; i++) {\r\n const currentLevel = levels[sortedLevels[i]];\r\n const nextLevel = levels[sortedLevels[i + 1]];\r\n\r\n // For each segment in current level\r\n for (const currentSegment of currentLevel) {\r\n if (currentSegment.type === \"outer\") {\r\n continue;\r\n }\r\n const matchedSegments: LineSegment[] = [];\r\n \r\n // For each segment in next level\r\n for (const nextSegment of nextLevel) {\r\n // Check if segments can be connected\r\n const connectionStart = currentSegment.start;\r\n const connectionEnd = nextSegment.end;\r\n\r\n let intersected = false;\r\n for (let i = 0; i < roof.points.length; i++) {\r\n const line = {\r\n start: roof.points[i],\r\n end: roof.points[(i + 1) % roof.points.length]\r\n };\r\n if (intersects(line, {start: connectionStart, end: connectionEnd})) {\r\n intersected = true;\r\n break;\r\n }\r\n }\r\n\r\n if (intersected) {\r\n continue;\r\n }\r\n\r\n // Check if center point of connection is inside polygon\r\n const centerPoint = {\r\n x: (connectionStart.x + connectionEnd.x) / 2,\r\n y: (connectionStart.y + connectionEnd.y) / 2\r\n };\r\n\r\n if (isPointInPolygon(centerPoint, roof)) {\r\n matchedSegments.push(nextSegment);\r\n }\r\n }\r\n\r\n if (matchedSegments.length > 0) {\r\n matches.push({\r\n segment: `${currentSegment.start.x}-${currentSegment.start.y}-${currentSegment.end.x}-${currentSegment.end.y}`,\r\n matchedSegments: matchedSegments.map(segment => `${segment.start.x}-${segment.start.y}-${segment.end.x}-${segment.end.y}`)\r\n });\r\n }\r\n }\r\n }\r\n\r\n return {matches, map};\r\n}\r\n\r\n/**\r\n * Fits panels to a roof polygon.\r\n * \r\n * Starts with positioning a solar panel row (a rectangle with the height of the solar panel and the width in the direction of the perpendicular of\r\n * the azimuth of the roof) at each corner of the roof.\r\n * For each corner there are four possible cases (the width is the width of the whole roof in the direction of the perpendicular of the azimuth):\r\n * 1. The row has height of the solar panel height and sits below the point in the direction of the azimuth of the roof.\r\n * 2. The row has height of the solar panel height and sits above the point in the direction of the azimuth of the roof.\r\n * 3. The row has the height of the solar panel width (solar panels are rotated) and sits below the point in the direction of the azimuth of the roof.\r\n * 4. The row has the height of the solar panel width (solar panels are rotated) and sits above the point in the direction of the azimuth of the roof.\r\n * \r\n * For each of these cases the function then places the solar panel rows directly above and below the current row.\r\n * \r\n * after the function has positioned all the rows it places the solar panels in the spaces between the rows.\r\n * For each of the four scenarios of each corner the number of panels are counted and the optimal placement is chosen.\r\n * \r\n * @param roof - The roof polygon.\r\n * @param panelType - The type of panel to fit.\r\n * @param borderOffset - The offset of the panel from the border of the roof. If negative, the panel can be partially overhanging the roof.\r\n * @param azimuth - The azimuth of the roof.\r\n * @returns The positioned panels.\r\n */\r\nexport function fitPanelsToRoof(roof: Polygon, panelType: SolarPanelType, borderOffset: number = 0, azimuth: number = 0): PositionedSolarPanel[] {\r\n if (!roof || !panelType || !roof.points || !roof.details) {\r\n return [];\r\n }\r\n console.log(borderOffset, azimuth)\r\n return [];\r\n \r\n // const minX = Math.min(...roof.points.map(p => p.x));\r\n // const maxX = Math.max(...roof.points.map(p => p.x));\r\n // const minY = Math.min(...roof.points.map(p => p.y));\r\n // const maxY = Math.max(...roof.points.map(p => p.y));\r\n\r\n // const projectedRoof = projectPolygon(roof, azimuth);\r\n // const projectedOffsetRoof = offsetPolygon(projectedRoof);\r\n\r\n // const segments = segmentPolygon(projectedOffsetRoof.polygon);\r\n // const {matches, map} = matchSegments(segments, projectedOffsetRoof.polygon);\r\n // const matchesMap: Record<string, LineSegment[]> = {};\r\n // for (const match of matches) {\r\n // matchesMap[match.segment] = match.matchedSegments.map(segment => map[segment]);\r\n // }\r\n\r\n // let panels: PositionedSolarPanel[] = [];\r\n // let undidPanels: PositionedSolarPanel[] = [];\r\n\r\n // for (const segment of segments) {\r\n // if (segment.type === \"outer\") {\r\n // continue;\r\n // }\r\n\r\n // const matches = matchesMap[`${segment.start.x}-${segment.start.y}-${segment.end.x}-${segment.end.y}`];\r\n // if (!matches || matches.length === 0) {\r\n // continue;\r\n // }\r\n\r\n // // Combine segments until we reach panel height\r\n // let combinedSegments: Array<Array<LineSegment>> = [[segment]];\r\n // let currentHeight = 0;\r\n // let currentMatches = matches;\r\n\r\n // // while (currentHeight < panelType.heightMeters && currentMatches.length > 0) {\r\n // // const nextSegment = currentMatches[0];\r\n // // combinedSegments.push(nextSegment);\r\n // // currentHeight += Math.abs(nextSegment.start.y - segment.start.y);\r\n // // currentMatches = matchesMap[`${nextSegment.start.x}-${nextSegment.start.y}-${nextSegment.end.x}-${nextSegment.end.y}`] || [];\r\n // // }\r\n\r\n // if (currentHeight < panelType.heightMeters) {\r\n // continue;\r\n // }\r\n\r\n // // Calculate minimum width\r\n // // let minEnd = Math.max(...combinedSegments.map(s => s.end.x));\r\n // // let maxStart = Math.min(...combinedSegments.map(s => s.start.x));\r\n // // let width = minEnd - maxStart;\r\n\r\n // // if (width >= panelType.widthMeters) {\r\n // // // Find highest segment for starting position\r\n // // const highestSegment = combinedSegments.reduce((prev, curr) => \r\n // // curr.start.y < prev.start.y ? curr : prev\r\n // // );\r\n\r\n // // // Place panels in a grid\r\n // // const panelSpacing = panelType.widthMeters + borderOffset;\r\n // // const rowSpacing = panelType.heightMeters + borderOffset;\r\n // // let currentX = maxStart;\r\n // // let currentY = highestSegment.start.y;\r\n\r\n // // while (currentX + panelType.widthMeters <= minEnd) {\r\n // // while (currentY + panelType.heightMeters <= highestSegment.start.y + currentHeight) {\r\n // // const panelCenter = {\r\n // // x: currentX + panelType.widthMeters / 2,\r\n // // y: currentY + panelType.heightMeters / 2\r\n // // };\r\n\r\n // // if (isPointInPolygon(panelCenter, projectedOffsetRoof.polygon)) {\r\n // // panels.push({\r\n // // panel: panelType,\r\n // // pixelPosition: panelCenter\r\n // // });\r\n // // }\r\n\r\n // // currentY += rowSpacing;\r\n // // }\r\n // // currentX += panelSpacing;\r\n // // currentY = highestSegment.start.y;\r\n // // }\r\n // // }\r\n // }\r\n\r\n // for (const panel of panels) {\r\n // const undoOffset = {\r\n // x: panel.pixelPosition.x + projectedOffsetRoof.offset.x,\r\n // y: panel.pixelPosition.y + projectedOffsetRoof.offset.y,\r\n // };\r\n // const projectedPanel = projectPoint(undoOffset, azimuth);\r\n // undidPanels.push({\r\n // panel: panel.panel,\r\n // pixelPosition: projectedPanel,\r\n // });\r\n // }\r\n\r\n // return panels;\r\n\r\n // project the polygon points such that the azimuth is 0 degrees\r\n // this means that the solar panel are aligned perfectly with the coordinate system\r\n //\r\n // 1. below point and height is height\r\n // for each point do the following\r\n // draw a line along the y-axis of the projected coordinate system (this is the perpendicular of the azimuth)\r\n // find all the intersection of that line with the roof polygon\r\n // get all points that are within the height of the solar panel in the direction of the azimuth\r\n // \r\n\r\n // for each point generate a line along the y-axis of the projected coordinate system (this is the perpendicular of the azimuth)\r\n // find all points on that line that intersect with the roof polygon bounds\r\n // if the number of points is even \r\n\r\n // \r\n\r\n // const positionedPanels: PositionedSolarPanel[] = [];\r\n // let bestPanelCount = 0;\r\n // let bestPanelArrangement: PositionedSolarPanel[] = [];\r\n\r\n // // Get roof details\r\n // const { azimuth } = roof.details;\r\n // const perpendicularAzimuth = (azimuth + 90) % 360;\r\n\r\n // for (const point of roof.points) {\r\n // const row = createPanelRow(point, false, false);\r\n // positionedPanels.push(...row);\r\n // }\r\n\r\n // Helper function to create a panel row\r\n // const createPanelRow = (startPoint: Point, isRotated: boolean, isAbove: boolean): PositionedSolarPanel[] => {\r\n // const rowPanels: PositionedSolarPanel[] = [];\r\n // const panelWidth = isRotated ? panelType.heightMeters : panelType.widthMeters;\r\n // const panelHeight = isRotated ? panelType.widthMeters : panelType.heightMeters;\r\n\r\n // // Calculate row direction based on azimuth\r\n // const rowAngle = perpendicularAzimuth * (Math.PI / 180);\r\n // const rowDirX = Math.cos(rowAngle);\r\n // const rowDirY = Math.sin(rowAngle);\r\n\r\n // // Calculate panel spacing direction based on azimuth\r\n // const panelAngle = azimuth * (Math.PI / 180);\r\n // const panelDirX = Math.cos(panelAngle);\r\n // const panelDirY = Math.sin(panelAngle);\r\n\r\n // // Calculate row width (distance from start to end of roof in perpendicular direction)\r\n // let maxRowWidth = 0;\r\n // for (const point of roof.points) {\r\n // const dx = point.x - startPoint.x;\r\n // const dy = point.y - startPoint.y;\r\n // const width = Math.abs(dx * rowDirX + dy * rowDirY);\r\n // maxRowWidth = Math.max(maxRowWidth, width);\r\n // }\r\n\r\n // // Place panels along the row\r\n // const numPanels = Math.floor(maxRowWidth / panelWidth);\r\n // for (let i = 0; i < numPanels; i++) {\r\n // const panelX = startPoint.x + i * panelWidth * rowDirX;\r\n // const panelY = startPoint.y + i * panelWidth * rowDirY;\r\n\r\n // // Check if panel center is within roof polygon\r\n // const panelCenter = {\r\n // x: panelX + (panelWidth / 2) * rowDirX + (panelHeight / 2) * panelDirX,\r\n // y: panelY + (panelWidth / 2) * rowDirY + (panelHeight / 2) * panelDirY\r\n // };\r\n\r\n // if (isPointInPolygon(panelCenter, roof)) {\r\n // rowPanels.push({\r\n // panel: panelType,\r\n // pixelPosition: {\r\n // x: panelCenter.x,\r\n // y: panelCenter.y\r\n // }\r\n // });\r\n // }\r\n // }\r\n\r\n // return rowPanels;\r\n // };\r\n\r\n // // Try each corner and arrangement\r\n // for (const corner of roof.points) {\r\n // // Try all four arrangements for this corner\r\n // const arrangements = [\r\n // { isRotated: false, isAbove: false },\r\n // { isRotated: false, isAbove: true },\r\n // { isRotated: true, isAbove: false },\r\n // { isRotated: true, isAbove: true }\r\n // ];\r\n\r\n // for (const arrangement of arrangements) {\r\n // const currentPanels: PositionedSolarPanel[] = [];\r\n // const { isRotated, isAbove } = arrangement;\r\n\r\n // // Create initial row\r\n // const initialRow = createPanelRow(corner, isRotated, isAbove);\r\n // currentPanels.push(...initialRow);\r\n\r\n // // Add rows above and below\r\n // const panelHeight = isRotated ? panelType.widthMeters : panelType.heightMeters;\r\n // const rowSpacing = panelHeight + borderOffset;\r\n\r\n // // Calculate direction for adding rows\r\n // const rowAngle = azimuth * (Math.PI / 180);\r\n // const rowDirX = Math.cos(rowAngle);\r\n // const rowDirY = Math.sin(rowAngle);\r\n\r\n // // Add rows in both directions\r\n // let rowOffset = rowSpacing;\r\n // while (true) {\r\n // const newRowPoint = {\r\n // x: corner.x + rowOffset * rowDirX,\r\n // y: corner.y + rowOffset * rowDirY\r\n // };\r\n // const newRow = createPanelRow(newRowPoint, isRotated, isAbove);\r\n // if (newRow.length === 0) break;\r\n // currentPanels.push(...newRow);\r\n // rowOffset += rowSpacing;\r\n // }\r\n\r\n // rowOffset = -rowSpacing;\r\n // while (true) {\r\n // const newRowPoint = {\r\n // x: corner.x + rowOffset * rowDirX,\r\n // y: corner.y + rowOffset * rowDirY\r\n // };\r\n // const newRow = createPanelRow(newRowPoint, isRotated, isAbove);\r\n // if (newRow.length === 0) break;\r\n // currentPanels.push(...newRow);\r\n // rowOffset -= rowSpacing;\r\n // }\r\n\r\n // // Update best arrangement if this one has more panels\r\n // if (currentPanels.length > bestPanelCount) {\r\n // bestPanelCount = currentPanels.length;\r\n // bestPanelArrangement = currentPanels;\r\n // }\r\n // }\r\n // }\r\n\r\n // return bestPanelArrangement;\r\n}\r\n\r\n/**\r\n * Uses the bounding box of the roof and the roof segment bounding boxes to find the best fitting roof segment.\r\n * @param roof the roof shape\r\n * @param roofSegmentStats the stats of the roof segments\r\n * @returns the best fitting roof segment\r\n */\r\nexport function getBestFittingRoofSegment(roof: Polygon, roofSegmentStats: RoofSegmentSizeAndSunshineStats[], bounds: Bounds, canvas: HTMLCanvasElement): RoofSegmentSizeAndSunshineStats {\r\n const polygonBounds = {\r\n minX: Math.min(...roof.points.map((p) => p.x)),\r\n maxX: Math.max(...roof.points.map((p) => p.x)),\r\n minY: Math.min(...roof.points.map((p) => p.y)),\r\n maxY: Math.max(...roof.points.map((p) => p.y)),\r\n };\r\n\r\n let bestSegment = null;\r\n let bestIoU = 0;\r\n\r\n for (const segment of roofSegmentStats) {\r\n const sw = latLngToPixel(bounds, canvas, {\r\n latitude: segment.boundingBox.sw.latitude,\r\n longitude: segment.boundingBox.sw.longitude,\r\n } as LatLng);\r\n const ne = latLngToPixel(bounds, canvas, {\r\n latitude: segment.boundingBox.ne.latitude,\r\n longitude: segment.boundingBox.ne.longitude,\r\n } as LatLng);\r\n const segmentBounds = {\r\n minX: sw.x,\r\n maxX: ne.x,\r\n minY: ne.y,\r\n maxY: sw.y,\r\n };\r\n\r\n // Calculate intersection\r\n const interLeft = Math.max(polygonBounds.minX, segmentBounds.minX);\r\n const interRight = Math.min(polygonBounds.maxX, segmentBounds.maxX);\r\n const interTop = Math.max(polygonBounds.minY, segmentBounds.minY);\r\n const interBottom = Math.min(polygonBounds.maxY, segmentBounds.maxY);\r\n\r\n const interWidth = interRight - interLeft;\r\n const interHeight = interBottom - interTop;\r\n let intersectionArea = 0;\r\n if (interWidth > 0 && interHeight > 0) {\r\n intersectionArea = interWidth * interHeight;\r\n }\r\n\r\n const polygonArea = (polygonBounds.maxX - polygonBounds.minX) * (polygonBounds.maxY - polygonBounds.minY);\r\n const segmentArea = (segmentBounds.maxX - segmentBounds.minX) * (segmentBounds.maxY - segmentBounds.minY);\r\n const unionArea = polygonArea + segmentArea - intersectionArea;\r\n const iou = unionArea > 0 ? intersectionArea / unionArea : 0;\r\n\r\n if (iou > bestIoU) {\r\n bestIoU = iou;\r\n bestSegment = segment;\r\n }\r\n }\r\n\r\n return bestSegment;\r\n}\r\n","import { COLUMN_SPACING, ROW_SPACING } from \"../../constants\";\r\nimport { Point, Polygon } from \"../../types/shapes\";\r\nimport { isPointInPolygon, Line } from \"../render/polygon\";\r\nimport { SolarPanelType } from \"../solar\";\r\nimport { intersects, offsetPolygon, PositionedSolarPanel, projectPoint, projectPolygon } from \"./fitting\";\r\n\r\nexport interface MinMax {\r\n minX: number;\r\n maxX: number;\r\n minY: number;\r\n maxY: number;\r\n}\r\n\r\nexport function generateGrid(minMax: MinMax, solarPanel: SolarPanelType, horizontal: boolean, anker: Point, rowSpacing: number, columnSpacing: number): Array<Array<PositionedSolarPanel>> {\r\n const grid: Array<Array<PositionedSolarPanel>> = [];\r\n const width = horizontal ? solarPanel.heightMeters : solarPanel.widthMeters;\r\n const widthCount = Math.ceil((minMax.maxX - minMax.minX) / width);\r\n const height = horizontal ? solarPanel.widthMeters : solarPanel.heightMeters;\r\n const heightCount = Math.ceil((minMax.maxY - minMax.minY) / height);\r\n\r\n const widthOffset = width / 2;\r\n const heightOffset = height / 2;\r\n\r\n // calculate the starting point based on the anker\r\n const startX = anker.x - (Math.ceil((anker.x - minMax.minX) / width) * width);\r\n const startY = anker.y - (Math.ceil((anker.y - minMax.minY) / height) * height);\r\n\r\n for (let i = 0; i < heightCount; i++) {\r\n const row: Array<PositionedSolarPanel> = [];\r\n for (let j = 0; j < widthCount; j++) {\r\n const x = startX + j * width + j * columnSpacing + widthOffset;\r\n const y = startY + i * height + i * rowSpacing + heightOffset;\r\n const positionedSolarPanel: PositionedSolarPanel = {\r\n panel: solarPanel,\r\n pixelPosition: {\r\n x: x,\r\n y: y\r\n },\r\n horizontal: horizontal\r\n }\r\n row.push(positionedSolarPanel);\r\n }\r\n grid.push(row);\r\n }\r\n return grid;\r\n}\r\n\r\nfunction getSolarPanelLines(positionedSolarPanel: PositionedSolarPanel, horizontal: boolean): Array<Line> {\r\n const width = horizontal ? positionedSolarPanel.panel.heightMeters : positionedSolarPanel.panel.widthMeters;\r\n const height = horizontal ? positionedSolarPanel.panel.widthMeters : positionedSolarPanel.panel.heightMeters;\r\n const p1 = {\r\n x: positionedSolarPanel.pixelPosition.x - width / 2,\r\n y: positionedSolarPanel.pixelPosition.y - height / 2\r\n }\r\n const p2 = {\r\n x: positionedSolarPanel.pixelPosition.x - width / 2,\r\n y: positionedSolarPanel.pixelPosition.y + height / 2\r\n }\r\n const p3 = {\r\n x: positionedSolarPanel.pixelPosition.x + width / 2,\r\n y: positionedSolarPanel.pixelPosition.y + height / 2\r\n }\r\n const p4 = {\r\n x: positionedSolarPanel.pixelPosition.x + width / 2,\r\n y: positionedSolarPanel.pixelPosition.y - height / 2\r\n }\r\n const lines = [\r\n {\r\n start: p1,\r\n end: p2\r\n },\r\n {\r\n start: p2,\r\n end: p3\r\n },\r\n {\r\n start: p3,\r\n end: p4\r\n },\r\n {\r\n start: p4,\r\n end: p1\r\n }\r\n ]\r\n return lines;\r\n}\r\n\r\n\r\nexport function solarPanelInObstacle(positionedSolarPanel: PositionedSolarPanel, obstacle: Polygon, horizontal: boolean): boolean {\r\n const lines = getSolarPanelLines(positionedSolarPanel, horizontal);\r\n if (isPointInPolygon(positionedSolarPanel.pixelPosition, obstacle)) {\r\n return true;\r\n }\r\n for (let i = 0; i < obstacle.points.length; i++) {\r\n const point = obstacle.points[i];\r\n const nextPoint = obstacle.points[(i + 1) % obstacle.points.length];\r\n const border = {\r\n start: point,\r\n end: nextPoint\r\n }\r\n for (const line of lines) {\r\n if (intersects(line, border)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport function solarPanelInPolygon(positionedSolarPanel: PositionedSolarPanel, polygon: Polygon, horizontal: boolean): boolean {\r\n const lines = getSolarPanelLines(positionedSolarPanel, horizontal);\r\n\r\n for (let i = 0; i < polygon.points.length; i++) {\r\n const point = polygon.points[i];\r\n const nextPoint = polygon.points[(i + 1) % polygon.points.length];\r\n const border = {\r\n start: point,\r\n end: nextPoint\r\n }\r\n for (const line of lines) {\r\n if (intersects(line, border)) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return isPointInPolygon(positionedSolarPanel.pixelPosition, polygon);\r\n}\r\n\r\nexport interface Obstacle {\r\n polygon: Polygon;\r\n boundingBox: {\r\n minX: number;\r\n maxX: number;\r\n minY: number;\r\n maxY: number;\r\n }\r\n}\r\n\r\nexport function isPanelObstructed(positionedSolarPanel: PositionedSolarPanel, obstacles: Obstacle[], horizontal: boolean): boolean {\r\n for (const obstacle of obstacles) {\r\n if (solarPanelInObstacle(positionedSolarPanel, obstacle.polygon, horizontal)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport function getSolarPanelsInPolygon(grid: Array<Array<PositionedSolarPanel>>, polygon: Polygon, horizontal: boolean, obstacles: Obstacle[]): Array<Array<PositionedSolarPanel>> {\r\n const solarPanels: Array<Array<PositionedSolarPanel>> = [];\r\n for (const row of grid) {\r\n let newRow: Array<PositionedSolarPanel> = [];\r\n for (const positionedSolarPanel of row) {\r\n const isObstructed = isPanelObstructed(positionedSolarPanel, obstacles, horizontal);\r\n if (solarPanelInPolygon(positionedSolarPanel, polygon, horizontal) && !isObstructed) {\r\n newRow.push(positionedSolarPanel);\r\n }\r\n }\r\n solarPanels.push(newRow);\r\n }\r\n return solarPanels;\r\n}\r\n\r\nexport function getOptimalSolarPosition(roof: Polygon, obstacles: Obstacle[], solarPanel: SolarPanelType, angle: number): Array<Array<PositionedSolarPanel>> {\r\n const minX = Math.min(...roof.points.map(p => p.x));\r\n const maxX = Math.max(...roof.points.map(p => p.x));\r\n const minY = Math.min(...roof.points.map(p => p.y));\r\n const maxY = Math.max(...roof.points.map(p => p.y));\r\n const minMax = {\r\n minX: minX,\r\n maxX: maxX,\r\n minY: minY,\r\n maxY: maxY\r\n } as MinMax;\r\n\r\n console.log(\"solar\", solarPanel)\r\n\r\n const horizontalSolarPanel = {\r\n ...solarPanel,\r\n widthMeters: solarPanel.widthMeters * Math.cos(angle * Math.PI / 180),\r\n heightMeters: solarPanel.heightMeters\r\n } as SolarPanelType;\r\n\r\n const verticalSolarPanel = {\r\n ...solarPanel,\r\n widthMeters: solarPanel.widthMeters,\r\n heightMeters: solarPanel.heightMeters * Math.cos(angle * Math.PI / 180)\r\n } as SolarPanelType;\r\n\r\n let solarPanels: Array<Array<PositionedSolarPanel>> = [];\r\n let numberOfPanels = 0;\r\n for (const point of roof.points) {\r\n for (const horizontal of [false]) { // TODO removed true\r\n const grid = generateGrid(minMax, horizontal ? horizontalSolarPanel : verticalSolarPanel, horizontal, point, ROW_SPACING, COLUMN_SPACING);\r\n const solarPanelsInPolygon = getSolarPanelsInPolygon(grid, roof, horizontal, obstacles);\r\n\r\n const numberOfPanelsInPolygon = solarPanelsInPolygon.reduce((acc, row) => acc + row.length, 0);\r\n if (numberOfPanelsInPolygon > numberOfPanels) {\r\n numberOfPanels = numberOfPanelsInPolygon;\r\n solarPanels = solarPanelsInPolygon;\r\n }\r\n }\r\n break;\r\n }\r\n return solarPanels;\r\n}\r\n\r\nfunction projectObstacles(obstacles: Polygon[], azimuth: number, offset: {x: number, y: number}, inset: number): Array<Obstacle> {\r\n const result: Array<Obstacle> = [];\r\n for (const obstacle of obstacles) {\r\n const offsetObstacle = offsetPolygon(obstacle, offset);\r\n const projectedObstacle = projectPolygon(offsetObstacle.polygon, -azimuth);\r\n const insetObstacle = insetPolygon(projectedObstacle, -inset);\r\n\r\n const minX = Math.min(...insetObstacle.points.map(p => p.x));\r\n const maxX = Math.max(...insetObstacle.points.map(p => p.x));\r\n const minY = Math.min(...insetObstacle.points.map(p => p.y));\r\n const maxY = Math.max(...insetObstacle.points.map(p => p.y));\r\n const boundingBox = {\r\n minX: minX,\r\n maxX: maxX,\r\n minY: minY,\r\n maxY: maxY\r\n } as MinMax;\r\n result.push({\r\n polygon: projectedObstacle,\r\n boundingBox: boundingBox\r\n });\r\n }\r\n return result;\r\n}\r\n\r\nfunction isClockwise(points: Point[]): boolean {\r\n let sum = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n const curr = points[i];\r\n const next = points[(i + 1) % points.length];\r\n sum += (next.x - curr.x) * (next.y + curr.y);\r\n }\r\n return sum > 0;\r\n}\r\n\r\nexport function insetPolygon(polygon: Polygon, inset: number): Polygon {\r\n const points = polygon.points;\r\n const isClockwisePolygon = isClockwise(points);\r\n inset = inset * Math.sqrt(2) * (isClockwisePolygon ? -1 : 1);\r\n const insetPoints: Point[] = [];\r\n \r\n for (let i = 0; i < points.length; i++) {\r\n const prev = points[(i - 1 + points.length) % points.length];\r\n const curr = points[i];\r\n const next = points[(i + 1) % points.length];\r\n \r\n // Calculate vectors for the two edges meeting at current point\r\n const v1 = {\r\n x: curr.x - prev.x,\r\n y: curr.y - prev.y\r\n };\r\n const v2 = {\r\n x: next.x - curr.x,\r\n y: next.y - curr.y\r\n };\r\n \r\n // Calculate perpendicular vectors (90 degrees clockwise)\r\n const perp1 = {\r\n x: -v1.y,\r\n y: v1.x\r\n };\r\n const perp2 = {\r\n x: -v2.y,\r\n y: v2.x\r\n };\r\n \r\n // Normalize the perpendicular vectors\r\n const length1 = Math.sqrt(perp1.x * perp1.x + perp1.y * perp1.y);\r\n const length2 = Math.sqrt(perp2.x * perp2.x + perp2.y * perp2.y);\r\n \r\n perp1.x /= length1;\r\n perp1.y /= length1;\r\n perp2.x /= length2;\r\n perp2.y /= length2;\r\n \r\n // Calculate the bisector vector\r\n const bisector = {\r\n x: perp1.x + perp2.x,\r\n y: perp1.y + perp2.y\r\n };\r\n \r\n // Normalize the bisector\r\n const bisectorLength = Math.sqrt(bisector.x * bisector.x + bisector.y * bisector.y);\r\n bisector.x /= bisectorLength;\r\n bisector.y /= bisectorLength;\r\n \r\n // Calculate the inset point\r\n const insetPoint = {\r\n x: curr.x + bisector.x * inset,\r\n y: curr.y + bisector.y * inset\r\n };\r\n \r\n insetPoints.push(insetPoint);\r\n }\r\n \r\n return {\r\n points: insetPoints,\r\n type: polygon.type,\r\n closed: polygon.closed,\r\n _id: polygon._id,\r\n details: polygon.details\r\n };\r\n}\r\n\r\nexport function getOptimalSolarPositionFully(roof: Polygon, obstacles: Polygon[], solarPanel: SolarPanelType, azimuth: number, inset: number, angle: number): Array<PositionedSolarPanel> {\r\n const insetRoof = insetPolygon(roof, inset);\r\n const offset = offsetPolygon(insetRoof);\r\n const projectedOffset = projectPolygon(offset.polygon, -azimuth);\r\n\r\n const projectedObstacles = projectObstacles(obstacles, azimuth, offset.offset, inset);\r\n\r\n const horizontalSolarPanels = getOptimalSolarPosition(projectedOffset, projectedObstacles, solarPanel, angle);\r\n const unprojectedPanels: Array<PositionedSolarPanel> = [];\r\n\r\n for (const panel of horizontalSolarPanels.flat()) {\r\n const unprojectedPanel = projectPoint(panel.pixelPosition, azimuth);\r\n const offsetPosition = {\r\n x: unprojectedPanel.x + offset.offset.x,\r\n y: unprojectedPanel.y + offset.offset.y\r\n }\r\n unprojectedPanels.push({\r\n panel: panel.panel,\r\n pixelPosition: offsetPosition,\r\n horizontal: panel.horizontal\r\n });\r\n }\r\n return unprojectedPanels;\r\n}","import { LanguageStrings } from \"../../types/lang\";\r\n\r\nexport const en: LanguageStrings = {\r\n mapDraw: {\r\n noPolygonSelected: \"No polygon selected\",\r\n noAddressSelected: \"Please select an address\",\r\n information: \"Information\",\r\n calculateSolarPanels: \"Calculate Solar Panels\",\r\n panels: \"Panels\",\r\n area: \"Area\",\r\n azimuth: \"Azimuth\",\r\n pitch: \"Pitch\",\r\n tools: {\r\n roof: {\r\n name: \"Roof\",\r\n explanation: \"Draw the roof of the building\",\r\n ariaLabel: \"Roof\",\r\n },\r\n obstruction: {\r\n name: \"Obstruction\",\r\n explanation: \"Draw the obstruction of the building\",\r\n ariaLabel: \"Obstruction\",\r\n },\r\n delete: {\r\n name: \"Delete\",\r\n explanation: \"Delete the selected polygon\",\r\n ariaLabel: \"Delete\",\r\n },\r\n move: {\r\n name: \"Move\",\r\n explanation: \"Move the selected polygon\",\r\n ariaLabel: \"Move\",\r\n },\r\n },\r\n }\r\n}","import { Language, LanguageStrings } from \"../../types/lang\";\r\nimport { en } from \"./english\";\r\n\r\n\r\nconst languageStrings: Record<Language, LanguageStrings> = {\r\n en: en,\r\n es: {} as LanguageStrings, // TODO: Add spanish strings\r\n de: {} as LanguageStrings // TODO: Add german strings\r\n}\r\n\r\n\r\nexport function getLanguageStrings(lang: Language): LanguageStrings {\r\n return languageStrings[lang];\r\n}\r\n","/*! tailwindcss v4.1.7 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --font-sans: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\",\n \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\",\n \"Courier New\", monospace;\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-green-600: oklch(62.7% 0.194 149.214);\n --color-blue-500: oklch(62.3% 0.214 259.815);\n --color-gray-50: oklch(98.5% 0.002 247.839);\n --color-gray-200: oklch(92.8% 0.006 264.531);\n --color-gray-300: oklch(87.2% 0.01 258.338);\n --color-gray-400: oklch(70.7% 0.022 261.325);\n --color-gray-500: oklch(55.1% 0.027 264.364);\n --color-gray-600: oklch(44.6% 0.03 256.802);\n --color-gray-700: oklch(37.3% 0.034 259.733);\n --color-gray-800: oklch(27.8% 0.033 256.848);\n --color-white: #fff;\n --spacing: 0.25rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-4xl: 2rem;\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --animate-spin: spin 1s linear infinite;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: var(--font-sans);\n --default-mono-font-family: var(--font-mono);\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .pointer-events-none {\n pointer-events: none;\n }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n }\n .absolute {\n position: absolute;\n }\n .fixed {\n position: fixed;\n }\n .relative {\n position: relative;\n }\n .inset-0 {\n inset: calc(var(--spacing) * 0);\n }\n .top-0 {\n top: calc(var(--spacing) * 0);\n }\n .top-1 {\n top: calc(var(--spacing) * 1);\n }\n .top-1\\/2 {\n top: calc(1/2 * 100%);\n }\n .bottom-full {\n bottom: 100%;\n }\n .left-0 {\n left: calc(var(--spacing) * 0);\n }\n .left-1 {\n left: calc(var(--spacing) * 1);\n }\n .left-1\\/2 {\n left: calc(1/2 * 100%);\n }\n .left-3 {\n left: calc(var(--spacing) * 3);\n }\n .z-1 {\n z-index: 1;\n }\n .z-10 {\n z-index: 10;\n }\n .z-20 {\n z-index: 20;\n }\n .z-50 {\n z-index: 50;\n }\n .m-auto {\n margin: auto;\n }\n .mt-1 {\n margin-top: calc(var(--spacing) * 1);\n }\n .mt-4 {\n margin-top: calc(var(--spacing) * 4);\n }\n .mb-1 {\n margin-bottom: calc(var(--spacing) * 1);\n }\n .mb-2 {\n margin-bottom: calc(var(--spacing) * 2);\n }\n .mb-4 {\n margin-bottom: calc(var(--spacing) * 4);\n }\n .mb-6 {\n margin-bottom: calc(var(--spacing) * 6);\n }\n .block {\n display: block;\n }\n .flex {\n display: flex;\n }\n .grid {\n display: grid;\n }\n .table {\n display: table;\n }\n .h-2 {\n height: calc(var(--spacing) * 2);\n }\n .h-3 {\n height: calc(var(--spacing) * 3);\n }\n .h-4 {\n height: calc(var(--spacing) * 4);\n }\n .h-5 {\n height: calc(var(--spacing) * 5);\n }\n .h-16 {\n height: calc(var(--spacing) * 16);\n }\n .h-32 {\n height: calc(var(--spacing) * 32);\n }\n .h-full {\n height: 100%;\n }\n .w-3 {\n width: calc(var(--spacing) * 3);\n }\n .w-4 {\n width: calc(var(--spacing) * 4);\n }\n .w-5 {\n width: calc(var(--spacing) * 5);\n }\n .w-16 {\n width: calc(var(--spacing) * 16);\n }\n .w-52 {\n width: calc(var(--spacing) * 52);\n }\n .w-64 {\n width: calc(var(--spacing) * 64);\n }\n .w-full {\n width: 100%;\n }\n .max-w-2xl {\n max-width: var(--container-2xl);\n }\n .max-w-3xl {\n max-width: var(--container-3xl);\n }\n .flex-1 {\n flex: 1;\n }\n .border-collapse {\n border-collapse: collapse;\n }\n .-translate-x-1 {\n --tw-translate-x: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-y-1 {\n --tw-translate-y: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-y-1\\/2 {\n --tw-translate-y: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .transform {\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\n }\n .animate-spin {\n animation: var(--animate-spin);\n }\n .cursor-help {\n cursor: help;\n }\n .cursor-not-allowed {\n cursor: not-allowed;\n }\n .cursor-pointer {\n cursor: pointer;\n }\n .resize {\n resize: both;\n }\n .appearance-none {\n appearance: none;\n }\n .grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n .grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .flex-col {\n flex-direction: column;\n }\n .flex-row {\n flex-direction: row;\n }\n .items-center {\n align-items: center;\n }\n .items-start {\n align-items: flex-start;\n }\n .justify-between {\n justify-content: space-between;\n }\n .justify-center {\n justify-content: center;\n }\n .justify-start {\n justify-content: flex-start;\n }\n .gap-1 {\n gap: calc(var(--spacing) * 1);\n }\n .gap-2 {\n gap: calc(var(--spacing) * 2);\n }\n .gap-3 {\n gap: calc(var(--spacing) * 3);\n }\n .gap-4 {\n gap: calc(var(--spacing) * 4);\n }\n .gap-6 {\n gap: calc(var(--spacing) * 6);\n }\n .space-y-4 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-6 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-8 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .rounded {\n border-radius: 0.25rem;\n }\n .rounded-2xl {\n border-radius: var(--radius-2xl);\n }\n .rounded-4xl {\n border-radius: var(--radius-4xl);\n }\n .rounded-full {\n border-radius: calc(infinity * 1px);\n }\n .rounded-lg {\n border-radius: var(--radius-lg);\n }\n .rounded-xl {\n border-radius: var(--radius-xl);\n }\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .border-2 {\n border-style: var(--tw-border-style);\n border-width: 2px;\n }\n .border-t {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n .border-t-2 {\n border-top-style: var(--tw-border-style);\n border-top-width: 2px;\n }\n .border-b {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n .border-b-2 {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 2px;\n }\n .border-\\[\\#271200\\] {\n border-color: #271200;\n }\n .border-\\[\\#964500\\] {\n border-color: #964500;\n }\n .border-gray-200 {\n border-color: var(--color-gray-200);\n }\n .border-gray-300 {\n border-color: var(--color-gray-300);\n }\n .border-red-500 {\n border-color: var(--color-red-500);\n }\n .bg-\\[\\#271200\\] {\n background-color: #271200;\n }\n .bg-\\[\\#964500\\] {\n background-color: #964500;\n }\n .bg-\\[\\#f3ebda\\] {\n background-color: #f3ebda;\n }\n .bg-gray-50 {\n background-color: var(--color-gray-50);\n }\n .bg-gray-200 {\n background-color: var(--color-gray-200);\n }\n .bg-gray-400 {\n background-color: var(--color-gray-400);\n }\n .bg-gray-800 {\n background-color: var(--color-gray-800);\n }\n .bg-white {\n background-color: var(--color-white);\n }\n .p-2 {\n padding: calc(var(--spacing) * 2);\n }\n .p-3 {\n padding: calc(var(--spacing) * 3);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n .p-6 {\n padding: calc(var(--spacing) * 6);\n }\n .p-8 {\n padding: calc(var(--spacing) * 8);\n }\n .px-2 {\n padding-inline: calc(var(--spacing) * 2);\n }\n .px-3 {\n padding-inline: calc(var(--spacing) * 3);\n }\n .px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n .px-6 {\n padding-inline: calc(var(--spacing) * 6);\n }\n .py-1 {\n padding-block: calc(var(--spacing) * 1);\n }\n .py-2 {\n padding-block: calc(var(--spacing) * 2);\n }\n .py-3 {\n padding-block: calc(var(--spacing) * 3);\n }\n .pt-4 {\n padding-top: calc(var(--spacing) * 4);\n }\n .pt-6 {\n padding-top: calc(var(--spacing) * 6);\n }\n .pt-7 {\n padding-top: calc(var(--spacing) * 7);\n }\n .pr-4 {\n padding-right: calc(var(--spacing) * 4);\n }\n .pb-2 {\n padding-bottom: calc(var(--spacing) * 2);\n }\n .pb-3 {\n padding-bottom: calc(var(--spacing) * 3);\n }\n .pb-7 {\n padding-bottom: calc(var(--spacing) * 7);\n }\n .pl-10 {\n padding-left: calc(var(--spacing) * 10);\n }\n .text-center {\n text-align: center;\n }\n .text-2xl {\n font-size: var(--text-2xl);\n line-height: var(--tw-leading, var(--text-2xl--line-height));\n }\n .text-3xl {\n font-size: var(--text-3xl);\n line-height: var(--tw-leading, var(--text-3xl--line-height));\n }\n .text-lg {\n font-size: var(--text-lg);\n line-height: var(--tw-leading, var(--text-lg--line-height));\n }\n .text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n .text-xl {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n .font-medium {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n .whitespace-nowrap {\n white-space: nowrap;\n }\n .text-\\[\\#1a365d\\] {\n color: #1a365d;\n }\n .text-\\[\\#271200\\] {\n color: #271200;\n }\n .text-\\[\\#964500\\] {\n color: #964500;\n }\n .text-gray-400 {\n color: var(--color-gray-400);\n }\n .text-gray-500 {\n color: var(--color-gray-500);\n }\n .text-gray-600 {\n color: var(--color-gray-600);\n }\n .text-gray-700 {\n color: var(--color-gray-700);\n }\n .text-green-600 {\n color: var(--color-green-600);\n }\n .text-red-500 {\n color: var(--color-red-500);\n }\n .text-white {\n color: var(--color-white);\n }\n .underline {\n text-decoration-line: underline;\n }\n .accent-\\[\\#964500\\] {\n accent-color: #964500;\n }\n .opacity-0 {\n opacity: 0%;\n }\n .shadow {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-inner {\n --tw-shadow: inset 0 2px 4px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-lg {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .outline {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n .transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-colors {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-opacity {\n transition-property: opacity;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .duration-200 {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n .ease-in-out {\n --tw-ease: var(--ease-in-out);\n transition-timing-function: var(--ease-in-out);\n }\n .select-none {\n -webkit-user-select: none;\n user-select: none;\n }\n .group-hover\\:opacity-100 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .peer-checked\\:bg-\\[\\#964500\\] {\n &:is(:where(.peer):checked ~ *) {\n background-color: #964500;\n }\n }\n .peer-checked\\:opacity-100 {\n &:is(:where(.peer):checked ~ *) {\n opacity: 100%;\n }\n }\n .hover\\:bg-\\[\\#7a3700\\] {\n &:hover {\n @media (hover: hover) {\n background-color: #7a3700;\n }\n }\n }\n .hover\\:bg-\\[\\#964500\\] {\n &:hover {\n @media (hover: hover) {\n background-color: #964500;\n }\n }\n }\n .focus\\:border-transparent {\n &:focus {\n border-color: transparent;\n }\n }\n .focus\\:ring-2 {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus\\:ring-\\[\\#1a365d\\] {\n &:focus {\n --tw-ring-color: #1a365d;\n }\n }\n .focus\\:ring-\\[\\#964500\\] {\n &:focus {\n --tw-ring-color: #964500;\n }\n }\n .focus\\:ring-blue-500 {\n &:focus {\n --tw-ring-color: var(--color-blue-500);\n }\n }\n .focus\\:outline-none {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n .md\\:grid-cols-2 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:h-4 {\n &::-moz-range-thumb {\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:w-4 {\n &::-moz-range-thumb {\n width: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:appearance-none {\n &::-moz-range-thumb {\n appearance: none;\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:rounded-full {\n &::-moz-range-thumb {\n border-radius: calc(infinity * 1px);\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:border-0 {\n &::-moz-range-thumb {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:bg-\\[\\#964500\\] {\n &::-moz-range-thumb {\n background-color: #964500;\n }\n }\n .\\[\\&\\:\\:-moz-range-track\\]\\:bg-\\[\\#964500\\] {\n &::-moz-range-track {\n background-color: #964500;\n }\n }\n .\\[\\&\\:\\:-webkit-slider-runnable-track\\]\\:bg-\\[\\#964500\\] {\n &::-webkit-slider-runnable-track {\n background-color: #964500;\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:h-4 {\n &::-webkit-slider-thumb {\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:w-4 {\n &::-webkit-slider-thumb {\n width: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:appearance-none {\n &::-webkit-slider-thumb {\n appearance: none;\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:rounded-full {\n &::-webkit-slider-thumb {\n border-radius: calc(infinity * 1px);\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:bg-\\[\\#964500\\] {\n &::-webkit-slider-thumb {\n background-color: #964500;\n }\n }\n .\\[\\&\\>option\\:checked\\]\\:bg-\\[\\#964500\\] {\n &>option:checked {\n background-color: #964500;\n }\n }\n .\\[\\&\\>option\\:checked\\]\\:text-white {\n &>option:checked {\n color: var(--color-white);\n }\n }\n}\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-rotate-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-z {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-space-y-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"<length>\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ease {\n syntax: \"*\";\n inherits: false;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *, ::before, ::after, ::backdrop {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-space-y-reverse: 0;\n --tw-border-style: solid;\n --tw-font-weight: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-duration: initial;\n --tw-ease: initial;\n }\n }\n}\n","import {\r\n Component,\r\n Element,\r\n h,\r\n Listen,\r\n Prop,\r\n State,\r\n Watch,\r\n} from \"@stencil/core\";\r\n\r\nimport {\r\n renderCombinedWithZoom,\r\n renderSolarPanel,\r\n} from \"../../utils/visualize\";\r\nimport {\r\n BuildingInsightsResponse,\r\n GeoTiff,\r\n SolarPanelType,\r\n} from \"../../utils/solar\";\r\nimport { fetchSolarData, getBuildingImages } from \"../../utils/api\";\r\nimport { drawPolygon, isPointInPolygon } from \"../../utils/render/polygon\";\r\nimport { projectPointPerpendicularToLine } from \"../../utils/render/projection\";\r\nimport { Point, Polygon, SelectedPolygon } from \"../../types/shapes\";\r\nimport { moveTool, roofTool, Tool, tools } from \"../../utils/render/tools\";\r\nimport {\r\n DEFAULT_SOLAR_EXPERT_CONFIG,\r\n DEFAULT_SOLAR_PANEL_TYPE,\r\n SolarExpertConfig,\r\n} from \"../../config\";\r\nimport { getFillColor } from \"../../utils/render/color\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport {\r\n azimuthToCardinal,\r\n calculatePolygonArea,\r\n getPixelInMeters,\r\n} from \"../../utils/utils\";\r\nimport {\r\n getBestFittingRoofSegment,\r\n SolarPanelSystemPart,\r\n} from \"../../utils/geometry/fitting\";\r\nimport { getOptimalSolarPositionFully } from \"../../utils/geometry/gridMatch\";\r\nimport { BORDER_INSET, DEFAULT_SUNNINESS } from \"../../constants\";\r\nimport { Language } from \"../../types/lang\";\r\nimport { getLanguageStrings } from \"../../utils/lang/general\";\r\nconst FACTOR = 1;\r\n\r\n@Component({\r\n tag: \"map-draw\",\r\n styleUrl: \"../../output.css\",\r\n shadow: false,\r\n})\r\nexport class MapDraw {\r\n @Prop()\r\n language: Language = \"en\";\r\n @Prop()\r\n apiKey: string = \"\";\r\n @Prop()\r\n latitude: number | null = null;\r\n @Prop()\r\n longitude: number | null = null;\r\n @Prop()\r\n config: SolarExpertConfig = DEFAULT_SOLAR_EXPERT_CONFIG;\r\n @Prop()\r\n solarPanel: SolarPanelType = DEFAULT_SOLAR_PANEL_TYPE;\r\n\r\n @State()\r\n zoom: number = 1;\r\n @State()\r\n loadingState: \"empty\" | \"loading\" | \"loaded\" = \"empty\";\r\n @State()\r\n rgbTiff: GeoTiff | null = null;\r\n @State()\r\n draggedPointIndex: number | null = null;\r\n @State()\r\n hoveredPointIndex: number | null = null;\r\n @State()\r\n hoveredPolygon: SelectedPolygon | null = null;\r\n @State()\r\n shiftKeyPressed: boolean = false;\r\n @State()\r\n altKeyPressed: boolean = false;\r\n @State()\r\n mousePoint: Point | null = null;\r\n @State()\r\n currentTool: Tool = roofTool;\r\n @State()\r\n roofPolygons: { [id: string]: Polygon } = {};\r\n @State()\r\n roofPolygonsSolarPanels: { [id: string]: SolarPanelSystemPart } = {};\r\n @State()\r\n obstructionPolygons: { [id: string]: Polygon } = {};\r\n @State()\r\n selectedPolygon: SelectedPolygon | null = null;\r\n @State()\r\n buildingInsights: BuildingInsightsResponse | null = null;\r\n @State()\r\n pixelInMeters: number = 0.2;\r\n @State()\r\n showAzimuth: boolean = true; // TODO: make this false\r\n\r\n @Element()\r\n el: HTMLElement;\r\n private canvasElement?: HTMLCanvasElement;\r\n private polygonCanvas?: HTMLCanvasElement;\r\n private polygonCtx?: CanvasRenderingContext2D;\r\n\r\n private getCurrentPolygon(): Polygon | null {\r\n if (!this.selectedPolygon) {\r\n return null;\r\n }\r\n const { _id, type } = this.selectedPolygon;\r\n return type === \"roof\"\r\n ? this.roofPolygons[_id]\r\n : this.obstructionPolygons[_id];\r\n }\r\n\r\n componentDidLoad() {\r\n if (this.latitude && this.longitude) {\r\n this.loadingState = \"loading\";\r\n }\r\n\r\n requestAnimationFrame(() => {\r\n if (this.canvasElement) {\r\n const rect = this.canvasElement.getBoundingClientRect();\r\n this.canvasElement.width = rect.width;\r\n this.canvasElement.height = rect.height;\r\n this.drawMap();\r\n }\r\n });\r\n }\r\n\r\n private sizeCanvas(width: number, height: number) {\r\n // if (this.canvasElement) {\r\n // this.canvasElement.width = width;\r\n // this.canvasElement.height = height;\r\n // }\r\n if (this.polygonCanvas) {\r\n this.polygonCanvas.width = width;\r\n this.polygonCanvas.height = height;\r\n this.polygonCtx = this.polygonCanvas.getContext(\"2d\");\r\n }\r\n }\r\n\r\n @Watch(\"latitude\")\r\n @Watch(\"longitude\")\r\n async getBuildingInsights() {\r\n if (!this.latitude || !this.longitude) {\r\n return;\r\n }\r\n this.loadingState = \"loading\";\r\n\r\n if (this.buildingInsights) {\r\n const sameLocation =\r\n this.buildingInsights.center.latitude === this.latitude &&\r\n this.buildingInsights.center.longitude === this.longitude;\r\n if (sameLocation) {\r\n return;\r\n }\r\n this.obstructionPolygons = {};\r\n this.roofPolygons = {};\r\n this.selectedPolygon = null;\r\n this.hoveredPolygon = null;\r\n this.canvasElement.getContext(\"2d\")?.clearRect(\r\n 0,\r\n 0,\r\n this.canvasElement.width,\r\n this.canvasElement.height,\r\n );\r\n this.polygonCtx?.clearRect(\r\n 0,\r\n 0,\r\n this.polygonCanvas.width,\r\n this.polygonCanvas.height,\r\n );\r\n this.rgbTiff = null;\r\n }\r\n this.buildingInsights = await fetchSolarData(\r\n this.latitude,\r\n this.longitude,\r\n this.apiKey,\r\n );\r\n if (!this.buildingInsights) {\r\n alert(\"No building insights found. Please enter them manually.\");\r\n }\r\n }\r\n\r\n @Watch(\"latitude\")\r\n @Watch(\"longitude\")\r\n async getBuildingImages() {\r\n if (!this.latitude || !this.longitude) {\r\n return;\r\n }\r\n if (this.buildingInsights) {\r\n const sameLocation =\r\n this.buildingInsights.center.latitude === this.latitude &&\r\n this.buildingInsights.center.longitude === this.longitude;\r\n if (sameLocation) {\r\n return;\r\n }\r\n }\r\n this.rgbTiff = await getBuildingImages(\r\n this.latitude,\r\n this.longitude,\r\n this.apiKey,\r\n );\r\n this.pixelInMeters = getPixelInMeters(this.rgbTiff);\r\n this.loadingState = \"loaded\";\r\n }\r\n\r\n @Watch(\"rgbTiff\")\r\n @Watch(\"buildingInsights\")\r\n @Watch(\"canvasElement\")\r\n async drawMap() {\r\n if (\r\n !this.canvasElement || !this.rgbTiff || !this.buildingInsights\r\n ) return;\r\n this.sizeCanvas(this.rgbTiff.width, this.rgbTiff.height);\r\n renderCombinedWithZoom({\r\n rgb: this.rgbTiff,\r\n zoom: this.zoom,\r\n canvas: this.canvasElement,\r\n });\r\n }\r\n\r\n @Listen(\"mousemove\", { target: \"document\" })\r\n handleMouseMove(event: MouseEvent) {\r\n if (!this.polygonCanvas || !this.polygonCtx) return;\r\n\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n const x = event.clientX - rect.left;\r\n const y = event.clientY - rect.top;\r\n this.mousePoint = { x, y };\r\n\r\n const currentPolygon = this.getCurrentPolygon();\r\n\r\n // Check for point hover\r\n const newHoveredPointIndex = currentPolygon?.points.findIndex(\r\n (point) => {\r\n const distance = Math.sqrt(\r\n Math.pow(x - point.x, 2) + Math.pow(y - point.y, 2),\r\n );\r\n return distance < 10;\r\n },\r\n );\r\n\r\n // Check for polygon hover\r\n let newHoveredPolygon = null;\r\n for (const polygon of Object.values(this.obstructionPolygons)) {\r\n if (isPointInPolygon({ x, y }, polygon)) {\r\n newHoveredPolygon = { _id: polygon._id, type: \"obstruction\" };\r\n break;\r\n }\r\n }\r\n // obstruction polygons get priority\r\n if (!newHoveredPolygon) {\r\n for (const polygon of Object.values(this.roofPolygons)) {\r\n if (isPointInPolygon({ x, y }, polygon)) {\r\n newHoveredPolygon = { _id: polygon._id, type: \"roof\" };\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Only redraw if hover state changed\r\n if (\r\n newHoveredPointIndex !== this.hoveredPointIndex ||\r\n JSON.stringify(newHoveredPolygon) !==\r\n JSON.stringify(this.hoveredPolygon)\r\n ) {\r\n this.hoveredPointIndex = newHoveredPointIndex;\r\n this.hoveredPolygon = newHoveredPolygon;\r\n this.drawPolygons();\r\n }\r\n\r\n // Handle dragging\r\n if (\r\n this.draggedPointIndex !== null && currentPolygon &&\r\n this.currentTool.name === \"move\"\r\n ) {\r\n currentPolygon.points[this.draggedPointIndex] = { x, y };\r\n this.drawPolygons();\r\n }\r\n\r\n if (this.shiftKeyPressed) {\r\n this.drawPolygons();\r\n }\r\n }\r\n\r\n private drawPolygons() {\r\n if (!this.polygonCanvas || !this.polygonCtx) return;\r\n\r\n // Clear the canvas and redraw the map\r\n this.polygonCtx.clearRect(\r\n 0,\r\n 0,\r\n this.polygonCanvas.width,\r\n this.polygonCanvas.height,\r\n );\r\n\r\n // draw roof polygons\r\n for (const polygon of Object.values(this.roofPolygons)) {\r\n const fillColor = getFillColor(\r\n this.selectedPolygon,\r\n this.hoveredPolygon,\r\n polygon._id,\r\n polygon,\r\n this.config,\r\n );\r\n\r\n drawPolygon({\r\n polygonCtx: this.polygonCtx,\r\n polygonCanvas: this.polygonCanvas,\r\n polygon,\r\n strokeColor: polygon.closed\r\n ? this.config.closedRoofColor\r\n : this.config.openRoofColor,\r\n fillColor,\r\n pixelInMeters: this.pixelInMeters,\r\n shiftKeyPressed: this.shiftKeyPressed,\r\n mousePoint: this.mousePoint,\r\n });\r\n\r\n const solarPanels = this.roofPolygonsSolarPanels[polygon._id];\r\n const convertedSolarPanel: SolarPanelType = {\r\n ...this.solarPanel,\r\n widthMeters: this.solarPanel.widthMeters / this.pixelInMeters,\r\n heightMeters: this.solarPanel.heightMeters / this.pixelInMeters,\r\n };\r\n if (solarPanels) {\r\n for (const panel of solarPanels.positionedPanels) {\r\n renderSolarPanel(\r\n panel,\r\n this.polygonCtx,\r\n convertedSolarPanel.widthMeters,\r\n convertedSolarPanel.heightMeters,\r\n polygon.details?.azimuth,\r\n polygon.details?.pitch,\r\n );\r\n }\r\n }\r\n }\r\n\r\n // draw obstruction polygons\r\n for (const polygon of Object.values(this.obstructionPolygons)) {\r\n const fillColor = getFillColor(\r\n this.selectedPolygon,\r\n this.hoveredPolygon,\r\n polygon._id,\r\n polygon,\r\n this.config,\r\n );\r\n\r\n drawPolygon({\r\n polygonCtx: this.polygonCtx,\r\n polygonCanvas: this.polygonCanvas,\r\n polygon,\r\n pixelInMeters: this.pixelInMeters,\r\n shiftKeyPressed: this.shiftKeyPressed,\r\n mousePoint: this.mousePoint,\r\n strokeColor: polygon.closed\r\n ? this.config.closedObstructionColor\r\n : this.config.openObstructionColor,\r\n fillColor,\r\n });\r\n }\r\n\r\n // if (this.showAzimuth && this.selectedPolygon) {\r\n // const currentPolygon = this.getCurrentPolygon();\r\n // renderAzimuth(currentPolygon.details?.azimuth, this.polygonCtx);\r\n // }\r\n }\r\n\r\n private deletePolygon(_id: string) {\r\n if (this.selectedPolygon?._id === _id) {\r\n this.selectedPolygon = null;\r\n }\r\n if (this.roofPolygons[_id]) {\r\n delete this.roofPolygons[_id];\r\n delete this.roofPolygonsSolarPanels[_id];\r\n }\r\n if (this.obstructionPolygons[_id]) {\r\n delete this.obstructionPolygons[_id];\r\n }\r\n }\r\n\r\n @Listen(\"keydown\", { target: \"document\" })\r\n handleKeyDown(event: KeyboardEvent) {\r\n if (event.target instanceof HTMLInputElement) {\r\n return;\r\n }\r\n // Handle shift key for perpendicular points\r\n if (event.shiftKey && !this.shiftKeyPressed) {\r\n this.shiftKeyPressed = true;\r\n this.drawPolygons();\r\n return;\r\n }\r\n if (event.altKey && !this.altKeyPressed) {\r\n this.altKeyPressed = true;\r\n return;\r\n }\r\n if (\r\n (event.key === \"Delete\" || event.key === \"Backspace\") &&\r\n this.selectedPolygon\r\n ) {\r\n const currentPolygon = this.getCurrentPolygon();\r\n if (currentPolygon.closed) {\r\n this.deletePolygon(currentPolygon._id);\r\n this.drawPolygons();\r\n return;\r\n }\r\n currentPolygon.points.pop();\r\n this.drawPolygons();\r\n return;\r\n }\r\n\r\n // Handle tool selection shortcuts\r\n const pressedKey = event.key.toLowerCase();\r\n const tool = tools.find((t) =>\r\n t.keyboardShortcut?.toLowerCase() === pressedKey\r\n );\r\n if (tool) {\r\n this.currentTool = tool;\r\n }\r\n }\r\n\r\n @Listen(\"keyup\", { target: \"document\" })\r\n handleKeyUp(event: KeyboardEvent) {\r\n if (!event.shiftKey && this.shiftKeyPressed) {\r\n this.shiftKeyPressed = false;\r\n this.drawPolygons();\r\n }\r\n if (!event.altKey && this.altKeyPressed) {\r\n this.altKeyPressed = false;\r\n }\r\n }\r\n\r\n @Listen(\"mousedown\", { target: \"document\" })\r\n handleMouseDown(event: MouseEvent) {\r\n if (!this.polygonCanvas || !this.polygonCtx) return;\r\n if (!this.polygonCanvas.contains(event.target as Node)) return;\r\n\r\n // get the mouse position in the polygon canvas\r\n const rect = this.polygonCanvas.getBoundingClientRect();\r\n let x = event.clientX - rect.left;\r\n let y = event.clientY - rect.top;\r\n\r\n if (this.currentTool.name === \"delete\") {\r\n if (!this.hoveredPolygon) {\r\n return;\r\n }\r\n const { _id, type } = this.hoveredPolygon;\r\n if (type === \"roof\") {\r\n delete this.roofPolygons[_id];\r\n delete this.roofPolygonsSolarPanels[_id];\r\n } else if (type === \"obstruction\") {\r\n delete this.obstructionPolygons[_id];\r\n }\r\n this.hoveredPolygon = null;\r\n if (this.selectedPolygon?._id === _id) {\r\n this.selectedPolygon = null;\r\n }\r\n this.drawPolygons();\r\n return;\r\n }\r\n if (this.currentTool.name === \"move\") {\r\n // Check if we're clicking on a point of the selected polygon\r\n if (this.selectedPolygon) {\r\n const currentPolygon = this.getCurrentPolygon();\r\n const pointIndex = currentPolygon?.points.findIndex((point) => {\r\n const distance = Math.sqrt(\r\n Math.pow(x - point.x, 2) + Math.pow(y - point.y, 2),\r\n );\r\n return distance < 10;\r\n });\r\n if (pointIndex !== undefined && pointIndex !== -1) {\r\n this.draggedPointIndex = pointIndex;\r\n return;\r\n }\r\n\r\n if (this.hoveredPolygon) {\r\n this.selectedPolygon = this.hoveredPolygon;\r\n return;\r\n }\r\n }\r\n this.selectedPolygon = null;\r\n this.drawPolygons();\r\n return;\r\n }\r\n\r\n if (!this.selectedPolygon || this.getCurrentPolygon()?.closed) {\r\n // no polygon is active, create a new one\r\n const newPolygon: Polygon = {\r\n _id: uuidv4(),\r\n points: [{ x, y }],\r\n type: this.currentTool.name,\r\n closed: false,\r\n };\r\n let _id;\r\n if (this.currentTool.name === \"roof\") {\r\n this.roofPolygons = {\r\n ...this.roofPolygons,\r\n [newPolygon._id]: newPolygon,\r\n };\r\n _id = newPolygon._id;\r\n } else if (this.currentTool.name === \"obstruction\") {\r\n this.obstructionPolygons = {\r\n ...this.obstructionPolygons,\r\n [newPolygon._id]: newPolygon,\r\n };\r\n _id = newPolygon._id;\r\n }\r\n this.selectedPolygon = { _id, type: this.currentTool.name };\r\n return;\r\n }\r\n\r\n const { _id, type } = this.selectedPolygon;\r\n const currentPolygon = type === \"roof\"\r\n ? this.roofPolygons[_id]\r\n : this.obstructionPolygons[_id];\r\n\r\n if (currentPolygon.closed) {\r\n return;\r\n }\r\n\r\n // If we have at least one point, check if we're clicking near the first point\r\n if (currentPolygon.points.length > 2) {\r\n const firstPoint = currentPolygon.points[0];\r\n const distance = Math.sqrt(\r\n Math.pow(x - firstPoint.x, 2) + Math.pow(y - firstPoint.y, 2),\r\n );\r\n\r\n if (distance < 10) {\r\n this.closePolygon();\r\n return;\r\n }\r\n }\r\n\r\n // Handle shift key for perpendicular points\r\n if (event.shiftKey && currentPolygon?.points.length >= 2) {\r\n const projectedPoint = projectPointPerpendicularToLine({\r\n x,\r\n y,\r\n lastPoint:\r\n currentPolygon.points[currentPolygon.points.length - 1],\r\n secondLastPoint:\r\n currentPolygon.points[currentPolygon.points.length - 2],\r\n });\r\n x = projectedPoint.x;\r\n y = projectedPoint.y;\r\n }\r\n\r\n currentPolygon.points = [...currentPolygon.points, { x, y }];\r\n this.drawPolygons();\r\n }\r\n\r\n @Listen(\"mouseup\", { target: \"document\" })\r\n handleMouseUp() {\r\n this.draggedPointIndex = null;\r\n }\r\n\r\n private closePolygon() {\r\n const currentPolygon = this.getCurrentPolygon();\r\n if (\r\n currentPolygon.points.length >= 3 &&\r\n (this.currentTool.name === \"roof\" ||\r\n this.currentTool.name === \"obstruction\")\r\n ) {\r\n currentPolygon.closed = true;\r\n }\r\n\r\n if (currentPolygon.type === \"roof\") {\r\n // Calculate basic polygon details\r\n const metersInPixels = 1 / this.pixelInMeters;\r\n const area = calculatePolygonArea(currentPolygon.points) /\r\n (metersInPixels * metersInPixels);\r\n const bestMatch = getBestFittingRoofSegment(\r\n currentPolygon,\r\n this.buildingInsights?.solarPotential.roofSegmentStats,\r\n this.rgbTiff.bounds,\r\n this.canvasElement,\r\n );\r\n\r\n if (bestMatch) {\r\n currentPolygon.details = {\r\n area,\r\n azimuth: bestMatch.azimuthDegrees,\r\n pitch: bestMatch.pitchDegrees,\r\n };\r\n } else {\r\n currentPolygon.details = {\r\n area,\r\n azimuth: 0,\r\n pitch: 0,\r\n };\r\n }\r\n }\r\n\r\n this.drawPolygons();\r\n this.currentTool = moveTool;\r\n }\r\n\r\n private calculateSolarPanels() {\r\n const currentPolygon = this.getCurrentPolygon();\r\n\r\n if (!currentPolygon.details) {\r\n return;\r\n }\r\n\r\n if (this.roofPolygonsSolarPanels[currentPolygon._id]) {\r\n delete this.roofPolygonsSolarPanels[currentPolygon._id];\r\n }\r\n\r\n const convertedSolarPanel: SolarPanelType = {\r\n ...this.solarPanel,\r\n widthMeters: this.solarPanel.widthMeters / this.pixelInMeters,\r\n heightMeters: this.solarPanel.heightMeters / this.pixelInMeters,\r\n };\r\n const inset = BORDER_INSET / this.pixelInMeters;\r\n const solarPanels = getOptimalSolarPositionFully(\r\n currentPolygon,\r\n Object.values(this.obstructionPolygons),\r\n convertedSolarPanel,\r\n currentPolygon.details?.azimuth,\r\n inset,\r\n currentPolygon.details?.pitch,\r\n );\r\n this.roofPolygonsSolarPanels = {\r\n ...this.roofPolygonsSolarPanels,\r\n [currentPolygon._id]: {\r\n positionedPanels: solarPanels,\r\n sunniness: currentPolygon.details?.assignedRoofStats?.stats\r\n .sunshineQuantiles[5] ??\r\n this.buildingInsights.solarPotential.buildingStats\r\n .sunshineQuantiles[5] ??\r\n DEFAULT_SUNNINESS,\r\n },\r\n };\r\n this.drawPolygons();\r\n }\r\n\r\n private handlePitchChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n const pitch = parseFloat(target.value);\r\n const currentPolygon = this.getCurrentPolygon();\r\n if (currentPolygon) {\r\n this.roofPolygons[currentPolygon._id].details.pitch = pitch;\r\n }\r\n if (\r\n currentPolygon.type === \"roof\" &&\r\n this.roofPolygonsSolarPanels[currentPolygon._id]\r\n ) {\r\n this.calculateSolarPanels();\r\n return;\r\n }\r\n }\r\n\r\n private handleAzimuthChange(event: Event) {\r\n const target = event.target as HTMLInputElement;\r\n const azimuth = parseFloat(target.value);\r\n const currentPolygon = this.getCurrentPolygon();\r\n if (currentPolygon) {\r\n this.roofPolygons[currentPolygon._id].details.azimuth = azimuth;\r\n }\r\n if (\r\n currentPolygon.type === \"roof\" &&\r\n this.roofPolygonsSolarPanels[currentPolygon._id]\r\n ) {\r\n this.calculateSolarPanels();\r\n return;\r\n }\r\n }\r\n\r\n private handleToolSelect(tool: Tool) {\r\n this.currentTool = tool;\r\n }\r\n\r\n render() {\r\n const t = getLanguageStrings(this.language);\r\n const currentPolygon = this.getCurrentPolygon();\r\n return (\r\n <div class=\"flex flex-col justify-center items-center w-full h-full gap-4\">\r\n {this.loadingState === \"empty\" && (\r\n <p class=\"text-gray-500 text-center\">\r\n {t.mapDraw.noAddressSelected}\r\n </p>\r\n )}\r\n {(this.latitude && this.longitude &&\r\n this.loadingState !== \"loaded\") && (\r\n <div class=\"absolute w-full flex items-center justify-center bg-white bg-opacity-75 z-20 pt-7 rounded-4xl\">\r\n <div class=\"animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-[#271200]\">\r\n </div>\r\n </div>\r\n )}\r\n <div class=\"flex gap-4 rounded-4xl bg-[#f3ebda] p-4\">\r\n {tools.map((tool) => {\r\n const toolStrings = t.mapDraw.tools[tool.name];\r\n return (\r\n <button\r\n class={`px-4 py-2 rounded-4xl transition-colors duration-200 hover:bg-[#964500] ${\r\n this.currentTool.name === tool.name\r\n ? \"bg-[#271200] text-white hover:bg-[#964500]\"\r\n : \"bg-[#f3ebda] hover:bg-[#964500]\"\r\n }`}\r\n aria-label={toolStrings.ariaLabel}\r\n title={toolStrings.explanation}\r\n onClick={() => this.handleToolSelect(tool)}\r\n >\r\n <div class=\"flex items-center gap-1 flex-col\">\r\n <i data-lucide={tool.icon} />\r\n <span>{toolStrings.name}</span>\r\n </div>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n <div class=\"flex gap-4 items-start justify-center h-full\">\r\n <div\r\n class=\"relative flex-1 w-full h-full rounded-4xl flex items-center justify-center\"\r\n style={{\r\n width: `${this.rgbTiff?.width * FACTOR || 0}px`,\r\n height: `${this.rgbTiff?.height * FACTOR || 0}px`,\r\n }}\r\n >\r\n <canvas\r\n ref={(el) => this.canvasElement = el}\r\n class={`absolute top-0 left-0 z-1 rounded-4xl m-auto`}\r\n style={{\r\n cursor: this.currentTool.cursor,\r\n }}\r\n >\r\n </canvas>\r\n <canvas\r\n ref={(el) => this.polygonCanvas = el}\r\n class={`absolute top-0 left-0 z-10 rounded-4xl m-auto`}\r\n style={{\r\n cursor: this.currentTool.cursor,\r\n }}\r\n >\r\n </canvas>\r\n </div>\r\n </div>\r\n <div class=\"flex gap-4 flex-row justify-center items-center\">\r\n <div class=\"w-52 bg-[#f3ebda] rounded-4xl p-4\">\r\n <h3 class=\"text-lg font-semibold mb-4 text-center\">\r\n {t.mapDraw.information}\r\n </h3>\r\n {currentPolygon?.details\r\n ? (\r\n <div class=\"space-y-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <button\r\n class=\"px-4 py-2 bg-[#271200] text-white rounded-4xl hover:bg-[#964500] transition-colors duration-200\"\r\n onClick={() =>\r\n this.calculateSolarPanels()}\r\n >\r\n {t.mapDraw.calculateSolarPanels}\r\n </button>\r\n {this\r\n .roofPolygonsSolarPanels[\r\n currentPolygon._id\r\n ] && (\r\n <p class=\"text-lg text-center\">\r\n {this\r\n .roofPolygonsSolarPanels[\r\n currentPolygon._id\r\n ].positionedPanels\r\n .length} {t.mapDraw.panels}\r\n </p>\r\n )}\r\n </div>\r\n <div>\r\n <h4 class=\"text-sm font-medium text-gray-600\">\r\n {t.mapDraw.area}\r\n </h4>\r\n <p class=\"text-lg\">\r\n {currentPolygon.details?.area\r\n .toFixed(2)} m²\r\n </p>\r\n </div>\r\n <div>\r\n <h4 class=\"text-sm font-medium text-gray-600\">\r\n Orientation\r\n </h4>\r\n <div class=\"flex gap-2 flex-row justify-start\">\r\n <input\r\n class=\"text-lg w-full\"\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.handleAzimuthChange(\r\n e,\r\n );\r\n (e.target as HTMLInputElement)\r\n .blur();\r\n }\r\n }}\r\n value={currentPolygon\r\n .details\r\n ?.azimuth}\r\n />\r\n ({azimuthToCardinal(\r\n currentPolygon.details\r\n ?.azimuth,\r\n )})\r\n </div>\r\n </div>\r\n <div>\r\n <h4 class=\"text-sm font-medium text-gray-600\">\r\n {t.mapDraw.pitch}\r\n </h4>\r\n <div class=\"flex gap-2 flex-row justify-start\">\r\n <input\r\n class=\"text-lg w-full\"\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.handlePitchChange(\r\n e,\r\n );\r\n (e.target as HTMLInputElement)\r\n .blur();\r\n }\r\n }}\r\n value={currentPolygon\r\n .details\r\n ?.pitch}\r\n />\r\n °\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n : (\r\n <p class=\"text-gray-500 text-center\">\r\n {t.mapDraw.noPolygonSelected}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n <solar-system-form\r\n systemConfigs={this.roofPolygonsSolarPanels}\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n","/**\n * @license lucide v0.509.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Eraser = [\n [\n \"path\",\n { d: \"m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21\" }\n ],\n [\"path\", { d: \"M22 21H7\" }],\n [\"path\", { d: \"m5 11 9 9\" }]\n];\n\nexport { Eraser as default };\n//# sourceMappingURL=eraser.js.map\n","/**\n * @license lucide v0.509.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst House = [\n [\"path\", { d: \"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\" }],\n [\n \"path\",\n {\n d: \"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"\n }\n ]\n];\n\nexport { House as default };\n//# sourceMappingURL=house.js.map\n","/**\n * @license lucide v0.509.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst Move = [\n [\"path\", { d: \"M12 2v20\" }],\n [\"path\", { d: \"m15 19-3 3-3-3\" }],\n [\"path\", { d: \"m19 9 3 3-3 3\" }],\n [\"path\", { d: \"M2 12h20\" }],\n [\"path\", { d: \"m5 9-3 3 3 3\" }],\n [\"path\", { d: \"m9 5 3-3 3 3\" }]\n];\n\nexport { Move as default };\n//# sourceMappingURL=move.js.map\n","/**\n * @license lucide v0.509.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst OctagonMinus = [\n [\n \"path\",\n {\n d: \"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z\"\n }\n ],\n [\"path\", { d: \"M8 12h8\" }]\n];\n\nexport { OctagonMinus as default };\n//# sourceMappingURL=octagon-minus.js.map\n","/*! tailwindcss v4.1.7 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --font-sans: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\",\n \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\",\n \"Courier New\", monospace;\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-green-600: oklch(62.7% 0.194 149.214);\n --color-blue-500: oklch(62.3% 0.214 259.815);\n --color-gray-50: oklch(98.5% 0.002 247.839);\n --color-gray-200: oklch(92.8% 0.006 264.531);\n --color-gray-300: oklch(87.2% 0.01 258.338);\n --color-gray-400: oklch(70.7% 0.022 261.325);\n --color-gray-500: oklch(55.1% 0.027 264.364);\n --color-gray-600: oklch(44.6% 0.03 256.802);\n --color-gray-700: oklch(37.3% 0.034 259.733);\n --color-gray-800: oklch(27.8% 0.033 256.848);\n --color-white: #fff;\n --spacing: 0.25rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-4xl: 2rem;\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --animate-spin: spin 1s linear infinite;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: var(--font-sans);\n --default-mono-font-family: var(--font-mono);\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .pointer-events-none {\n pointer-events: none;\n }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n }\n .absolute {\n position: absolute;\n }\n .fixed {\n position: fixed;\n }\n .relative {\n position: relative;\n }\n .inset-0 {\n inset: calc(var(--spacing) * 0);\n }\n .top-0 {\n top: calc(var(--spacing) * 0);\n }\n .top-1 {\n top: calc(var(--spacing) * 1);\n }\n .top-1\\/2 {\n top: calc(1/2 * 100%);\n }\n .bottom-full {\n bottom: 100%;\n }\n .left-0 {\n left: calc(var(--spacing) * 0);\n }\n .left-1 {\n left: calc(var(--spacing) * 1);\n }\n .left-1\\/2 {\n left: calc(1/2 * 100%);\n }\n .left-3 {\n left: calc(var(--spacing) * 3);\n }\n .z-1 {\n z-index: 1;\n }\n .z-10 {\n z-index: 10;\n }\n .z-20 {\n z-index: 20;\n }\n .z-50 {\n z-index: 50;\n }\n .m-auto {\n margin: auto;\n }\n .mt-1 {\n margin-top: calc(var(--spacing) * 1);\n }\n .mt-4 {\n margin-top: calc(var(--spacing) * 4);\n }\n .mb-1 {\n margin-bottom: calc(var(--spacing) * 1);\n }\n .mb-2 {\n margin-bottom: calc(var(--spacing) * 2);\n }\n .mb-4 {\n margin-bottom: calc(var(--spacing) * 4);\n }\n .mb-6 {\n margin-bottom: calc(var(--spacing) * 6);\n }\n .block {\n display: block;\n }\n .flex {\n display: flex;\n }\n .grid {\n display: grid;\n }\n .table {\n display: table;\n }\n .h-2 {\n height: calc(var(--spacing) * 2);\n }\n .h-3 {\n height: calc(var(--spacing) * 3);\n }\n .h-4 {\n height: calc(var(--spacing) * 4);\n }\n .h-5 {\n height: calc(var(--spacing) * 5);\n }\n .h-16 {\n height: calc(var(--spacing) * 16);\n }\n .h-32 {\n height: calc(var(--spacing) * 32);\n }\n .h-full {\n height: 100%;\n }\n .w-3 {\n width: calc(var(--spacing) * 3);\n }\n .w-4 {\n width: calc(var(--spacing) * 4);\n }\n .w-5 {\n width: calc(var(--spacing) * 5);\n }\n .w-16 {\n width: calc(var(--spacing) * 16);\n }\n .w-52 {\n width: calc(var(--spacing) * 52);\n }\n .w-64 {\n width: calc(var(--spacing) * 64);\n }\n .w-full {\n width: 100%;\n }\n .max-w-2xl {\n max-width: var(--container-2xl);\n }\n .max-w-3xl {\n max-width: var(--container-3xl);\n }\n .flex-1 {\n flex: 1;\n }\n .border-collapse {\n border-collapse: collapse;\n }\n .-translate-x-1 {\n --tw-translate-x: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-y-1 {\n --tw-translate-y: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-y-1\\/2 {\n --tw-translate-y: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .transform {\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\n }\n .animate-spin {\n animation: var(--animate-spin);\n }\n .cursor-help {\n cursor: help;\n }\n .cursor-not-allowed {\n cursor: not-allowed;\n }\n .cursor-pointer {\n cursor: pointer;\n }\n .resize {\n resize: both;\n }\n .appearance-none {\n appearance: none;\n }\n .grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n .grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .flex-col {\n flex-direction: column;\n }\n .flex-row {\n flex-direction: row;\n }\n .items-center {\n align-items: center;\n }\n .items-start {\n align-items: flex-start;\n }\n .justify-between {\n justify-content: space-between;\n }\n .justify-center {\n justify-content: center;\n }\n .justify-start {\n justify-content: flex-start;\n }\n .gap-1 {\n gap: calc(var(--spacing) * 1);\n }\n .gap-2 {\n gap: calc(var(--spacing) * 2);\n }\n .gap-3 {\n gap: calc(var(--spacing) * 3);\n }\n .gap-4 {\n gap: calc(var(--spacing) * 4);\n }\n .gap-6 {\n gap: calc(var(--spacing) * 6);\n }\n .space-y-4 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-6 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-8 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .rounded {\n border-radius: 0.25rem;\n }\n .rounded-2xl {\n border-radius: var(--radius-2xl);\n }\n .rounded-4xl {\n border-radius: var(--radius-4xl);\n }\n .rounded-full {\n border-radius: calc(infinity * 1px);\n }\n .rounded-lg {\n border-radius: var(--radius-lg);\n }\n .rounded-xl {\n border-radius: var(--radius-xl);\n }\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .border-2 {\n border-style: var(--tw-border-style);\n border-width: 2px;\n }\n .border-t {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n .border-t-2 {\n border-top-style: var(--tw-border-style);\n border-top-width: 2px;\n }\n .border-b {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n .border-b-2 {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 2px;\n }\n .border-\\[\\#271200\\] {\n border-color: #271200;\n }\n .border-\\[\\#964500\\] {\n border-color: #964500;\n }\n .border-gray-200 {\n border-color: var(--color-gray-200);\n }\n .border-gray-300 {\n border-color: var(--color-gray-300);\n }\n .border-red-500 {\n border-color: var(--color-red-500);\n }\n .bg-\\[\\#271200\\] {\n background-color: #271200;\n }\n .bg-\\[\\#964500\\] {\n background-color: #964500;\n }\n .bg-\\[\\#f3ebda\\] {\n background-color: #f3ebda;\n }\n .bg-gray-50 {\n background-color: var(--color-gray-50);\n }\n .bg-gray-200 {\n background-color: var(--color-gray-200);\n }\n .bg-gray-400 {\n background-color: var(--color-gray-400);\n }\n .bg-gray-800 {\n background-color: var(--color-gray-800);\n }\n .bg-white {\n background-color: var(--color-white);\n }\n .p-2 {\n padding: calc(var(--spacing) * 2);\n }\n .p-3 {\n padding: calc(var(--spacing) * 3);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n .p-6 {\n padding: calc(var(--spacing) * 6);\n }\n .p-8 {\n padding: calc(var(--spacing) * 8);\n }\n .px-2 {\n padding-inline: calc(var(--spacing) * 2);\n }\n .px-3 {\n padding-inline: calc(var(--spacing) * 3);\n }\n .px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n .px-6 {\n padding-inline: calc(var(--spacing) * 6);\n }\n .py-1 {\n padding-block: calc(var(--spacing) * 1);\n }\n .py-2 {\n padding-block: calc(var(--spacing) * 2);\n }\n .py-3 {\n padding-block: calc(var(--spacing) * 3);\n }\n .pt-4 {\n padding-top: calc(var(--spacing) * 4);\n }\n .pt-6 {\n padding-top: calc(var(--spacing) * 6);\n }\n .pt-7 {\n padding-top: calc(var(--spacing) * 7);\n }\n .pr-4 {\n padding-right: calc(var(--spacing) * 4);\n }\n .pb-2 {\n padding-bottom: calc(var(--spacing) * 2);\n }\n .pb-3 {\n padding-bottom: calc(var(--spacing) * 3);\n }\n .pb-7 {\n padding-bottom: calc(var(--spacing) * 7);\n }\n .pl-10 {\n padding-left: calc(var(--spacing) * 10);\n }\n .text-center {\n text-align: center;\n }\n .text-2xl {\n font-size: var(--text-2xl);\n line-height: var(--tw-leading, var(--text-2xl--line-height));\n }\n .text-3xl {\n font-size: var(--text-3xl);\n line-height: var(--tw-leading, var(--text-3xl--line-height));\n }\n .text-lg {\n font-size: var(--text-lg);\n line-height: var(--tw-leading, var(--text-lg--line-height));\n }\n .text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n .text-xl {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n .font-medium {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n .whitespace-nowrap {\n white-space: nowrap;\n }\n .text-\\[\\#1a365d\\] {\n color: #1a365d;\n }\n .text-\\[\\#271200\\] {\n color: #271200;\n }\n .text-\\[\\#964500\\] {\n color: #964500;\n }\n .text-gray-400 {\n color: var(--color-gray-400);\n }\n .text-gray-500 {\n color: var(--color-gray-500);\n }\n .text-gray-600 {\n color: var(--color-gray-600);\n }\n .text-gray-700 {\n color: var(--color-gray-700);\n }\n .text-green-600 {\n color: var(--color-green-600);\n }\n .text-red-500 {\n color: var(--color-red-500);\n }\n .text-white {\n color: var(--color-white);\n }\n .underline {\n text-decoration-line: underline;\n }\n .accent-\\[\\#964500\\] {\n accent-color: #964500;\n }\n .opacity-0 {\n opacity: 0%;\n }\n .shadow {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-inner {\n --tw-shadow: inset 0 2px 4px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-lg {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .outline {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n .transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-colors {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-opacity {\n transition-property: opacity;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .duration-200 {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n .ease-in-out {\n --tw-ease: var(--ease-in-out);\n transition-timing-function: var(--ease-in-out);\n }\n .select-none {\n -webkit-user-select: none;\n user-select: none;\n }\n .group-hover\\:opacity-100 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .peer-checked\\:bg-\\[\\#964500\\] {\n &:is(:where(.peer):checked ~ *) {\n background-color: #964500;\n }\n }\n .peer-checked\\:opacity-100 {\n &:is(:where(.peer):checked ~ *) {\n opacity: 100%;\n }\n }\n .hover\\:bg-\\[\\#7a3700\\] {\n &:hover {\n @media (hover: hover) {\n background-color: #7a3700;\n }\n }\n }\n .hover\\:bg-\\[\\#964500\\] {\n &:hover {\n @media (hover: hover) {\n background-color: #964500;\n }\n }\n }\n .focus\\:border-transparent {\n &:focus {\n border-color: transparent;\n }\n }\n .focus\\:ring-2 {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus\\:ring-\\[\\#1a365d\\] {\n &:focus {\n --tw-ring-color: #1a365d;\n }\n }\n .focus\\:ring-\\[\\#964500\\] {\n &:focus {\n --tw-ring-color: #964500;\n }\n }\n .focus\\:ring-blue-500 {\n &:focus {\n --tw-ring-color: var(--color-blue-500);\n }\n }\n .focus\\:outline-none {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n .md\\:grid-cols-2 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:h-4 {\n &::-moz-range-thumb {\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:w-4 {\n &::-moz-range-thumb {\n width: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:appearance-none {\n &::-moz-range-thumb {\n appearance: none;\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:rounded-full {\n &::-moz-range-thumb {\n border-radius: calc(infinity * 1px);\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:border-0 {\n &::-moz-range-thumb {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:bg-\\[\\#964500\\] {\n &::-moz-range-thumb {\n background-color: #964500;\n }\n }\n .\\[\\&\\:\\:-moz-range-track\\]\\:bg-\\[\\#964500\\] {\n &::-moz-range-track {\n background-color: #964500;\n }\n }\n .\\[\\&\\:\\:-webkit-slider-runnable-track\\]\\:bg-\\[\\#964500\\] {\n &::-webkit-slider-runnable-track {\n background-color: #964500;\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:h-4 {\n &::-webkit-slider-thumb {\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:w-4 {\n &::-webkit-slider-thumb {\n width: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:appearance-none {\n &::-webkit-slider-thumb {\n appearance: none;\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:rounded-full {\n &::-webkit-slider-thumb {\n border-radius: calc(infinity * 1px);\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:bg-\\[\\#964500\\] {\n &::-webkit-slider-thumb {\n background-color: #964500;\n }\n }\n .\\[\\&\\>option\\:checked\\]\\:bg-\\[\\#964500\\] {\n &>option:checked {\n background-color: #964500;\n }\n }\n .\\[\\&\\>option\\:checked\\]\\:text-white {\n &>option:checked {\n color: var(--color-white);\n }\n }\n}\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-rotate-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-z {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-space-y-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"<length>\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ease {\n syntax: \"*\";\n inherits: false;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *, ::before, ::after, ::backdrop {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-space-y-reverse: 0;\n --tw-border-style: solid;\n --tw-font-weight: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-duration: initial;\n --tw-ease: initial;\n }\n }\n}\n","import { Component, Element, Env, h, Prop, State } from \"@stencil/core\";\r\nimport { Loader } from \"@googlemaps/js-api-loader\";\r\nimport { createIcons, Eraser, House, Move, OctagonMinus, Search } from \"lucide\";\r\nimport { Language } from \"../../types/lang\";\r\n\r\n@Component({\r\n tag: \"solar-expert\",\r\n shadow: false,\r\n styleUrl: \"../../output.css\",\r\n})\r\nexport class SolarExpert {\r\n @Element()\r\n el!: HTMLElement;\r\n\r\n @Prop()\r\n apiKey: string = Env.GOOGLE_MAPS_API_KEY;\r\n @Prop()\r\n language: Language = \"en\";\r\n\r\n @State()\r\n latitude: number | null = null;\r\n @State()\r\n longitude: number | null = null;\r\n @State()\r\n isLoaded: boolean = false;\r\n @State()\r\n autocomplete: google.maps.places.Autocomplete | null = null;\r\n @State()\r\n place: google.maps.places.PlaceResult | null = null;\r\n\r\n private inputElement?: HTMLInputElement;\r\n\r\n componentWillLoad() {\r\n this.loadGoogleMapsScript();\r\n }\r\n\r\n private async loadGoogleMapsScript() {\r\n try {\r\n const loader = new Loader({\r\n apiKey: this.apiKey,\r\n libraries: [\"places\"],\r\n });\r\n\r\n const places = await loader.importLibrary(\"places\");\r\n this.isLoaded = true;\r\n this.initializeAutocomplete(places);\r\n } catch (error) {\r\n console.error(\"Error loading Google Maps: \", error);\r\n }\r\n }\r\n\r\n private initializeAutocomplete(\r\n places: google.maps.PlacesLibrary,\r\n ) {\r\n if (!this.inputElement || !this.isLoaded) return;\r\n this.autocomplete = new places.Autocomplete(this.inputElement);\r\n\r\n this.autocomplete.addListener(\"place_changed\", () => {\r\n const place = this.autocomplete?.getPlace();\r\n this.latitude = place?.geometry?.location?.lat() ?? 0;\r\n this.longitude = place?.geometry?.location?.lng() ?? 0;\r\n });\r\n }\r\n\r\n componentDidLoad() {\r\n createIcons({\r\n icons: {\r\n Search,\r\n OctagonMinus,\r\n Eraser,\r\n House,\r\n Move,\r\n },\r\n nameAttr: \"data-lucide\",\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n <div class=\"flex flex-col w-full h-full p-3\">\r\n <div class=\"pb-3\">\r\n <div class=\"relative\">\r\n <i\r\n data-lucide=\"search\"\r\n class=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 \"\r\n />\r\n <input\r\n ref={(el) => this.inputElement = el}\r\n type=\"text\"\r\n placeholder=\"Search for a location\"\r\n class=\"w-full pl-10 pr-4 py-2 border border-gray-300 rounded-4xl focus:outline-none focus:ring-2 focus:ring-blue-500 bg-white\"\r\n />\r\n </div>\r\n </div>\r\n <map-draw\r\n latitude={this.latitude}\r\n longitude={this.longitude}\r\n apiKey={this.apiKey}\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/*!\n * Chart.js v4.4.9\n * https://www.chartjs.org\n * (c) 2025 Chart.js Contributors\n * Released under the MIT License\n */\nimport { Color } from '@kurkle/color';\n\n/**\n * @namespace Chart.helpers\n */ /**\n * An empty function that can be used, for example, for optional callback.\n */ function noop() {\n/* noop */ }\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */ const uid = (()=>{\n let id = 0;\n return ()=>id++;\n})();\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isNullOrUndef(value) {\n return value === null || value === undefined;\n}\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */ function isArray(value) {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isObject(value) {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */ function isNumberFinite(value) {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */ function finiteOrDefault(value, defaultValue) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */ function valueOrDefault(value, defaultValue) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 : +value / dimension;\nconst toDimension = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 * dimension : +value;\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */ function callback(fn, args, thisArg) {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n let i, len, keys;\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for(i = len - 1; i >= 0; i--){\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for(i = 0; i < len; i++){\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for(i = 0; i < len; i++){\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */ function _elementsEqual(a0, a1) {\n let i, ilen, v0, v1;\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n for(i = 0, ilen = a0.length; i < ilen; ++i){\n v0 = a0[i];\n v1 = a1[i];\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n return true;\n}\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */ function clone(source) {\n if (isArray(source)) {\n return source.map(clone);\n }\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n for(; k < klen; ++k){\n target[keys[k]] = clone(source[keys[k]]);\n }\n return target;\n }\n return source;\n}\nfunction isValidKey(key) {\n return [\n '__proto__',\n 'prototype',\n 'constructor'\n ].indexOf(key) === -1;\n}\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */ function _merger(key, target, source, options) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\nfunction merge(target, source, options) {\n const sources = isArray(source) ? source : [\n source\n ];\n const ilen = sources.length;\n if (!isObject(target)) {\n return target;\n }\n options = options || {};\n const merger = options.merger || _merger;\n let current;\n for(let i = 0; i < ilen; ++i){\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n const keys = Object.keys(current);\n for(let k = 0, klen = keys.length; k < klen; ++k){\n merger(keys[k], target, current, options);\n }\n }\n return target;\n}\nfunction mergeIf(target, source) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {\n merger: _mergerIf\n });\n}\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */ function _mergerIf(key, target, source) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n/**\n * @private\n */ function _deprecated(scope, value, previous, current) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous + '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': (v)=>v,\n // default resolvers\n x: (o)=>o.x,\n y: (o)=>o.y\n};\n/**\n * @private\n */ function _splitKey(key) {\n const parts = key.split('.');\n const keys = [];\n let tmp = '';\n for (const part of parts){\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\nfunction _getKeyResolver(key) {\n const keys = _splitKey(key);\n return (obj)=>{\n for (const k of keys){\n if (k === '') {\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\nfunction resolveObjectKey(obj, key) {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n/**\n * @private\n */ function _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value)=>typeof value !== 'undefined';\nconst isFunction = (value)=>typeof value === 'function';\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nconst setsEqual = (a, b)=>{\n if (a.size !== b.size) {\n return false;\n }\n for (const item of a){\n if (!b.has(item)) {\n return false;\n }\n }\n return true;\n};\n/**\n * @param e - The event\n * @private\n */ function _isClickEvent(e) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */ const PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction almostEquals(x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n}\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */ function niceNum(range) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */ function _factorize(value) {\n const result = [];\n const sqrt = Math.sqrt(value);\n let i;\n for(i = 1; i < sqrt; i++){\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) {\n result.push(sqrt);\n }\n result.sort((a, b)=>a - b).pop();\n return result;\n}\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */ function isNonPrimitive(n) {\n return typeof n === 'symbol' || typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n);\n}\nfunction isNumber(n) {\n return !isNonPrimitive(n) && !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostWhole(x, epsilon) {\n const rounded = Math.round(x);\n return rounded - epsilon <= x && rounded + epsilon >= x;\n}\n/**\n * @private\n */ function _setMinAndMaxByKey(array, target, property) {\n let i, ilen, value;\n for(i = 0, ilen = array.length; i < ilen; i++){\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\nfunction toRadians(degrees) {\n return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n return radians * (180 / PI);\n}\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */ function _decimalPlaces(x) {\n if (!isNumberFinite(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while(Math.round(x * e) / e !== x){\n e *= 10;\n p++;\n }\n return p;\n}\n// Gets the angle from vertical upright to the point about a centre.\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n if (angle < -0.5 * PI) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */ function _angleDiff(a, b) {\n return (a - b + PITAU) % TAU - PI;\n}\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */ function _normalizeAngle(a) {\n return (a % TAU + TAU) % TAU;\n}\n/**\n * @private\n */ function _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || sameAngleIsFullCircle && s === e || angleToStart > angleToEnd && startToAngle < endToAngle;\n}\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */ function _limitValue(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n/**\n * @param {number} value\n * @private\n */ function _int16Range(value) {\n return _limitValue(value, -32768, 32767);\n}\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */ function _isBetween(value, start, end, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n\nfunction _lookup(table, value, cmp) {\n cmp = cmp || ((index)=>table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid;\n while(hi - lo > 1){\n mid = lo + hi >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return {\n lo,\n hi\n };\n}\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */ const _lookupByKey = (table, key, value, last)=>_lookup(table, value, last ? (index)=>{\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n } : (index)=>table[index][key] < value);\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */ const _rlookupByKey = (table, key, value)=>_lookup(table, value, (index)=>table[index][key] >= value);\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */ function _filterBetween(values, min, max) {\n let start = 0;\n let end = values.length;\n while(start < end && values[start] < min){\n start++;\n }\n while(end > start && values[end - 1] > max){\n end--;\n }\n return start > 0 || end < values.length ? values.slice(start, end) : values;\n}\nconst arrayEvents = [\n 'push',\n 'pop',\n 'shift',\n 'splice',\n 'unshift'\n];\nfunction listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [\n listener\n ]\n }\n });\n arrayEvents.forEach((key)=>{\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value (...args) {\n const res = base.apply(this, args);\n array._chartjs.listeners.forEach((object)=>{\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n return res;\n }\n });\n });\n}\nfunction unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n if (listeners.length > 0) {\n return;\n }\n arrayEvents.forEach((key)=>{\n delete array[key];\n });\n delete array._chartjs;\n}\n/**\n * @param items\n */ function _arrayUnique(items) {\n const set = new Set(items);\n if (set.size === items.length) {\n return items;\n }\n return Array.from(set);\n}\n\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n/**\n* Request animation polyfill\n*/ const requestAnimFrame = function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}();\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */ function throttled(fn, thisArg) {\n let argsToUse = [];\n let ticking = false;\n return function(...args) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, ()=>{\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n/**\n * Debounces calling `fn` for `delay` ms\n */ function debounce(fn, delay) {\n let timeout;\n return function(...args) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */ const _toLeftRightCenter = (align)=>align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */ const _alignStartEnd = (align, start, end)=>align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */ const _textX = (align, left, right, rtl)=>{\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n/**\n * Return start and count of visible points.\n * @private\n */ function _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n const pointCount = points.length;\n let start = 0;\n let count = pointCount;\n if (meta._sorted) {\n const { iScale , vScale , _parsed } = meta;\n const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n const axis = iScale.axis;\n const { min , max , minDefined , maxDefined } = iScale.getUserBounds();\n if (minDefined) {\n start = Math.min(// @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo, // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n if (spanGaps) {\n const distanceToDefinedLo = _parsed.slice(0, start + 1).reverse().findIndex((point)=>!isNullOrUndef(point[vScale.axis]));\n start -= Math.max(0, distanceToDefinedLo);\n }\n start = _limitValue(start, 0, pointCount - 1);\n }\n if (maxDefined) {\n let end = Math.max(// @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1, // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n if (spanGaps) {\n const distanceToDefinedHi = _parsed.slice(end - 1).findIndex((point)=>!isNullOrUndef(point[vScale.axis]));\n end += Math.max(0, distanceToDefinedHi);\n }\n count = _limitValue(end, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n return {\n start,\n count\n };\n}\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */ function _scaleRangesChanged(meta) {\n const { xScale , yScale , _scaleRanges } = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min || _scaleRanges.xmax !== xScale.max || _scaleRanges.ymin !== yScale.min || _scaleRanges.ymax !== yScale.max;\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n\nconst atEdge = (t)=>t === 0 || t === 1;\nconst elasticIn = (t, s, p)=>-(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p)=>Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */ const effects = {\n linear: (t)=>t,\n easeInQuad: (t)=>t * t,\n easeOutQuad: (t)=>-t * (t - 2),\n easeInOutQuad: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1),\n easeInCubic: (t)=>t * t * t,\n easeOutCubic: (t)=>(t -= 1) * t * t + 1,\n easeInOutCubic: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2),\n easeInQuart: (t)=>t * t * t * t,\n easeOutQuart: (t)=>-((t -= 1) * t * t * t - 1),\n easeInOutQuart: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t : -0.5 * ((t -= 2) * t * t * t - 2),\n easeInQuint: (t)=>t * t * t * t * t,\n easeOutQuint: (t)=>(t -= 1) * t * t * t * t + 1,\n easeInOutQuint: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t * t : 0.5 * ((t -= 2) * t * t * t * t + 2),\n easeInSine: (t)=>-Math.cos(t * HALF_PI) + 1,\n easeOutSine: (t)=>Math.sin(t * HALF_PI),\n easeInOutSine: (t)=>-0.5 * (Math.cos(PI * t) - 1),\n easeInExpo: (t)=>t === 0 ? 0 : Math.pow(2, 10 * (t - 1)),\n easeOutExpo: (t)=>t === 1 ? 1 : -Math.pow(2, -10 * t) + 1,\n easeInOutExpo: (t)=>atEdge(t) ? t : t < 0.5 ? 0.5 * Math.pow(2, 10 * (t * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n easeInCirc: (t)=>t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1),\n easeOutCirc: (t)=>Math.sqrt(1 - (t -= 1) * t),\n easeInOutCirc: (t)=>(t /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n easeInElastic: (t)=>atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n easeOutElastic: (t)=>atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n easeInOutElastic (t) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t : t < 0.5 ? 0.5 * elasticIn(t * 2, s, p) : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n easeInBack (t) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n easeOutBack (t) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n easeInOutBack (t) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);\n },\n easeInBounce: (t)=>1 - effects.easeOutBounce(1 - t),\n easeOutBounce (t) {\n const m = 7.5625;\n const d = 2.75;\n if (t < 1 / d) {\n return m * t * t;\n }\n if (t < 2 / d) {\n return m * (t -= 1.5 / d) * t + 0.75;\n }\n if (t < 2.5 / d) {\n return m * (t -= 2.25 / d) * t + 0.9375;\n }\n return m * (t -= 2.625 / d) * t + 0.984375;\n },\n easeInOutBounce: (t)=>t < 0.5 ? effects.easeInBounce(t * 2) * 0.5 : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5\n};\n\nfunction isPatternOrGradient(value) {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n return false;\n}\nfunction color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\nfunction getHoverColor(value) {\n return isPatternOrGradient(value) ? value : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n\nconst numbers = [\n 'x',\n 'y',\n 'borderWidth',\n 'radius',\n 'tension'\n];\nconst colors = [\n 'color',\n 'borderColor',\n 'backgroundColor'\n];\nfunction applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined\n });\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name)=>name !== 'onProgress' && name !== 'onComplete' && name !== 'fn'\n });\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n }\n });\n defaults.describe('animations', {\n _fallback: 'animation'\n });\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0\n }\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: (v)=>v | 0\n }\n }\n }\n });\n}\n\nfunction applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\nfunction formatNumber(num, locale, options) {\n return getNumberFormat(locale, options).format(num);\n}\n\nconst formatters = {\n values (value) {\n return isArray(value) ? value : '' + value;\n },\n numeric (tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue;\n if (ticks.length > 1) {\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n delta = calculateDelta(tickValue, ticks);\n }\n const logDelta = log10(Math.abs(delta));\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n const options = {\n notation,\n minimumFractionDigits: numDecimal,\n maximumFractionDigits: numDecimal\n };\n Object.assign(options, this.options.ticks.format);\n return formatNumber(tickValue, locale, options);\n },\n logarithmic (tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || tickValue / Math.pow(10, Math.floor(log10(tickValue)));\n if ([\n 1,\n 2,\n 3,\n 5,\n 10,\n 15\n ].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n};\nfunction calculateDelta(tickValue, ticks) {\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n var Ticks = {\n formatters\n};\n\nfunction applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n bounds: 'ticks',\n clip: true,\n grace: 0,\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options)=>options.lineWidth,\n tickColor: (_ctx, options)=>options.color,\n offset: false\n },\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n title: {\n display: false,\n text: '',\n padding: {\n top: 4,\n bottom: 4\n }\n },\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2\n }\n });\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name)=>!name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name)=>name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash'\n });\n defaults.describe('scales', {\n _fallback: 'scale'\n });\n defaults.describe('scale.ticks', {\n _scriptable: (name)=>name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name)=>name !== 'backdropPadding'\n });\n}\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\n function getScope$1(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for(let i = 0, n = keys.length; i < n; ++i){\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope$1(root, scope), values);\n }\n return merge(getScope$1(root, ''), scope);\n}\n class Defaults {\n constructor(_descriptors, _appliers){\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context)=>context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options)=>getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options)=>getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options)=>getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n set(scope, values) {\n return set(this, scope, values);\n }\n get(scope) {\n return getScope$1(this, scope);\n }\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n override(scope, values) {\n return set(overrides, scope, values);\n }\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope$1(this, scope);\n const targetScopeObject = getScope$1(this, targetScope);\n const privateName = '_' + name;\n Object.defineProperties(scopeObject, {\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n [name]: {\n enumerable: true,\n get () {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set (value) {\n this[privateName] = value;\n }\n }\n });\n }\n apply(appliers) {\n appliers.forEach((apply)=>apply(this));\n }\n}\nvar defaults = /* #__PURE__ */ new Defaults({\n _scriptable: (name)=>!name.startsWith('on'),\n _indexable: (name)=>name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false\n }\n}, [\n applyAnimationsDefaults,\n applyLayoutsDefaults,\n applyScaleDefaults\n]);\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */ function toFontString(font) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n return (font.style ? font.style + ' ' : '') + (font.weight ? font.weight + ' ' : '') + font.size + 'px ' + font.family;\n}\n/**\n * @private\n */ function _measureText(ctx, data, gc, longest, string) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n/**\n * @private\n */ // eslint-disable-next-line complexity\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n ctx.save();\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i, j, jlen, thing, nestedThing;\n for(i = 0; i < ilen; i++){\n thing = arrayOfThings[i];\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for(j = 0, jlen = thing.length; j < jlen; j++){\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n ctx.restore();\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for(i = 0; i < gcLen; i++){\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */ function _alignPixel(chart, pixel, width) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n/**\n * Clears the entire canvas.\n */ function clearCanvas(canvas, ctx) {\n if (!ctx && !canvas) {\n return;\n }\n ctx = ctx || canvas.getContext('2d');\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n// eslint-disable-next-line complexity\nfunction drawPointLegend(ctx, options, x, y, w) {\n let type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n ctx.beginPath();\n switch(style){\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */ case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */ case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */ function _isPointInArea(point, area, margin) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n return !area || point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin;\n}\nfunction clipArea(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\nfunction unclipArea(ctx) {\n ctx.restore();\n}\n/**\n * @private\n */ function _steppedLineTo(ctx, previous, target, flip, mode) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n/**\n * @private\n */ function _bezierCurveTo(ctx, previous, target, flip) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(flip ? previous.cp1x : previous.cp2x, flip ? previous.cp1y : previous.cp2y, flip ? target.cp2x : target.cp1x, flip ? target.cp2y : target.cp1y, target.x, target.y);\n}\nfunction setRenderOpts(ctx, opts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */ const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\nfunction drawBackdrop(ctx, opts) {\n const oldColor = ctx.fillStyle;\n ctx.fillStyle = opts.color;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n/**\n * Render text onto the canvas\n */ function renderText(ctx, text, x, y, font, opts = {}) {\n const lines = isArray(text) ? text : [\n text\n ];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i, line;\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n for(i = 0; i < lines.length; ++i){\n line = lines[i];\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n y += Number(font.lineHeight);\n }\n ctx.restore();\n}\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */ function addRoundedRectPath(ctx, rect) {\n const { x , y , w , h , radius } = rect;\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n/**\n * @alias Chart.helpers.options\n * @namespace\n */ /**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */ function toLineHeight(value, size) {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n value = +matches[2];\n switch(matches[3]){\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n }\n return size * value;\n}\nconst numberOrZero = (v)=>+v || 0;\nfunction _readValueToProps(value, props) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value) ? objProps ? (prop)=>valueOrDefault(value[prop], value[props[prop]]) : (prop)=>value[prop] : ()=>value;\n for (const prop of keys){\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */ function toTRBL(value) {\n return _readValueToProps(value, {\n top: 'y',\n right: 'x',\n bottom: 'y',\n left: 'x'\n });\n}\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */ function toTRBLCorners(value) {\n return _readValueToProps(value, [\n 'topLeft',\n 'topRight',\n 'bottomLeft',\n 'bottomRight'\n ]);\n}\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */ function toPadding(value) {\n const obj = toTRBL(value);\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n return obj;\n}\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */ function toFont(options, fallback) {\n options = options || {};\n fallback = fallback || defaults.font;\n let size = valueOrDefault(options.size, fallback.size);\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n font.string = toFontString(font);\n return font;\n}\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */ function resolve(inputs, context, index, info) {\n let cacheable = true;\n let i, ilen, value;\n for(i = 0, ilen = inputs.length; i < ilen; ++i){\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */ function _addGrace(minmax, grace, beginAtZero) {\n const { min , max } = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value, add)=>beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\nfunction createContext(parentContext, context) {\n return Object.assign(Object.create(parentContext), context);\n}\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */ function _createResolver(scopes, prefixes = [\n ''\n], rootScopes, fallback, getTarget = ()=>scopes[0]) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope)=>_createResolver([\n scope,\n ...scopes\n ], prefixes, finalRootScopes, fallback)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */ deleteProperty (target, prop) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n /**\n * A trap for getting property values.\n */ get (target, prop) {\n return _cached(target, prop, ()=>_resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */ getOwnPropertyDescriptor (target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n /**\n * A trap for Object.getPrototypeOf.\n */ getPrototypeOf () {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n /**\n * A trap for the in operator.\n */ has (target, prop) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */ ownKeys (target) {\n return getKeysFromAllScopes(target);\n },\n /**\n * A trap for setting property values.\n */ set (target, prop, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n });\n}\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */ function _attachContext(proxy, context, subProxy, descriptorDefaults) {\n const cache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx)=>_attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope)=>_attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */ deleteProperty (target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n /**\n * A trap for getting property values.\n */ get (target, prop, receiver) {\n return _cached(target, prop, ()=>_resolveWithContext(target, prop, receiver));\n },\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */ getOwnPropertyDescriptor (target, prop) {\n return target._descriptors.allKeys ? Reflect.has(proxy, prop) ? {\n enumerable: true,\n configurable: true\n } : undefined : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n /**\n * A trap for Object.getPrototypeOf.\n */ getPrototypeOf () {\n return Reflect.getPrototypeOf(proxy);\n },\n /**\n * A trap for the in operator.\n */ has (target, prop) {\n return Reflect.has(proxy, prop);\n },\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */ ownKeys () {\n return Reflect.ownKeys(proxy);\n },\n /**\n * A trap for setting property values.\n */ set (target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n });\n}\n/**\n * @private\n */ function _descriptors(proxy, defaults = {\n scriptable: true,\n indexable: true\n}) {\n const { _scriptable =defaults.scriptable , _indexable =defaults.indexable , _allKeys =defaults.allKeys } = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : ()=>_scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : ()=>_indexable\n };\n}\nconst readKey = (prefix, name)=>prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value)=>isObject(value) && prop !== 'adapters' && (Object.getPrototypeOf(value) === null || value.constructor === Object);\nfunction _cached(target, prop, resolve) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n const { _proxy , _context , _subProxy , _descriptors: descriptors } = target;\n let value = _proxy[prop]; // resolve from proxy\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\nfunction _resolveScriptable(prop, getValue, target, receiver) {\n const { _proxy , _context , _subProxy , _stack } = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n const { _proxy , _context , _subProxy , _descriptors: descriptors } = target;\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter((s)=>s !== arr);\n value = [];\n for (const item of arr){\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent)=>key === true ? parent : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback, value) {\n for (const parent of parentScopes){\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [\n ...parentScopes,\n ...rootScopes\n ];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [\n ''\n ], rootScopes, fallback, ()=>subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback, item) {\n while(key){\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n let value;\n for (const prefix of prefixes){\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value) ? createSubResolver(scopes, proxy, prop, value) : value;\n }\n }\n}\nfunction _resolve(key, scopes) {\n for (const scope of scopes){\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\nfunction getKeysFromAllScopes(target) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n const set = new Set();\n for (const scope of scopes){\n for (const key of Object.keys(scope).filter((k)=>!k.startsWith('_'))){\n set.add(key);\n }\n }\n return Array.from(set);\n}\nfunction _parseObjectDataRadialScale(meta, data, start, count) {\n const { iScale } = meta;\n const { key ='r' } = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i)=>i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis)=>indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n // This function must also respect \"skipped\" points\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n/**\n * Adjust tangents to ensure monotonic properties\n */ function monotoneAdjust(points, deltaK, mK) {\n const pointsLen = points.length;\n let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(let i = 0; i < pointsLen - 1; ++i){\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(let i = 0; i < pointsLen; ++i){\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */ function splineCurveMonotone(points, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK = Array(pointsLen).fill(0);\n const mK = Array(pointsLen);\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(i = 0; i < pointsLen; ++i){\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i] : !pointAfter ? deltaK[i - 1] : sign(deltaK[i - 1]) !== sign(deltaK[i]) ? 0 : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n monotoneAdjust(points, deltaK, mK);\n monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for(i = 0, ilen = points.length; i < ilen; ++i){\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n/**\n * @private\n */ function _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n let i, ilen, point, controlPoints;\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt)=>!pt.skip);\n }\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for(i = 0, ilen = points.length; i < ilen; ++i){\n point = points[i];\n controlPoints = splineCurve(prev, point, points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen], options.tension);\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n\n/**\n * @private\n */ function _isDomSupported() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n/**\n * @private\n */ function _getParentNode(domNode) {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = parent.host;\n }\n return parent;\n}\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */ function parseMaxStyle(styleValue, node, parentProperty) {\n let valueInPixels;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n return valueInPixels;\n}\nconst getComputedStyle = (element)=>element.ownerDocument.defaultView.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = [\n 'top',\n 'right',\n 'bottom',\n 'left'\n];\nfunction getPositionedStyle(styles, style, suffix) {\n const result = {};\n suffix = suffix ? '-' + suffix : '';\n for(let i = 0; i < 4; i++){\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\nconst useOffsetPos = (x, y, target)=>(x > 0 || y > 0) && (!target || !target.shadowRoot);\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */ function getCanvasPosition(e, canvas) {\n const touches = e.touches;\n const source = touches && touches.length ? touches[0] : e;\n const { offsetX , offsetY } = source;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {\n x,\n y,\n box\n };\n}\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */ function getRelativePosition(event, chart) {\n if ('native' in event) {\n return event;\n }\n const { canvas , currentDevicePixelRatio } = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const { x , y , box } = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n let { width , height } = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\nfunction getContainerSize(canvas, width, height) {\n let maxWidth, maxHeight;\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\nconst round1 = (v)=>Math.round(v * 10) / 10;\n// eslint-disable-next-line complexity\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let { width , height } = containerSize;\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n return {\n width,\n height\n };\n}\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */ function retinaScale(chart, forceRatio, forceStyle) {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = Math.floor(chart.height * pixelRatio);\n const deviceWidth = Math.floor(chart.width * pixelRatio);\n chart.height = Math.floor(chart.height);\n chart.width = Math.floor(chart.width);\n const canvas = chart.canvas;\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || !canvas.style.height && !canvas.style.width)) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) {\n chart.currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */ const supportsEventListenerOptions = function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive () {\n passiveSupported = true;\n return false;\n }\n };\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}();\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */ function readUsedSize(element, property) {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n\n/**\n * @private\n */ function _pointInLine(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n/**\n * @private\n */ function _steppedInterpolation(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y : mode === 'after' ? t < 1 ? p1.y : p2.y : t > 0 ? p2.y : p1.y\n };\n}\n/**\n * @private\n */ function _bezierInterpolation(p1, p2, t, mode) {\n const cp1 = {\n x: p1.cp2x,\n y: p1.cp2y\n };\n const cp2 = {\n x: p2.cp1x,\n y: p2.cp1y\n };\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n return {\n x (x) {\n return rectX + rectX + width - x;\n },\n setWidth (w) {\n width = w;\n },\n textAlign (align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus (x, value) {\n return x - value;\n },\n leftForLtr (x, itemWidth) {\n return x - itemWidth;\n }\n };\n};\nconst getLeftToRightAdapter = function() {\n return {\n x (x) {\n return x;\n },\n setWidth (w) {},\n textAlign (align) {\n return align;\n },\n xPlus (x, value) {\n return x + value;\n },\n leftForLtr (x, _itemWidth) {\n return x;\n }\n };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n let style, original;\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction')\n ];\n style.setProperty('direction', direction, 'important');\n ctx.prevTextDirection = original;\n }\n}\nfunction restoreTextDirection(ctx, original) {\n if (original !== undefined) {\n delete ctx.prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle\n };\n }\n return {\n between: _isBetween,\n compare: (a, b)=>a - b,\n normalize: (x)=>x\n };\n}\nfunction normalizeSegment({ start , end , count , loop , style }) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\nfunction getSegment(segment, points, bounds) {\n const { property , start: startBound , end: endBound } = bounds;\n const { between , normalize } = propertyFn(property);\n const count = points.length;\n let { start , end , loop } = segment;\n let i, ilen;\n if (loop) {\n start += count;\n end += count;\n for(i = 0, ilen = count; i < ilen; ++i){\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n if (end < start) {\n end += count;\n }\n return {\n start,\n end,\n loop,\n style: segment.style\n };\n}\n function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [\n segment\n ];\n }\n const { property , start: startBound , end: endBound } = bounds;\n const count = points.length;\n const { compare , between , normalize } = propertyFn(property);\n const { start , end , loop , style } = getSegment(segment, points, bounds);\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n const startIsBefore = ()=>between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = ()=>compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = ()=>inside || startIsBefore();\n const shouldStop = ()=>!inside || endIsBefore();\n for(let i = start, prev = start; i <= end; ++i){\n point = points[i % count];\n if (point.skip) {\n continue;\n }\n value = normalize(point[property]);\n if (value === prevValue) {\n continue;\n }\n inside = between(value, startBound, endBound);\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({\n start: subStart,\n end: i,\n loop,\n count,\n style\n }));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n if (subStart !== null) {\n result.push(normalizeSegment({\n start: subStart,\n end,\n loop,\n count,\n style\n }));\n }\n return result;\n}\n function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n for(let i = 0; i < segments.length; i++){\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n function findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n if (loop && !spanGaps) {\n while(start < count && !points[start].skip){\n start++;\n }\n }\n while(start < count && points[start].skip){\n start++;\n }\n start %= count;\n if (loop) {\n end += start;\n }\n while(end > start && points[end % count].skip){\n end--;\n }\n end %= count;\n return {\n start,\n end\n };\n}\n function solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n for(end = start + 1; end <= max; ++end){\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({\n start: start % count,\n end: (end - 1) % count,\n loop\n });\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n if (last !== null) {\n result.push({\n start: start % count,\n end: last % count,\n loop\n });\n }\n return result;\n}\n function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n if (!count) {\n return [];\n }\n const loop = !!line._loop;\n const { start , end } = findStartAndEnd(points, count, loop, spanGaps);\n if (spanGaps === true) {\n return splitByStyles(line, [\n {\n start,\n end,\n loop\n }\n ], points, segmentOptions);\n }\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n function splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n function doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const { _datasetIndex: datasetIndex , options: { spanGaps } } = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n s += count;\n while(points[s % count].skip){\n s -= dir;\n }\n while(points[e % count].skip){\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({\n start: s % count,\n end: e % count,\n loop: l,\n style: st\n });\n prevStyle = st;\n start = e % count;\n }\n }\n for (const segment of segments){\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for(i = start + 1; i <= segment.end; i++){\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n return result;\n}\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n\nfunction getSizeForArea(scale, chartArea, field) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\nfunction getDatasetArea(meta, chartArea) {\n const { xScale , yScale } = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\nfunction getDatasetClipArea(chart, meta) {\n const clip = meta._clip;\n if (clip.disabled) {\n return false;\n }\n const area = getDatasetArea(meta, chart.chartArea);\n return {\n left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),\n right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),\n top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),\n bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)\n };\n}\n\nexport { unclipArea as $, _rlookupByKey as A, _lookupByKey as B, _isPointInArea as C, getAngleFromPoint as D, toPadding as E, each as F, getMaximumSize as G, HALF_PI as H, _getParentNode as I, readUsedSize as J, supportsEventListenerOptions as K, throttled as L, _isDomSupported as M, _factorize as N, finiteOrDefault as O, PI as P, callback as Q, _addGrace as R, _limitValue as S, TAU as T, toDegrees as U, _measureText as V, _int16Range as W, _alignPixel as X, clipArea as Y, renderText as Z, _arrayUnique as _, resolve as a, getStyle as a$, toFont as a0, _toLeftRightCenter as a1, _alignStartEnd as a2, overrides as a3, merge as a4, _capitalize as a5, descriptors as a6, isFunction as a7, _attachContext as a8, _createResolver as a9, getRtlAdapter as aA, overrideTextDirection as aB, _textX as aC, restoreTextDirection as aD, drawPointLegend as aE, distanceBetweenPoints as aF, noop as aG, _setMinAndMaxByKey as aH, niceNum as aI, almostWhole as aJ, almostEquals as aK, _decimalPlaces as aL, Ticks as aM, log10 as aN, _longestText as aO, _filterBetween as aP, _lookup as aQ, isPatternOrGradient as aR, getHoverColor as aS, clone as aT, _merger as aU, _mergerIf as aV, _deprecated as aW, _splitKey as aX, toFontString as aY, splineCurve as aZ, splineCurveMonotone as a_, _descriptors as aa, mergeIf as ab, uid as ac, debounce as ad, retinaScale as ae, clearCanvas as af, setsEqual as ag, getDatasetClipArea as ah, _elementsEqual as ai, _isClickEvent as aj, _isBetween as ak, _readValueToProps as al, _updateBezierControlPoints as am, _computeSegments as an, _boundSegments as ao, _steppedInterpolation as ap, _bezierInterpolation as aq, _pointInLine as ar, _steppedLineTo as as, _bezierCurveTo as at, drawPoint as au, addRoundedRectPath as av, toTRBL as aw, toTRBLCorners as ax, _boundSegment as ay, _normalizeAngle as az, isArray as b, fontString as b0, toLineHeight as b1, PITAU as b2, INFINITY as b3, RAD_PER_DEG as b4, QUARTER_PI as b5, TWO_THIRDS_PI as b6, _angleDiff as b7, color as c, defaults as d, effects as e, resolveObjectKey as f, isNumberFinite as g, defined as h, isObject as i, createContext as j, isNullOrUndef as k, listenArrayEvents as l, toPercentage as m, toDimension as n, formatNumber as o, _angleBetween as p, _getStartAndCountOfVisiblePoints as q, requestAnimFrame as r, sign as s, toRadians as t, unlistenArrayEvents as u, valueOrDefault as v, _scaleRangesChanged as w, isNumber as x, _parseObjectDataRadialScale as y, getRelativePosition as z };\n//# sourceMappingURL=helpers.dataset.js.map\n","/*!\n * Chart.js v4.4.9\n * https://www.chartjs.org\n * (c) 2025 Chart.js Contributors\n * Released under the MIT License\n */\nimport { r as requestAnimFrame, a as resolve, e as effects, c as color, i as isObject, d as defaults, b as isArray, v as valueOrDefault, u as unlistenArrayEvents, l as listenArrayEvents, f as resolveObjectKey, g as isNumberFinite, h as defined, s as sign, j as createContext, k as isNullOrUndef, _ as _arrayUnique, t as toRadians, m as toPercentage, n as toDimension, T as TAU, o as formatNumber, p as _angleBetween, H as HALF_PI, P as PI, q as _getStartAndCountOfVisiblePoints, w as _scaleRangesChanged, x as isNumber, y as _parseObjectDataRadialScale, z as getRelativePosition, A as _rlookupByKey, B as _lookupByKey, C as _isPointInArea, D as getAngleFromPoint, E as toPadding, F as each, G as getMaximumSize, I as _getParentNode, J as readUsedSize, K as supportsEventListenerOptions, L as throttled, M as _isDomSupported, N as _factorize, O as finiteOrDefault, Q as callback, R as _addGrace, S as _limitValue, U as toDegrees, V as _measureText, W as _int16Range, X as _alignPixel, Y as clipArea, Z as renderText, $ as unclipArea, a0 as toFont, a1 as _toLeftRightCenter, a2 as _alignStartEnd, a3 as overrides, a4 as merge, a5 as _capitalize, a6 as descriptors, a7 as isFunction, a8 as _attachContext, a9 as _createResolver, aa as _descriptors, ab as mergeIf, ac as uid, ad as debounce, ae as retinaScale, af as clearCanvas, ag as setsEqual, ah as getDatasetClipArea, ai as _elementsEqual, aj as _isClickEvent, ak as _isBetween, al as _readValueToProps, am as _updateBezierControlPoints, an as _computeSegments, ao as _boundSegments, ap as _steppedInterpolation, aq as _bezierInterpolation, ar as _pointInLine, as as _steppedLineTo, at as _bezierCurveTo, au as drawPoint, av as addRoundedRectPath, aw as toTRBL, ax as toTRBLCorners, ay as _boundSegment, az as _normalizeAngle, aA as getRtlAdapter, aB as overrideTextDirection, aC as _textX, aD as restoreTextDirection, aE as drawPointLegend, aF as distanceBetweenPoints, aG as noop, aH as _setMinAndMaxByKey, aI as niceNum, aJ as almostWhole, aK as almostEquals, aL as _decimalPlaces, aM as Ticks, aN as log10, aO as _longestText, aP as _filterBetween, aQ as _lookup } from './chunks/helpers.dataset.js';\nimport '@kurkle/color';\n\nclass Animator {\n constructor(){\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n callbacks.forEach((fn)=>fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n this._request = requestAnimFrame.call(window, ()=>{\n this._update();\n this._request = null;\n if (this._running) {\n this._refresh();\n }\n });\n }\n _update(date = Date.now()) {\n let remaining = 0;\n this._charts.forEach((anims, chart)=>{\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n for(; i >= 0; --i){\n item = items[i];\n if (item._active) {\n if (item._total > anims.duration) {\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n remaining += items.length;\n });\n this._lastDate = date;\n if (remaining === 0) {\n this._running = false;\n }\n }\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur)=>Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n for(; i >= 0; --i){\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\nvar animator = /* #__PURE__ */ new Animator();\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean (from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n color (from, to, factor) {\n const c0 = color(from || transparent);\n const c1 = c0.valid && color(to || transparent);\n return c1 && c1.valid ? c1.mix(c0, factor).hexString() : to;\n },\n number (from, to, factor) {\n return from + (to - from) * factor;\n }\n};\nclass Animation {\n constructor(cfg, target, prop, to){\n const currentValue = target[prop];\n to = resolve([\n cfg.to,\n to,\n currentValue,\n cfg.from\n ]);\n const from = resolve([\n cfg.from,\n currentValue,\n to\n ]);\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n active() {\n return this._active;\n }\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([\n cfg.to,\n to,\n currentValue,\n cfg.from\n ]);\n this._from = resolve([\n cfg.from,\n currentValue,\n to\n ]);\n }\n }\n cancel() {\n if (this._active) {\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n this._active = from !== to && (loop || elapsed < duration);\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n factor = elapsed / duration % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n this._target[prop] = this._fn(from, to, factor);\n }\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej)=>{\n promises.push({\n res,\n rej\n });\n });\n }\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for(let i = 0; i < promises.length; i++){\n promises[i][method]();\n }\n }\n}\n\nclass Animations {\n constructor(chart, config){\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n Object.getOwnPropertyNames(config).forEach((key)=>{\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions){\n resolved[option] = cfg[option];\n }\n (isArray(cfg.properties) && cfg.properties || [\n key\n ]).forEach((prop)=>{\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n awaitAll(target.options.$animations, newOptions).then(()=>{\n target.options = newOptions;\n }, ()=>{\n });\n }\n return animations;\n }\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n for(i = props.length - 1; i >= 0; --i){\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n if (animation) {\n if (cfg && animation.active()) {\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n target[prop] = value;\n continue;\n }\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n update(target, values) {\n if (this._properties.size === 0) {\n Object.assign(target, values);\n return;\n }\n const animations = this._createAnimations(target, values);\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for(let i = 0; i < keys.length; i++){\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n target.options = options = Object.assign({}, options, {\n $shared: false,\n $animations: {}\n });\n }\n return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\nfunction toClip(value) {\n let t, r, b, l;\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n for(i = 0, ilen = metasets.length; i < ilen; ++i){\n keys.push(metasets[i].index);\n }\n return keys;\n}\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n if (value === null) {\n return;\n }\n let found = false;\n for(i = 0, ilen = keys.length; i < ilen; ++i){\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isNumberFinite(otherValue) && (singleMode || value === 0 || sign(value) === sign(otherValue))) {\n value += otherValue;\n }\n }\n if (!found && !options.all) {\n return 0;\n }\n return value;\n}\nfunction convertObjectDataToArray(data, meta) {\n const { iScale , vScale } = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for(i = 0, ilen = keys.length; i < ilen; ++i){\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || stacked === undefined && meta.stack !== undefined;\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n const { min , max , minDefined , maxDefined } = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()){\n const value = stack[meta.index];\n if (positive && value > 0 || !positive && value < 0) {\n return meta.index;\n }\n }\n return null;\n}\nfunction updateStacks(controller, parsed) {\n const { chart , _cachedMeta: meta } = controller;\n const stacks = chart._stacks || (chart._stacks = {});\n const { iScale , vScale , index: datasetIndex } = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n for(let i = 0; i < ilen; ++i){\n const item = parsed[i];\n const { [iAxis]: index , [vAxis]: value } = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter((key)=>scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n return createContext(parent, {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n });\n}\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\nfunction clearStacks(meta, items) {\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n items = items || meta._parsed;\n for (const parsed of items){\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\nconst isDirectUpdateMode = (mode)=>mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared)=>shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart)=>canStack && !meta.hidden && meta._stacked && {\n keys: getSortedDatasetIndices(chart, true),\n values: null\n };\nclass DatasetController {\n static defaults = {};\n static datasetElementType = null;\n static dataElementType = null;\n constructor(chart, datasetIndex){\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n this.initialize();\n }\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n const chooseId = (axis, x, y, r)=>axis === 'x' ? x : axis === 'r' ? r : y;\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale ? meta.vScale : meta.iScale;\n }\n reset() {\n this._update('reset');\n }\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n unlistenArrayEvents(_data, this);\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n addElements() {\n const meta = this._cachedMeta;\n this._dataCheck();\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n this._dataCheck();\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n this._resyncElements(resetNewElements);\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n parse(start, count) {\n const { _cachedMeta: meta , _data: data } = this;\n const { iScale , _stacked } = meta;\n const iAxis = iScale.axis;\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n const isNotInOrderComparedToPrev = ()=>cur[iAxis] === null || prev && cur[iAxis] < prev[iAxis];\n for(i = 0; i < count; ++i){\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n parsePrimitiveData(meta, data, start, count) {\n const { iScale , vScale } = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const { xScale , yScale } = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const { xScale , yScale } = meta;\n const { xAxisKey ='x' , yAxisKey ='y' } = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {\n mode\n });\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY\n };\n const { min: otherMin , max: otherMax } = getUserBounds(otherScale);\n let i, parsed;\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n for(i = 0; i < ilen; ++i){\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n break;\n }\n }\n if (sorted) {\n for(i = ilen - 1; i >= 0; --i){\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n for(i = 0, ilen = parsed.length; i < ilen; ++i){\n value = parsed[i][scale.axis];\n if (isNumberFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n getMaxOverflow() {\n return false;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n update(mode) {}\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || elements.length - start;\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n for(i = start; i < start + count; ++i){\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n for(i = 0; i < active.length; ++i){\n active[i].draw(ctx, area);\n }\n }\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset ? this.resolveDatasetElementOptions(mode) : this.resolveDataElementOptions(index || 0, mode);\n }\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context || (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context || (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [\n `${elementType}Hover`,\n 'hover',\n elementType,\n ''\n ] : [\n elementType,\n ''\n ];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n const context = ()=>this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n if (values.$shared) {\n values.$shared = sharing;\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n return values;\n }\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || sharedOptions !== previouslySharedOptions;\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {\n sharedOptions,\n includeOptions\n };\n }\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n options: !active && this.getSharedOptions(options) || options\n });\n }\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n for (const [method, arg1, arg2] of this._syncList){\n this[method](arg1, arg2);\n }\n this._syncList = [];\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n if (count) {\n this.parse(0, count);\n }\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n const move = (arr)=>{\n arr.length += count;\n for(i = arr.length - 1; i >= end; i--){\n arr[i] = arr[i - count];\n }\n };\n move(data);\n for(i = start; i < end; ++i){\n data[i] = new this.dataElementType();\n }\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n updateElements(element, start, count, mode) {}\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([\n this.index,\n ...args\n ]);\n }\n _onDataPush() {\n const count = arguments.length;\n this._sync([\n '_insertElements',\n this.getDataset().data.length - count,\n count\n ]);\n }\n _onDataPop() {\n this._sync([\n '_removeElements',\n this._cachedMeta.data.length - 1,\n 1\n ]);\n }\n _onDataShift() {\n this._sync([\n '_removeElements',\n 0,\n 1\n ]);\n }\n _onDataSplice(start, count) {\n if (count) {\n this._sync([\n '_removeElements',\n start,\n count\n ]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync([\n '_insertElements',\n start,\n newCount\n ]);\n }\n }\n _onDataUnshift() {\n this._sync([\n '_insertElements',\n 0,\n arguments.length\n ]);\n }\n}\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n for(let i = 0, ilen = visibleMetas.length; i < ilen; i++){\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b)=>a - b));\n }\n return scale._cache.$bar;\n}\n function computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = ()=>{\n if (curr === 32767 || curr === -32768) {\n return;\n }\n if (defined(prev)) {\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n for(i = 0, ilen = values.length; i < ilen; ++i){\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n prev = undefined;\n for(i = 0, ilen = scale.ticks.length; i < ilen; ++i){\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n return min;\n}\n function computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n size = thickness * stackCount;\n ratio = 1;\n }\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - size / 2\n };\n}\n function computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n if (prev === null) {\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n if (next === null) {\n next = curr + curr - prev;\n }\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n item[vScale.axis] = barEnd;\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n for(i = start, ilen = start + count; i < ilen; ++i){\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {\n start,\n end,\n reverse,\n top,\n bottom\n };\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n if (edge === true) {\n properties.borderSkipped = {\n top: true,\n right: true,\n bottom: true,\n left: true\n };\n return;\n }\n const { start , end , reverse , top , bottom } = borderProps(properties);\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\nfunction setInflateAmount(properties, { inflateAmount }, ratio) {\n properties.inflateAmount = inflateAmount === 'auto' ? ratio === 1 ? 0.33 : 0 : inflateAmount;\n}\nclass BarController extends DatasetController {\n static id = 'bar';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'base',\n 'width',\n 'height'\n ]\n }\n }\n };\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true\n }\n }\n };\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseObjectData(meta, data, start, count) {\n const { iScale , vScale } = meta;\n const { xAxisKey ='x' , yAxisKey ='y' } = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for(i = start, ilen = start + count; i < ilen; ++i){\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n getMaxOverflow() {\n return 0;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const { iScale , vScale } = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom) ? '[' + custom.start + ', ' + custom.end + ']' : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const { index , _cachedMeta: { vScale } } = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n for(let i = start; i < start + count; i++){\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {\n base,\n head: base\n } : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || index === stack._top || index === stack._bottom,\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n _getStacks(last, dataIndex) {\n const { iScale } = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type).filter((meta)=>meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n const skipNull = (meta)=>{\n const parsed = meta._parsed.find((item)=>item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n for (const meta of metasets){\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === undefined && meta.stack === undefined) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n if (!stacks.length) {\n stacks.push(undefined);\n }\n return stacks;\n }\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = name !== undefined ? stacks.indexOf(name) : -1;\n return index === -1 ? stacks.length - 1 : index;\n }\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n for(i = 0, ilen = meta.data.length; i < ilen; ++i){\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n _calculateBarValuePixels(index) {\n const { _cachedMeta: { vScale , _stacked , index: datasetIndex } , options: { base: baseValue , minBarLength } } = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n if (length !== value) {\n start = length - value;\n length = value;\n }\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n head = base;\n }\n size = head - base;\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n if (_stacked && !floating) {\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options, stackCount) : computeFitCategoryTraits(index, ruler, options, stackCount);\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined);\n center = range.start + range.chunk * stackIndex + range.chunk / 2;\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n for(; i < ilen; ++i){\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n}\n\nclass BubbleController extends DatasetController {\n static id = 'bubble';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'borderWidth',\n 'radius'\n ]\n }\n }\n };\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n let max = 0;\n for(let i = data.length - 1; i >= 0; --i){\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const { xScale , yScale } = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n update(mode) {\n const points = this._cachedMeta.data;\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale } = this._cachedMeta;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n for(let i = start; i < start + count; i++){\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n if (reset) {\n properties.options.radius = 0;\n }\n }\n this.updateElement(point, i, properties, mode);\n }\n }\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n if (values.$shared) {\n values = Object.assign({}, values, {\n $shared: false\n });\n }\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n return values;\n }\n}\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {\n ratioX,\n ratioY,\n offsetX,\n offsetY\n };\n}\nclass DoughnutController extends DatasetController {\n static id = 'doughnut';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'circumference',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'startAngle',\n 'x',\n 'y',\n 'offset',\n 'borderWidth',\n 'spacing'\n ]\n }\n },\n cutout: '50%',\n rotation: 0,\n circumference: 360,\n radius: '100%',\n spacing: 0,\n indexAxis: 'r'\n };\n static descriptors = {\n _scriptable: (name)=>name !== 'spacing',\n _indexable: (name)=>name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash')\n };\n static overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels (chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const { labels: { pointStyle , color } } = chart.legend.options;\n return data.labels.map((label, i)=>{\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick (e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n constructor(chart, datasetIndex){\n super(chart, datasetIndex);\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n linkScales() {}\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i)=>+data[i];\n if (isObject(data[start])) {\n const { key ='value' } = this._parsing;\n getter = (i)=>+resolveObjectKey(data[i], key);\n }\n let i, ilen;\n for(i = start, ilen = start + count; i < ilen; ++i){\n meta._parsed[i] = getter(i);\n }\n }\n }\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n for(let i = 0; i < this.chart.data.datasets.length; ++i){\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n return {\n rotation: min,\n circumference: max - min\n };\n }\n update(mode) {\n const chart = this.chart;\n const { chartArea } = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n const { circumference , rotation } = this._getRotationExtents();\n const { ratioX , ratioY , offsetX , offsetY } = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n meta.total = this.calculateTotal();\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if (reset && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n for(i = 0; i < start; ++i){\n startAngle += this._circumference(i, reset);\n }\n for(i = start; i < start + count; ++i){\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n this.updateElement(arc, i, properties, mode);\n }\n }\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n for(i = 0; i < metaData.length; i++){\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n return total;\n }\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n return {\n label: labels[index] || '',\n value\n };\n }\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n if (!arcs) {\n for(i = 0, ilen = chart.data.datasets.length; i < ilen; ++i){\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n if (!arcs) {\n return 0;\n }\n for(i = 0, ilen = arcs.length; i < ilen; ++i){\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n getMaxOffset(arcs) {\n let max = 0;\n for(let i = 0, ilen = arcs.length; i < ilen; ++i){\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n for(let i = 0; i < datasetIndex; ++i){\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n return ringWeightOffset;\n }\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n\nclass LineController extends DatasetController {\n static id = 'line';\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n showLine: true,\n spanGaps: false\n };\n static overrides = {\n scales: {\n _index_: {\n type: 'category'\n },\n _value_: {\n type: 'linear'\n }\n }\n };\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n update(mode) {\n const meta = this._cachedMeta;\n const { dataset: line , data: points = [] , _dataset } = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let { start , count } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n this.updateElements(points, start, count, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale , _stacked , _dataset } = this._cachedMeta;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const { spanGaps , segment } = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for(let i = 0; i < pointsCount; ++i){\n const point = points[i];\n const properties = directUpdate ? point : {};\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n\nclass PolarAreaController extends DatasetController {\n static id = 'polarArea';\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ]\n }\n },\n indexAxis: 'r',\n startAngle: 0\n };\n static overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels (chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const { labels: { pointStyle , color } } = chart.legend.options;\n return data.labels.map((label, i)=>{\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick (e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n constructor(chart, datasetIndex){\n super(chart, datasetIndex);\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n return {\n label: labels[index] || '',\n value\n };\n }\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const arcs = this._cachedMeta.data;\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY\n };\n meta.data.forEach((element, index)=>{\n const parsed = this.getParsed(index).r;\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n return range;\n }\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? outerRadius / 100 * opts.cutoutPercentage : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n this.outerRadius = outerRadius - radiusLength * this.index;\n this.innerRadius = this.outerRadius - radiusLength;\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n const defaultAngle = 360 / this.countVisibleElements();\n for(i = 0; i < start; ++i){\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for(i = start; i < start + count; i++){\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n this.updateElement(arc, i, properties, mode);\n }\n }\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n meta.data.forEach((element, index)=>{\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n return count;\n }\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index) ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle) : 0;\n }\n}\n\nclass PieController extends DoughnutController {\n static id = 'pie';\n static defaults = {\n cutout: 0,\n rotation: 0,\n circumference: 360,\n radius: '100%'\n };\n}\n\nclass RadarController extends DatasetController {\n static id = 'radar';\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n }\n };\n static overrides = {\n aspectRatio: 1,\n scales: {\n r: {\n type: 'radialLinear'\n }\n }\n };\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n line.points = points;\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n this.updateElement(line, undefined, properties, mode);\n }\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n for(let i = start; i < start + count; i++){\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n\nclass ScatterController extends DatasetController {\n static id = 'scatter';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n static overrides = {\n interaction: {\n mode: 'point'\n },\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const { xScale , yScale } = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n update(mode) {\n const meta = this._cachedMeta;\n const { data: points = [] } = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let { start , count } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n if (this.options.showLine) {\n if (!this.datasetElementType) {\n this.addElements();\n }\n const { dataset: line , _dataset } = meta;\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n delete meta.dataset;\n this.datasetElementType = false;\n }\n this.updateElements(points, start, count, mode);\n }\n addElements() {\n const { showLine } = this.options;\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n super.addElements();\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale , _stacked , _dataset } = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const { spanGaps , segment } = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for(let i = start; i < start + count; ++i){\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n if (!this.options.showLine) {\n let max = 0;\n for(let i = data.length - 1; i >= 0; --i){\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPieController: PieController,\nPolarAreaController: PolarAreaController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\n/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */ function abstract() {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */ class DateAdapterBase {\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */ static override(members) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n options;\n constructor(options){\n this.options = options || {};\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n formats() {\n return abstract();\n }\n parse() {\n return abstract();\n }\n format() {\n return abstract();\n }\n add() {\n return abstract();\n }\n diff() {\n return abstract();\n }\n startOf() {\n return abstract();\n }\n endOf() {\n return abstract();\n }\n}\nvar adapters = {\n _date: DateAdapterBase\n};\n\nfunction binarySearch(metaset, axis, value, intersect) {\n const { controller , data , _sorted } = metaset;\n const iScale = controller._cachedMeta.iScale;\n const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n const result = lookupMethod(data, axis, value);\n if (spanGaps) {\n const { vScale } = controller._cachedMeta;\n const { _parsed } = metaset;\n const distanceToDefinedLo = _parsed.slice(0, result.lo + 1).reverse().findIndex((point)=>!isNullOrUndef(point[vScale.axis]));\n result.lo -= Math.max(0, distanceToDefinedLo);\n const distanceToDefinedHi = _parsed.slice(result.hi).findIndex((point)=>!isNullOrUndef(point[vScale.axis]));\n result.hi += Math.max(0, distanceToDefinedHi);\n }\n return result;\n } else if (controller._sharedOptions) {\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {\n lo: start.lo,\n hi: end.hi\n };\n }\n }\n }\n return {\n lo: 0,\n hi: data.length - 1\n };\n}\n function evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for(let i = 0, ilen = metasets.length; i < ilen; ++i){\n const { index , data } = metasets[i];\n const { lo , hi } = binarySearch(metasets[i], axis, value, intersect);\n for(let j = lo; j <= hi; ++j){\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n function getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n function getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n };\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n function getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n function evaluationFunc(element, datasetIndex, index) {\n const { startAngle , endAngle } = element.getProps([\n 'startAngle',\n 'endAngle'\n ], useFinalPosition);\n const { angle } = getAngleFromPoint(element, {\n x: position.x,\n y: position.y\n });\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n function getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [\n {\n element,\n datasetIndex,\n index\n }\n ];\n minDistance = distance;\n } else if (distance === minDistance) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n function getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n return axis === 'r' && !intersect ? getNearestRadialItems(chart, position, axis, useFinalPosition) : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n function getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index)=>{\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n var Interaction = {\n evaluateInteractionItems,\n modes: {\n index (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n if (!items.length) {\n return [];\n }\n chart.getSortedVisibleDatasetMetas().forEach((meta)=>{\n const index = items[0].index;\n const element = meta.data[index];\n if (element && !element.skip) {\n elements.push({\n element,\n datasetIndex: meta.index,\n index\n });\n }\n });\n return elements;\n },\n dataset (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for(let i = 0; i < data.length; ++i){\n items.push({\n element: data[i],\n datasetIndex,\n index: i\n });\n }\n }\n return items;\n },\n point (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n nearest (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n x (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n y (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n\nconst STATIC_POSITIONS = [\n 'left',\n 'top',\n 'right',\n 'bottom'\n];\nfunction filterByPosition(array, position) {\n return array.filter((v)=>v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter((v)=>STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b)=>{\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight;\n });\n}\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n for(i = 0, ilen = (boxes || []).length; i < ilen; ++i){\n box = boxes[i];\n ({ position: pos , options: { stack , stackWeight =1 } } = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && pos + stack,\n stackWeight\n });\n }\n return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts){\n const { stack , pos , stackWeight } = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {\n count: 0,\n placed: 0,\n weight: 0,\n size: 0\n });\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n function setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const { vBoxMaxWidth , hBoxMaxHeight } = params;\n let i, ilen, layout;\n for(i = 0, ilen = layouts.length; i < ilen; ++i){\n layout = layouts[i];\n const { fullSize } = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter((wrap)=>wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n const { pos , box } = layout;\n const maxPadding = chartArea.maxPadding;\n if (!isObject(pos)) {\n if (layout.size) {\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {\n size: 0,\n count: 1\n };\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n return layout.horizontal ? {\n same: widthChanged,\n other: heightChanged\n } : {\n same: heightChanged,\n other: widthChanged\n };\n}\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n function marginForPositions(positions) {\n const margin = {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n };\n positions.forEach((pos)=>{\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n return horizontal ? marginForPositions([\n 'left',\n 'right'\n ]) : marginForPositions([\n 'top',\n 'bottom'\n ]);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n for(i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i){\n layout = boxes[i];\n box = layout.box;\n box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea));\n const { same , other } = updateDims(chartArea, params, layout, stacks);\n refit |= same && refitBoxes.length;\n changed = changed || other;\n if (!box.fullSize) {\n refitBoxes.push(layout);\n }\n }\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let { x , y } = chartArea;\n for (const layout of boxes){\n const box = layout.box;\n const stack = stacks[layout.stack] || {\n count: 1,\n placed: 0,\n weight: 1\n };\n const weight = layout.stackWeight / stack.weight || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n chartArea.x = x;\n chartArea.y = y;\n}\nvar layouts = {\n addBox (chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n item._layers = item._layers || function() {\n return [\n {\n z: 0,\n draw (chartArea) {\n item.draw(chartArea);\n }\n }\n ];\n };\n chart.boxes.push(item);\n },\n removeBox (chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n configure (chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n update (chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n each(chart.boxes, (box)=>{\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap)=>wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n handleMaxPadding(chartArea);\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w\n };\n each(boxes.chartArea, (layout)=>{\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n });\n });\n }\n};\n\nclass BasePlatform {\n acquireContext(canvas, aspectRatio) {}\n releaseContext(context) {\n return false;\n }\n addEventListener(chart, type, listener) {}\n removeEventListener(chart, type, listener) {}\n getDevicePixelRatio() {\n return 1;\n }\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n isAttached(canvas) {\n return true;\n }\n updateConfig(config) {\n }\n}\n\nclass BasicPlatform extends BasePlatform {\n acquireContext(item) {\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n\nconst EXPANDO_KEY = '$chartjs';\n const EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\nconst isNullOrEmpty = (value)=>value === null || value === '';\n function initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n style.display = style.display || 'block';\n style.boxSizing = style.boxSizing || 'border-box';\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {\n passive: true\n} : false;\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const { x , y } = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null\n };\n}\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList){\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver((entries)=>{\n let trigger = false;\n for (const entry of entries){\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {\n childList: true,\n subtree: true\n });\n return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver((entries)=>{\n let trigger = false;\n for (const entry of entries){\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {\n childList: true,\n subtree: true\n });\n return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart)=>{\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height)=>{\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n listener();\n }\n }, window);\n const observer = new ResizeObserver((entries)=>{\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event)=>{\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n addListener(canvas, type, proxy);\n return proxy;\n}\n class DomPlatform extends BasePlatform {\n acquireContext(canvas, aspectRatio) {\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n if (context && context.canvas === canvas) {\n initCanvas(canvas, aspectRatio);\n return context;\n }\n return null;\n }\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n const initial = canvas[EXPANDO_KEY].initial;\n [\n 'height',\n 'width'\n ].forEach((prop)=>{\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n const style = initial.style || {};\n Object.keys(style).forEach((key)=>{\n canvas.style[key] = style[key];\n });\n canvas.width = canvas.width;\n delete canvas[EXPANDO_KEY];\n return true;\n }\n addEventListener(chart, type, listener) {\n this.removeEventListener(chart, type);\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n if (!proxy) {\n return;\n }\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n\nfunction _detectPlatform(canvas) {\n if (!_isDomSupported() || typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nclass Element {\n static defaults = {};\n static defaultRoutes = undefined;\n x;\n y;\n active = false;\n options;\n $animations;\n tooltipPosition(useFinalPosition) {\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return {\n x,\n y\n };\n }\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n getProps(props, final) {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this;\n }\n const ret = {};\n props.forEach((prop)=>{\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop];\n });\n return ret;\n }\n}\n\nfunction autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for(i = 0, ilen = numMajorIndices - 1; i < ilen; i++){\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n function calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n const factors = _factorize(evenMajorSpacing);\n for(let i = 0, ilen = factors.length - 1; i < ilen; i++){\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n function getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n function skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n spacing = Math.ceil(spacing);\n for(i = 0; i < ticks.length; i++){\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n function skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n next = start;\n while(next < 0){\n count++;\n next = Math.round(start + count * spacing);\n }\n for(i = Math.max(start, 0); i < end; i++){\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n function getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n if (len < 2) {\n return false;\n }\n for(diff = arr[0], i = 1; i < len; ++i){\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n\nconst reverseAlign = (align)=>align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset)=>edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit)=>Math.min(maxTicksLimit || ticksLength, ticksLength);\n function sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n for(; i < len; i += increment){\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n function getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6;\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n function garbageCollect(caches, length) {\n each(caches, (cache)=>{\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for(i = 0; i < gcLen; ++i){\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n function getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n function getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n return lines * font.lineHeight + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\nfunction titleAlign(align, position, reverse) {\n let ret = _toLeftRightCenter(align);\n if (reverse && position !== 'right' || !reverse && position === 'right') {\n ret = reverseAlign(ret);\n }\n return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n const { top , left , bottom , right , chart } = scale;\n const { chartArea , scales } = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {\n titleX,\n titleY,\n maxWidth,\n rotation\n };\n}\nclass Scale extends Element {\n constructor(cfg){\n super();\n this.id = cfg.id;\n this.type = cfg.type;\n this.options = undefined;\n this.ctx = cfg.ctx;\n this.chart = cfg.chart;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n this.maxWidth = undefined;\n this.maxHeight = undefined;\n this.paddingTop = undefined;\n this.paddingBottom = undefined;\n this.paddingLeft = undefined;\n this.paddingRight = undefined;\n this.axis = undefined;\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n this.ticks = [];\n this._gridLineItems = null;\n this._labelItems = null;\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n this._startPixel = undefined;\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n init(options) {\n this.options = options.setContext(this.getContext());\n this.axis = options.axis;\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n parse(raw, index) {\n return raw;\n }\n getUserBounds() {\n let { _userMin , _userMax , _suggestedMin , _suggestedMax } = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isNumberFinite(_userMin),\n maxDefined: isNumberFinite(_userMax)\n };\n }\n getMinMax(canStack) {\n let { min , max , minDefined , maxDefined } = this.getUserBounds();\n let range;\n if (minDefined && maxDefined) {\n return {\n min,\n max\n };\n }\n const metas = this.getMatchingVisibleMetas();\n for(let i = 0, ilen = metas.length; i < ilen; ++i){\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n getTicks() {\n return this.ticks;\n }\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n beforeUpdate() {\n callback(this.options.beforeUpdate, [\n this\n ]);\n }\n update(maxWidth, maxHeight, margins) {\n const { beginAtZero , grace , ticks: tickOpts } = this.options;\n const sampleSize = tickOpts.sampleSize;\n this.beforeUpdate();\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n this._maxLength = this.isHorizontal() ? this.width + margins.left + margins.right : this.height + margins.top + margins.bottom;\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n this.beforeBuildTicks();\n this.ticks = this.buildTicks() || [];\n this.afterBuildTicks();\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n this.configure();\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation();\n this.afterCalculateLabelRotation();\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n if (samplingEnabled) {\n this._convertTicksToLabels(this.ticks);\n }\n this.beforeFit();\n this.fit();\n this.afterFit();\n this.afterUpdate();\n }\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n afterUpdate() {\n callback(this.options.afterUpdate, [\n this\n ]);\n }\n beforeSetDimensions() {\n callback(this.options.beforeSetDimensions, [\n this\n ]);\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = 0;\n this.bottom = this.height;\n }\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n callback(this.options.afterSetDimensions, [\n this\n ]);\n }\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n callback(this.options[name], [\n this\n ]);\n }\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n beforeTickToLabelConversion() {\n callback(this.options.beforeTickToLabelConversion, [\n this\n ]);\n }\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n tick = ticks[i];\n tick.label = callback(tickOpts.callback, [\n tick.value,\n i,\n ticks\n ], this);\n }\n }\n afterTickToLabelConversion() {\n callback(this.options.afterTickToLabelConversion, [\n this\n ]);\n }\n beforeCalculateLabelRotation() {\n callback(this.options.beforeCalculateLabelRotation, [\n this\n ]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)), Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n callback(this.options.afterCalculateLabelRotation, [\n this\n ]);\n }\n afterAutoSkip() {}\n beforeFit() {\n callback(this.options.beforeFit, [\n this\n ]);\n }\n fit() {\n const minSize = {\n width: 0,\n height: 0\n };\n const { chart , options: { ticks: tickOpts , title: titleOpts , grid: gridOpts } } = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight;\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n if (tickOpts.display && this.ticks.length) {\n const { first , last , widest , highest } = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n if (isHorizontal) {\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n this._handleMargins();\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n _calculatePadding(first, last, sin, cos) {\n const { ticks: { align , padding } , position } = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n afterFit() {\n callback(this.options.afterFit, [\n this\n ]);\n }\n isHorizontal() {\n const { axis , position } = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n isFullSize() {\n return this.options.fullSize;\n }\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n this.generateTickLabels(ticks);\n let i, ilen;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n this.afterTickToLabelConversion();\n }\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n return labelSizes;\n }\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const { ctx , _longestTextCache: caches } = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n for(i = 0; i < length; i += increment){\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {\n data: {},\n gc: []\n };\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n for(j = 0, jlen = label.length; j < jlen; ++j){\n nestedLabel = label[j];\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n const valueAt = (idx)=>({\n width: widths[idx] || 0,\n height: heights[idx] || 0\n });\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights\n };\n }\n getLabelForValue(value) {\n return value;\n }\n getPixelForValue(value, index) {\n return NaN;\n }\n getValueForPixel(pixel) {}\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n getBaseValue() {\n const { min , max } = this;\n return min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0;\n }\n getContext(index) {\n const ticks = this.ticks || [];\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context || (tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context || (this.$context = createScaleContext(this.chart.getContext(), this));\n }\n _tickSize() {\n const optionTicks = this.options.ticks;\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n return this.isHorizontal() ? h * cos > w * sin ? w / cos : h / sin : h * sin < w * cos ? h / cos : w / sin;\n }\n _isVisible() {\n const display = this.options.display;\n if (display !== 'auto') {\n return !!display;\n }\n return this.getMatchingVisibleMetas().length > 0;\n }\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const { grid , position , border } = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for(i = 0; i < ticksLength; i += step){\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n lineValue = getPixelForGridLine(this, i, offset);\n if (lineValue === undefined) {\n continue;\n }\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset\n });\n }\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n return items;\n }\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const { position , ticks: optionTicks } = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const { align , crossAlign , padding , mirror } = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = (chartArea.top + chartArea.bottom) / 2 + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = (chartArea.left + chartArea.right) / 2 - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n const labelSizes = this._getLabelSizes();\n for(i = 0, ilen = ticks.length; i < ilen; ++i){\n tick = ticks[i];\n label = tick.label;\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n if (isHorizontal) {\n x = pixel;\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += lineHeight / 2 * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n let backdrop;\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n switch(textBaseline){\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n }\n switch(textAlign){\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n }\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n color: optsAtIndex.backdropColor\n };\n }\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [\n x,\n y\n ],\n backdrop\n }\n });\n }\n return items;\n }\n _getXAxisLabelAlignment() {\n const { position , ticks } = this.options;\n const rotation = -toRadians(this.labelRotation);\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n let align = 'center';\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n return align;\n }\n _getYAxisLabelAlignment(tl) {\n const { position , ticks: { crossAlign , mirror , padding } } = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n let textAlign;\n let x;\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= widest / 2;\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= widest / 2;\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n return {\n textAlign,\n x\n };\n }\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n const chart = this.chart;\n const position = this.options.position;\n if (position === 'left' || position === 'right') {\n return {\n top: 0,\n left: this.left,\n bottom: chart.height,\n right: this.right\n };\n }\n if (position === 'top' || position === 'bottom') {\n return {\n top: this.top,\n left: 0,\n bottom: this.bottom,\n right: chart.width\n };\n }\n }\n drawBackground() {\n const { ctx , options: { backgroundColor } , left , top , width , height } = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex((t)=>t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n const drawLine = (p1, p2, style)=>{\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n if (grid.display) {\n for(i = 0, ilen = items.length; i < ilen; ++i){\n const item = items[i];\n if (grid.drawOnChartArea) {\n drawLine({\n x: item.x1,\n y: item.y1\n }, {\n x: item.x2,\n y: item.y2\n }, item);\n }\n if (grid.drawTicks) {\n drawLine({\n x: item.tx1,\n y: item.ty1\n }, {\n x: item.tx2,\n y: item.ty2\n }, {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n });\n }\n }\n }\n }\n drawBorder() {\n const { chart , ctx , options: { border , grid } } = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.restore();\n }\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n if (!optionTicks.display) {\n return;\n }\n const ctx = this.ctx;\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n const items = this.getLabelItems(chartArea);\n for (const item of items){\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n if (area) {\n unclipArea(ctx);\n }\n }\n drawTitle() {\n const { ctx , options: { position , title , reverse } } = this;\n if (!title.display) {\n return;\n }\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n const { titleX , titleY , maxWidth , rotation } = titleArgs(this, offset, position, align);\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [\n titleX,\n titleY\n ]\n });\n }\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n return [\n {\n z: tz,\n draw: (chartArea)=>{\n this.draw(chartArea);\n }\n }\n ];\n }\n return [\n {\n z: gz,\n draw: (chartArea)=>{\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n },\n {\n z: bz,\n draw: ()=>{\n this.drawBorder();\n }\n },\n {\n z: tz,\n draw: (chartArea)=>{\n this.drawLabels(chartArea);\n }\n }\n ];\n }\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n for(i = 0, ilen = metas.length; i < ilen; ++i){\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n\nclass TypedRegistry {\n constructor(type, scope, override){\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n if (isIChartComponent(proto)) {\n parentScope = this.register(proto);\n }\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n if (id in items) {\n return scope;\n }\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n return scope;\n }\n get(id) {\n return this.items[id];\n }\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n if (id in items) {\n delete items[id];\n }\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\nfunction registerDefaults(item, scope, parentScope) {\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n defaults.set(scope, itemDefaults);\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach((property)=>{\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [\n scope\n ].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n constructor(){\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n this._typedRegistries = [\n this.controllers,\n this.scales,\n this.elements\n ];\n }\n add(...args) {\n this._each('register', args);\n }\n remove(...args) {\n this._each('unregister', args);\n }\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n _each(method, args, typedRegistry) {\n [\n ...args\n ].forEach((arg)=>{\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || reg === this.plugins && arg.id) {\n this._exec(method, reg, arg);\n } else {\n each(arg, (item)=>{\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n callback(component['before' + camelMethod], [], component);\n registry[method](component);\n callback(component['after' + camelMethod], [], component);\n }\n _getRegistryForType(type) {\n for(let i = 0; i < this._typedRegistries.length; i++){\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n return this.plugins;\n }\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n}\nvar registry = /* #__PURE__ */ new Registry();\n\nclass PluginService {\n constructor(){\n this._init = [];\n }\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n }\n return result;\n }\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors){\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [\n chart,\n args,\n descriptor.options\n ];\n if (callback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n return true;\n }\n invalidate() {\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n const descriptors = this._cache = this._createDescriptors(chart);\n this._notifyStateChanges(chart);\n return descriptors;\n }\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n function allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for(let i = 0; i < keys.length; i++){\n plugins.push(registry.getPlugin(keys[i]));\n }\n const local = config.plugins || [];\n for(let i = 0; i < local.length; i++){\n const plugin = local[i];\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n return {\n plugins,\n localIds\n };\n}\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\nfunction createDescriptors(chart, { plugins , localIds }, options, all) {\n const result = [];\n const context = chart.getContext();\n for (const plugin of plugins){\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {\n plugin,\n local: localIds[id]\n }, opts, context)\n });\n }\n return result;\n}\nfunction pluginOpts(config, { plugin , local }, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [\n ''\n ], {\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n\nfunction getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\nfunction determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions){\n const axis = opts.axis || axisFromPosition(opts.position) || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {\n axis\n };\n }\n}\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d)=>d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {\n scales: {}\n };\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n Object.keys(configScales).forEach((id)=>{\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [\n {\n axis\n },\n scaleConf,\n defaultScaleOptions[axis],\n defaultScaleOptions[defaultId]\n ]);\n });\n config.data.datasets.forEach((dataset)=>{\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach((defaultID)=>{\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [\n {\n axis\n },\n configScales[id],\n defaultScaleOptions[defaultID]\n ]);\n });\n });\n Object.keys(scales).forEach((key)=>{\n const scale = scales[key];\n mergeIf(scale, [\n defaults.scales[scale.type],\n defaults.scale\n ]);\n });\n return scales;\n}\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n initOptions(config);\n return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\nconst addIfFound = (set, obj, key)=>{\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\nclass Config {\n constructor(config){\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n get platform() {\n return this._config.platform;\n }\n get type() {\n return this._config.type;\n }\n set type(type) {\n this._config.type = type;\n }\n get data() {\n return this._config.data;\n }\n set data(data) {\n this._config.data = initData(data);\n }\n get options() {\n return this._config.options;\n }\n set options(options) {\n this._config.options = options;\n }\n get plugins() {\n return this._config.plugins;\n }\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType, ()=>[\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`, ()=>[\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`\n ],\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`, ()=>[\n [\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]\n ]);\n }\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`, ()=>[\n [\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || []\n ]\n ]);\n }\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n getOptionScopes(mainScope, keyLists, resetCache) {\n const { options , type } = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n const scopes = new Set();\n keyLists.forEach((keys)=>{\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach((key)=>addIfFound(scopes, mainScope, key));\n }\n keys.forEach((key)=>addIfFound(scopes, options, key));\n keys.forEach((key)=>addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach((key)=>addIfFound(scopes, defaults, key));\n keys.forEach((key)=>addIfFound(scopes, descriptors, key));\n });\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n chartOptionScopes() {\n const { options , type } = this;\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {},\n {\n type\n },\n defaults,\n descriptors\n ];\n }\n resolveNamedOptions(scopes, names, context, prefixes = [\n ''\n ]) {\n const result = {\n $shared: true\n };\n const { resolver , subPrefixes } = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n for (const prop of names){\n result[prop] = options[prop];\n }\n return result;\n }\n createResolver(scopes, context, prefixes = [\n ''\n ], descriptorDefaults) {\n const { resolver } = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context) ? _attachContext(resolver, context, undefined, descriptorDefaults) : resolver;\n }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter((p)=>!p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\nconst hasFunction = (value)=>isObject(value) && Object.getOwnPropertyNames(value).some((key)=>isFunction(value[key]));\nfunction needContext(proxy, names) {\n const { isScriptable , isIndexable } = _descriptors(proxy);\n for (const prop of names){\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if (scriptable && (isFunction(value) || hasFunction(value)) || indexable && isArray(value)) {\n return true;\n }\n }\n return false;\n}\n\nvar version = \"4.4.9\";\n\nconst KNOWN_POSITIONS = [\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'chartArea'\n];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x';\n}\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1];\n };\n}\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n chart.notifyPlugins('afterRender');\n callback(animationOptions && animationOptions.onComplete, [\n context\n ], chart);\n}\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callback(animationOptions && animationOptions.onProgress, [\n context\n ], chart);\n}\n function getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n item = item[0];\n }\n if (item && item.canvas) {\n item = item.canvas;\n }\n return item;\n}\nconst instances = {};\nconst getChart = (key)=>{\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c)=>c.canvas === canvas).pop();\n};\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys){\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n function determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\nclass Chart {\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n constructor(item, userConfig){\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error('Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' + ' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.');\n }\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce((mode)=>this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n instances[this.id] = this;\n if (!context || !canvas) {\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n get aspectRatio() {\n const { options: { aspectRatio , maintainAspectRatio } , width , height , _aspectRatio } = this;\n if (!isNullOrUndef(aspectRatio)) {\n return aspectRatio;\n }\n if (maintainAspectRatio && _aspectRatio) {\n return _aspectRatio;\n }\n return height ? width / height : null;\n }\n get data() {\n return this.config.data;\n }\n set data(data) {\n this.config.data = data;\n }\n get options() {\n return this._options;\n }\n set options(options) {\n this.config.options = options;\n }\n get registry() {\n return registry;\n }\n _initialize() {\n this.notifyPlugins('beforeInit');\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n this.bindEvents();\n this.notifyPlugins('afterInit');\n return this;\n }\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n stop() {\n animator.stop(this);\n return this;\n }\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {\n width,\n height\n };\n }\n }\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n this.notifyPlugins('resize', {\n size: newSize\n });\n callback(options.onResize, [\n this,\n newSize\n ], this);\n if (this.attached) {\n if (this._doResize(mode)) {\n this.render();\n }\n }\n }\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n each(scalesOptions, (axisOptions, axisID)=>{\n axisOptions.id = axisID;\n });\n }\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id)=>{\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n if (scaleOpts) {\n items = items.concat(Object.keys(scaleOpts).map((id)=>{\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n }));\n }\n each(items, (item)=>{\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n scale.init(scaleOptions, options);\n });\n each(updated, (hasUpdated, id)=>{\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n each(scales, (scale)=>{\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n metasets.sort((a, b)=>a.index - b.index);\n if (numMeta > numData) {\n for(let i = numData; i < numMeta; ++i){\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n _removeUnreferencedMetasets() {\n const { _metasets: metasets , data: { datasets } } = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index)=>{\n if (datasets.filter((x)=>x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n this._removeUnreferencedMetasets();\n for(i = 0, ilen = datasets.length; i < ilen; i++){\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const { datasetElementType , dataElementType } = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n this._updateMetasets();\n return newControllers;\n }\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex)=>{\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n update(mode) {\n const config = this.config;\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n this._plugins.invalidate();\n if (this.notifyPlugins('beforeUpdate', {\n mode,\n cancelable: true\n }) === false) {\n return;\n }\n const newControllers = this.buildOrUpdateControllers();\n this.notifyPlugins('beforeElementsUpdate');\n let minPadding = 0;\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; i++){\n const { controller } = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n if (!animsDisabled) {\n each(newControllers, (controller)=>{\n controller.reset();\n });\n }\n this._updateDatasets(mode);\n this.notifyPlugins('afterUpdate', {\n mode\n });\n this._layers.sort(compare2Level('z', '_idx'));\n const { _active , _lastEvent } = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n this.render();\n }\n _updateScales() {\n each(this.scales, (scale)=>{\n layouts.removeBox(this, scale);\n });\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n this.unbindEvents();\n this.bindEvents();\n }\n }\n _updateHiddenIndices() {\n const { _hiddenIndices } = this;\n const changes = this._getUniformDataChanges() || [];\n for (const { method , start , count } of changes){\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx)=>new Set(_dataChanges.filter((c)=>c[0] === idx).map((c, i)=>i + ',' + c.splice(1).join(',')));\n const changeSet = makeSet(0);\n for(let i = 1; i < datasetCount; i++){\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet).map((c)=>c.split(',')).map((a)=>({\n method: a[1],\n start: +a[2],\n count: +a[3]\n }));\n }\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {\n cancelable: true\n }) === false) {\n return;\n }\n layouts.update(this, this.width, this.height, minPadding);\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n this._layers = [];\n each(this.boxes, (box)=>{\n if (noArea && box.position === 'chartArea') {\n return;\n }\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n this._layers.forEach((item, index)=>{\n item._idx = index;\n });\n this.notifyPlugins('afterLayout');\n }\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {\n mode,\n cancelable: true\n }) === false) {\n return;\n }\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this.getDatasetMeta(i).controller.configure();\n }\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this._updateDataset(i, isFunction(mode) ? mode({\n datasetIndex: i\n }) : mode);\n }\n this.notifyPlugins('afterDatasetsUpdate', {\n mode\n });\n }\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {\n meta,\n index,\n mode,\n cancelable: true\n };\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n meta.controller._update(mode);\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n render() {\n if (this.notifyPlugins('beforeRender', {\n cancelable: true\n }) === false) {\n return;\n }\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({\n chart: this\n });\n }\n }\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const { width , height } = this._resizeBeforeDraw;\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n if (this.notifyPlugins('beforeDraw', {\n cancelable: true\n }) === false) {\n return;\n }\n const layers = this._layers;\n for(i = 0; i < layers.length && layers[i].z <= 0; ++i){\n layers[i].draw(this.chartArea);\n }\n this._drawDatasets();\n for(; i < layers.length; ++i){\n layers[i].draw(this.chartArea);\n }\n this.notifyPlugins('afterDraw');\n }\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n for(i = 0, ilen = metasets.length; i < ilen; ++i){\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n return result;\n }\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {\n cancelable: true\n }) === false) {\n return;\n }\n const metasets = this.getSortedVisibleDatasetMetas();\n for(let i = metasets.length - 1; i >= 0; --i){\n this._drawDataset(metasets[i]);\n }\n this.notifyPlugins('afterDatasetsDraw');\n }\n _drawDataset(meta) {\n const ctx = this.ctx;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n const clip = getDatasetClipArea(this, meta);\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n if (clip) {\n clipArea(ctx, clip);\n }\n meta.controller.draw();\n if (clip) {\n unclipArea(ctx);\n }\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n return [];\n }\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter((x)=>x && x._dataset === dataset).pop();\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n return meta;\n }\n getContext() {\n return this.$context || (this.$context = createContext(null, {\n chart: this,\n type: 'chart'\n }));\n }\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n const meta = this.getDatasetMeta(datasetIndex);\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n anims.update(meta, {\n visible\n });\n this.update((ctx)=>ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n for(i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this._destroyDatasetMeta(i);\n }\n }\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const { canvas , ctx } = this;\n this._stop();\n this.config.clearCache();\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n delete instances[this.id];\n this.notifyPlugins('afterDestroy');\n }\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n const _add = (type, listener)=>{\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const listener = (e, x, y)=>{\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n each(this.options.events, (type)=>_add(type, listener));\n }\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n const _add = (type, listener)=>{\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener)=>{\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n const listener = (width, height)=>{\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n let detached;\n const attached = ()=>{\n _remove('attach', attached);\n this.attached = true;\n this.resize();\n _add('resize', listener);\n _add('detach', detached);\n };\n detached = ()=>{\n this.attached = false;\n _remove('resize', listener);\n this._stop();\n this._resize(0, 0);\n _add('attach', attached);\n };\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n unbindEvents() {\n each(this._listeners, (listener, type)=>{\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n each(this._responsiveListeners, (listener, type)=>{\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n for(i = 0, ilen = items.length; i < ilen; ++i){\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({ datasetIndex , index })=>{\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n if (changed) {\n this._active = active;\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter((p)=>p.plugin.id === pluginId).length === 1;\n }\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin)=>(plugin.options.events || this.options.events).includes(e.native.type);\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n const changed = this._handleEvent(e, replay, args.inChartArea);\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n if (changed || args.changed) {\n this.render();\n }\n return this;\n }\n _handleEvent(e, replay, inChartArea) {\n const { _active: lastActive = [] , options } = this;\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n if (inChartArea) {\n this._lastEvent = null;\n callback(options.onHover, [\n e,\n active,\n this\n ], this);\n if (isClick) {\n callback(options.onClick, [\n e,\n active,\n this\n ], this);\n }\n }\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n this._lastEvent = lastEvent;\n return changed;\n }\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n if (!inChartArea) {\n return lastActive;\n }\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart)=>chart._plugins.invalidate());\n}\n\nfunction clipArc(ctx, element, endAngle) {\n const { startAngle , pixelMargin , x , y , outerRadius , innerRadius } = element;\n let angleMargin = pixelMargin / outerRadius;\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, [\n 'outerStart',\n 'outerEnd',\n 'innerStart',\n 'innerEnd'\n ]);\n}\n/**\n * Parse border radius from the provided options\n */ function parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val)=>{\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit)\n };\n}\n/**\n * Convert (r, 𝜃) to (x, y)\n */ function rThetaToXY(r, theta, x, y) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta)\n };\n}\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */ function pathArc(ctx, element, offset, spacing, end, circular) {\n const { x , y , startAngle: start , pixelMargin , innerRadius: innerR } = element;\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n let spacingOffset = 0;\n const alpha = end - start;\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? alpha * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const { outerStart , outerEnd , innerStart , innerEnd } = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n ctx.beginPath();\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2;\n ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true);\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing, circular) {\n const { fullCircles , startAngle , circumference } = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for(let i = 0; i < fullCircles; ++i){\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\nfunction drawBorder(ctx, element, offset, spacing, circular) {\n const { fullCircles , startAngle , circumference , options } = element;\n const { borderWidth , borderJoinStyle , borderDash , borderDashOffset } = options;\n const inner = options.borderAlign === 'inner';\n if (!borderWidth) {\n return;\n }\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for(let i = 0; i < fullCircles; ++i){\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\nclass ArcElement extends Element {\n static id = 'arc';\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n static descriptors = {\n _scriptable: true,\n _indexable: (name)=>name !== 'borderDash'\n };\n circumference;\n endAngle;\n fullCircles;\n innerRadius;\n outerRadius;\n pixelMargin;\n startAngle;\n constructor(cfg){\n super();\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(chartX, chartY, useFinalPosition) {\n const point = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n const { angle , distance } = getAngleFromPoint(point, {\n x: chartX,\n y: chartY\n });\n const { startAngle , endAngle , innerRadius , outerRadius , circumference } = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n return betweenAngles && withinRadius;\n }\n getCenterPoint(useFinalPosition) {\n const { x , y , startAngle , endAngle , innerRadius , outerRadius } = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const { offset , spacing } = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n tooltipPosition(useFinalPosition) {\n return this.getCenterPoint(useFinalPosition);\n }\n draw(ctx) {\n const { options , circumference } = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = options.borderAlign === 'inner' ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n ctx.save();\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n ctx.restore();\n }\n}\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n function getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const { start: paramsStart = 0 , end: paramsEnd = count - 1 } = params;\n const { start: segmentStart , end: segmentEnd } = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n function pathSegment(ctx, line, segment, params) {\n const { points , options } = line;\n const { count , start , loop , ilen } = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n let { move =true , reverse } = params || {};\n let i, point, prev;\n for(i = 0; i <= ilen; ++i){\n point = points[(start + (reverse ? ilen - i : i)) % count];\n if (point.skip) {\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n prev = point;\n }\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n return !!loop;\n}\n function fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const { count , start , ilen } = pathVars(points, segment, params);\n const { move =true , reverse } = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n const pointIndex = (index)=>(start + (reverse ? ilen - index : index)) % count;\n const drawX = ()=>{\n if (minY !== maxY) {\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n ctx.lineTo(avgX, lastY);\n }\n };\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n for(i = 0; i <= ilen; ++i){\n point = points[pointIndex(i)];\n if (point.skip) {\n continue;\n }\n const x = point.x;\n const y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n ctx.lineTo(x, y);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n lastY = y;\n }\n drawX();\n}\n function _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n function _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n const { segments , options } = line;\n const segmentMethod = _getSegmentMethod(line);\n for (const segment of segments){\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {\n start,\n end: start + count - 1\n })) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\nclass LineElement extends Element {\n static id = 'line';\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n static descriptors = {\n _scriptable: true,\n _indexable: (name)=>name !== 'borderDash' && name !== 'fill'\n };\n constructor(cfg){\n super();\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n get points() {\n return this._points;\n }\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {\n property,\n start: value,\n end: value\n });\n if (!segments.length) {\n return;\n }\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for(i = 0, ilen = segments.length; i < ilen; ++i){\n const { start , end } = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n start = start || 0;\n count = count || this.points.length - start;\n for (const segment of segments){\n loop &= segmentMethod(ctx, this, segment, {\n start,\n end: start + count - 1\n });\n }\n return !!loop;\n }\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n if (points.length && options.borderWidth) {\n ctx.save();\n draw(ctx, this, start, count);\n ctx.restore();\n }\n if (this.animated) {\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n const options = el.options;\n const { [axis]: value } = el.getProps([\n axis\n ], useFinalPosition);\n return Math.abs(pos - value) < options.radius + options.hitRadius;\n}\nclass PointElement extends Element {\n static id = 'point';\n parsed;\n skip;\n stop;\n /**\n * @type {any}\n */ static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n /**\n * @type {any}\n */ static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n constructor(cfg){\n super();\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n const options = this.options;\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2) < Math.pow(options.hitRadius + options.radius, 2);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange$1(this, mouseX, 'x', useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange$1(this, mouseY, 'y', useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return {\n x,\n y\n };\n }\n size(options) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n draw(ctx, area) {\n const options = this.options;\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n\nfunction getBarBounds(bar, useFinalPosition) {\n const { x , y , base , width , height } = bar.getProps([\n 'x',\n 'y',\n 'base',\n 'width',\n 'height'\n ], useFinalPosition);\n let left, right, top, bottom, half;\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n return {\n left,\n top,\n right,\n bottom\n };\n}\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n const { enableBorderRadius } = bar.getProps([\n 'enableBorderRadius'\n ]);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n const enableBorder = enableBorderRadius || isObject(value);\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r))\n }\n }\n };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n return bounds && (skipX || _isBetween(x, bounds.left, bounds.right)) && (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n function addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\nclass BarElement extends Element {\n static id = 'bar';\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n constructor(cfg){\n super();\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n draw(ctx) {\n const { inflateAmount , options: { borderColor , backgroundColor } } = this;\n const { inner , outer } = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n ctx.save();\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const { x , y , base , horizontal } = this.getProps([\n 'x',\n 'y',\n 'base',\n 'horizontal'\n ], useFinalPosition);\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nBarElement: BarElement,\nLineElement: LineElement,\nPointElement: PointElement\n});\n\nconst BORDER_COLORS = [\n 'rgb(54, 162, 235)',\n 'rgb(255, 99, 132)',\n 'rgb(255, 159, 64)',\n 'rgb(255, 205, 86)',\n 'rgb(75, 192, 192)',\n 'rgb(153, 102, 255)',\n 'rgb(201, 203, 207)' // grey\n];\n// Border colors with 50% transparency\nconst BACKGROUND_COLORS = /* #__PURE__ */ BORDER_COLORS.map((color)=>color.replace('rgb(', 'rgba(').replace(')', ', 0.5)'));\nfunction getBorderColor(i) {\n return BORDER_COLORS[i % BORDER_COLORS.length];\n}\nfunction getBackgroundColor(i) {\n return BACKGROUND_COLORS[i % BACKGROUND_COLORS.length];\n}\nfunction colorizeDefaultDataset(dataset, i) {\n dataset.borderColor = getBorderColor(i);\n dataset.backgroundColor = getBackgroundColor(i);\n return ++i;\n}\nfunction colorizeDoughnutDataset(dataset, i) {\n dataset.backgroundColor = dataset.data.map(()=>getBorderColor(i++));\n return i;\n}\nfunction colorizePolarAreaDataset(dataset, i) {\n dataset.backgroundColor = dataset.data.map(()=>getBackgroundColor(i++));\n return i;\n}\nfunction getColorizer(chart) {\n let i = 0;\n return (dataset, datasetIndex)=>{\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n if (controller instanceof DoughnutController) {\n i = colorizeDoughnutDataset(dataset, i);\n } else if (controller instanceof PolarAreaController) {\n i = colorizePolarAreaDataset(dataset, i);\n } else if (controller) {\n i = colorizeDefaultDataset(dataset, i);\n }\n };\n}\nfunction containsColorsDefinitions(descriptors) {\n let k;\n for(k in descriptors){\n if (descriptors[k].borderColor || descriptors[k].backgroundColor) {\n return true;\n }\n }\n return false;\n}\nfunction containsColorsDefinition(descriptor) {\n return descriptor && (descriptor.borderColor || descriptor.backgroundColor);\n}\nfunction containsDefaultColorsDefenitions() {\n return defaults.borderColor !== 'rgba(0,0,0,0.1)' || defaults.backgroundColor !== 'rgba(0,0,0,0.1)';\n}\nvar plugin_colors = {\n id: 'colors',\n defaults: {\n enabled: true,\n forceOverride: false\n },\n beforeLayout (chart, _args, options) {\n if (!options.enabled) {\n return;\n }\n const { data: { datasets } , options: chartOptions } = chart.config;\n const { elements } = chartOptions;\n const containsColorDefenition = containsColorsDefinitions(datasets) || containsColorsDefinition(chartOptions) || elements && containsColorsDefinitions(elements) || containsDefaultColorsDefenitions();\n if (!options.forceOverride && containsColorDefenition) {\n return;\n }\n const colorizer = getColorizer(chart);\n datasets.forEach(colorizer);\n }\n};\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n const samples = options.samples || availableWidth;\n if (samples >= count) {\n return data.slice(start, start + count);\n }\n const decimated = [];\n const bucketWidth = (count - 2) / (samples - 2);\n let sampledIndex = 0;\n const endIndex = start + count - 1;\n let a = start;\n let i, maxAreaPoint, maxArea, area, nextA;\n decimated[sampledIndex++] = data[a];\n for(i = 0; i < samples - 2; i++){\n let avgX = 0;\n let avgY = 0;\n let j;\n const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n for(j = avgRangeStart; j < avgRangeEnd; j++){\n avgX += data[j].x;\n avgY += data[j].y;\n }\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n const { x: pointAx , y: pointAy } = data[a];\n maxArea = area = -1;\n for(j = rangeOffs; j < rangeTo; j++){\n area = 0.5 * Math.abs((pointAx - avgX) * (data[j].y - pointAy) - (pointAx - data[j].x) * (avgY - pointAy));\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n decimated[sampledIndex++] = maxAreaPoint;\n a = nextA;\n }\n decimated[sampledIndex++] = data[endIndex];\n return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n let avgX = 0;\n let countX = 0;\n let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n const decimated = [];\n const endIndex = start + count - 1;\n const xMin = data[start].x;\n const xMax = data[endIndex].x;\n const dx = xMax - xMin;\n for(i = start; i < start + count; ++i){\n point = data[i];\n x = (point.x - xMin) / dx * availableWidth;\n y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n minIndex = i;\n } else if (y > maxY) {\n maxY = y;\n maxIndex = i;\n }\n avgX = (countX * avgX + point.x) / ++countX;\n } else {\n const lastIndex = i - 1;\n if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n const intermediateIndex1 = Math.min(minIndex, maxIndex);\n const intermediateIndex2 = Math.max(minIndex, maxIndex);\n if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex1],\n x: avgX\n });\n }\n if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex2],\n x: avgX\n });\n }\n }\n if (i > 0 && lastIndex !== startIndex) {\n decimated.push(data[lastIndex]);\n }\n decimated.push(point);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n minIndex = maxIndex = startIndex = i;\n }\n }\n return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n if (dataset._decimated) {\n const data = dataset._data;\n delete dataset._decimated;\n delete dataset._data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n writable: true,\n value: data\n });\n }\n}\nfunction cleanDecimatedData(chart) {\n chart.data.datasets.forEach((dataset)=>{\n cleanDecimatedDataset(dataset);\n });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n const pointCount = points.length;\n let start = 0;\n let count;\n const { iScale } = meta;\n const { min , max , minDefined , maxDefined } = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n return {\n start,\n count\n };\n}\nvar plugin_decimation = {\n id: 'decimation',\n defaults: {\n algorithm: 'min-max',\n enabled: false\n },\n beforeElementsUpdate: (chart, args, options)=>{\n if (!options.enabled) {\n cleanDecimatedData(chart);\n return;\n }\n const availableWidth = chart.width;\n chart.data.datasets.forEach((dataset, datasetIndex)=>{\n const { _data , indexAxis } = dataset;\n const meta = chart.getDatasetMeta(datasetIndex);\n const data = _data || dataset.data;\n if (resolve([\n indexAxis,\n chart.options.indexAxis\n ]) === 'y') {\n return;\n }\n if (!meta.controller.supportsDecimation) {\n return;\n }\n const xAxis = chart.scales[meta.xAxisID];\n if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n return;\n }\n if (chart.options.parsing) {\n return;\n }\n let { start , count } = getStartAndCountOfVisiblePointsSimplified(meta, data);\n const threshold = options.threshold || 4 * availableWidth;\n if (count <= threshold) {\n cleanDecimatedDataset(dataset);\n return;\n }\n if (isNullOrUndef(_data)) {\n dataset._data = data;\n delete dataset.data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this._decimated;\n },\n set: function(d) {\n this._data = d;\n }\n });\n }\n let decimated;\n switch(options.algorithm){\n case 'lttb':\n decimated = lttbDecimation(data, start, count, availableWidth, options);\n break;\n case 'min-max':\n decimated = minMaxDecimation(data, start, count, availableWidth);\n break;\n default:\n throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n }\n dataset._decimated = decimated;\n });\n },\n destroy (chart) {\n cleanDecimatedData(chart);\n }\n};\n\nfunction _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n for (const segment of segments){\n let { start , end } = segment;\n end = _findSegmentEnd(start, end, points);\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n if (!target.segments) {\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n const targetSegments = _boundSegments(target, bounds);\n for (const tgt of targetSegments){\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n for (const fillSource of fillSources){\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\nfunction _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {\n property,\n start,\n end\n };\n}\nfunction _pointsFromSegments(boundary, line) {\n const { x =null , y =null } = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({ start , end })=>{\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({\n x: first.x,\n y\n });\n points.push({\n x: last.x,\n y\n });\n } else if (x !== null) {\n points.push({\n x,\n y: first.y\n });\n points.push({\n x,\n y: last.y\n });\n }\n });\n return points;\n}\nfunction _findSegmentEnd(start, end, points) {\n for(; end > start; end--){\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n\nfunction _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n if (isArray(boundary)) {\n _loop = true;\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n return points.length ? new LineElement({\n points,\n options: {\n tension: 0\n },\n _loop,\n _fullLoop: _loop\n }) : null;\n}\nfunction _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n\nfunction _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [\n index\n ];\n let target;\n if (!propagate) {\n return fill;\n }\n while(fill !== false && visited.indexOf(fill) === -1){\n if (!isNumberFinite(fill)) {\n return fill;\n }\n target = sources[fill];\n if (!target) {\n return false;\n }\n if (target.visible) {\n return fill;\n }\n visited.push(fill);\n fill = target.fill;\n }\n return false;\n}\n function _decodeFill(line, index, count) {\n const fill = parseFillOption(line);\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n let target = parseFloat(fill);\n if (isNumberFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n return [\n 'origin',\n 'start',\n 'end',\n 'stack',\n 'shape'\n ].indexOf(fill) >= 0 && fill;\n}\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n return target;\n}\n function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n function _getTargetValue(fill, scale, startValue) {\n let value;\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n function parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n if (fill === false || fill === null) {\n return false;\n }\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n\nfunction _buildStackLine(source) {\n const { scale , index , line } = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({\n x: null,\n y: scale.bottom\n }, line));\n for(let i = 0; i < segments.length; i++){\n const segment = segments[i];\n for(let j = segment.start; j <= segment.end; j++){\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({\n points,\n options: {}\n });\n}\n function getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n for(let i = 0; i < metas.length; i++){\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n function addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for(let j = 0; j < linesBelow.length; j++){\n const line = linesBelow[j];\n const { first , last , point } = findPoint(line, sourcePoint, 'x');\n if (!point || first && last) {\n continue;\n }\n if (first) {\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n break;\n }\n }\n }\n points.push(...postponed);\n}\n function findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for(let i = 0; i < segments.length; i++){\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {\n first,\n last,\n point\n };\n}\n\nclass simpleArc {\n constructor(opts){\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n pathSegment(ctx, bounds, opts) {\n const { x , y , radius } = this;\n bounds = bounds || {\n start: 0,\n end: TAU\n };\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n interpolate(point) {\n const { x , y , radius } = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n\nfunction _getTarget(source) {\n const { chart , fill , line } = source;\n if (isNumberFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n if (fill === 'shape') {\n return true;\n }\n const boundary = computeBoundary(source);\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n return _createBoundaryLine(boundary, line);\n}\n function getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\nfunction computeLinearBoundary(source) {\n const { scale ={} , fill } = source;\n const pixel = _getTargetPixel(fill, scale);\n if (isNumberFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n return null;\n}\nfunction computeCircularBoundary(source) {\n const { scale , fill } = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n for(let i = 0; i < length; ++i){\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\nfunction _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const { chart , index , line , scale , axis } = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const { above =color , below =color } = fillOption || {};\n const meta = chart.getDatasetMeta(index);\n const clip = getDatasetClipArea(chart, meta);\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {\n line,\n target,\n above,\n below,\n area,\n scale,\n axis,\n clip\n });\n unclipArea(ctx);\n }\n}\nfunction doFill(ctx, cfg) {\n const { line , target , above , below , area , scale , clip } = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n ctx.save();\n if (property === 'x' && below !== above) {\n clipVertical(ctx, target, area.top);\n fill(ctx, {\n line,\n target,\n color: above,\n scale,\n property,\n clip\n });\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n }\n fill(ctx, {\n line,\n target,\n color: below,\n scale,\n property,\n clip\n });\n ctx.restore();\n}\nfunction clipVertical(ctx, target, clipY) {\n const { segments , points } = target;\n let first = true;\n let lineLoop = false;\n ctx.beginPath();\n for (const segment of segments){\n const { start , end } = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {\n move: lineLoop\n });\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\nfunction fill(ctx, cfg) {\n const { line , target , property , color , scale , clip } = cfg;\n const segments = _segments(line, target, property);\n for (const { source: src , target: tgt , start , end } of segments){\n const { style: { backgroundColor =color } = {} } = src;\n const notShape = target !== true;\n ctx.save();\n ctx.fillStyle = backgroundColor;\n clipBounds(ctx, scale, clip, notShape && _getBounds(property, start, end));\n ctx.beginPath();\n const lineLoop = !!line.pathSegment(ctx, src);\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n const targetLoop = !!target.pathSegment(ctx, tgt, {\n move: lineLoop,\n reverse: true\n });\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n ctx.restore();\n }\n}\nfunction clipBounds(ctx, scale, clip, bounds) {\n const chartArea = scale.chart.chartArea;\n const { property , start , end } = bounds || {};\n if (property === 'x' || property === 'y') {\n let left, top, right, bottom;\n if (property === 'x') {\n left = start;\n top = chartArea.top;\n right = end;\n bottom = chartArea.bottom;\n } else {\n left = chartArea.left;\n top = start;\n right = chartArea.right;\n bottom = end;\n }\n ctx.beginPath();\n if (clip) {\n left = Math.max(left, clip.left);\n right = Math.min(right, clip.right);\n top = Math.max(top, clip.top);\n bottom = Math.min(bottom, clip.bottom);\n }\n ctx.rect(left, top, right - left, bottom - top);\n ctx.clip();\n }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\nvar index = {\n id: 'filler',\n afterDatasetsUpdate (chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n for(i = 0; i < count; ++i){\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line\n };\n }\n meta.$filler = source;\n sources.push(source);\n }\n for(i = 0; i < count; ++i){\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n beforeDraw (chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for(let i = metasets.length - 1; i >= 0; --i){\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n beforeDatasetsDraw (chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n const metasets = chart.getSortedVisibleDatasetMetas();\n for(let i = metasets.length - 1; i >= 0; --i){\n const source = metasets[i].$filler;\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n beforeDatasetDraw (chart, args, options) {\n const source = args.meta.$filler;\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n\nconst getBoxSize = (labelOpts, fontSize)=>{\n let { boxHeight =fontSize , boxWidth =fontSize } = labelOpts;\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\nconst itemsEqual = (a, b)=>a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n constructor(config){\n super();\n this._added = false;\n this.legendHitBoxes = [];\n this._hoveredItem = null;\n this.doughnutMode = false;\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = callback(labelOpts.generateLabels, [\n this.chart\n ], this) || [];\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item)=>labelOpts.filter(item, this.chart.data));\n }\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b)=>labelOpts.sort(a, b, this.chart.data));\n }\n if (this.options.reverse) {\n legendItems.reverse();\n }\n this.legendItems = legendItems;\n }\n fit() {\n const { options , ctx } = this;\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const { boxWidth , itemHeight } = getBoxSize(labelOpts, fontSize);\n let width, height;\n ctx.font = labelFont.string;\n if (this.isHorizontal()) {\n width = this.maxWidth;\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight;\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const { ctx , maxWidth , options: { labels: { padding } } } = this;\n const hitboxes = this.legendHitBoxes = [];\n const lineWidths = this.lineWidths = [\n 0\n ];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i)=>{\n const itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n hitboxes[i] = {\n left: 0,\n top,\n row,\n width: itemWidth,\n height: itemHeight\n };\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n return totalHeight;\n }\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const { ctx , maxHeight , options: { labels: { padding } } } = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n let left = 0;\n let col = 0;\n this.legendItems.forEach((legendItem, i)=>{\n const { itemWidth , itemHeight } = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({\n width: currentColWidth,\n height: currentColHeight\n });\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n hitboxes[i] = {\n left,\n top: currentColHeight,\n col,\n width: itemWidth,\n height: itemHeight\n };\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n totalWidth += currentColWidth;\n columnSizes.push({\n width: currentColWidth,\n height: currentColHeight\n });\n return totalWidth;\n }\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const { legendHitBoxes: hitboxes , options: { align , labels: { padding } , rtl } } = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes){\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes){\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n this._draw();\n unclipArea(ctx);\n }\n }\n _draw() {\n const { options: opts , columnSizes , lineWidths , ctx } = this;\n const { align , labels: labelOpts } = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const { padding } = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n this.drawTitle();\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n const { boxWidth , boxHeight , itemHeight } = getBoxSize(labelOpts, fontSize);\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n ctx.save();\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n if (labelOpts.usePointStyle) {\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n ctx.beginPath();\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n ctx.restore();\n };\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + itemHeight / 2, labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n overrideTextDirection(this.ctx, opts.textDirection);\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i)=>{\n ctx.strokeStyle = legendItem.fontColor;\n ctx.fillStyle = legendItem.fontColor;\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n rtlHelper.setWidth(this.width);\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n const realX = rtlHelper.x(x);\n drawLegendBox(realX, y, legendItem);\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n fillText(rtlHelper.x(x), y, legendItem);\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n if (!titleOpts.display) {\n return;\n }\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n let left = this.left;\n let maxWidth = this.width;\n if (this.isHorizontal()) {\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n const maxHeight = this.columnSizes.reduce((acc, size)=>Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n const x = _alignStartEnd(position, left, left + maxWidth);\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n if (_isBetween(x, this.left, this.right) && _isBetween(y, this.top, this.bottom)) {\n lh = this.legendHitBoxes;\n for(i = 0; i < lh.length; ++i){\n hitBox = lh[i];\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width) && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n return this.legendItems[i];\n }\n }\n }\n return null;\n }\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n callback(opts.onLeave, [\n e,\n previous,\n this\n ], this);\n }\n this._hoveredItem = hoveredItem;\n if (hoveredItem && !sameItem) {\n callback(opts.onHover, [\n e,\n hoveredItem,\n this\n ], this);\n }\n } else if (hoveredItem) {\n callback(opts.onClick, [\n e,\n hoveredItem,\n this\n ], this);\n }\n }\n}\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {\n itemWidth,\n itemHeight\n };\n}\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b)=>a.length > b.length ? a : b);\n }\n return boxWidth + labelFont.size / 2 + ctx.measureText(legendItemText).width;\n}\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\nvar plugin_legend = {\n id: 'legend',\n _element: Legend,\n start (chart, _args, options) {\n const legend = chart.legend = new Legend({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n stop (chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n beforeUpdate (chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n afterUpdate (chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n afterEvent (chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n onClick (e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n onHover: null,\n onLeave: null,\n labels: {\n color: (ctx)=>ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n generateLabels (chart) {\n const datasets = chart.data.datasets;\n const { labels: { usePointStyle , pointStyle , textAlign , color , useBorderRadius , borderRadius } } = chart.legend.options;\n return chart._getSortedDatasetMetas().map((meta)=>{\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n title: {\n color: (ctx)=>ctx.chart.options.color,\n display: false,\n position: 'center',\n text: ''\n }\n },\n descriptors: {\n _scriptable: (name)=>!name.startsWith('on'),\n labels: {\n _scriptable: (name)=>![\n 'generateLabels',\n 'filter',\n 'sort'\n ].includes(name)\n }\n }\n};\n\nclass Title extends Element {\n constructor(config){\n super();\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this._padding = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight) {\n const opts = this.options;\n this.left = 0;\n this.top = 0;\n if (!opts.display) {\n this.width = this.height = this.right = this.bottom = 0;\n return;\n }\n this.width = this.right = maxWidth;\n this.height = this.bottom = maxHeight;\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n this._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n if (this.isHorizontal()) {\n this.height = textSize;\n } else {\n this.width = textSize;\n }\n }\n isHorizontal() {\n const pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n }\n _drawArgs(offset) {\n const { top , left , bottom , right , options } = this;\n const align = options.align;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n if (this.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n if (options.position === 'left') {\n titleX = left + offset;\n titleY = _alignStartEnd(align, bottom, top);\n rotation = PI * -0.5;\n } else {\n titleX = right - offset;\n titleY = _alignStartEnd(align, top, bottom);\n rotation = PI * 0.5;\n }\n maxWidth = bottom - top;\n }\n return {\n titleX,\n titleY,\n maxWidth,\n rotation\n };\n }\n draw() {\n const ctx = this.ctx;\n const opts = this.options;\n if (!opts.display) {\n return;\n }\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + this._padding.top;\n const { titleX , titleY , maxWidth , rotation } = this._drawArgs(offset);\n renderText(ctx, opts.text, 0, 0, fontOpts, {\n color: opts.color,\n maxWidth,\n rotation,\n textAlign: _toLeftRightCenter(opts.align),\n textBaseline: 'middle',\n translation: [\n titleX,\n titleY\n ]\n });\n }\n}\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\nvar plugin_title = {\n id: 'title',\n _element: Title,\n start (chart, _args, options) {\n createTitle(chart, options);\n },\n stop (chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n beforeUpdate (chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'bold'\n },\n fullSize: true,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false\n }\n};\n\nconst map = new WeakMap();\nvar plugin_subtitle = {\n id: 'subtitle',\n start (chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n stop (chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n beforeUpdate (chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal'\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false\n }\n};\n\nconst positioners = {\n average (items) {\n if (!items.length) {\n return false;\n }\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n for(i = 0, len = items.length; i < len; ++i){\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n const xAverage = [\n ...xSet\n ].reduce((a, b)=>a + b) / xSet.size;\n return {\n x: xAverage,\n y: y / count\n };\n },\n nearest (items, eventPosition) {\n if (!items.length) {\n return false;\n }\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n for(i = 0, len = items.length; i < len; ++i){\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n return {\n x,\n y\n };\n }\n};\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n return base;\n}\n function splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n function createTooltipItem(chart, item) {\n const { element , datasetIndex , index } = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const { label , value } = controller.getLabelAndValue(index);\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n function getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const { body , footer , title } = tooltip;\n const { boxWidth , boxHeight } = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n let combinedBodyLength = body.reduce((count, bodyItem)=>count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight + (titleLineCount - 1) * options.titleSpacing + options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight + (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight + (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop + footerLineCount * footerFont.lineHeight + (footerLineCount - 1) * options.footerSpacing;\n }\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n ctx.save();\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n widthPadding = options.displayColors ? boxWidth + 2 + options.boxPadding : 0;\n each(body, (bodyItem)=>{\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n widthPadding = 0;\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n ctx.restore();\n width += padding.width;\n return {\n width,\n height\n };\n}\nfunction determineYAlign(chart, size) {\n const { y , height } = size;\n if (y < height / 2) {\n return 'top';\n } else if (y > chart.height - height / 2) {\n return 'bottom';\n }\n return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const { x , width } = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n const { x , width } = size;\n const { width: chartWidth , chartArea: { left , right } } = chart;\n let xAlign = 'center';\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n return xAlign;\n}\n function determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\nfunction alignX(size, xAlign) {\n let { x , width } = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= width / 2;\n }\n return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n let { y , height } = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= height / 2;\n }\n return y;\n}\n function getBackgroundPoint(options, size, alignment, chart) {\n const { caretSize , caretPadding , cornerRadius } = options;\n const { xAlign , yAlign } = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(cornerRadius);\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n return align === 'center' ? tooltip.x + tooltip.width / 2 : align === 'right' ? tooltip.x + tooltip.width - padding.right : tooltip.x + padding.left;\n}\n function getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\nconst defaultCallbacks = {\n beforeTitle: noop,\n title (tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n return '';\n },\n afterTitle: noop,\n beforeBody: noop,\n beforeLabel: noop,\n label (tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n let label = tooltipItem.dataset.label || '';\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor (tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0\n };\n },\n labelTextColor () {\n return this.options.bodyColor;\n },\n labelPointStyle (tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation\n };\n },\n afterLabel: noop,\n afterBody: noop,\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n function invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n return result;\n}\nclass Tooltip extends Element {\n static positioners = positioners;\n constructor(config){\n super();\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n if (cached) {\n return cached;\n }\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n return animations;\n }\n getContext() {\n return this.$context || (this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n getTitle(context, options) {\n const { callbacks } = options;\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n return lines;\n }\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems));\n }\n getBody(tooltipItems, options) {\n const { callbacks } = options;\n const bodyItems = [];\n each(tooltipItems, (context)=>{\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n bodyItems.push(bodyItem);\n });\n return bodyItems;\n }\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems));\n }\n getFooter(tooltipItems, options) {\n const { callbacks } = options;\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n return lines;\n }\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n for(i = 0, len = active.length; i < len; ++i){\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array)=>options.filter(element, index, array, data));\n }\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b)=>options.itemSort(a, b, data));\n }\n each(tooltipItems, (context)=>{\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n if (changed && options.external) {\n options.external.call(this, {\n chart: this.chart,\n tooltip: this,\n replay\n });\n }\n }\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n getCaretPosition(tooltipPoint, size, options) {\n const { xAlign , yAlign } = this;\n const { caretSize , cornerRadius } = options;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(cornerRadius);\n const { x: ptX , y: ptY } = tooltipPoint;\n const { width , height } = size;\n let x1, x2, x3, y1, y2, y3;\n if (yAlign === 'center') {\n y2 = ptY + height / 2;\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {\n x1,\n x2,\n x3,\n y1,\n y2,\n y3\n };\n }\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, options.titleAlign, options);\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n for(i = 0; i < length; ++i){\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing;\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing;\n }\n }\n }\n }\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const { boxHeight , boxWidth } = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2,\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : labelColor.borderWidth || 1;\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius\n });\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius\n });\n ctx.fill();\n } else {\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n ctx.fillStyle = this.labelTextColors[i];\n }\n drawBody(pt, ctx, options) {\n const { body } = this;\n const { bodySpacing , bodyAlign , displayColors , boxHeight , boxWidth , boxPadding } = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right' ? bodyAlign === 'center' ? boxWidth / 2 + boxPadding : boxWidth + 2 + boxPadding : 0;\n for(i = 0, ilen = body.length; i < ilen; ++i){\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n lines = bodyItem.lines;\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n for(j = 0, jlen = lines.length; j < jlen; ++j){\n fillLineOfText(lines[j]);\n bodyLineHeight = bodyFont.lineHeight;\n }\n each(bodyItem.after, fillLineOfText);\n }\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing;\n }\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n footerFont = toFont(options.footerFont);\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n for(i = 0; i < length; ++i){\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n drawBackground(pt, ctx, tooltipSize, options) {\n const { xAlign , yAlign } = this;\n const { x , y } = pt;\n const { width , height } = tooltipSize;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(options.cornerRadius);\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n _willRender() {\n return !!this.opacity;\n }\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n if (!opacity) {\n return;\n }\n this._updateAnimationTarget(options);\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n const padding = toPadding(options.padding);\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n this.drawBackground(pt, ctx, tooltipSize, options);\n overrideTextDirection(ctx, options.textDirection);\n pt.y += padding.top;\n this.drawTitle(pt, ctx, options);\n this.drawBody(pt, ctx, options);\n this.drawFooter(pt, ctx, options);\n restoreTextDirection(ctx, options.textDirection);\n ctx.restore();\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({ datasetIndex , index })=>{\n const meta = this.chart.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n const positionChanged = this._positionChanged(active, e);\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n if (changed) {\n this._active = active;\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n this.update(true, replay);\n }\n }\n return changed;\n }\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n if (e.type === 'mouseout') {\n return [];\n }\n if (!inChartArea) {\n return lastActive.filter((i)=>this.chart.data.datasets[i.datasetIndex] && this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined);\n }\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n if (options.reverse) {\n active.reverse();\n }\n return active;\n }\n _positionChanged(active, e) {\n const { caretX , caretY , options } = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\nvar plugin_tooltip = {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n afterInit (chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({\n chart,\n options\n });\n }\n },\n beforeUpdate (chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n reset (chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n afterDraw (chart) {\n const tooltip = chart.tooltip;\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n if (chart.notifyPlugins('beforeTooltipDraw', {\n ...args,\n cancelable: true\n }) === false) {\n return;\n }\n tooltip.draw(chart.ctx);\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n afterEvent (chart, args) {\n if (chart.tooltip) {\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n args.changed = true;\n }\n }\n },\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold'\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {},\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold'\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts)=>opts.bodyFont.size,\n boxWidth: (ctx, opts)=>opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart'\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'width',\n 'height',\n 'caretX',\n 'caretY'\n ]\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n descriptors: {\n _scriptable: (name)=>name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n additionalOptionScopes: [\n 'interaction'\n ]\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nColors: plugin_colors,\nDecimation: plugin_decimation,\nFiller: index,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index, addedLabels)=>{\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({\n index,\n label: raw\n });\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\nconst validIndex = (index, max)=>index === null ? null : _limitValue(Math.round(index), 0, max);\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\nclass CategoryScale extends Scale {\n static id = 'category';\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n constructor(cfg){\n super(cfg);\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const { index , label } of added){\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n determineDataLimits() {\n const { minDefined , maxDefined } = this.getUserBounds();\n let { min , max } = this.getMinMax(true);\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n labels = min === 0 && max === labels.length - 1 ? labels : labels.slice(min, max + 1);\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n for(let value = min; value <= max; value++){\n ticks.push({\n value\n });\n }\n return ticks;\n }\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n configure() {\n super.configure();\n if (!this.isHorizontal()) {\n this._reversePixels = !this._reversePixels;\n }\n }\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n getBasePixel() {\n return this.bottom;\n }\n}\n\nfunction generateTicks$1(generationOptions, dataRange) {\n const ticks = [];\n const MIN_SPACING = 1e-14;\n const { bounds , step , min , max , precision , count , maxTicks , maxDigits , includeBounds } = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const { min: rmin , max: rmax } = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [\n {\n value: rmin\n },\n {\n value: rmax\n }\n ];\n }\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n if (!isNullOrUndef(precision)) {\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n numSpaces = (niceMax - niceMin) / spacing;\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n const decimalPlaces = Math.max(_decimalPlaces(spacing), _decimalPlaces(niceMin));\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({\n value: min\n });\n if (niceMin < min) {\n j++;\n }\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n for(; j < numSpaces; ++j){\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({\n value: tickValue\n });\n }\n if (maxDefined && includeBounds && niceMax !== max) {\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({\n value: max\n });\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({\n value: niceMax\n });\n }\n return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, { horizontal , minRotation }) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n constructor(cfg){\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._endValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n return +raw;\n }\n handleTickRangeOptions() {\n const { beginAtZero } = this.options;\n const { minDefined , maxDefined } = this.getUserBounds();\n let { min , max } = this;\n const setMin = (v)=>min = minDefined ? min : v;\n const setMax = (v)=>max = maxDefined ? max : v;\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n setMax(max + offset);\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n getTickLimit() {\n const tickOpts = this.options.ticks;\n let { maxTicksLimit , stepSize } = tickOpts;\n let maxTicks;\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n return maxTicks;\n }\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n super.configure();\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n\nclass LinearScale extends LinearScaleBase {\n static id = 'linear';\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n determineDataLimits() {\n const { min , max } = this.getMinMax(true);\n this.min = isNumberFinite(min) ? min : 0;\n this.max = isNumberFinite(max) ? max : 1;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n\nconst log10Floor = (v)=>Math.floor(log10(v));\nconst changeExponent = (v, m)=>Math.pow(10, log10Floor(v) + m);\nfunction isMajor(tickVal) {\n const remain = tickVal / Math.pow(10, log10Floor(tickVal));\n return remain === 1;\n}\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while(steps(min, max, rangeExp) > 10){\n rangeExp++;\n }\n while(steps(min, max, rangeExp) < 10){\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n function generateTicks(generationOptions, { min , max }) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while(value < max){\n ticks.push({\n value,\n major: isMajor(value),\n significand\n });\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({\n value: lastTick,\n major: isMajor(lastTick),\n significand\n });\n return ticks;\n}\nclass LogarithmicScale extends Scale {\n static id = 'logarithmic';\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n constructor(cfg){\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [\n raw,\n index\n ]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isNumberFinite(value) && value > 0 ? value : null;\n }\n determineDataLimits() {\n const { min , max } = this.getMinMax(true);\n this.min = isNumberFinite(min) ? Math.max(0, min) : null;\n this.max = isNumberFinite(max) ? Math.max(0, max) : null;\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n if (this._zero && this.min !== this._suggestedMin && !isNumberFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n this.handleTickRangeOptions();\n }\n handleTickRangeOptions() {\n const { minDefined , maxDefined } = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n const setMin = (v)=>min = minDefined ? min : v;\n const setMax = (v)=>max = maxDefined ? max : v;\n if (min === max) {\n if (min <= 0) {\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n setMax(changeExponent(min, +1));\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const opts = this.options;\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n getLabelForValue(value) {\n return value === undefined ? '0' : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n configure() {\n const start = this.min;\n super.configure();\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min ? 0 : (log10(value) - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [\n label\n ];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - size / 2,\n end: pos + size / 2\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n return {\n start: pos,\n end: pos + size\n };\n}\n function fitWithPointLabels(scale) {\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n for(let i = 0; i < valueCount; i++){\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n scale.setCenterPoint(orig.l - limits.l, limits.r - orig.r, orig.t - limits.t, limits.b - orig.b);\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const { extra , additionalAngle , padding , size } = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n visible: true,\n x: pointLabelPosition.x,\n y,\n textAlign,\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const { left , top , right , bottom } = item;\n const apexesInArea = _isPointInArea({\n x: left,\n y: top\n }, area) || _isPointInArea({\n x: left,\n y: bottom\n }, area) || _isPointInArea({\n x: right,\n y: top\n }, area) || _isPointInArea({\n x: right,\n y: bottom\n }, area);\n return !apexesInArea;\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const { centerPointLabels , display } = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n for(let i = 0; i < valueCount; i++){\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n return 'right';\n}\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= w / 2;\n }\n return x;\n}\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= h / 2;\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\nfunction drawPointLabelBox(ctx, opts, item) {\n const { left , top , right , bottom } = item;\n const { backdropColor } = opts;\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\nfunction drawPointLabels(scale, labelCount) {\n const { ctx , options: { pointLabels } } = scale;\n for(let i = labelCount - 1; i >= 0; i--){\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const { x , y , textAlign } = item;\n renderText(ctx, scale._pointLabels[i], x, y + plFont.lineHeight / 2, plFont, {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n });\n }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const { ctx } = scale;\n if (circular) {\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n for(let i = 1; i < labelCount; i++){\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n const { color , lineWidth } = gridLineOpts;\n if (!circular && !labelCount || !color || !lineWidth || radius < 0) {\n return;\n }\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\nclass RadialLinearScale extends LinearScaleBase {\n static id = 'radialLinear';\n static defaults = {\n display: true,\n animate: true,\n position: 'chartArea',\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n grid: {\n circular: false\n },\n startAngle: 0,\n ticks: {\n showLabelBackdrop: true,\n callback: Ticks.formatters.numeric\n },\n pointLabels: {\n backdropColor: undefined,\n backdropPadding: 2,\n display: true,\n font: {\n size: 10\n },\n callback (label) {\n return label;\n },\n padding: 5,\n centerPointLabels: false\n }\n };\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n constructor(cfg){\n super(cfg);\n this.xCenter = undefined;\n this.yCenter = undefined;\n this.drawingArea = undefined;\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n setDimensions() {\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n determineDataLimits() {\n const { min , max } = this.getMinMax(false);\n this.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n this.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n this._pointLabels = this.getLabels().map((value, index)=>{\n const label = callback(this.options.pointLabels.callback, [\n value,\n index\n ], this);\n return label || label === 0 ? label : '';\n }).filter((v, i)=>this.chart.getDataVisibility(i));\n }\n fit() {\n const opts = this.options;\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n getPointLabelPosition(index) {\n const { left , top , right , bottom } = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom\n };\n }\n drawBackground() {\n const { backgroundColor , grid: { circular } } = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const { angleLines , grid , border } = opts;\n const labelCount = this._pointLabels.length;\n let i, offset, position;\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n if (grid.display) {\n this.ticks.forEach((tick, index)=>{\n if (index !== 0 || index === 0 && this.min < 0) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n if (angleLines.display) {\n ctx.save();\n for(i = labelCount - 1; i >= 0; i--){\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const { color , lineWidth } = optsAtIndex;\n if (!lineWidth || !color) {\n continue;\n }\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n ctx.restore();\n }\n }\n drawBorder() {}\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n if (!tickOpts.display) {\n return;\n }\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n this.ticks.forEach((tick, index)=>{\n if (index === 0 && this.min >= 0 && !opts.reverse) {\n return;\n }\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(-width / 2 - padding.left, -offset - tickFont.size / 2 - padding.top, width + padding.width, tickFont.size + padding.height);\n }\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth\n });\n });\n ctx.restore();\n }\n drawTitle() {}\n}\n\nconst INTERVALS = {\n millisecond: {\n common: true,\n size: 1,\n steps: 1000\n },\n second: {\n common: true,\n size: 1000,\n steps: 60\n },\n minute: {\n common: true,\n size: 60000,\n steps: 60\n },\n hour: {\n common: true,\n size: 3600000,\n steps: 24\n },\n day: {\n common: true,\n size: 86400000,\n steps: 30\n },\n week: {\n common: false,\n size: 604800000,\n steps: 4\n },\n month: {\n common: true,\n size: 2.628e9,\n steps: 12\n },\n quarter: {\n common: false,\n size: 7.884e9,\n steps: 4\n },\n year: {\n common: true,\n size: 3.154e10\n }\n};\n const UNITS = /* #__PURE__ */ Object.keys(INTERVALS);\n function sorter(a, b) {\n return a - b;\n}\n function parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n const adapter = scale._adapter;\n const { parser , round , isoWeekday } = scale._parseOpts;\n let value = input;\n if (typeof parser === 'function') {\n value = parser(value);\n }\n if (!isNumberFinite(value)) {\n value = typeof parser === 'string' ? adapter.parse(value, parser) : adapter.parse(value);\n }\n if (value === null) {\n return null;\n }\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true) ? adapter.startOf(value, 'isoWeek', isoWeekday) : adapter.startOf(value, round);\n }\n return +value;\n}\n function determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n for(let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i){\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n return UNITS[ilen - 1];\n}\n function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for(let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--){\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n function determineMajorUnit(unit) {\n for(let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i){\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n function addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const { lo , hi } = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n function setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n for(major = first; major <= last; major = +adapter.add(major, 1, majorUnit)){\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n function ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n const map = {};\n const ilen = values.length;\n let i, value;\n for(i = 0; i < ilen; ++i){\n value = values[i];\n map[value] = i;\n ticks.push({\n value,\n major: false\n });\n }\n return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n static id = 'time';\n static defaults = {\n bounds: 'data',\n adapters: {},\n time: {\n parser: false,\n unit: false,\n round: false,\n isoWeekday: false,\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n source: 'auto',\n callback: false,\n major: {\n enabled: false\n }\n }\n };\n constructor(props){\n super(props);\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n this._unit = 'day';\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n adapter.init(opts);\n mergeIf(time.displayFormats, adapter.formats());\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n super.init(scaleOpts);\n this._normalized = opts.normalized;\n }\n parse(raw, index) {\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n let { min , max , minDefined , maxDefined } = this.getUserBounds();\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n if (!minDefined || !maxDefined) {\n _applyBounds(this._getLabelBounds());\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {\n min,\n max\n };\n }\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n const min = this.min;\n const max = this.max;\n const ticks = _filterBetween(timestamps, min, max);\n this._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min)) : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n if (options.reverse) {\n ticks.reverse();\n }\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n afterAutoSkip() {\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map((tick)=>+tick.value));\n }\n }\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n this._offsets = {\n start,\n end,\n factor: 1 / (start + 1 + end)\n };\n }\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for(time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++){\n addTick(ticks, time, timestamps);\n }\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n return Object.keys(ticks).sort(sorter).map((x)=>+x);\n }\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n if (formatter) {\n return callback(formatter, [\n time,\n index,\n ticks\n ], this);\n }\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n generateTickLabels(ticks) {\n let i, ilen, tick;\n for(i = 0, ilen = ticks.length; i < ilen; ++i){\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n return {\n w: tickLabelWidth * cosRotation + tickFontSize * sinRotation,\n h: tickLabelWidth * sinRotation + tickFontSize * cosRotation\n };\n }\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [\n exampleTime\n ], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const metas = this.getMatchingVisibleMetas();\n if (this._normalized && metas.length) {\n return this._cache.data = metas[0].controller.getAllParsedValues(this);\n }\n for(i = 0, ilen = metas.length; i < ilen; ++i){\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n return this._cache.data = this.normalize(timestamps);\n }\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const labels = this.getLabels();\n for(i = 0, ilen = labels.length; i < ilen; ++i){\n timestamps.push(parse(this, labels[i]));\n }\n return this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps);\n }\n normalize(values) {\n return _arrayUnique(values.sort(sorter));\n }\n}\n\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({ lo , hi } = _lookupByKey(table, 'pos', val));\n }\n ({ pos: prevSource , time: prevTarget } = table[lo]);\n ({ pos: nextSource , time: nextTarget } = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({ lo , hi } = _lookupByKey(table, 'time', val));\n }\n ({ time: prevSource , pos: prevTarget } = table[lo]);\n ({ time: nextSource , pos: nextTarget } = table[hi]);\n }\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n static id = 'timeseries';\n static defaults = TimeScale.defaults;\n constructor(props){\n super(props);\n this._table = [];\n this._minPos = undefined;\n this._tableRange = undefined;\n }\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n buildLookupTable(timestamps) {\n const { min , max } = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n for(i = 0, ilen = timestamps.length; i < ilen; ++i){\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n if (items.length < 2) {\n return [\n {\n time: min,\n pos: 0\n },\n {\n time: max,\n pos: 1\n }\n ];\n }\n for(i = 0, ilen = items.length; i < ilen; ++i){\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({\n time: curr,\n pos: i / (ilen - 1)\n });\n }\n }\n return table;\n }\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b)=>a - b);\n }\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n if (timestamps.length) {\n return timestamps;\n }\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n return timestamps;\n }\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nconst registerables = [\n controllers,\n elements,\n plugins,\n scales\n];\n\nexport { Animation, Animations, ArcElement, BarController, BarElement, BasePlatform, BasicPlatform, BubbleController, CategoryScale, Chart, plugin_colors as Colors, DatasetController, plugin_decimation as Decimation, DomPlatform, DoughnutController, Element, index as Filler, Interaction, plugin_legend as Legend, LineController, LineElement, LinearScale, LogarithmicScale, PieController, PointElement, PolarAreaController, RadarController, RadialLinearScale, Scale, ScatterController, plugin_subtitle as SubTitle, Ticks, TimeScale, TimeSeriesScale, plugin_title as Title, plugin_tooltip as Tooltip, adapters as _adapters, _detectPlatform, animator, controllers, defaults, elements, layouts, plugins, registerables, registry, scales };\n//# sourceMappingURL=chart.js.map\n","import {Chart, registerables} from '../dist/chart.js';\n\nChart.register(...registerables);\n\nexport * from '../dist/chart.js';\nexport default Chart;\n","/*! tailwindcss v4.1.7 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --font-sans: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\",\n \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\",\n \"Courier New\", monospace;\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-green-600: oklch(62.7% 0.194 149.214);\n --color-blue-500: oklch(62.3% 0.214 259.815);\n --color-gray-50: oklch(98.5% 0.002 247.839);\n --color-gray-200: oklch(92.8% 0.006 264.531);\n --color-gray-300: oklch(87.2% 0.01 258.338);\n --color-gray-400: oklch(70.7% 0.022 261.325);\n --color-gray-500: oklch(55.1% 0.027 264.364);\n --color-gray-600: oklch(44.6% 0.03 256.802);\n --color-gray-700: oklch(37.3% 0.034 259.733);\n --color-gray-800: oklch(27.8% 0.033 256.848);\n --color-white: #fff;\n --spacing: 0.25rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-4xl: 2rem;\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n --animate-spin: spin 1s linear infinite;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: var(--font-sans);\n --default-mono-font-family: var(--font-mono);\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .pointer-events-none {\n pointer-events: none;\n }\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n }\n .absolute {\n position: absolute;\n }\n .fixed {\n position: fixed;\n }\n .relative {\n position: relative;\n }\n .inset-0 {\n inset: calc(var(--spacing) * 0);\n }\n .top-0 {\n top: calc(var(--spacing) * 0);\n }\n .top-1 {\n top: calc(var(--spacing) * 1);\n }\n .top-1\\/2 {\n top: calc(1/2 * 100%);\n }\n .bottom-full {\n bottom: 100%;\n }\n .left-0 {\n left: calc(var(--spacing) * 0);\n }\n .left-1 {\n left: calc(var(--spacing) * 1);\n }\n .left-1\\/2 {\n left: calc(1/2 * 100%);\n }\n .left-3 {\n left: calc(var(--spacing) * 3);\n }\n .z-1 {\n z-index: 1;\n }\n .z-10 {\n z-index: 10;\n }\n .z-20 {\n z-index: 20;\n }\n .z-50 {\n z-index: 50;\n }\n .m-auto {\n margin: auto;\n }\n .mt-1 {\n margin-top: calc(var(--spacing) * 1);\n }\n .mt-4 {\n margin-top: calc(var(--spacing) * 4);\n }\n .mb-1 {\n margin-bottom: calc(var(--spacing) * 1);\n }\n .mb-2 {\n margin-bottom: calc(var(--spacing) * 2);\n }\n .mb-4 {\n margin-bottom: calc(var(--spacing) * 4);\n }\n .mb-6 {\n margin-bottom: calc(var(--spacing) * 6);\n }\n .block {\n display: block;\n }\n .flex {\n display: flex;\n }\n .grid {\n display: grid;\n }\n .table {\n display: table;\n }\n .h-2 {\n height: calc(var(--spacing) * 2);\n }\n .h-3 {\n height: calc(var(--spacing) * 3);\n }\n .h-4 {\n height: calc(var(--spacing) * 4);\n }\n .h-5 {\n height: calc(var(--spacing) * 5);\n }\n .h-16 {\n height: calc(var(--spacing) * 16);\n }\n .h-32 {\n height: calc(var(--spacing) * 32);\n }\n .h-full {\n height: 100%;\n }\n .w-3 {\n width: calc(var(--spacing) * 3);\n }\n .w-4 {\n width: calc(var(--spacing) * 4);\n }\n .w-5 {\n width: calc(var(--spacing) * 5);\n }\n .w-16 {\n width: calc(var(--spacing) * 16);\n }\n .w-52 {\n width: calc(var(--spacing) * 52);\n }\n .w-64 {\n width: calc(var(--spacing) * 64);\n }\n .w-full {\n width: 100%;\n }\n .max-w-2xl {\n max-width: var(--container-2xl);\n }\n .max-w-3xl {\n max-width: var(--container-3xl);\n }\n .flex-1 {\n flex: 1;\n }\n .border-collapse {\n border-collapse: collapse;\n }\n .-translate-x-1 {\n --tw-translate-x: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-y-1 {\n --tw-translate-y: calc(var(--spacing) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .-translate-y-1\\/2 {\n --tw-translate-y: calc(calc(1/2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n .transform {\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\n }\n .animate-spin {\n animation: var(--animate-spin);\n }\n .cursor-help {\n cursor: help;\n }\n .cursor-not-allowed {\n cursor: not-allowed;\n }\n .cursor-pointer {\n cursor: pointer;\n }\n .resize {\n resize: both;\n }\n .appearance-none {\n appearance: none;\n }\n .grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n }\n .grid-cols-2 {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n .flex-col {\n flex-direction: column;\n }\n .flex-row {\n flex-direction: row;\n }\n .items-center {\n align-items: center;\n }\n .items-start {\n align-items: flex-start;\n }\n .justify-between {\n justify-content: space-between;\n }\n .justify-center {\n justify-content: center;\n }\n .justify-start {\n justify-content: flex-start;\n }\n .gap-1 {\n gap: calc(var(--spacing) * 1);\n }\n .gap-2 {\n gap: calc(var(--spacing) * 2);\n }\n .gap-3 {\n gap: calc(var(--spacing) * 3);\n }\n .gap-4 {\n gap: calc(var(--spacing) * 4);\n }\n .gap-6 {\n gap: calc(var(--spacing) * 6);\n }\n .space-y-4 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-6 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .space-y-8 {\n :where(& > :not(:last-child)) {\n --tw-space-y-reverse: 0;\n margin-block-start: calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));\n margin-block-end: calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)));\n }\n }\n .rounded {\n border-radius: 0.25rem;\n }\n .rounded-2xl {\n border-radius: var(--radius-2xl);\n }\n .rounded-4xl {\n border-radius: var(--radius-4xl);\n }\n .rounded-full {\n border-radius: calc(infinity * 1px);\n }\n .rounded-lg {\n border-radius: var(--radius-lg);\n }\n .rounded-xl {\n border-radius: var(--radius-xl);\n }\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .border-2 {\n border-style: var(--tw-border-style);\n border-width: 2px;\n }\n .border-t {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n .border-t-2 {\n border-top-style: var(--tw-border-style);\n border-top-width: 2px;\n }\n .border-b {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n .border-b-2 {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 2px;\n }\n .border-\\[\\#271200\\] {\n border-color: #271200;\n }\n .border-\\[\\#964500\\] {\n border-color: #964500;\n }\n .border-gray-200 {\n border-color: var(--color-gray-200);\n }\n .border-gray-300 {\n border-color: var(--color-gray-300);\n }\n .border-red-500 {\n border-color: var(--color-red-500);\n }\n .bg-\\[\\#271200\\] {\n background-color: #271200;\n }\n .bg-\\[\\#964500\\] {\n background-color: #964500;\n }\n .bg-\\[\\#f3ebda\\] {\n background-color: #f3ebda;\n }\n .bg-gray-50 {\n background-color: var(--color-gray-50);\n }\n .bg-gray-200 {\n background-color: var(--color-gray-200);\n }\n .bg-gray-400 {\n background-color: var(--color-gray-400);\n }\n .bg-gray-800 {\n background-color: var(--color-gray-800);\n }\n .bg-white {\n background-color: var(--color-white);\n }\n .p-2 {\n padding: calc(var(--spacing) * 2);\n }\n .p-3 {\n padding: calc(var(--spacing) * 3);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n .p-6 {\n padding: calc(var(--spacing) * 6);\n }\n .p-8 {\n padding: calc(var(--spacing) * 8);\n }\n .px-2 {\n padding-inline: calc(var(--spacing) * 2);\n }\n .px-3 {\n padding-inline: calc(var(--spacing) * 3);\n }\n .px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n .px-6 {\n padding-inline: calc(var(--spacing) * 6);\n }\n .py-1 {\n padding-block: calc(var(--spacing) * 1);\n }\n .py-2 {\n padding-block: calc(var(--spacing) * 2);\n }\n .py-3 {\n padding-block: calc(var(--spacing) * 3);\n }\n .pt-4 {\n padding-top: calc(var(--spacing) * 4);\n }\n .pt-6 {\n padding-top: calc(var(--spacing) * 6);\n }\n .pt-7 {\n padding-top: calc(var(--spacing) * 7);\n }\n .pr-4 {\n padding-right: calc(var(--spacing) * 4);\n }\n .pb-2 {\n padding-bottom: calc(var(--spacing) * 2);\n }\n .pb-3 {\n padding-bottom: calc(var(--spacing) * 3);\n }\n .pb-7 {\n padding-bottom: calc(var(--spacing) * 7);\n }\n .pl-10 {\n padding-left: calc(var(--spacing) * 10);\n }\n .text-center {\n text-align: center;\n }\n .text-2xl {\n font-size: var(--text-2xl);\n line-height: var(--tw-leading, var(--text-2xl--line-height));\n }\n .text-3xl {\n font-size: var(--text-3xl);\n line-height: var(--tw-leading, var(--text-3xl--line-height));\n }\n .text-lg {\n font-size: var(--text-lg);\n line-height: var(--tw-leading, var(--text-lg--line-height));\n }\n .text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n .text-xl {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n .font-medium {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n .whitespace-nowrap {\n white-space: nowrap;\n }\n .text-\\[\\#1a365d\\] {\n color: #1a365d;\n }\n .text-\\[\\#271200\\] {\n color: #271200;\n }\n .text-\\[\\#964500\\] {\n color: #964500;\n }\n .text-gray-400 {\n color: var(--color-gray-400);\n }\n .text-gray-500 {\n color: var(--color-gray-500);\n }\n .text-gray-600 {\n color: var(--color-gray-600);\n }\n .text-gray-700 {\n color: var(--color-gray-700);\n }\n .text-green-600 {\n color: var(--color-green-600);\n }\n .text-red-500 {\n color: var(--color-red-500);\n }\n .text-white {\n color: var(--color-white);\n }\n .underline {\n text-decoration-line: underline;\n }\n .accent-\\[\\#964500\\] {\n accent-color: #964500;\n }\n .opacity-0 {\n opacity: 0%;\n }\n .shadow {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-inner {\n --tw-shadow: inset 0 2px 4px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-lg {\n --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .outline {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n .transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-colors {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-opacity {\n transition-property: opacity;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .duration-200 {\n --tw-duration: 200ms;\n transition-duration: 200ms;\n }\n .ease-in-out {\n --tw-ease: var(--ease-in-out);\n transition-timing-function: var(--ease-in-out);\n }\n .select-none {\n -webkit-user-select: none;\n user-select: none;\n }\n .group-hover\\:opacity-100 {\n &:is(:where(.group):hover *) {\n @media (hover: hover) {\n opacity: 100%;\n }\n }\n }\n .peer-checked\\:bg-\\[\\#964500\\] {\n &:is(:where(.peer):checked ~ *) {\n background-color: #964500;\n }\n }\n .peer-checked\\:opacity-100 {\n &:is(:where(.peer):checked ~ *) {\n opacity: 100%;\n }\n }\n .hover\\:bg-\\[\\#7a3700\\] {\n &:hover {\n @media (hover: hover) {\n background-color: #7a3700;\n }\n }\n }\n .hover\\:bg-\\[\\#964500\\] {\n &:hover {\n @media (hover: hover) {\n background-color: #964500;\n }\n }\n }\n .focus\\:border-transparent {\n &:focus {\n border-color: transparent;\n }\n }\n .focus\\:ring-2 {\n &:focus {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus\\:ring-\\[\\#1a365d\\] {\n &:focus {\n --tw-ring-color: #1a365d;\n }\n }\n .focus\\:ring-\\[\\#964500\\] {\n &:focus {\n --tw-ring-color: #964500;\n }\n }\n .focus\\:ring-blue-500 {\n &:focus {\n --tw-ring-color: var(--color-blue-500);\n }\n }\n .focus\\:outline-none {\n &:focus {\n --tw-outline-style: none;\n outline-style: none;\n }\n }\n .md\\:grid-cols-2 {\n @media (width >= 48rem) {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:h-4 {\n &::-moz-range-thumb {\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:w-4 {\n &::-moz-range-thumb {\n width: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:appearance-none {\n &::-moz-range-thumb {\n appearance: none;\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:rounded-full {\n &::-moz-range-thumb {\n border-radius: calc(infinity * 1px);\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:border-0 {\n &::-moz-range-thumb {\n border-style: var(--tw-border-style);\n border-width: 0px;\n }\n }\n .\\[\\&\\:\\:-moz-range-thumb\\]\\:bg-\\[\\#964500\\] {\n &::-moz-range-thumb {\n background-color: #964500;\n }\n }\n .\\[\\&\\:\\:-moz-range-track\\]\\:bg-\\[\\#964500\\] {\n &::-moz-range-track {\n background-color: #964500;\n }\n }\n .\\[\\&\\:\\:-webkit-slider-runnable-track\\]\\:bg-\\[\\#964500\\] {\n &::-webkit-slider-runnable-track {\n background-color: #964500;\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:h-4 {\n &::-webkit-slider-thumb {\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:w-4 {\n &::-webkit-slider-thumb {\n width: calc(var(--spacing) * 4);\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:appearance-none {\n &::-webkit-slider-thumb {\n appearance: none;\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:rounded-full {\n &::-webkit-slider-thumb {\n border-radius: calc(infinity * 1px);\n }\n }\n .\\[\\&\\:\\:-webkit-slider-thumb\\]\\:bg-\\[\\#964500\\] {\n &::-webkit-slider-thumb {\n background-color: #964500;\n }\n }\n .\\[\\&\\>option\\:checked\\]\\:bg-\\[\\#964500\\] {\n &>option:checked {\n background-color: #964500;\n }\n }\n .\\[\\&\\>option\\:checked\\]\\:text-white {\n &>option:checked {\n color: var(--color-white);\n }\n }\n}\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-rotate-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-rotate-z {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-x {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-skew-y {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-space-y-reverse {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"<length>\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ease {\n syntax: \"*\";\n inherits: false;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *, ::before, ::after, ::backdrop {\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-space-y-reverse: 0;\n --tw-border-style: solid;\n --tw-font-weight: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-duration: initial;\n --tw-ease: initial;\n }\n }\n}\n","import { Component, h, Listen, Prop, State, Watch } from \"@stencil/core\";\r\nimport Chart from \"chart.js/auto\";\r\nimport { DEFAULT_SOLAR_PANEL_TYPE } from \"../../config\";\r\nimport { SolarPanelSystemPart } from \"../../utils/geometry/fitting\";\r\n\r\nconst SOLAR_RADIATION = [\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n 0, // 00:00 - 05:00 - 6\r\n 0,\r\n 0.1,\r\n 0.2, // 8\r\n 0.4,\r\n 0.8,\r\n 1, // 06:00 - 11:00 - 12\r\n 1,\r\n 1,\r\n 1,\r\n 0.7,\r\n 0.5,\r\n 0.3, // 12:00 - 17:00 - 18\r\n 0.16,\r\n 0.02,\r\n 0,\r\n 0,\r\n 0,\r\n 0, // 18:00 - 23:00 - 24\r\n];\r\nconst CONSUMPTION_PROFILES = {\r\n mostly_at_home: [\r\n 0.1,\r\n 0.1,\r\n 0.1,\r\n 0.1,\r\n 0.1,\r\n 0.15, // 00:00 - 05:00 - 6\r\n 0.23,\r\n 0.26,\r\n 0.16,\r\n 0.16,\r\n 0.15,\r\n 0.19, // 06:00 - 11:00 - 12\r\n 0.23,\r\n 0.24,\r\n 0.35,\r\n 0.28,\r\n 0.275,\r\n 0.8, // 12:00 - 17:00 - 18\r\n 0.78,\r\n 0.74,\r\n 0.75,\r\n 0.73,\r\n 0.26,\r\n 0.1, // 18:00 - 23:00 - 24\r\n ],\r\n mostly_away: [\r\n 0.1,\r\n 0.1,\r\n 0.1,\r\n 0.1,\r\n 0.1,\r\n 0.15, // 00:00 - 05:00 - 6\r\n 0.29,\r\n 0.32,\r\n 0.25,\r\n 0.15,\r\n 0.12,\r\n 0.14, // 06:00 - 11:00 - 12\r\n 0.15,\r\n 0.12,\r\n 0.16,\r\n 0.21,\r\n 0.285,\r\n 1, // 12:00 - 17:00 - 18\r\n 0.81,\r\n 0.77,\r\n 0.79,\r\n 0.73,\r\n 0.26,\r\n 0.1, // 18:00 - 23:00 - 24\r\n ],\r\n};\r\n\r\n@Component({\r\n tag: \"solar-system-form\",\r\n styleUrl: \"../../output.css\",\r\n shadow: true,\r\n})\r\nexport class SolarSystemForm {\r\n @Prop()\r\n systemConfigs: { [id: string]: SolarPanelSystemPart } = {};\r\n\r\n @State()\r\n householdConsumption: number = 3500;\r\n @State()\r\n consumptionProfile: \"mostly_at_home\" | \"mostly_away\" = \"mostly_at_home\";\r\n @State()\r\n hasHeatPump: boolean = false;\r\n @State()\r\n hasElectricCar: boolean = false;\r\n @State()\r\n electricCarConsumption: number = 7.6;\r\n @State()\r\n electricityPrice: number = 0.3;\r\n @State()\r\n compensationRate: number = 0.07;\r\n @State()\r\n autonomy: number = 0;\r\n @State()\r\n costSavings: number = 0;\r\n @State()\r\n numberOfPanels: number = 5;\r\n @State()\r\n panelPeakPower: number = 0.4; // kW per panel\r\n @State()\r\n name: string = \"\";\r\n @State()\r\n email: string = \"\";\r\n @State()\r\n nameError: string = \"\";\r\n @State()\r\n emailError: string = \"\";\r\n\r\n private chart: Chart | null = null;\r\n private chartRef: HTMLCanvasElement | null = null;\r\n\r\n @Watch(\"systemConfigs\")\r\n updateSystemConfigs() {\r\n if (Object.keys(this.systemConfigs).length === 0) {\r\n this.numberOfPanels = 0;\r\n return;\r\n }\r\n this.numberOfPanels = Object.keys(this.systemConfigs).reduce(\r\n (acc, curr) =>\r\n acc + this.systemConfigs[curr].positionedPanels.length,\r\n 0,\r\n );\r\n\r\n this.panelPeakPower =\r\n Object.entries(this.systemConfigs)[0][1].positionedPanels[0].panel\r\n .kWattPeak;\r\n\r\n this.recalculate();\r\n this.updateChart();\r\n }\r\n\r\n private recalculate() {\r\n const data = CONSUMPTION_PROFILES[this.consumptionProfile];\r\n const norm = data.reduce((acc, curr) => acc + curr, 0);\r\n\r\n const peakKwh = this.numberOfPanels * this.panelPeakPower;\r\n const production = SOLAR_RADIATION.map((radiation) =>\r\n radiation * peakKwh\r\n );\r\n let energyUsageOfProduction = 0;\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n data[i] = data[i] * this.householdConsumption / norm / 365;\r\n if (data[i] <= production[i]) {\r\n energyUsageOfProduction += data[i];\r\n } else if (data[i] > production[i]) {\r\n energyUsageOfProduction += production[i];\r\n }\r\n }\r\n const energyDifference = production.map((p, i) => data[i] - p);\r\n const soldEnergy = -energyDifference.filter((e) => e < 0).reduce(\r\n (acc, curr) => acc + curr,\r\n 0,\r\n );\r\n // Calculate the cost savings\r\n this.costSavings = soldEnergy * this.compensationRate * 365 +\r\n energyUsageOfProduction * 365 * this.electricityPrice;\r\n\r\n this.autonomy =\r\n (energyUsageOfProduction / (this.householdConsumption / 365)) *\r\n 100;\r\n }\r\n\r\n private updateChart() {\r\n if (!this.chartRef) return;\r\n\r\n const ctx = this.chartRef.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n if (this.chart) {\r\n this.chart.destroy();\r\n }\r\n\r\n const hours = Array.from({ length: 24 }, (_, i) => `${i}:00`);\r\n const data = CONSUMPTION_PROFILES[this.consumptionProfile];\r\n const norm = data.reduce((acc, curr) => acc + curr, 0);\r\n\r\n const peakKwh = this.numberOfPanels * this.panelPeakPower;\r\n const production = SOLAR_RADIATION.map((radiation) =>\r\n radiation * peakKwh\r\n );\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n data[i] = data[i] * this.householdConsumption / norm / 365;\r\n }\r\n\r\n let datasets = [{\r\n label: \"Energy Consumption\",\r\n data: data,\r\n borderColor: \"#964500\",\r\n backgroundColor: \"rgba(150, 69, 0, 0.1)\",\r\n fill: true,\r\n tension: 0.4,\r\n }, {\r\n label: \"Energy Production\",\r\n data: production,\r\n borderColor: \"#000000\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.1)\",\r\n fill: true,\r\n }];\r\n\r\n this.chart = new Chart(ctx, {\r\n type: \"line\",\r\n data: {\r\n labels: hours,\r\n datasets: datasets,\r\n },\r\n options: {\r\n responsive: true,\r\n plugins: {\r\n title: {\r\n display: true,\r\n text: \"Daily Consumption Profile\",\r\n },\r\n },\r\n scales: {\r\n y: {\r\n beginAtZero: true,\r\n title: {\r\n display: true,\r\n text: \"Relative Consumption\",\r\n },\r\n },\r\n x: {\r\n title: {\r\n display: true,\r\n text: \"Hour of Day\",\r\n },\r\n },\r\n },\r\n },\r\n });\r\n }\r\n\r\n componentWillLoad() {\r\n this.updateSystemConfigs();\r\n }\r\n\r\n private validateForm(): boolean {\r\n let isValid = true;\r\n\r\n // Validate name\r\n if (!this.name.trim()) {\r\n this.nameError = \"Name is required\";\r\n isValid = false;\r\n } else {\r\n this.nameError = \"\";\r\n }\r\n\r\n // Validate email\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n if (!this.email.trim()) {\r\n this.emailError = \"Email is required\";\r\n isValid = false;\r\n } else if (!emailRegex.test(this.email)) {\r\n this.emailError = \"Please enter a valid email address\";\r\n isValid = false;\r\n } else {\r\n this.emailError = \"\";\r\n }\r\n\r\n return isValid;\r\n }\r\n\r\n private handleRequestOffer() {\r\n if (!this.validateForm()) {\r\n return;\r\n }\r\n // Here you can implement the logic to handle the offer request\r\n console.log(\"Requesting offer for:\", {\r\n name: this.name,\r\n email: this.email,\r\n systemConfig: this.systemConfigs,\r\n consumption: this.householdConsumption,\r\n autonomy: this.autonomy,\r\n costSavings: this.costSavings,\r\n });\r\n }\r\n\r\n render() {\r\n if (Object.keys(this.systemConfigs).length === 0) {\r\n return <div></div>;\r\n }\r\n return (\r\n <div class=\"flex flex-col justify-center items-center w-full h-full gap-4 p-4\">\r\n <h1 class=\"text-2xl font-bold text-[#271200] mb-4\">\r\n Solar System Configuration\r\n </h1>\r\n\r\n <div class=\"w-full max-w-2xl bg-[#f3ebda] rounded-4xl p-6 space-y-6\">\r\n {/* System Info Section */}\r\n <div class=\"space-y-4\">\r\n <h2 class=\"text-lg font-semibold text-[#271200]\">\r\n System Information\r\n </h2>\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label class=\"block text-sm font-medium text-gray-600 mb-1\">\r\n Number of Solar Panels\r\n </label>\r\n <input\r\n type=\"number\"\r\n class=\"w-full px-4 py-2 rounded-4xl border border-gray-300 focus:ring-2 focus:ring-[#964500] focus:border-transparent\"\r\n value={this.numberOfPanels}\r\n readOnly\r\n />\r\n </div>\r\n <div>\r\n <label class=\"block text-sm font-medium text-gray-600 mb-1\">\r\n Panel Peak Power (kW)\r\n </label>\r\n <input\r\n type=\"number\"\r\n class=\"w-full px-4 py-2 rounded-4xl border border-gray-300 focus:ring-2 focus:ring-[#964500] focus:border-transparent\"\r\n value={this.panelPeakPower}\r\n readonly\r\n />\r\n </div>\r\n </div>\r\n <div class=\"bg-white rounded-4xl p-4\">\r\n <div class=\"flex items-center justify-between\">\r\n <span class=\"text-gray-600\">\r\n Total System Peak Power\r\n </span>\r\n <span class=\"text-xl font-bold text-[#271200]\">\r\n {(DEFAULT_SOLAR_PANEL_TYPE.kWattPeak *\r\n this.numberOfPanels).toFixed(1)} kW\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n {/* Household Consumption Section */}\r\n <div class=\"space-y-4\">\r\n <h2 class=\"text-lg font-semibold text-[#271200]\">\r\n Household Electricity Consumption\r\n </h2>\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label class=\"block text-sm font-medium text-gray-600 mb-1\">\r\n Annual Consumption (kWh)\r\n </label>\r\n <input\r\n type=\"number\"\r\n class=\"w-full px-4 py-2 rounded-4xl border border-gray-300 focus:ring-2 focus:ring-[#964500] focus:border-transparent\"\r\n value={this.householdConsumption}\r\n onInput={(e) => {\r\n this.householdConsumption = parseInt(\r\n (e.target as HTMLInputElement)\r\n .value,\r\n );\r\n this.recalculate();\r\n this.updateChart();\r\n }}\r\n />\r\n </div>\r\n <div>\r\n <label class=\"block text-sm font-medium text-gray-600 mb-1\">\r\n Consumption Profile\r\n </label>\r\n <select\r\n class=\"w-full px-4 py-2 rounded-4xl border border-gray-300 focus:ring-2 focus:ring-[#964500] focus:border-transparent\"\r\n onChange={(e) => {\r\n this.consumptionProfile =\r\n (e.target as HTMLSelectElement)\r\n .value as\r\n | \"mostly_at_home\"\r\n | \"mostly_away\";\r\n this.recalculate();\r\n this.updateChart();\r\n }}\r\n >\r\n <option\r\n value=\"mostly_at_home\"\r\n selected={this.consumptionProfile ===\r\n \"mostly_at_home\"}\r\n >\r\n Mostly at Home\r\n </option>\r\n <option\r\n value=\"mostly_away\"\r\n selected={this.consumptionProfile ===\r\n \"mostly_away\"}\r\n >\r\n Mostly Away\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n <div class=\"mt-4\">\r\n <canvas ref={(el) => this.chartRef = el}></canvas>\r\n </div>\r\n </div>\r\n\r\n {/* Electricity Price and Compensation Section */}\r\n <div class=\"space-y-4\">\r\n <h2 class=\"text-lg font-semibold text-[#271200]\">\r\n Electricity Costs\r\n </h2>\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label class=\"block text-sm font-medium text-gray-600 mb-1\">\r\n Electricity Price (€/kWh)\r\n </label>\r\n <input\r\n type=\"number\"\r\n step=\"0.01\"\r\n class=\"w-full px-4 py-2 rounded-4xl border border-gray-300 focus:ring-2 focus:ring-[#964500] focus:border-transparent\"\r\n value={this.electricityPrice}\r\n onInput={(e) => {\r\n this.electricityPrice = parseFloat(\r\n (e.target as HTMLInputElement)\r\n .value,\r\n );\r\n this.recalculate();\r\n this.updateChart();\r\n }}\r\n />\r\n </div>\r\n <div>\r\n <label class=\"block text-sm font-medium text-gray-600 mb-1\">\r\n Compensation Rate (€/kWh)\r\n </label>\r\n <input\r\n type=\"number\"\r\n step=\"0.01\"\r\n class=\"w-full px-4 py-2 rounded-4xl border border-gray-300 focus:ring-2 focus:ring-[#964500] focus:border-transparent\"\r\n value={this.compensationRate}\r\n onInput={(e) => {\r\n this.compensationRate = parseFloat(\r\n (e.target as HTMLInputElement)\r\n .value,\r\n );\r\n this.recalculate();\r\n this.updateChart();\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Results Section */}\r\n <div class=\"space-y-4 pt-4 border-t border-gray-200\">\r\n <h2 class=\"text-lg font-semibold text-[#271200]\">\r\n Results\r\n </h2>\r\n <div class=\"bg-white rounded-4xl p-4\">\r\n <div class=\"flex items-center justify-between\">\r\n <span class=\"text-gray-600\">Autonomy</span>\r\n <span class=\"text-xl font-bold text-[#271200]\">\r\n {this.autonomy.toFixed(1)}%\r\n </span>\r\n </div>\r\n <div class=\"flex items-center justify-between mt-4\">\r\n <div class=\"flex items-center gap-2\">\r\n <span class=\"text-gray-600\">\r\n Cost Savings\r\n </span>\r\n <div class=\"relative group\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"h-5 w-5 text-gray-400 cursor-help\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"currentColor\"\r\n >\r\n <path\r\n fill-rule=\"evenodd\"\r\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-3a1 1 0 00-.867.5 1 1 0 11-1.731-1A3 3 0 0113 8a3.001 3.001 0 01-2 2.83V11a1 1 0 11-2 0v-1a1 1 0 011-1 1 1 0 100-2zm0 8a1 1 0 100-2 1 1 0 000 2z\"\r\n clip-rule=\"evenodd\"\r\n />\r\n </svg>\r\n <div class=\"absolute bottom-full left-1/2 transform -translate-x-1/2 mb-2 w-64 p-2 bg-gray-800 text-white text-sm rounded-lg opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none\">\r\n Cost savings are calculated based on\r\n current electricity prices and\r\n compensation rates. The calculation\r\n includes both direct usage of solar\r\n energy and compensation for excess\r\n energy fed back into the grid.\r\n </div>\r\n </div>\r\n </div>\r\n <span class=\"text-xl font-bold text-green-600\">\r\n {this.costSavings.toFixed(2)}€/year\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Contact Information Section */}\r\n <div class=\"space-y-4 pt-4 border-t border-gray-200\">\r\n <h2 class=\"text-lg font-semibold text-[#271200]\">\r\n Request an Offer\r\n </h2>\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <label class=\"block text-sm font-medium text-gray-600 mb-1\">\r\n Name\r\n </label>\r\n <input\r\n type=\"text\"\r\n class={`w-full px-4 py-2 rounded-4xl border ${\r\n this.nameError\r\n ? \"border-red-500\"\r\n : \"border-gray-300\"\r\n } focus:ring-2 focus:ring-[#964500] focus:border-transparent`}\r\n value={this.name}\r\n onInput={(e) => {\r\n this.name =\r\n (e.target as HTMLInputElement)\r\n .value;\r\n this.validateForm();\r\n }}\r\n placeholder=\"Your name\"\r\n />\r\n {this.nameError && (\r\n <p class=\"text-red-500 text-sm mt-1\">\r\n {this.nameError}\r\n </p>\r\n )}\r\n </div>\r\n <div>\r\n <label class=\"block text-sm font-medium text-gray-600 mb-1\">\r\n Email\r\n </label>\r\n <input\r\n type=\"email\"\r\n class={`w-full px-4 py-2 rounded-4xl border ${\r\n this.emailError\r\n ? \"border-red-500\"\r\n : \"border-gray-300\"\r\n } focus:ring-2 focus:ring-[#964500] focus:border-transparent`}\r\n value={this.email}\r\n onInput={(e) => {\r\n this.email =\r\n (e.target as HTMLInputElement)\r\n .value;\r\n this.validateForm();\r\n }}\r\n placeholder=\"your.email@example.com\"\r\n />\r\n {this.emailError && (\r\n <p class=\"text-red-500 text-sm mt-1\">\r\n {this.emailError}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n <div class=\"flex justify-center\">\r\n <button\r\n onClick={() => this.handleRequestOffer()}\r\n disabled={!this.name.trim() ||\r\n !this.email.trim() || !!this.nameError ||\r\n !!this.emailError}\r\n class=\"px-4 py-2 bg-[#271200] text-white rounded-4xl hover:bg-[#964500] transition-colors duration-200\"\r\n >\r\n Request Offer\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|