boost.js 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*
  2. Highcharts JS v8.2.0 (2020-08-20)
  3. Boost module
  4. (c) 2010-2019 Highsoft AS
  5. Author: Torstein Honsi
  6. License: www.highcharts.com/license
  7. This is a Highcharts module that draws long data series on a canvas in order
  8. to increase performance of the initial load time and tooltip responsiveness.
  9. Compatible with WebGL compatible browsers (not IE < 11).
  10. If this module is taken in as part of the core
  11. - All the loading logic should be merged with core. Update styles in the
  12. core.
  13. - Most of the method wraps should probably be added directly in parent
  14. methods.
  15. Notes for boost mode
  16. - Area lines are not drawn
  17. - Lines are not drawn on scatter charts
  18. - Zones and negativeColor don't work
  19. - Dash styles are not rendered on lines.
  20. - Columns are always one pixel wide. Don't set the threshold too low.
  21. - Disable animations
  22. - Marker shapes are not supported: markers will always be circles, except
  23. heatmap series, where markers are always rectangles.
  24. Optimizing tips for users
  25. - Set extremes (min, max) explicitly on the axes in order for Highcharts to
  26. avoid computing extremes.
  27. - Set enableMouseTracking to false on the series to improve total rendering
  28. time.
  29. - The default threshold is set based on one series. If you have multiple,
  30. dense series, the combined number of points drawn gets higher, and you may
  31. want to set the threshold lower in order to use optimizations.
  32. - If drawing large scatter charts, it's beneficial to set the marker radius
  33. to a value less than 1. This is to add additional spacing to make the chart
  34. more readable.
  35. - If the value increments on both the X and Y axis aren't small, consider
  36. setting useGPUTranslations to true on the boost settings object. If you do
  37. this and the increments are small (e.g. datetime axis with small time
  38. increments) it may cause rendering issues due to floating point rounding
  39. errors, so your millage may vary.
  40. Settings
  41. There are two ways of setting the boost threshold:
  42. - Per series: boost based on number of points in individual series
  43. - Per chart: boost based on the number of series
  44. To set the series boost threshold, set seriesBoostThreshold on the chart
  45. object.
  46. To set the series-specific threshold, set boostThreshold on the series
  47. object.
  48. In addition, the following can be set in the boost object:
  49. {
  50. //Wether or not to use alpha blending
  51. useAlpha: boolean - default: true
  52. //Set to true to perform translations on the GPU.
  53. //Much faster, but may cause rendering issues
  54. //when using values far from 0 due to floating point
  55. //rounding issues
  56. useGPUTranslations: boolean - default: false
  57. //Use pre-allocated buffers, much faster,
  58. //but may cause rendering issues with some data sets
  59. usePreallocated: boolean - default: false
  60. }
  61. */
  62. (function(b){"object"===typeof module&&module.exports?(b["default"]=b,module.exports=b):"function"===typeof define&&define.amd?define("highcharts/modules/boost",["highcharts"],function(n){b(n);b.Highcharts=n;return b}):b("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(b){function n(b,l,E,m){b.hasOwnProperty(l)||(b[l]=m.apply(null,E))}b=b?b._modules:{};n(b,"Extensions/Boost/Boostables.js",[],function(){return"area arearange column columnrange bar line scatter heatmap bubble treemap".split(" ")});
  63. n(b,"Extensions/Boost/BoostableMap.js",[b["Extensions/Boost/Boostables.js"]],function(b){var v={};b.forEach(function(b){v[b]=1});return v});n(b,"Extensions/Boost/WGLShader.js",[b["Core/Utilities.js"]],function(b){var v=b.clamp,E=b.error,m=b.pick;return function(d){function b(){k.length&&E("[highcharts boost] shader error - "+k.join("\n"))}function g(c,a){var e=d.createShader("vertex"===a?d.VERTEX_SHADER:d.FRAGMENT_SHADER);d.shaderSource(e,c);d.compileShader(e);return d.getShaderParameter(e,d.COMPILE_STATUS)?
  64. e:(k.push("when compiling "+a+" shader:\n"+d.getShaderInfoLog(e)),!1)}function z(){function c(c){return d.getUniformLocation(a,c)}var H=g("#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 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 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 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 && 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}",
  65. "vertex"),e=g("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;\nif (hasColor) {\ncol = vColor;\n}\nif (isCircle) {\ntcol = texture2D(uSampler, gl_PointCoord.st);\ncol *= tcol;\nif (tcol.r < 0.0) {\ndiscard;\n} else {\ngl_FragColor = col;\n}\n} else {\ngl_FragColor = col;\n}\n}","fragment");if(!H||!e)return a=!1,
  66. b(),!1;a=d.createProgram();d.attachShader(a,H);d.attachShader(a,e);d.linkProgram(a);if(!d.getProgramParameter(a,d.LINK_STATUS))return k.push(d.getProgramInfoLog(a)),b(),a=!1;d.useProgram(a);d.bindAttribLocation(a,0,"aVertexPosition");w=c("uPMatrix");p=c("pSize");f=c("fillColor");B=c("isBubble");O=c("bubbleSizeAbs");h=c("bubbleSizeByArea");I=c("uSampler");l=c("skipTranslation");G=c("isCircle");t=c("isInverted");return!0}function q(c,k){d&&a&&(c=r[c]=r[c]||d.getUniformLocation(a,c),d.uniform1f(c,k))}
  67. var r={},a,w,p,f,B,O,h,l,G,t,k=[],I;return d&&!z()?!1:{psUniform:function(){return p},pUniform:function(){return w},fillColorUniform:function(){return f},setBubbleUniforms:function(c,k,e){var t=c.options,b=Number.MAX_VALUE,p=-Number.MAX_VALUE;d&&a&&"bubble"===c.type&&(b=m(t.zMin,v(k,!1===t.displayNegative?t.zThreshold:-Number.MAX_VALUE,b)),p=m(t.zMax,Math.max(p,e)),d.uniform1i(B,1),d.uniform1i(G,1),d.uniform1i(h,"width"!==c.options.sizeBy),d.uniform1i(O,c.options.sizeByAbsoluteValue),q("bubbleZMin",
  68. b),q("bubbleZMax",p),q("bubbleZThreshold",c.options.zThreshold),q("bubbleMinSize",c.minPxSize),q("bubbleMaxSize",c.maxPxSize))},bind:function(){d&&a&&d.useProgram(a)},program:function(){return a},create:z,setUniform:q,setPMatrix:function(c){d&&a&&d.uniformMatrix4fv(w,!1,c)},setColor:function(c){d&&a&&d.uniform4f(f,c[0]/255,c[1]/255,c[2]/255,c[3])},setPointSize:function(c){d&&a&&d.uniform1f(p,c)},setSkipTranslation:function(c){d&&a&&d.uniform1i(l,!0===c?1:0)},setTexture:function(c){d&&a&&d.uniform1i(I,
  69. c)},setDrawAsCircle:function(c){d&&a&&d.uniform1i(G,c?1:0)},reset:function(){d&&a&&(d.uniform1i(B,0),d.uniform1i(G,0))},setInverted:function(c){d&&a&&d.uniform1i(t,c)},destroy:function(){d&&a&&(d.deleteProgram(a),a=!1)}}}});n(b,"Extensions/Boost/WGLVBuffer.js",[],function(){return function(b,l,E){function m(){d&&(b.deleteBuffer(d),v=d=!1);q=0;g=E||2;r=[]}var d=!1,v=!1,g=E||2,z=!1,q=0,r;return{destroy:m,bind:function(){if(!d)return!1;b.vertexAttribPointer(v,g,b.FLOAT,!1,0,0)},data:r,build:function(a,
  70. w,p){var f;r=a||[];if(!(r&&0!==r.length||z))return m(),!1;g=p||g;d&&b.deleteBuffer(d);z||(f=new Float32Array(r));d=b.createBuffer();b.bindBuffer(b.ARRAY_BUFFER,d);b.bufferData(b.ARRAY_BUFFER,z||f,b.STATIC_DRAW);v=b.getAttribLocation(l.program(),w);b.enableVertexAttribArray(v);return!0},render:function(a,m,p){var f=z?z.length:r.length;if(!d||!f)return!1;if(!a||a>f||0>a)a=0;if(!m||m>f)m=f;b.drawArrays(b[(p||"points").toUpperCase()],a/g,(m-a)/g);return!0},allocate:function(a){q=-1;z=new Float32Array(4*
  71. a)},push:function(a,b,d,f){z&&(z[++q]=a,z[++q]=b,z[++q]=d,z[++q]=f)}}}});n(b,"Extensions/Boost/WGLRenderer.js",[b["Core/Globals.js"],b["Extensions/Boost/WGLShader.js"],b["Extensions/Boost/WGLVBuffer.js"],b["Core/Color.js"],b["Core/Utilities.js"]],function(b,l,E,m,d){var v=m.parse,g=d.isNumber,z=d.isObject,q=d.merge,r=d.objectEach,a=d.pick,w=b.win.document;return function(d){function p(c){if(c.isSeriesBoosting){var a=!!c.options.stacking;var e=c.xData||c.options.xData||c.processedXData;a=(a?c.data:
  72. e||c.options.data).length;"treemap"===c.type?a*=12:"heatmap"===c.type?a*=6:ma[c.type]&&(a*=2);return a}return 0}function B(){e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}function O(c,a){function e(c){c&&(a.colorData.push(c[0]),a.colorData.push(c[1]),a.colorData.push(c[2]),a.colorData.push(c[3]))}function b(c,a,b,k,d){e(d);y.usePreallocated?H.push(c,a,b?1:0,k||1):(N.push(c),N.push(a),N.push(b?1:0),N.push(k||1))}function k(){a.segments.length&&(a.segments[a.segments.length-1].to=N.length)}function d(){a.segments.length&&
  73. a.segments[a.segments.length-1].from===N.length||(k(),a.segments.push({from:N.length}))}function t(c,a,k,d,t){e(t);b(c+k,a);e(t);b(c,a);e(t);b(c,a+d);e(t);b(c,a+d);e(t);b(c+k,a+d);e(t);b(c+k,a)}function p(c,e){y.useGPUTranslations||(a.skipTranslation=!0,c.x=w.toPixels(c.x,!0),c.y=n.toPixels(c.y,!0));e?N=[c.x,c.y,0,2].concat(N):b(c.x,c.y,0,2)}var Z=c.pointArrayMap&&"low,high"===c.pointArrayMap.join(","),P=c.chart,f=c.options,G=!!f.stacking,I=f.data,g=c.xAxis.getExtremes(),h=g.min;g=g.max;var B=c.yAxis.getExtremes(),
  74. q=B.min;B=B.max;var l=c.xData||f.xData||c.processedXData,O=c.yData||f.yData||c.processedYData,r=c.zData||f.zData||c.processedZData,n=c.yAxis,w=c.xAxis,E=c.chart.plotWidth,J=!l||0===l.length,L=f.connectNulls,u=c.points||!1,F=!1,K=!1,Q;l=G?c.data:l||I;var X={x:Number.MAX_VALUE,y:0},M={x:-Number.MAX_VALUE,y:0},T=0,W=!1,D=-1,S=!1,U=!1,ka="undefined"===typeof P.index,fa=!1,ha=!1;var x=!1;var za=ma[c.type],ia=!1,sa=!0,ta=!0,Y=f.zones||!1,V=!1,ua=f.threshold,ja=!1;if(!(f.boostData&&0<f.boostData.length)){f.gapSize&&
  75. (ja="value"!==f.gapUnit?f.gapSize*c.closestPointRange:f.gapSize);Y&&(Y.some(function(c){return"undefined"===typeof c.value?(V=new m(c.color),!0):!1}),V||(V=c.pointAttribs&&c.pointAttribs().fill||c.color,V=new m(V)));P.inverted&&(E=c.chart.plotHeight);c.closestPointRangePx=Number.MAX_VALUE;d();if(u&&0<u.length)a.skipTranslation=!0,a.drawMode="triangles",u[0].node&&u[0].node.levelDynamic&&u.sort(function(c,a){if(c.node){if(c.node.levelDynamic>a.node.levelDynamic)return 1;if(c.node.levelDynamic<a.node.levelDynamic)return-1}return 0}),
  76. u.forEach(function(a){var e=a.plotY;if("undefined"!==typeof e&&!isNaN(e)&&null!==a.y){e=a.shapeArgs;var b=P.styledMode?a.series.colorAttribs(a):b=a.series.pointAttribs(a);a=b["stroke-width"]||0;x=v(b.fill).rgba;x[0]/=255;x[1]/=255;x[2]/=255;"treemap"===c.type&&(a=a||1,Q=v(b.stroke).rgba,Q[0]/=255,Q[1]/=255,Q[2]/=255,t(e.x,e.y,e.width,e.height,Q),a/=2);"heatmap"===c.type&&P.inverted&&(e.x=w.len-e.x,e.y=n.len-e.y,e.width=-e.width,e.height=-e.height);t(e.x+a,e.y+a,e.width-2*a,e.height-2*a,x)}});else{for(;D<
  77. l.length-1;){var C=l[++D];if(ka)break;u=I&&I[D];!J&&z(u,!0)&&u.color&&(x=v(u.color).rgba,x[0]/=255,x[1]/=255,x[2]/=255);if(J){u=C[0];var A=C[1];l[D+1]&&(U=l[D+1][0]);l[D-1]&&(S=l[D-1][0]);if(3<=C.length){var va=C[2];C[2]>a.zMax&&(a.zMax=C[2]);C[2]<a.zMin&&(a.zMin=C[2])}}else u=C,A=O[D],l[D+1]&&(U=l[D+1]),l[D-1]&&(S=l[D-1]),r&&r.length&&(va=r[D],r[D]>a.zMax&&(a.zMax=r[D]),r[D]<a.zMin&&(a.zMin=r[D]));if(L||null!==u&&null!==A){U&&U>=h&&U<=g&&(fa=!0);S&&S>=h&&S<=g&&(ha=!0);if(Z){J&&(A=C.slice(1,3));var ba=
  78. A[0];A=A[1]}else G&&(u=C.x,A=C.stackY,ba=A-C.y);null!==q&&"undefined"!==typeof q&&null!==B&&"undefined"!==typeof B&&(sa=A>=q&&A<=B);u>g&&M.x<g&&(M.x=u,M.y=A);u<h&&X.x>h&&(X.x=u,X.y=A);if(null!==A||!L)if(null!==A&&(sa||fa||ha)){if((U>=h||u>=h)&&(S<=g||u<=g)&&(ia=!0),ia||fa||ha){ja&&u-S>ja&&d();Y&&(x=V.rgba,Y.some(function(c,a){a=Y[a-1];if("undefined"!==typeof c.value&&A<=c.value){if(!a||A>=a.value)x=v(c.color).rgba;return!0}return!1}),x[0]/=255,x[1]/=255,x[2]/=255);if(!y.useGPUTranslations&&(a.skipTranslation=
  79. !0,u=w.toPixels(u,!0),A=n.toPixels(A,!0),u>E&&"points"===a.drawMode))continue;if(za){C=ba;if(!1===ba||"undefined"===typeof ba)C=0>A?A:0;Z||G||(C=Math.max(null===ua?q:ua,q));y.useGPUTranslations||(C=n.toPixels(C,!0));b(u,C,0,0,x)}a.hasMarkers&&ia&&!1!==F&&(c.closestPointRangePx=Math.min(c.closestPointRangePx,Math.abs(u-F)));!y.useGPUTranslations&&!y.usePreallocated&&F&&1>Math.abs(u-F)&&K&&1>Math.abs(A-K)?y.debug.showSkipSummary&&++T:(f.step&&!ta&&b(u,K,0,2,x),b(u,A,0,"bubble"===c.type?va||1:2,x),F=
  80. u,K=A,W=!0,ta=!1)}}else d()}else d()}y.debug.showSkipSummary&&console.log("skipped points:",T);W||!1===L||"line_strip"!==c.drawMode||(X.x<Number.MAX_VALUE&&p(X,!0),M.x>-Number.MAX_VALUE&&p(M))}k()}}function h(){F=[];W.data=N=[];L=[];H&&H.destroy()}function J(a){c&&(c.setUniform("xAxisTrans",a.transA),c.setUniform("xAxisMin",a.min),c.setUniform("xAxisMinPad",a.minPixelPadding),c.setUniform("xAxisPointRange",a.pointRange),c.setUniform("xAxisLen",a.len),c.setUniform("xAxisPos",a.pos),c.setUniform("xAxisCVSCoord",
  81. !a.horiz),c.setUniform("xAxisIsLog",!!a.logarithmic),c.setUniform("xAxisReversed",!!a.reversed))}function G(a){c&&(c.setUniform("yAxisTrans",a.transA),c.setUniform("yAxisMin",a.min),c.setUniform("yAxisMinPad",a.minPixelPadding),c.setUniform("yAxisPointRange",a.pointRange),c.setUniform("yAxisLen",a.len),c.setUniform("yAxisPos",a.pos),c.setUniform("yAxisCVSCoord",!a.horiz),c.setUniform("yAxisIsLog",!!a.logarithmic),c.setUniform("yAxisReversed",!!a.reversed))}function t(a,e){c.setUniform("hasThreshold",
  82. a);c.setUniform("translatedThreshold",e)}function k(k){if(k)n=k.chartWidth||800,K=k.chartHeight||400;else return!1;if(!(e&&n&&K&&c))return!1;y.debug.timeRendering&&console.time("gl rendering");e.canvas.width=n;e.canvas.height=K;c.bind();e.viewport(0,0,n,K);c.setPMatrix([2/n,0,0,0,0,-(2/K),0,0,0,0,-2,0,-1,1,-1,1]);1<y.lineWidth&&!b.isMS&&e.lineWidth(y.lineWidth);H.build(W.data,"aVertexPosition",4);H.bind();c.setInverted(k.inverted);F.forEach(function(b,d){var f=b.series.options,p=f.marker;var h="undefined"!==
  83. typeof f.lineWidth?f.lineWidth:1;var I=f.threshold,l=g(I),B=b.series.yAxis.getThreshold(I);I=a(f.marker?f.marker.enabled:null,b.series.xAxis.isRadial?!0:null,b.series.closestPointRangePx>2*((f.marker?f.marker.radius:10)||10));p=M[p&&p.symbol||b.series.symbol]||M.circle;if(!(0===b.segments.length||b.segmentslength&&b.segments[0].from===b.segments[0].to)){p.isReady&&(e.bindTexture(e.TEXTURE_2D,p.handle),c.setTexture(p.handle));k.styledMode?p=b.series.markerGroup&&b.series.markerGroup.getStyle("fill"):
  84. (p=b.series.pointAttribs&&b.series.pointAttribs().fill||b.series.color,f.colorByPoint&&(p=b.series.chart.options.colors[d]));b.series.fillOpacity&&f.fillOpacity&&(p=(new m(p)).setOpacity(a(f.fillOpacity,1)).get());p=v(p).rgba;y.useAlpha||(p[3]=1);"lines"===b.drawMode&&y.useAlpha&&1>p[3]&&(p[3]/=10);"add"===f.boostBlending?(e.blendFunc(e.SRC_ALPHA,e.ONE),e.blendEquation(e.FUNC_ADD)):"mult"===f.boostBlending||"multiply"===f.boostBlending?e.blendFunc(e.DST_COLOR,e.ZERO):"darken"===f.boostBlending?(e.blendFunc(e.ONE,
  85. e.ONE),e.blendEquation(e.FUNC_MIN)):e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA);c.reset();0<b.colorData.length&&(c.setUniform("hasColor",1),d=E(e,c),d.build(b.colorData,"aColor",4),d.bind());c.setColor(p);J(b.series.xAxis);G(b.series.yAxis);t(l,B);"points"===b.drawMode&&(f.marker&&g(f.marker.radius)?c.setPointSize(2*f.marker.radius):c.setPointSize(1));c.setSkipTranslation(b.skipTranslation);"bubble"===b.series.type&&c.setBubbleUniforms(b.series,b.zMin,b.zMax);
  86. c.setDrawAsCircle(ka[b.series.type]||!1);if(0<h||"line_strip"!==b.drawMode)for(h=0;h<b.segments.length;h++)H.render(b.segments[h].from,b.segments[h].to,b.drawMode);if(b.hasMarkers&&I)for(f.marker&&g(f.marker.radius)?c.setPointSize(2*f.marker.radius):c.setPointSize(10),c.setDrawAsCircle(!0),h=0;h<b.segments.length;h++)H.render(b.segments[h].from,b.segments[h].to,"POINTS")}});y.debug.timeRendering&&console.timeEnd("gl rendering");d&&d();h()}function I(a){B();if(a.renderer.forExport)return k(a);T?k(a):
  87. setTimeout(function(){I(a)},1)}var c=!1,H=!1,e=!1,n=0,K=0,N=!1,L=!1,W={},T=!1,F=[],M={},ma={column:!0,columnrange:!0,bar:!0,area:!0,arearange:!0},ka={scatter:!0,bubble:!0},y={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}};return W={allocateBufferForSingleSeries:function(a){var c=0;y.usePreallocated&&(a.isSeriesBoosting&&(c=p(a)),H.allocate(c))},
  88. pushSeries:function(a){0<F.length&&F[F.length-1].hasMarkers&&(F[F.length-1].markerTo=L.length);y.debug.timeSeriesProcessing&&console.time("building "+a.type+" series");F.push({segments:[],markerFrom:L.length,colorData:[],series:a,zMin:Number.MAX_VALUE,zMax:-Number.MAX_VALUE,hasMarkers:a.options.marker?!1!==a.options.marker.enabled:!1,showMarkers:!0,drawMode:{area:"lines",arearange:"lines",areaspline:"line_strip",column:"lines",columnrange:"lines",bar:"lines",line:"line_strip",scatter:"points",heatmap:"triangles",
  89. treemap:"triangles",bubble:"points"}[a.type]||"line_strip"});O(a,F[F.length-1]);y.debug.timeSeriesProcessing&&console.timeEnd("building "+a.type+" series")},setSize:function(a,b){n===a&&K===b||!c||(n=a,K=b,c.bind(),c.setPMatrix([2/n,0,0,0,0,-(2/K),0,0,0,0,-2,0,-1,1,-1,1]))},inited:function(){return T},setThreshold:t,init:function(a,b){function k(a,c){var b={isReady:!1,texture:w.createElement("canvas"),handle:e.createTexture()},k=b.texture.getContext("2d");M[a]=b;b.texture.width=512;b.texture.height=
  90. 512;k.mozImageSmoothingEnabled=!1;k.webkitImageSmoothingEnabled=!1;k.msImageSmoothingEnabled=!1;k.imageSmoothingEnabled=!1;k.strokeStyle="rgba(255, 255, 255, 0)";k.fillStyle="#FFF";c(k);try{e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,b.handle),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,b.texture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),
  91. e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.bindTexture(e.TEXTURE_2D,null),b.isReady=!0}catch(R){}}var d=0,f=["webgl","experimental-webgl","moz-webgl","webkit-3d"];T=!1;if(!a)return!1;for(y.debug.timeSetup&&console.time("gl setup");d<f.length&&!(e=a.getContext(f[d],{}));d++);if(e)b||h();else return!1;e.enable(e.BLEND);e.blendFunc(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA);e.disable(e.DEPTH_TEST);e.depthFunc(e.LESS);c=l(e);if(!c)return!1;H=E(e,c);k("circle",function(a){a.beginPath();a.arc(256,
  92. 256,256,0,2*Math.PI);a.stroke();a.fill()});k("square",function(a){a.fillRect(0,0,512,512)});k("diamond",function(a){a.beginPath();a.moveTo(256,0);a.lineTo(512,256);a.lineTo(256,512);a.lineTo(0,256);a.lineTo(256,0);a.fill()});k("triangle",function(a){a.beginPath();a.moveTo(0,512);a.lineTo(256,0);a.lineTo(512,512);a.lineTo(0,512);a.fill()});k("triangle-down",function(a){a.beginPath();a.moveTo(0,0);a.lineTo(256,512);a.lineTo(512,0);a.lineTo(0,0);a.fill()});T=!0;y.debug.timeSetup&&console.timeEnd("gl setup");
  93. return!0},render:I,settings:y,valid:function(){return!1!==e},clear:B,flush:h,setXAxis:J,setYAxis:G,data:N,gl:function(){return e},allocateBuffer:function(a){var c=0;y.usePreallocated&&(a.series.forEach(function(a){a.isSeriesBoosting&&(c+=p(a))}),H.allocate(c))},destroy:function(){h();H.destroy();c.destroy();e&&(r(M,function(a){a.handle&&e.deleteTexture(a.handle)}),e.canvas.width=1,e.canvas.height=1)},setOptions:function(a){q(!0,y,a)}}}});n(b,"Extensions/Boost/BoostAttach.js",[b["Extensions/Boost/WGLRenderer.js"],
  94. b["Core/Globals.js"],b["Core/Utilities.js"]],function(b,l,n){var m=l.doc,d=n.error,v=m.createElement("canvas");return function(g,n){var q=g.chartWidth,r=g.chartHeight,a=g,w=g.seriesGroup||n.group,p=m.implementation.hasFeature("www.http://w3.org/TR/SVG11/feature#Extensibility","1.1");a=g.isChartSeriesBoosting()?g:n;p=!1;a.renderTarget||(a.canvas=v,g.renderer.forExport||!p?(a.renderTarget=g.renderer.image("",0,0,q,r).addClass("highcharts-boost-canvas").add(w),a.boostClear=function(){a.renderTarget.attr({href:""})},
  95. a.boostCopy=function(){a.boostResizeTarget();a.renderTarget.attr({href:a.canvas.toDataURL("image/png")})}):(a.renderTargetFo=g.renderer.createElement("foreignObject").add(w),a.renderTarget=m.createElement("canvas"),a.renderTargetCtx=a.renderTarget.getContext("2d"),a.renderTargetFo.element.appendChild(a.renderTarget),a.boostClear=function(){a.renderTarget.width=a.canvas.width;a.renderTarget.height=a.canvas.height},a.boostCopy=function(){a.renderTarget.width=a.canvas.width;a.renderTarget.height=a.canvas.height;
  96. a.renderTargetCtx.drawImage(a.canvas,0,0)}),a.boostResizeTarget=function(){q=g.chartWidth;r=g.chartHeight;(a.renderTargetFo||a.renderTarget).attr({x:0,y:0,width:q,height:r}).css({pointerEvents:"none",mixedBlendMode:"normal",opacity:1});a instanceof l.Chart&&a.markerGroup.translate(g.plotLeft,g.plotTop)},a.boostClipRect=g.renderer.clipRect(),(a.renderTargetFo||a.renderTarget).clip(a.boostClipRect),a instanceof l.Chart&&(a.markerGroup=a.renderer.g().add(w),a.markerGroup.translate(n.xAxis.pos,n.yAxis.pos)));
  97. a.canvas.width=q;a.canvas.height=r;a.boostClipRect.attr(g.getBoostClipRect(a));a.boostResizeTarget();a.boostClear();a.ogl||(a.ogl=b(function(){a.ogl.settings.debug.timeBufferCopy&&console.time("buffer copy");a.boostCopy();a.ogl.settings.debug.timeBufferCopy&&console.timeEnd("buffer copy")}),a.ogl.init(a.canvas)||d("[highcharts boost] - unable to init WebGL renderer"),a.ogl.setOptions(g.options.boost||{}),a instanceof l.Chart&&a.ogl.allocateBuffer(g));a.ogl.setSize(q,r);return a.ogl}});n(b,"Extensions/Boost/BoostUtils.js",
  98. [b["Core/Globals.js"],b["Extensions/Boost/BoostableMap.js"],b["Extensions/Boost/BoostAttach.js"],b["Core/Utilities.js"]],function(b,l,n,m){function d(){for(var a=[],b=0;b<arguments.length;b++)a[b]=arguments[b];var d=-Number.MAX_VALUE;a.forEach(function(a){if("undefined"!==typeof a&&null!==a&&"undefined"!==typeof a.length&&0<a.length)return d=a.length,!0});return d}function v(a,b,d){a&&b.renderTarget&&b.canvas&&!(d||b.chart).isChartSeriesBoosting()&&a.render(d||b.chart)}function g(a,b){a&&b.renderTarget&&
  99. b.canvas&&!b.chart.isChartSeriesBoosting()&&a.allocateBufferForSingleSeries(b)}function z(a,b,d,g,h,l){h=h||0;g=g||3E3;for(var f=h+g,t=!0;t&&h<f&&h<a.length;)t=b(a[h],h),++h;t&&(h<a.length?l?z(a,b,d,g,h,l):r.requestAnimationFrame?r.requestAnimationFrame(function(){z(a,b,d,g,h)}):setTimeout(function(){z(a,b,d,g,h)}):d&&d())}function q(){var b=0,d,g=["webgl","experimental-webgl","moz-webgl","webkit-3d"],l=!1;if("undefined"!==typeof r.WebGLRenderingContext)for(d=a.createElement("canvas");b<g.length;b++)try{if(l=
  100. d.getContext(g[b]),"undefined"!==typeof l&&null!==l)return!0}catch(h){}return!1}var r=b.win,a=b.doc,w=m.pick;m={patientMax:d,boostEnabled:function(a){return w(a&&a.options&&a.options.boost&&a.options.boost.enabled,!0)},shouldForceChartSeriesBoosting:function(a){var b=0,g=0,p=w(a.options.boost&&a.options.boost.allowForce,!0);if("undefined"!==typeof a.boostForceChartBoost)return a.boostForceChartBoost;if(1<a.series.length)for(var h=0;h<a.series.length;h++){var m=a.series[h];0!==m.options.boostThreshold&&
  101. !1!==m.visible&&"heatmap"!==m.type&&(l[m.type]&&++g,d(m.processedXData,m.options.data,m.points)>=(m.options.boostThreshold||Number.MAX_VALUE)&&++b)}a.boostForceChartBoost=p&&(g===a.series.length&&0<b||5<b);return a.boostForceChartBoost},renderIfNotSeriesBoosting:v,allocateIfNotSeriesBoosting:g,eachAsync:z,hasWebGLSupport:q,pointDrawHandler:function(a){var b=!0;this.chart.options&&this.chart.options.boost&&(b="undefined"===typeof this.chart.options.boost.enabled?!0:this.chart.options.boost.enabled);
  102. if(!b||!this.isSeriesBoosting)return a.call(this);this.chart.isBoosting=!0;if(a=n(this.chart,this))g(a,this),a.pushSeries(this);v(a,this)}};b.hasWebGLSupport=q;return m});n(b,"Extensions/Boost/BoostInit.js",[b["Core/Chart/Chart.js"],b["Core/Globals.js"],b["Core/Utilities.js"],b["Extensions/Boost/BoostUtils.js"],b["Extensions/Boost/BoostAttach.js"]],function(b,l,n,m,d){var v=n.addEvent,g=n.extend,z=n.fireEvent,q=n.wrap,r=l.Series,a=l.seriesTypes,w=function(){},p=m.eachAsync,f=m.pointDrawHandler,B=
  103. m.allocateIfNotSeriesBoosting,E=m.renderIfNotSeriesBoosting,h=m.shouldForceChartSeriesBoosting,J;return function(){g(r.prototype,{renderCanvas:function(){function a(a,c){var b=!1,d="undefined"===typeof g.index,k=!0;if(!d){if(pa){var t=a[0];var f=a[1]}else t=a,f=m[c];la?(pa&&(f=a.slice(1,3)),b=f[0],f=f[1]):na&&(t=a.x,f=a.stackY,b=f-a.y);wa||(k=f>=v&&f<=M);if(null!==f&&t>=q&&t<=r&&k)if(a=e.toPixels(t,!0),y){if("undefined"===typeof R||a===O){la||(b=f);if("undefined"===typeof aa||f>da)da=f,aa=c;if("undefined"===
  104. typeof R||b<ca)ca=b,R=c}a!==O&&("undefined"!==typeof R&&(f=h.toPixels(da,!0),P=h.toPixels(ca,!0),ea(a,f,aa),P!==f&&ea(a,P,R)),R=aa=void 0,O=a)}else f=Math.ceil(h.toPixels(f,!0)),ea(a,f,c)}return!d}function b(){z(k,"renderedCanvas");delete k.buildKDTree;k.buildKDTree();ra.debug.timeKDTree&&console.timeEnd("kd tree building")}var k=this,f=k.options||{},c=!1,g=k.chart,e=this.xAxis,h=this.yAxis,l=f.xData||k.processedXData,m=f.yData||k.processedYData,n=f.data;c=e.getExtremes();var q=c.min,r=c.max;c=h.getExtremes();
  105. var v=c.min,M=c.max,L={},O,y=!!k.sampling,Z=!1!==f.enableMouseTracking,P=h.getThreshold(f.threshold),la=k.pointArrayMap&&"low,high"===k.pointArrayMap.join(","),na=!!f.stacking,oa=k.cropStart||0,wa=k.requireSorting,pa=!l,ca,da,R,aa,xa="x"===f.findNearestPointBy,qa=this.xData||this.options.xData||this.processedXData||!1,ea=function(a,c,b){a=Math.ceil(a);J=xa?a:a+","+c;Z&&!L[J]&&(L[J]=!0,g.inverted&&(a=e.len-a,c=h.len-c),ya.push({x:qa?qa[oa+b]:!1,clientX:a,plotX:a,plotY:c,i:oa+b}))};c=d(g,k);g.isBoosting=
  106. !0;var ra=c.settings;if(this.visible){(this.points||this.graph)&&this.destroyGraphics();g.isChartSeriesBoosting()?(this.markerGroup&&this.markerGroup!==g.markerGroup&&this.markerGroup.destroy(),this.markerGroup=g.markerGroup,this.renderTarget&&(this.renderTarget=this.renderTarget.destroy())):(this.markerGroup===g.markerGroup&&(this.markerGroup=void 0),this.markerGroup=k.plotGroup("markerGroup","markers",!0,1,g.seriesGroup));var ya=this.points=[];k.buildKDTree=w;c&&(B(c,this),c.pushSeries(k),E(c,this,
  107. g));g.renderer.forExport||(ra.debug.timeKDTree&&console.time("kd tree building"),p(na?k.data:l||n,a,b))}}});["heatmap","treemap"].forEach(function(b){a[b]&&q(a[b].prototype,"drawPoints",f)});a.bubble&&(delete a.bubble.prototype.buildKDTree,q(a.bubble.prototype,"markerAttribs",function(a){return this.isSeriesBoosting?!1:a.apply(this,[].slice.call(arguments,1))}));a.scatter.prototype.fill=!0;g(a.area.prototype,{fill:!0,fillOpacity:!0,sampling:!0});g(a.column.prototype,{fill:!0,sampling:!0});b.prototype.callbacks.push(function(a){v(a,
  108. "predraw",function(){a.boostForceChartBoost=void 0;a.boostForceChartBoost=h(a);a.isBoosting=!1;!a.isChartSeriesBoosting()&&a.didBoost&&(a.didBoost=!1);a.boostClear&&a.boostClear();a.canvas&&a.ogl&&a.isChartSeriesBoosting()&&(a.didBoost=!0,a.ogl.allocateBuffer(a));a.markerGroup&&a.xAxis&&0<a.xAxis.length&&a.yAxis&&0<a.yAxis.length&&a.markerGroup.translate(a.xAxis[0].pos,a.yAxis[0].pos)});v(a,"render",function(){a.ogl&&a.isChartSeriesBoosting()&&a.ogl.render(a)})})}});n(b,"Extensions/Boost/BoostOverrides.js",
  109. [b["Core/Chart/Chart.js"],b["Core/Globals.js"],b["Core/Series/Point.js"],b["Core/Utilities.js"],b["Extensions/Boost/BoostUtils.js"],b["Extensions/Boost/Boostables.js"],b["Extensions/Boost/BoostableMap.js"]],function(b,l,n,m,d,L,g){var v=m.addEvent,q=m.error,r=m.getOptions,a=m.isArray,w=m.isNumber,p=m.pick,f=m.wrap,B=d.boostEnabled,E=d.shouldForceChartSeriesBoosting,h=l.Series,J=l.seriesTypes,G=r().plotOptions;b.prototype.isChartSeriesBoosting=function(){return p(this.options.boost&&this.options.boost.seriesThreshold,
  110. 50)<=this.series.length||E(this)};b.prototype.getBoostClipRect=function(a){var b={x:this.plotLeft,y:this.plotTop,width:this.plotWidth,height:this.plotHeight};a===this&&this.yAxis.forEach(function(a){b.y=Math.min(a.pos,b.y);b.height=Math.max(a.pos-this.plotTop+a.len,b.height)},this);return b};h.prototype.getPoint=function(a){var b=a,d=this.xData||this.options.xData||this.processedXData||!1;!a||a instanceof this.pointClass||(b=(new this.pointClass).init(this,this.options.data[a.i],d?d[a.i]:void 0),
  111. b.category=p(this.xAxis.categories?this.xAxis.categories[b.x]:b.x,b.x),b.dist=a.dist,b.distX=a.distX,b.plotX=a.plotX,b.plotY=a.plotY,b.index=a.i,b.isInside=this.isPointInside(a));return b};f(h.prototype,"searchPoint",function(a){return this.getPoint(a.apply(this,[].slice.call(arguments,1)))});f(n.prototype,"haloPath",function(a){var b=this.series,d=this.plotX,c=this.plotY,f=b.chart.inverted;b.isSeriesBoosting&&f&&(this.plotX=b.yAxis.len-c,this.plotY=b.xAxis.len-d);var e=a.apply(this,Array.prototype.slice.call(arguments,
  112. 1));b.isSeriesBoosting&&f&&(this.plotX=d,this.plotY=c);return e});f(h.prototype,"markerAttribs",function(a,b){var d=b.plotX,c=b.plotY,f=this.chart.inverted;this.isSeriesBoosting&&f&&(b.plotX=this.yAxis.len-c,b.plotY=this.xAxis.len-d);var e=a.apply(this,Array.prototype.slice.call(arguments,1));this.isSeriesBoosting&&f&&(b.plotX=d,b.plotY=c);return e});v(h,"destroy",function(){var a=this,b=a.chart;b.markerGroup===a.markerGroup&&(a.markerGroup=null);b.hoverPoints&&(b.hoverPoints=b.hoverPoints.filter(function(b){return b.series===
  113. a}));b.hoverPoint&&b.hoverPoint.series===a&&(b.hoverPoint=null)});f(h.prototype,"getExtremes",function(a){return this.isSeriesBoosting&&this.hasExtremes&&this.hasExtremes()?{}:a.apply(this,Array.prototype.slice.call(arguments,1))});["translate","generatePoints","drawTracker","drawPoints","render"].forEach(function(a){function b(b){var c=this.options.stacking&&("translate"===a||"generatePoints"===a);if(!this.isSeriesBoosting||c||!B(this.chart)||"heatmap"===this.type||"treemap"===this.type||!g[this.type]||
  114. 0===this.options.boostThreshold)b.call(this);else if(this[a+"Canvas"])this[a+"Canvas"]()}f(h.prototype,a,b);"translate"===a&&"column bar arearange columnrange heatmap treemap".split(" ").forEach(function(d){J[d]&&f(J[d].prototype,a,b)})});f(h.prototype,"processData",function(b){function d(a){return f.chart.isChartSeriesBoosting()||(a?a.length:0)>=(f.options.boostThreshold||Number.MAX_VALUE)}var f=this,c=this.options.data;B(this.chart)&&g[this.type]?(d(c)&&"heatmap"!==this.type&&"treemap"!==this.type&&
  115. !this.options.stacking&&this.hasExtremes&&this.hasExtremes(!0)||(b.apply(this,Array.prototype.slice.call(arguments,1)),c=this.processedXData),(this.isSeriesBoosting=d(c))?(c=this.getFirstValidPoint(this.options.data),w(c)||a(c)||q(12,!1,this.chart),this.enterBoost()):this.exitBoost&&this.exitBoost()):b.apply(this,Array.prototype.slice.call(arguments,1))});v(h,"hide",function(){this.canvas&&this.renderTarget&&(this.ogl&&this.ogl.clear(),this.boostClear())});h.prototype.enterBoost=function(){this.alteredByBoost=
  116. [];["allowDG","directTouch","stickyTracking"].forEach(function(a){this.alteredByBoost.push({prop:a,val:this[a],own:Object.hasOwnProperty.call(this,a)})},this);this.directTouch=this.allowDG=!1;this.finishedAnimating=this.stickyTracking=!0;this.labelBySeries&&(this.labelBySeries=this.labelBySeries.destroy())};h.prototype.exitBoost=function(){(this.alteredByBoost||[]).forEach(function(a){a.own?this[a.prop]=a.val:delete this[a.prop]},this);this.boostClear&&this.boostClear()};h.prototype.hasExtremes=function(a){var b=
  117. this.options,d=this.xAxis&&this.xAxis.options,c=this.yAxis&&this.yAxis.options,f=this.colorAxis&&this.colorAxis.options;return b.data.length>(b.boostThreshold||Number.MAX_VALUE)&&w(c.min)&&w(c.max)&&(!a||w(d.min)&&w(d.max))&&(!f||w(f.min)&&w(f.max))};h.prototype.destroyGraphics=function(){var a=this,b=this.points,d,c;if(b)for(c=0;c<b.length;c+=1)(d=b[c])&&d.destroyElements&&d.destroyElements();["graph","area","tracker"].forEach(function(b){a[b]&&(a[b]=a[b].destroy())})};L.forEach(function(a){G[a]&&
  118. (G[a].boostThreshold=5E3,G[a].boostData=[],J[a].prototype.fillOpacity=!0)})});n(b,"Extensions/Boost/NamedColors.js",[b["Core/Color.js"]],function(b){var l={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",
  119. 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",
  120. floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#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",
  121. 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",
  122. 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",
  123. 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",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};return b.names=l});n(b,"Extensions/Boost/Boost.js",[b["Core/Globals.js"],b["Extensions/Boost/BoostUtils.js"],
  124. b["Extensions/Boost/BoostInit.js"],b["Core/Utilities.js"]],function(b,l,n,m){m=m.error;l=l.hasWebGLSupport;l()?n():"undefined"!==typeof b.initCanvasBoost?b.initCanvasBoost():m(26)});n(b,"masters/modules/boost.src.js",[],function(){})});
  125. //# sourceMappingURL=boost.js.map