highcharts
Version:
JavaScript charting framework
14 lines • 45.2 kB
JavaScript
!/**
* Highcharts JS v12.5.0 (2026-01-12)
* @module highcharts/modules/boost
* @requires highcharts
*
* Boost module
*
* (c) 2010-2026 Highsoft AS
* Author: Torstein Honsi
*
* A commercial license may be required depending on use.
* See www.highcharts.com/license
*
* */function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(e._Highcharts,e._Highcharts.Color):"function"==typeof define&&define.amd?define("highcharts/modules/boost",["highcharts/highcharts"],function(e){return t(e,e.Color)}):"object"==typeof exports?exports["highcharts/modules/boost"]=t(e._Highcharts,e._Highcharts.Color):e.Highcharts=t(e.Highcharts,e.Highcharts.Color)}("u"<typeof window?this:window,(e,t)=>(()=>{"use strict";let i,s,r;var o,n,a,l,h,d,f,u,g={620:e=>{e.exports=t},944:t=>{t.exports=e}},m={};function c(e){var t=m[e];if(void 0!==t)return t.exports;var i=m[e]={exports:{}};return g[e](i,i.exports,c),i.exports}c.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return c.d(t,{a:t}),t},c.d=(e,t)=>{for(var i in t)c.o(t,i)&&!c.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},c.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var p={};c.d(p,{default:()=>eW});var b=c(944),x=c.n(b);let A=["area","areaspline","arearange","column","columnrange","bar","line","scatter","heatmap","bubble","treemap"],y={};A.forEach(e=>{y[e]=!0});let{composed:v}=x(),{addEvent:P,pick:T,pushUnique:C}=x();function k(e){let t=e.series,i=e.boost=e.boost||{},s=e.options.boost||{},r=T(s.seriesThreshold,50);if(t.length>=r)return!0;if(1===t.length)return!1;let o=s.allowForce;if(void 0===o){for(let t of(o=!0,e.xAxis))if(T(t.min,-1/0)>T(t.dataMin,-1/0)||T(t.max,1/0)<T(t.dataMax,1/0)){o=!1;break}}if(void 0!==i.forceChartBoost){if(o)return i.forceChartBoost;i.forceChartBoost=void 0}let n=0,a=0,l;for(let e of t)0!==(l=e.options).boostThreshold&&!1!==e.visible&&"heatmap"!==e.type&&(y[e.type]&&++n,function(...e){let t=-Number.MAX_VALUE;return e.forEach(e=>{if(null!=e&&void 0!==e.length&&e.length>0)return t=e.length,!0}),t}(e.getColumn("x",!0),l.data,e.points)>=(l.boostThreshold||Number.MAX_VALUE)&&++a);return i.forceChartBoost=o&&(n===t.length&&a===n||a>5),i.forceChartBoost}function M(e){function t(){e.boost&&e.boost.wgl&&k(e)&&e.boost.wgl.render(e)}P(e,"predraw",function(){e.boost=e.boost||{},e.boost.forceChartBoost=void 0,e.boosted=!1,e.axes.some(e=>e.isPanning)||e.boost.clear?.(),e.boost.canvas&&e.boost.wgl&&k(e)&&e.boost.wgl.allocateBuffer(e),e.boost.markerGroup&&e.xAxis&&e.xAxis.length>0&&e.yAxis&&e.yAxis.length>0&&e.boost.markerGroup.translate(e.xAxis[0].pos,e.yAxis[0].pos)}),P(e,"load",t,{order:-1}),P(e,"redraw",t);let i=-1,s=-1;P(e.pointer,"afterGetHoverData",t=>{let r=t.hoverPoint?.series;if(e.boost=e.boost||{},e.boost.markerGroup&&r){let t=e.inverted?r.yAxis:r.xAxis,o=e.inverted?r.xAxis:r.yAxis;(t&&t.pos!==i||o&&o.pos!==s)&&(e.series.forEach(e=>{e.halo?.hide()}),e.boost.markerGroup.translate(t.pos,o.pos),i=t.pos,s=o.pos)}})}let E={compose:function(e,t){return t&&C(v,"Boost.Chart")&&e.prototype.callbacks.push(M),e},getBoostClipRect:function(e,t){let i=e.navigator,s={x:e.plotLeft,y:e.plotTop,width:e.plotWidth,height:e.plotHeight};if(i&&e.inverted?(s.width+=i.top+i.height,i.opposite||(s.x=i.left)):i&&!e.inverted&&(s.height=i.top+i.height-e.plotTop),t.is){let{xAxis:i,yAxis:r}=t;if(s=e.getClipBox(t),e.inverted){let e=s.width;s.width=s.height,s.height=e,s.x=r.pos,s.y=i.pos}else s.x=i.pos,s.y=r.pos}if(t===e){let t=e.inverted?e.xAxis:e.yAxis;t.length<=1&&(s.y=Math.min(t[0].pos,s.y),s.height=t[0].pos-e.plotTop+t[0].len)}return s},isChartSeriesBoosting:k};var S=c(620),w=c.n(S);let U={area:"LINES",arearange:"LINES",areaspline:"LINES",column:"LINES",columnrange:"LINES",bar:"LINES",line:"LINE_STRIP",scatter:"POINTS",heatmap:"TRIANGLES",treemap:"TRIANGLES",bubble:"POINTS"},{clamp:R,error:_,pick:L}=x(),z=class{constructor(e){if(this.errors=[],this.uLocations={},this.gl=e,e&&!this.createShader())return}bind(){this.gl&&this.shaderProgram&&this.gl.useProgram(this.shaderProgram)}createShader(){let e=this.stringToProgram("#version 100\n#define LN10 2.302585092994046\nprecision highp float;\nattribute vec4 aVertexPosition;\nattribute vec4 aColor;\nvarying highp vec2 position;\nvarying highp vec4 vColor;\nuniform mat4 uPMatrix;\nuniform float pSize;\nuniform float translatedThreshold;\nuniform bool hasThreshold;\nuniform bool skipTranslation;\nuniform float xAxisTrans;\nuniform float xAxisMin;\nuniform float xAxisMax;\nuniform float xAxisMinPad;\nuniform float xAxisPointRange;\nuniform float xAxisLen;\nuniform bool xAxisPostTranslate;\nuniform float xAxisOrdinalSlope;\nuniform float xAxisOrdinalOffset;\nuniform float xAxisPos;\nuniform bool xAxisCVSCoord;\nuniform bool xAxisIsLog;\nuniform bool xAxisReversed;\nuniform float yAxisTrans;\nuniform float yAxisMin;\nuniform float yAxisMax;\nuniform float yAxisMinPad;\nuniform float yAxisPointRange;\nuniform float yAxisLen;\nuniform bool yAxisPostTranslate;\nuniform float yAxisOrdinalSlope;\nuniform float yAxisOrdinalOffset;\nuniform float yAxisPos;\nuniform bool yAxisCVSCoord;\nuniform bool yAxisIsLog;\nuniform bool yAxisReversed;\nuniform bool isCircle;\nuniform bool isBubble;\nuniform bool bubbleSizeByArea;\nuniform float bubbleZMin;\nuniform float bubbleZMax;\nuniform float bubbleZThreshold;\nuniform float bubbleMinSize;\nuniform float bubbleMaxSize;\nuniform bool bubbleSizeAbs;\nuniform bool isInverted;\nfloat bubbleRadius(){\nfloat value = aVertexPosition.w;\nfloat zMax = bubbleZMax;\nfloat zMin = bubbleZMin;\nfloat radius = 0.0;\nfloat pos = 0.0;\nfloat zRange = zMax - zMin;\nif (bubbleSizeAbs){\nvalue = value - bubbleZThreshold;\nzMax = max(zMax - bubbleZThreshold, zMin - bubbleZThreshold);\nzMin = 0.0;\n}\nif (value < zMin){\nradius = bubbleZMin / 2.0 - 1.0;\n} else {\npos = zRange > 0.0 ? (value - zMin) / zRange : 0.5;\nif (bubbleSizeByArea && pos > 0.0){\npos = sqrt(pos);\n}\nradius = ceil(bubbleMinSize + pos * (bubbleMaxSize - bubbleMinSize)) / 2.0;\n}\nreturn radius * 2.0;\n}\nfloat translate(float val,\nfloat pointPlacement,\nfloat localA,\nfloat localMin,\nfloat minPixelPadding,\nfloat pointRange,\nfloat len,\nbool cvsCoord,\nbool isLog,\nbool reversed\n){\nfloat sign = 1.0;\nfloat cvsOffset = 0.0;\nif (cvsCoord) {\nsign *= -1.0;\ncvsOffset = len;\n}\nif (isLog) {\nval = log(val) / LN10;\n}\nif (reversed) {\nsign *= -1.0;\ncvsOffset -= sign * len;\n}\nreturn sign * (val - localMin) * localA + cvsOffset + \n(sign * minPixelPadding);\n}\nfloat xToPixels(float value) {\nif (skipTranslation){\nreturn value;// + xAxisPos;\n}\nreturn translate(value, 0.0, xAxisTrans, xAxisMin, xAxisMinPad, xAxisPointRange, xAxisLen, xAxisCVSCoord, xAxisIsLog, xAxisReversed);// + xAxisPos;\n}\nfloat yToPixels(float value, float checkTreshold) {\nfloat v;\nif (skipTranslation){\nv = value;// + yAxisPos;\n} else {\nv = translate(value, 0.0, yAxisTrans, yAxisMin, yAxisMinPad, yAxisPointRange, yAxisLen, yAxisCVSCoord, yAxisIsLog, yAxisReversed);// + yAxisPos;\nif (v > yAxisLen) {\nv = yAxisLen;\n}\n}\nif (checkTreshold > 0.0 && hasThreshold) {\nv = min(v, translatedThreshold);\n}\nreturn v;\n}\nvoid main(void) {\nif (isBubble){\ngl_PointSize = bubbleRadius();\n} else {\ngl_PointSize = pSize;\n}\nvColor = aColor;\nif (!skipTranslation && isCircle && (\naVertexPosition.x < xAxisMin ||\naVertexPosition.x > xAxisMax ||\naVertexPosition.y < yAxisMin ||\naVertexPosition.y > yAxisMax\n)) {\ngl_Position = uPMatrix * vec4(2.0, 2.0, 2.0, 1.0);\n} else if (skipTranslation && isInverted) {\ngl_Position = uPMatrix * vec4(aVertexPosition.y + yAxisPos, aVertexPosition.x + xAxisPos, 0.0, 1.0);\n} else if (isInverted) {\ngl_Position = uPMatrix * vec4(yToPixels(aVertexPosition.y, aVertexPosition.z) + yAxisPos, xToPixels(aVertexPosition.x) + xAxisPos, 0.0, 1.0);\n} else {\ngl_Position = uPMatrix * vec4(xToPixels(aVertexPosition.x) + xAxisPos, yToPixels(aVertexPosition.y, aVertexPosition.z) + yAxisPos, 0.0, 1.0);\n}\n}","vertex"),t=this.stringToProgram("precision highp float;\nuniform vec4 fillColor;\nvarying highp vec2 position;\nvarying highp vec4 vColor;\nuniform sampler2D uSampler;\nuniform bool isCircle;\nuniform bool hasColor;\nvoid main(void) {\nvec4 col = fillColor;\nvec4 tcol = texture2D(uSampler, gl_PointCoord.st);\nif (hasColor) {\ncol = vColor;\n}\nif (isCircle) {\ncol *= tcol;\nif (tcol.r < 0.0) {\ndiscard;\n} else {\ngl_FragColor = col;\n}\n} else {\ngl_FragColor = col;\n}\n}","fragment"),i=e=>this.gl.getUniformLocation(this.shaderProgram,e);return e&&t?(this.shaderProgram=this.gl.createProgram(),this.gl.attachShader(this.shaderProgram,e),this.gl.attachShader(this.shaderProgram,t),this.gl.linkProgram(this.shaderProgram),this.gl.getProgramParameter(this.shaderProgram,this.gl.LINK_STATUS))?(this.gl.useProgram(this.shaderProgram),this.gl.bindAttribLocation(this.shaderProgram,0,"aVertexPosition"),this.pUniform=i("uPMatrix"),this.psUniform=i("pSize"),this.fcUniform=i("fillColor"),this.isBubbleUniform=i("isBubble"),this.bubbleSizeAbsUniform=i("bubbleSizeAbs"),this.bubbleSizeAreaUniform=i("bubbleSizeByArea"),this.uSamplerUniform=i("uSampler"),this.skipTranslationUniform=i("skipTranslation"),this.isCircleUniform=i("isCircle"),this.isInverted=i("isInverted"),!0):(this.errors.push(this.gl.getProgramInfoLog(this.shaderProgram)),this.handleErrors(),this.shaderProgram=!1,!1):(this.shaderProgram=!1,this.handleErrors(),!1)}handleErrors(){this.errors.length&&_("[highcharts boost] shader error - "+this.errors.join("\n"))}stringToProgram(e,t){let i=this.gl.createShader("vertex"===t?this.gl.VERTEX_SHADER:this.gl.FRAGMENT_SHADER);return(this.gl.shaderSource(i,e),this.gl.compileShader(i),this.gl.getShaderParameter(i,this.gl.COMPILE_STATUS))?i:(this.errors.push("when compiling "+t+" shader:\n"+this.gl.getShaderInfoLog(i)),!1)}destroy(){this.gl&&this.shaderProgram&&(this.gl.deleteProgram(this.shaderProgram),this.shaderProgram=!1)}fillColorUniform(){return this.fcUniform}getProgram(){return this.shaderProgram}pointSizeUniform(){return this.psUniform}perspectiveUniform(){return this.pUniform}reset(){this.gl&&this.shaderProgram&&(this.gl.uniform1i(this.isBubbleUniform,0),this.gl.uniform1i(this.isCircleUniform,0))}setBubbleUniforms(e,t,i,s=1){let r=e.options,o=Number.MAX_VALUE,n=-Number.MAX_VALUE;if(this.gl&&this.shaderProgram&&e.is("bubble")){let a=e.getPxExtremes();o=L(r.zMin,R(t,!1===r.displayNegative?r.zThreshold:-Number.MAX_VALUE,o)),n=L(r.zMax,Math.max(n,i)),this.gl.uniform1i(this.isBubbleUniform,1),this.gl.uniform1i(this.isCircleUniform,1),this.gl.uniform1i(this.bubbleSizeAreaUniform,"width"!==e.options.sizeBy),this.gl.uniform1i(this.bubbleSizeAbsUniform,e.options.sizeByAbsoluteValue),this.setUniform("bubbleMinSize",a.minPxSize*s),this.setUniform("bubbleMaxSize",a.maxPxSize*s),this.setUniform("bubbleZMin",o),this.setUniform("bubbleZMax",n),this.setUniform("bubbleZThreshold",e.options.zThreshold)}}setColor(e){this.gl&&this.shaderProgram&&this.gl.uniform4f(this.fcUniform,e[0]/255,e[1]/255,e[2]/255,e[3])}setDrawAsCircle(e){this.gl&&this.shaderProgram&&this.gl.uniform1i(this.isCircleUniform,+!!e)}setInverted(e){this.gl&&this.shaderProgram&&this.gl.uniform1i(this.isInverted,e)}setPMatrix(e){this.gl&&this.shaderProgram&&this.gl.uniformMatrix4fv(this.pUniform,!1,e)}setPointSize(e){this.gl&&this.shaderProgram&&this.gl.uniform1f(this.psUniform,e)}setSkipTranslation(e){this.gl&&this.shaderProgram&&this.gl.uniform1i(this.skipTranslationUniform,+(!0===e))}setTexture(e){this.gl&&this.shaderProgram&&this.gl.uniform1i(this.uSamplerUniform,e)}setUniform(e,t){if(this.gl&&this.shaderProgram){let i=this.uLocations[e]=this.uLocations[e]||this.gl.getUniformLocation(this.shaderProgram,e);this.gl.uniform1f(i,t)}}},N=class{constructor(e,t,i){this.buffer=!1,this.iterator=0,this.preAllocated=!1,this.vertAttribute=!1,this.components=i||2,this.dataComponents=i,this.gl=e,this.shader=t}allocate(e){this.iterator=-1,this.preAllocated=new Float32Array(4*e)}bind(){if(!this.buffer)return!1;this.gl.vertexAttribPointer(this.vertAttribute,this.components,this.gl.FLOAT,!1,0,0)}build(e,t,i){let s;return(this.data=e||[],this.data&&0!==this.data.length||this.preAllocated)?(this.components=i||this.components,this.buffer&&this.gl.deleteBuffer(this.buffer),this.preAllocated||(s=new Float32Array(this.data)),this.buffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.buffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,this.preAllocated||s,this.gl.STATIC_DRAW),this.vertAttribute=this.gl.getAttribLocation(this.shader.getProgram(),t),this.gl.enableVertexAttribArray(this.vertAttribute),s=!1,!0):(this.destroy(),!1)}destroy(){this.buffer&&(this.gl.deleteBuffer(this.buffer),this.buffer=!1,this.vertAttribute=!1),this.iterator=0,this.components=this.dataComponents||2,this.data=[]}push(e,t,i,s){this.preAllocated&&(this.preAllocated[++this.iterator]=e,this.preAllocated[++this.iterator]=t,this.preAllocated[++this.iterator]=i,this.preAllocated[++this.iterator]=s)}render(e,t,i){let s=this.preAllocated?this.preAllocated.length:this.data.length;return!!this.buffer&&!!s&&((!e||e>s||e<0)&&(e=0),(!t||t>s)&&(t=s),!(e>=t)&&(i=i||"POINTS",this.gl.drawArrays(this.gl[i],e/this.components,(t-e)/this.components),!0))}},{getBoostClipRect:D}=E,{parse:I}=w(),{doc:G,win:O}=x(),{isNumber:B,isObject:V,merge:X,objectEach:F,pick:H}=x(),W={column:!0,columnrange:!0,bar:!0,area:!0,areaspline:!0,arearange:!0},j={scatter:!0,bubble:!0},q=["webgl","experimental-webgl","moz-webgl","webkit-3d"];class Y{static orthoMatrix(e,t){return[2/e,0,0,0,0,-(2/t),0,0,0,0,-2,0,-1,1,-1,1]}static seriesPointCount(e){let t,i,s;return e.boosted?(t=!!e.options.stacking,i=(e.getColumn("x").length?e.getColumn("x"):void 0)||e.options.xData||e.getColumn("x",!0),s=(t?e.data:i||e.options.data).length,"treemap"===e.type?s*=12:"heatmap"===e.type?s*=6:W[e.type]&&(s*=2),s):0}constructor(e){this.data=[],this.height=0,this.isInited=!1,this.markerData=[],this.series=[],this.textureHandles={},this.width=0,this.postRenderCallback=e,this.settings={pointSize:1,lineWidth:1,fillColor:"#AA00AA",useAlpha:!0,usePreallocated:!1,useGPUTranslations:!1,debug:{timeRendering:!1,timeSeriesProcessing:!1,timeSetup:!1,timeBufferCopy:!1,timeKDTree:!1,showSkipSummary:!1}}}getPixelRatio(){return this.settings.pixelRatio||O.devicePixelRatio||1}setOptions(e){"pixelRatio"in e||(e.pixelRatio=1),X(!0,this.settings,e)}allocateBuffer(e){let t=this.vbuffer,i=0;this.settings.usePreallocated&&(e.series.forEach(e=>{e.boosted&&(i+=Y.seriesPointCount(e))}),t&&t.allocate(i))}allocateBufferForSingleSeries(e){let t=this.vbuffer,i=0;this.settings.usePreallocated&&(e.boosted&&(i=Y.seriesPointCount(e)),t&&t.allocate(i))}clear(){let e=this.gl;e&&e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}pushSeriesData(e,t){let i=this.data,s=this.settings,r=this.vbuffer,o=e.pointArrayMap&&"low,high"===e.pointArrayMap.join(","),{chart:n,options:a,sorted:l,xAxis:h,yAxis:d}=e,f=!!a.stacking,u=a.data,g=e.xAxis.getExtremes(),m=g.min-(e.xAxis.minPointOffset||0),c=g.max+(e.xAxis.minPointOffset||0),p=e.yAxis.getExtremes(),b=p.min-(e.yAxis.minPointOffset||0),x=p.max+(e.yAxis.minPointOffset||0),A=(e.getColumn("x").length?e.getColumn("x"):void 0)||a.xData||e.getColumn("x",!0),y=(e.getColumn("y").length?e.getColumn("y"):void 0)||a.yData||e.getColumn("y",!0),v=(e.getColumn("z").length?e.getColumn("z"):void 0)||a.zData||e.getColumn("z",!0),P=!A||0===A.length,T=e.options.colorByPoint,C=a.connectNulls,k=e.points||!1,M=f?e.data:A||u,E={x:Number.MAX_VALUE,y:0},S={x:-Number.MAX_VALUE,y:0},w=void 0===n.index,U=W[e.type],R=a.zoneAxis||"y",_=a.zones||!1,L=a.threshold,z=this.getPixelRatio(),N=e.chart.plotWidth,D=!1,G=!1,O,B,X=0,F=!1,H,j,q,Y,Z=-1,K=!1,Q=!1,$,J=!1,ee=!1,et,ei=!1,es=!0,er=!0,eo=[],en=!1,ea=!1,el=0,eh=0;if(a.boostData&&a.boostData.length>0)return;a.gapSize&&(ea="value"!==a.gapUnit?a.gapSize*e.closestPointRange:a.gapSize),_&&_.length&&(eo=[],_.forEach((e,t)=>{if(e.color){let i=I(e.color).rgba;i[0]/=255,i[1]/=255,i[2]/=255,eo[t]=i,en||void 0!==e.value||(en=i)}}),en||(en=I(e.pointAttribs&&e.pointAttribs().fill||e.color).rgba,en[0]/=255,en[1]/=255,en[2]/=255)),n.inverted&&(N=e.chart.plotHeight),e.closestPointRangePx=Number.MAX_VALUE;let ed=e=>{e&&(t.colorData.push(e[0]),t.colorData.push(e[1]),t.colorData.push(e[2]),t.colorData.push(e[3]))},ef=(e,o,n,a=1,l)=>{ed(l),1!==z&&(!s.useGPUTranslations||t.skipTranslation)&&(e*=z,o*=z,a*=z),s.usePreallocated&&r?(r.push(e,o,+!!n,a),el+=4):(i.push(e),i.push(o),i.push(n?z:0),i.push(a))},eu=()=>{t.segments.length&&(t.segments[t.segments.length-1].to=i.length||el)},eg=()=>{t.segments.length&&t.segments[t.segments.length-1].from===(i.length||el)||(eu(),t.segments.push({from:i.length||el}))},em=(e,t,i,s,r)=>{ed(r),ef(e+i,t),ed(r),ef(e,t),ed(r),ef(e,t+s),ed(r),ef(e,t+s),ed(r),ef(e+i,t+s),ed(r),ef(e+i,t)};if(eg(),k&&k.length>0){t.skipTranslation=!0,t.drawMode="TRIANGLES",k[0].node&&k[0].node.levelDynamic&&k.sort((e,t)=>{if(e.node){if(e.node.levelDynamic>t.node.levelDynamic)return 1;if(e.node.levelDynamic<t.node.levelDynamic)return -1}return 0}),k.forEach(t=>{let i,s,r=t.plotY;if(void 0!==r&&!isNaN(r)&&null!==t.y&&t.shapeArgs){let{x:r=0,y:o=0,width:a=0,height:l=0}=t.shapeArgs;i=(s=n.styledMode?t.series.colorAttribs(t):s=t.series.pointAttribs(t))["stroke-width"]||0,et=I(s.fill).rgba,et[0]/=255,et[1]/=255,et[2]/=255,e.is("treemap")&&(i=i||1,B=I(s.stroke).rgba,B[0]/=255,B[1]/=255,B[2]/=255,em(r,o,a,l,B),i/=2),e.is("heatmap")&&n.inverted&&(r=h.len-r,o=d.len-o,a=-a,l=-l),em(r+i,o+i,a-2*i,l-2*i,et)}}),eu();return}for(;Z<M.length-1;){if(void 0===(q=M[++Z]))continue;if(w)break;let i=u&&u[Z];if(!P){let t;V(i,!0)&&i.color&&(t=I(i.color).rgba);let s=e.options.keys?.indexOf("color");Array.isArray(i)&&s&&"string"==typeof i[s]?t=I(i[s]).rgba:T&&n.options.colors&&(eh%=n.options.colors.length,t=I(n.options.colors[eh]).rgba),t&&((et=t)[0]=t[0]/255,et[1]=t[1]/255,et[2]=t[2]/255,et[3]=t[3]),eh++}if(P?(H=q[0],j=q[1],M[Z+1]&&(Q=M[Z+1][0]),M[Z-1]&&(K=M[Z-1][0]),q.length>=3&&(Y=q[2],q[2]>t.zMax&&(t.zMax=q[2]),q[2]<t.zMin&&(t.zMin=q[2]))):(H=q,j=y?.[Z],M[Z+1]&&(Q=M[Z+1]),M[Z-1]&&(K=M[Z-1]),v&&v.length&&(Y=v[Z],v[Z]>t.zMax&&(t.zMax=v[Z]),v[Z]<t.zMin&&(t.zMin=v[Z]))),!C&&(null===H||null===j)){eg();continue}if(Q&&Q>=m&&Q<=c&&(J=!0),K&&K>=m&&K<=c&&(ee=!0),o?(P&&(j=q.slice(1,3)),$=e.getColumn("low",!0)?.[Z],j=e.getColumn("high",!0)?.[Z]||0):f&&(H=q.x,$=(j=q.stackY)-q.y),null!=b&&null!=x&&(es=j>=b&&j<=x),!l&&!es||(H>c&&S.x<c&&(S.x=H,S.y=j),H<m&&E.x>m&&(E.x=H,E.y=j),null===j&&C))continue;if(null===j||!es&&M.length>1&&!J&&!ee){eg();continue}if((l&&(Q>=m||H>=m)&&(K<=c||H<=c)||!l&&H>=m&&H<=c)&&(ei=!0),ei||J||ee){if(ea&&H-K>ea&&eg(),_&&_.length){let e,t,i="x"===R?H:j;_.some((e,s)=>void 0!==e.value&&i<e.value&&(t=s,!0)),void 0!==t&&eo[t]&&(e=eo[t]),et=e||en||et}if(s.useGPUTranslations||(t.skipTranslation=!0,H=h.toPixels(H,!0),j=d.toPixels(j,!0),!(H>N)||"POINTS"!==t.drawMode)){if(t.hasMarkers&&ei&&!1!==D&&(e.closestPointRangePx=Math.min(e.closestPointRangePx,Math.abs(H-D))),!s.useGPUTranslations&&!s.usePreallocated&&D&&1>Math.abs(H-D)&&G&&1>Math.abs(j-G)){s.debug.showSkipSummary&&++X;continue}U&&(O=$||0,(!1===$||void 0===$)&&(O=j<0?j:0),(o||f)&&!d.logarithmic||(O=Math.max(null===L?b:L,b)),s.useGPUTranslations||(O=d.toPixels(O,!0)),ef(H,O,!1,0,et)),a.step&&!er&&ef(H,G,!1,2,et),ef(H,j,!1,"bubble"===e.type?Y||1:2,et),D=H,G=j,F=!0,er=!1}}}s.debug.showSkipSummary&&console.log("skipped points:",X);let ec=(e,i)=>{if(s.useGPUTranslations||(t.skipTranslation=!0,e.x=h.toPixels(e.x,!0),e.y=d.toPixels(e.y,!0)),i){this.data=[e.x,e.y,0,2].concat(this.data);return}ef(e.x,e.y,0,2)};!F&&!1!==C&&"line_strip"===e.drawMode&&(E.x<Number.MAX_VALUE&&ec(E,!0),S.x>-Number.MAX_VALUE&&ec(S)),eu()}pushSeries(e){let t=this.markerData,i=this.series,s=this.settings;i.length>0&&i[i.length-1].hasMarkers&&(i[i.length-1].markerTo=t.length),s.debug.timeSeriesProcessing&&console.time("building "+e.type+" series");let r={segments:[],markerFrom:t.length,colorData:[],series:e,zMin:Number.MAX_VALUE,zMax:-Number.MAX_VALUE,hasMarkers:!!e.options.marker&&!1!==e.options.marker.enabled,showMarkers:!0,drawMode:U[e.type]||"LINE_STRIP"};e.index>=i.length?i.push(r):i[e.index]=r,this.pushSeriesData(e,r),s.debug.timeSeriesProcessing&&console.timeEnd("building "+e.type+" series")}flush(){let e=this.vbuffer;this.data=[],this.markerData=[],this.series=[],e&&e.destroy()}setXAxis(e){let t=this.shader;if(!t)return;let i=this.getPixelRatio();t.setUniform("xAxisTrans",e.transA*i),t.setUniform("xAxisMin",e.min),t.setUniform("xAxisMax",e.max),t.setUniform("xAxisMinPad",e.minPixelPadding*i),t.setUniform("xAxisPointRange",e.pointRange),t.setUniform("xAxisLen",e.len*i),t.setUniform("xAxisPos",e.pos*i),t.setUniform("xAxisCVSCoord",!e.horiz),t.setUniform("xAxisIsLog",!!e.logarithmic),t.setUniform("xAxisReversed",!!e.reversed)}setYAxis(e){let t=this.shader;if(!t)return;let i=this.getPixelRatio();t.setUniform("yAxisTrans",e.transA*i),t.setUniform("yAxisMin",e.min),t.setUniform("yAxisMax",e.max),t.setUniform("yAxisMinPad",e.minPixelPadding*i),t.setUniform("yAxisPointRange",e.pointRange),t.setUniform("yAxisLen",e.len*i),t.setUniform("yAxisPos",e.pos*i),t.setUniform("yAxisCVSCoord",!e.horiz),t.setUniform("yAxisIsLog",!!e.logarithmic),t.setUniform("yAxisReversed",!!e.reversed)}setThreshold(e,t){let i=this.shader;i&&(i.setUniform("hasThreshold",e),i.setUniform("translatedThreshold",t))}renderChart(e){let t=this.gl,i=this.settings,s=this.shader,r=this.vbuffer,o=this.getPixelRatio();if(!e)return!1;this.width=e.chartWidth*o,this.height=e.chartHeight*o;let n=this.height,a=this.width;if(!t||!s||!a||!n)return!1;i.debug.timeRendering&&console.time("gl rendering"),t.canvas.width=a,t.canvas.height=n,s.bind(),t.viewport(0,0,a,n),s.setPMatrix(Y.orthoMatrix(a,n)),i.lineWidth>1&&!x().isMS&&t.lineWidth(i.lineWidth),r&&(r.build(this.data,"aVertexPosition",4),r.bind()),s.setInverted(e.inverted),this.series.forEach((a,l)=>{let h=a.series.options,d=h.marker,f=void 0!==h.lineWidth?h.lineWidth:1,u=h.threshold,g=B(u),m=a.series.yAxis.getThreshold(u),c=H(h.marker?h.marker.enabled:null,!!a.series.xAxis.isRadial||null,a.series.closestPointRangePx>2*((h.marker?h.marker.radius:10)||10)),p=this.textureHandles[d&&d.symbol||a.series.symbol]||this.textureHandles.circle,b,x,A,y=[];if(0!==a.segments.length&&a.segments[0].from!==a.segments[0].to&&(p.isReady&&(t.bindTexture(t.TEXTURE_2D,p.handle),s.setTexture(p.handle)),e.styledMode?a.series.markerGroup===a.series.chart.boost?.markerGroup?(delete a.series.markerGroup,a.series.markerGroup=a.series.plotGroup("markerGroup","markers","visible",1,e.seriesGroup).addClass("highcharts-tracker"),A=a.series.markerGroup.getStyle("fill"),a.series.markerGroup.destroy(),a.series.markerGroup=a.series.chart.boost?.markerGroup):A=a.series.markerGroup?.getStyle("fill"):(A="POINTS"===a.drawMode&&a.series.pointAttribs&&a.series.pointAttribs().fill||a.series.color,h.colorByPoint&&(A=a.series.chart.options.colors[l])),a.series.fillOpacity&&h.fillOpacity&&(A=new(w())(A).setOpacity(H(h.fillOpacity,1)).get()),y=I(A).rgba,i.useAlpha||(y[3]=1),"add"===h.boostBlending?(t.blendFunc(t.SRC_ALPHA,t.ONE),t.blendEquation(t.FUNC_ADD)):"mult"===h.boostBlending||"multiply"===h.boostBlending?t.blendFunc(t.DST_COLOR,t.ZERO):"darken"===h.boostBlending?(t.blendFunc(t.ONE,t.ONE),t.blendEquation(t.FUNC_MIN)):t.blendFuncSeparate(t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA,t.ONE,t.ONE_MINUS_SRC_ALPHA),s.reset(),a.colorData.length>0?(s.setUniform("hasColor",1),(x=new N(t,s)).build(Array(a.segments[0].from).concat(a.colorData),"aColor",4),x.bind()):(s.setUniform("hasColor",0),t.disableVertexAttribArray(t.getAttribLocation(s.getProgram(),"aColor"))),s.setColor(y),this.setXAxis(a.series.xAxis),this.setYAxis(a.series.yAxis),this.setThreshold(g,m),"POINTS"===a.drawMode&&s.setPointSize(2*H(h.marker&&h.marker.radius,.5)*o),s.setSkipTranslation(a.skipTranslation),"bubble"===a.series.type&&s.setBubbleUniforms(a.series,a.zMin,a.zMax,o),s.setDrawAsCircle(j[a.series.type]||!1),r)){if(f>0||"LINE_STRIP"!==a.drawMode){let{x:i,y:s,width:o,height:l}=D(e,a.series);for(t.enable(t.SCISSOR_TEST),t.scissor(i,n-s-l,o,l),b=0;b<a.segments.length;b++)r.render(a.segments[b].from,a.segments[b].to,a.drawMode);t.disable(t.SCISSOR_TEST)}if(a.hasMarkers&&c)for(s.setPointSize(2*H(h.marker&&h.marker.radius,5)*o),s.setDrawAsCircle(!0),b=0;b<a.segments.length;b++)r.render(a.segments[b].from,a.segments[b].to,"POINTS")}}),i.debug.timeRendering&&console.timeEnd("gl rendering"),this.postRenderCallback&&this.postRenderCallback(this),this.flush()}render(e){if(this.clear(),e.renderer.forExport)return this.renderChart(e);this.isInited?this.renderChart(e):setTimeout(()=>{this.render(e)},1)}setSize(e,t){let i=this.shader;i&&(this.width!==e||this.height!==t)&&(this.width=e,this.height=t,i.bind(),i.setPMatrix(Y.orthoMatrix(e,t)))}init(e,t){let i=this.settings;if(this.isInited=!1,!e)return!1;i.debug.timeSetup&&console.time("gl setup");for(let t=0;t<q.length&&(this.gl=e.getContext(q[t],{}),!this.gl);++t);let s=this.gl;if(!s)return!1;t||this.flush(),s.enable(s.BLEND),s.blendFunc(s.SRC_ALPHA,s.ONE_MINUS_SRC_ALPHA),s.disable(s.DEPTH_TEST),s.depthFunc(s.LESS);let r=this.shader=new z(s);if(!r)return!1;this.vbuffer=new N(s,r);let o=(e,t)=>{let i={isReady:!1,texture:G.createElement("canvas"),handle:s.createTexture()},r=i.texture.getContext("2d");this.textureHandles[e]=i,i.texture.width=512,i.texture.height=512,r.mozImageSmoothingEnabled=!1,r.webkitImageSmoothingEnabled=!1,r.msImageSmoothingEnabled=!1,r.imageSmoothingEnabled=!1,r.strokeStyle="rgba(255, 255, 255, 0)",r.fillStyle="#FFF",t(r);try{s.activeTexture(s.TEXTURE0),s.bindTexture(s.TEXTURE_2D,i.handle),s.texImage2D(s.TEXTURE_2D,0,s.RGBA,s.RGBA,s.UNSIGNED_BYTE,i.texture),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_S,s.CLAMP_TO_EDGE),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_T,s.CLAMP_TO_EDGE),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MAG_FILTER,s.LINEAR),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MIN_FILTER,s.LINEAR),s.bindTexture(s.TEXTURE_2D,null),i.isReady=!0}catch{}};return o("circle",e=>{e.beginPath(),e.arc(256,256,256,0,2*Math.PI),e.stroke(),e.fill()}),o("square",e=>{e.fillRect(0,0,512,512)}),o("diamond",e=>{e.beginPath(),e.moveTo(256,0),e.lineTo(512,256),e.lineTo(256,512),e.lineTo(0,256),e.lineTo(256,0),e.fill()}),o("triangle",e=>{e.beginPath(),e.moveTo(0,512),e.lineTo(256,0),e.lineTo(512,512),e.lineTo(0,512),e.fill()}),o("triangle-down",e=>{e.beginPath(),e.moveTo(0,0),e.lineTo(256,512),e.lineTo(512,0),e.lineTo(0,0),e.fill()}),this.isInited=!0,i.debug.timeSetup&&console.timeEnd("gl setup"),!0}destroy(){let e=this.gl,t=this.shader,i=this.vbuffer;this.flush(),i&&i.destroy(),t&&t.destroy(),e&&(F(this.textureHandles,t=>{t.handle&&e.deleteTexture(t.handle)}),e.canvas.width=1,e.canvas.height=1)}}(f=u||(u={})).setLength=function(e,t,i){return Array.isArray(e)?(e.length=t,e):e[i?"subarray":"slice"](0,t)},f.splice=function(e,t,i,s,r=[]){if(Array.isArray(e))return Array.isArray(r)||(r=Array.from(r)),{removed:e.splice(t,i,...r),array:e};let o=Object.getPrototypeOf(e).constructor,n=e[s?"subarray":"slice"](t,t+i),a=new o(e.length-i+r.length);return a.set(e.subarray(0,t),0),a.set(r,t),a.set(e.subarray(t+i),t+r.length),{removed:n,array:a}},f.convertToNumber=function(e,t){switch(typeof e){case"boolean":return+!!e;case"number":return isNaN(e)&&!t?null:e;default:return isNaN(e=parseFloat(`${e??""}`))&&!t?null:e}};let{setLength:Z,splice:K}=u,{fireEvent:Q,objectEach:$,uniqueKey:J}=x(),ee=class{constructor(e={}){this.autoId=!e.id,this.columns={},this.id=e.id||J(),this.rowCount=0,this.versionTag=J();let t=0;$(e.columns||{},(e,i)=>{this.columns[i]=e.slice(),t=Math.max(t,e.length)}),this.applyRowCount(t)}applyRowCount(e){this.rowCount=e,$(this.columns,(t,i)=>{t.length!==e&&(this.columns[i]=Z(t,e))})}deleteRows(e,t=1){if(t>0&&e<this.rowCount){let i=0;$(this.columns,(s,r)=>{this.columns[r]=K(s,e,t).array,i=s.length}),this.rowCount=i}Q(this,"afterDeleteRows",{rowIndex:e,rowCount:t}),this.versionTag=J()}getColumn(e,t){return this.columns[e]}getColumns(e,t){return(e||Object.keys(this.columns)).reduce((e,t)=>(e[t]=this.columns[t],e),{})}getRow(e,t){return(t||Object.keys(this.columns)).map(t=>this.columns[t]?.[e])}setColumn(e,t=[],i=0,s){this.setColumns({[e]:t},i,s)}setColumns(e,t,i){let s=this.rowCount;$(e,(e,t)=>{this.columns[t]=e.slice(),s=e.length}),this.applyRowCount(s),i?.silent||(Q(this,"afterSetColumns"),this.versionTag=J())}setRow(e,t=this.rowCount,i,s){let{columns:r}=this,o=i?this.rowCount+1:t+1,n=Object.keys(e);if(s?.addColumns!==!1)for(let e=0,t=n.length;e<t;e++){let t=n[e];r[t]||(r[t]=[])}$(r,(n,a)=>{n||s?.addColumns===!1||(n=Array(o)),n&&(i?n=K(n,t,0,!0,[e[a]??null]).array:n[t]=e[a]??null,r[a]=n)}),o>this.rowCount&&this.applyRowCount(o),s?.silent||(Q(this,"afterSetRows"),this.versionTag=J())}getModified(){return this.modified||this}},{getBoostClipRect:et,isChartSeriesBoosting:ei}=E,{getOptions:es}=x(),{composed:er,doc:eo,noop:en,win:ea}=x(),{addEvent:el,destroyObjectProperties:eh,error:ed,extend:ef,fireEvent:eu,isArray:eg,isNumber:em,pick:ec,pushUnique:ep,wrap:eb,defined:ex}=x();function eA(e,t){let i=t.boost;e&&i&&i.target&&i.canvas&&!ei(t.chart)&&e.allocateBufferForSingleSeries(t)}function ey(e){return ec(e&&e.options&&e.options.boost&&e.options.boost.enabled,!0)}function ev(e,t){let i=e.constructor,r=e.seriesGroup||t.group,o=e.chartWidth,n=e.chartHeight,a=e,l="u">typeof SVGForeignObjectElement,h=!1;ei(e)?a=e:(a=t,h=!!(t.options.events?.click||t.options.point?.events?.click));let d=a.boost=a.boost||{};if(l=!1,s||(s=eo.createElement("canvas")),!d.target&&(d.canvas=s,e.renderer.forExport||!l?(a.renderTarget=d.target=e.renderer.image("",0,0,o,n).addClass("highcharts-boost-canvas").add(r),d.clear=function(){d.target.attr({href:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="})},d.copy=function(){d.resize(),d.target.attr({href:d.canvas.toDataURL("image/png")})}):(d.targetFo=e.renderer.createElement("foreignObject").add(r),a.renderTarget=d.target=eo.createElement("canvas"),d.targetCtx=d.target.getContext("2d"),d.targetFo.element.appendChild(d.target),d.clear=function(){d.target.width=d.canvas.width,d.target.height=d.canvas.height},d.copy=function(){d.target.width=d.canvas.width,d.target.height=d.canvas.height,d.targetCtx.drawImage(d.canvas,0,0)}),d.resize=function(){o=e.chartWidth,n=e.chartHeight,(d.targetFo||d.target).attr({x:0,y:0,width:o,height:n}).css({pointerEvents:h?void 0:"none",mixedBlendMode:"normal",opacity:1}).addClass(h?"highcharts-tracker":""),a instanceof i&&a.boost?.markerGroup?.translate(e.plotLeft,e.plotTop)},d.clipRect=e.renderer.clipRect(),(d.targetFo||d.target).attr({zIndex:t.options.zIndex}),a instanceof i&&(a.boost.markerGroup=a.renderer.g().add(r).translate(t.xAxis.pos,t.yAxis.pos))),d.canvas.width=o,d.canvas.height=n,d.clipRect){let t=et(e,a);d.clipRect.attr(t),e.navigator||t.width!==e.clipBox.width||t.height!==e.clipBox.height?(d.targetFo||d.target).clip(d.clipRect):r?.clip(e.renderer.clipRect(t.x-4,t.y,t.width+4,t.height+4))}return d.resize(),d.clear(),!d.wgl&&(d.wgl=new Y(e=>{e.settings.debug.timeBufferCopy&&console.time("buffer copy"),d.copy(),e.settings.debug.timeBufferCopy&&console.timeEnd("buffer copy")}),d.wgl.init(d.canvas)||ed("[highcharts boost] - unable to init WebGL renderer"),d.wgl.setOptions(e.options.boost||{}),a instanceof i&&d.wgl.allocateBuffer(e)),d.wgl.setSize(o,n),d.wgl}function eP(e){let t=e.points;if(t){let e,i;for(i=0;i<t.length;i+=1)(e=t[i])&&e.destroyElements&&e.destroyElements()}for(let t of(["graph","area","tracker"].forEach(t=>{let i=e[t];i&&(e[t]=i.destroy())}),e.zones))eh(t,void 0,!0)}function eT(e,t,i,s,r,o){let n=(r=r||0)+(s=s||3e3),a=!0;for(;a&&r<n&&r<e.length;)a=t(e[r],r),++r;a&&(r<e.length?o?eT(e,t,i,s,r,o):ea.requestAnimationFrame?ea.requestAnimationFrame(function(){eT(e,t,i,s,r)}):setTimeout(eT,0,e,t,i,s,r):i&&i())}function eC(e,t){let i=e.options,s=e.dataTable.getModified().rowCount,r=e.xAxis&&e.xAxis.options,o=e.yAxis&&e.yAxis.options,n=e.colorAxis&&e.colorAxis.options;return s>ec(i.boostThreshold,Number.MAX_VALUE)&&em(o.min)&&em(o.max)&&(!t||em(r.min)&&em(r.max))&&(!n||em(n.min)&&em(n.max))}let ek=(e,t)=>!e.forceCrop&&(ei(e.chart)||(t?t.length:0)>=ec(e.options.boostThreshold,Number.MAX_VALUE));function eM(){let e=this,t=e.chart;t.boost&&t.boost.markerGroup===e.markerGroup&&(e.markerGroup=void 0),t.hoverPoints&&(t.hoverPoints=t.hoverPoints.filter(function(t){return t.series===e})),t.hoverPoint&&t.hoverPoint.series===e&&(t.hoverPoint=void 0)}function eE(){let e=this.boost;e&&e.canvas&&e.target&&(e.wgl&&e.wgl.clear(),e.clear&&e.clear())}function eS(e){let t=e.boost;t&&t.canvas&&t.target&&t.wgl&&!ei(e.chart)&&t.wgl.render(e.chart)}function ew(e,t){let i=e.options,s=e.xAxis,r=e.pointClass;if(t instanceof r)return t;let o=i.data,n=e.is("scatter"),a=(n&&e.getColumn("x",!0).length?e.getColumn("x",!0):void 0)||(e.getColumn("x").length?e.getColumn("x"):void 0)||i.xData||e.getColumn("x",!0)||!1,l=e.getColumn("y",!0)||i.yData||!1,h=t.i,d=o?.[h]?.color,f=new r(e,n&&a&&l?[a[h],l[h]]:(eg(o)?o:[])[h],a?a[h]:void 0);if(n&&i?.keys?.length){let e=i.keys;for(let t=e.length-1;t>-1;t--)f[e[t]]=o[h][t]}return f.category=ec(s.categories?s.categories[f.x]:f.x,f.x),f.key=f.name??f.category,f.dist=t.dist,f.distX=t.distX,f.plotX=t.plotX,f.plotY=t.plotY,f.index=h,f.percentage=t.percentage,f.isInside=e.isPointInside(f),d&&(f.color=d),f}function eU(e){let{options:t,xAxis:i,yAxis:s}=this;if(!this.isDirty&&!i.isDirty&&!s.isDirty&&!e)return!1;this.yAxis.setTickInterval();let r=t.boostThreshold||0,o=t.cropThreshold,n=this.getColumn("x"),a=i.getExtremes(),l=a.max??Number.MAX_VALUE,h=a.min??-Number.MAX_VALUE,d=this.getColumn("y"),f=s.getExtremes(),u=f.max??Number.MAX_VALUE,g=f.min??-Number.MAX_VALUE;if(!this.boosted&&i.old&&s.old&&h>=(i.old.min??-Number.MAX_VALUE)&&l<=(i.old.max??Number.MAX_VALUE)&&g>=(s.old.min??-Number.MAX_VALUE)&&u<=(s.old.max??Number.MAX_VALUE))return this.dataTable.getModified().setColumns({x:n,y:d}),!0;let m=this.dataTable.rowCount;if(!r||m<r||o&&!this.forceCrop&&!this.getExtremesFromAll&&!t.getExtremesFromAll&&m<o)return this.dataTable.getModified().setColumns({x:n,y:d}),!0;let c=[],p=[],b=[],x=!(em(a.max)||em(a.min)),A=!(em(f.max)||em(f.min)),y=!1,v,P=n[0],T=n[0],C,k=d?.[0],M=d?.[0];for(let e=0,t=n.length;e<t;++e)v=n[e],C=d?.[e],v>=h&&v<=l&&C>=g&&C<=u?(c.push({x:v,y:C}),p.push(v),b.push(C),x&&(P=Math.max(P,v),T=Math.min(T,v)),A&&(k=Math.max(k,C),M=Math.min(M,C))):y=!0;return x&&(i.dataMax=Math.max(P,i.dataMax||0),i.dataMin=Math.min(T,i.dataMin||0)),A&&(s.dataMax=Math.max(k,s.dataMax||0),s.dataMin=Math.min(M,s.dataMin||0)),this.cropped=y,this.cropStart=0,y&&!this.dataTable.modified&&(this.dataTable.modified=new ee),this.dataTable.getModified().setColumns({x:p,y:b}),ek(this,p)||(this.processedData=c),!0}function eR(){let e=this.options||{},t=this.chart,s=t.boost,r=this.boost,o=this.xAxis,n=this.yAxis,a=e.xData||this.getColumn("x",!0),l=e.yData||this.getColumn("y",!0),h=this.getColumn("low",!0),d=this.getColumn("high",!0),f=this.processedData||e.data,u=o.getExtremes(),g=u.min-(o.minPointOffset||0),m=u.max+(o.minPointOffset||0),c=n.getExtremes(),p=c.min-(n.minPointOffset||0),b=c.max+(n.minPointOffset||0),x={},A=!!this.sampling,y=e.enableMouseTracking,v=e.threshold,P=this.pointArrayMap&&"low,high"===this.pointArrayMap.join(","),T=!!e.stacking,C=this.cropStart||0,k=this.requireSorting,M=!a,E="x"===e.findNearestPointBy,S=(this.getColumn("x").length?this.getColumn("x"):void 0)||this.options.xData||this.getColumn("x",!0),w=ec(e.lineWidth,1),U=e.nullInteraction&&p,R=t.tooltip,_=!1,L,z=n.getThreshold(v),N,D,I,G;if(!this.boosted||(this.points?.forEach(e=>{e?.destroyElements?.()}),this.points=[],R&&!R.isHidden?(t.hoverPoint?.series===this||t.hoverPoints?.some(e=>e.series===this))&&(t.hoverPoint=t.hoverPoints=void 0,R.hide(0)):t.hoverPoints&&(t.hoverPoints=t.hoverPoints.filter(e=>e.series!==this)),o.isPanning||n.isPanning)||(_=ev(t,this),t.boosted=!0,!this.visible))return;(this.points||this.graph)&&eP(this),ei(t)?(this.markerGroup&&this.markerGroup!==s?.markerGroup&&this.markerGroup.destroy(),this.markerGroup=s?.markerGroup,r&&r.target&&(this.renderTarget=r.target=r.target.destroy())):(this.markerGroup===s?.markerGroup&&(this.markerGroup=void 0),this.markerGroup=this.plotGroup("markerGroup","markers","visible",1,t.seriesGroup).addClass("highcharts-tracker"));let O=this.points=[],B=(e,s,r,a)=>{let l=!!S&&S[C+r],h=e=>{t.inverted&&(e=o.len-e,s=n.len-s),O.push({destroy:en,x:l,clientX:e,plotX:e,plotY:s,i:C+r,percentage:a})};e=Math.ceil(e),i=E?e:e+","+s,y&&(x[i]?l===S[S.length-1]&&(O.length--,h(e)):(x[i]=!0,h(e)))};this.buildKDTree=en,eu(this,"renderCanvas"),s&&w>1&&this.is("line")&&(s.lineWidthFilter?.remove(),s.lineWidthFilter=t.renderer.definition({tagName:"filter",children:[{tagName:"feMorphology",attributes:{operator:"dilate",radius:.25*w}}],attributes:{id:"linewidth"}}),(r?.target||s.target)?.attr({filter:"url(#linewidth)"})),_&&(eA(_,this),_.pushSeries(this),eS(this));let V=_.settings,X=()=>{eu(this,"renderedCanvas"),delete this.buildKDTree,this.options&&this.buildKDTree(),V.debug.timeKDTree&&console.timeEnd("kd tree building")};t.renderer.forExport||(V.debug.timeKDTree&&console.time("kd tree building"),eT(T?this.data.slice(C):a||f,function(e,i){let s=void 0===t.index,r,a,f,u,c,x=!1,y=!0;return!ex(e)||(!s&&(M?(r=e[0],a=e[1]):(r=e,a=l[i]??U??null),P?(M&&(a=e.slice(1,3)),x=h[i],a=d[i]):T&&(r=e.x,x=(a=e.stackY)-e.y,c=e.percentage),k||(y=(a||0)>=p&&a<=b),null!==a&&r>=g&&r<=m&&y&&(f=o.toPixels(r,!0),A?((void 0===I||f===L)&&(P||(x=a),(void 0===G||a>D)&&(D=a,G=i),(void 0===I||x<N)&&(N=x,I=i)),E&&f===L||(void 0!==I&&(u=n.toPixels(D,!0),z=n.toPixels(N,!0),B(f,u,G,c),z!==u&&B(f,z,I,c)),I=G=void 0,L=f)):B(f,u=Math.ceil(n.toPixels(a,!0)),i,c))),!s)},X))}function e_(e){let t=!0;if(this.chart.options&&this.chart.options.boost&&(t=void 0===this.chart.options.boost.enabled||this.chart.options.boost.enabled),!t||!this.boosted)return e.call(this);this.chart.boosted=!0;let i=ev(this.chart,this);i&&(eA(i,this),i.pushSeries(this)),eS(this)}function eL(e){if(this.boosted){if(eC(this))return{};if(this.xAxis.isPanning||this.yAxis.isPanning)return this}return e.apply(this,[].slice.call(arguments,1))}function ez(e){let t=this.options.data;if(ey(this.chart)&&y[this.type]){let s=this.is("scatter")&&!this.is("bubble")&&!this.is("treemap")&&!this.is("heatmap");if(!ek(this,t)||s||this.is("treemap")||this.options.stacking||!eC(this,!0)){if(this.boosted&&(this.xAxis?.isPanning||this.yAxis?.isPanning))return;s&&"treegrid"!==this.yAxis.type?eU.call(this,arguments[1]):e.apply(this,[].slice.call(arguments,1)),t=this.getColumn("x",!0)}if(this.boosted=ek(this,t),this.boosted){let e;this.options.data?.length&&(em(e=this.getFirstValidPoint(this.options.data))||eg(e)||this.is("treemap")||ed(12,!1,this.chart));var i=this;i.boost=i.boost||{getPoint:e=>ew(i,e)};let t=i.boost.altered=[];if(["allowDG","directTouch","stickyTracking"].forEach(e=>{t.push({prop:e,val:i[e],own:Object.hasOwnProperty.call(i,e)})}),i.allowDG=!1,i.directTouch=!1,i.stickyTracking=!0,i.finishedAnimating=!0,i.labelBySeries&&(i.labelBySeries=i.labelBySeries.destroy()),i.is("scatter")&&!i.is("treemap")&&i.data.length){for(let e of i.data)e?.destroy?.();i.data.length=0,i.points.length=0,delete i.processedData}}else!function(e){let t=e.boost,i=e.chart,s=i.boost;if(s?.markerGroup)for(let e of(s.markerGroup.destroy(),s.markerGroup=void 0,i.series))e.markerGroup=void 0,e.markerGroup=e.plotGroup("markerGroup","markers","visible",1,i.seriesGroup).addClass("highcharts-tracker");t&&((t.altered||[]).forEach(t=>{t.own?e[t.prop]=t.val:delete e[t.prop]}),t.clear&&t.clear()),(i.seriesGroup||e.group)?.clip()}(this)}else e.apply(this,[].slice.call(arguments,1))}function eN(e){let t=e.apply(this,[].slice.call(arguments,1));return this.boost&&t?this.boost.getPoint(t):t}let eD=function(e,t,i,s){if(ep(er,"Boost.Series")){let r=es().plotOptions,o=e.prototype;if(el(e,"destroy",eM),el(e,"hide",eE),s&&(o.renderCanvas=eR),eb(o,"getExtremes",eL),eb(o,"processData",ez),eb(o,"searchPoint",eN),["translate","generatePoints","drawTracker","drawPoints","render"].forEach(e=>(function(e,t,i){function s(e){let t=this.options.stacking&&("translate"===i||"generatePoints"===i);this.boosted&&!t&&ey(this.chart)&&"heatmap"!==this.type&&"treemap"!==this.type&&y[this.type]&&0!==this.options.boostThreshold?"render"===i&&this.renderCanvas&&this.renderCanvas():e.call(this)}if(eb(e,i,s),"translate"===i)for(let e of["column","arearange","columnrange","heatmap","treemap"])t[e]&&eb(t[e].prototype,i,s)})(o,t,e)),eb(i.prototype,"firePointEvent",function(e,t,i){if("click"===t&&this.series.boosted){let e=i.point;if((e.dist||e.distX)>=(e.series.options.marker?.radius??10))return}return e.apply(this,[].slice.call(arguments,1))}),A.forEach(e=>{let i=r[e];i&&(i.boostThreshold=5e3,i.boostData=[],t[e].prototype.fillOpacity=!0)}),s){let{area:e,areaspline:i,bubble:s,column:r,heatmap:o,scatter:n,treemap:a}=t;if(e&&ef(e.prototype,{fill:!0,fillOpacity:!0,sampling:!0}),i&&ef(i.prototype,{fill:!0,fillOpacity:!0,sampling:!0}),s){let e=s.prototype;delete e.buildKDTree,eb(e,"markerAttribs",function(e){return!this.boosted&&e.apply(this,[].slice.call(arguments,1))})}r&&ef(r.prototype,{fill:!0,sampling:!0}),n&&(n.prototype.fill=!0),[o,a].forEach(e=>{e&&eb(e.prototype,"drawPoints",e_)})}}return e},eI={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",feldspar:"#d19275",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslateblue:"#8470ff",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",violetred:"#d02090",wheat:"#f5deb3",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},{doc:eG,win:eO}=x(),{addEvent:eB,error:eV}=x(),eX=["webgl","experimental-webgl","moz-webgl","webkit-3d"];function eF(){let e;if(void 0!==eO.WebGLRenderingContext){e=eG.createElement("canvas");for(let t=0;t<eX.length;++t)try{if(null!=e.getContext(eX[t]))return!0}catch{}}return!1}let eH=x();eH.hasWebGLSupport=eF,o=eH.Chart,n=eH.Axis,a=eH.Series,l=eH.seriesTypes,h=eH.Point,d=eH.Color,(r=eF())||(void 0!==x().initCanvasBoost?x().initCanvasBoost():eV(26)),d&&!d.names.lightgoldenrodyellow&&(d.names={...d.names,...eI}),E.compose(o,r),eD(a,l,h,r),eB(n,"setExtremes",function(e){for(let t of[this.chart,...this.series].map(e=>e.renderTarget).filter(Boolean)){let{horiz:i,pos:s}=this,r=i?"scaleX":"scaleY",o=i?"translateX":"translateY",n=t?.[r]??1,a=1,l=0,h=1,d="none";this.isPanning&&(a=(e.scale??1)*n,l=(t?.[o]||0)-a*(e.move||0)+n*s-a*s,h=.7,d="blur(3px)"),t?.attr({[r]:a,[o]:l}).css({transition:"250ms filter, 250ms opacity",filter:d,opacity:h})}});let eW=x();return p.default})());