{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/flatbuffers/js/flatbuffers.mjs","webpack:///./resources/assets/js/orderbook-heatmap.js","webpack:///./public/js/flatbuffers_combined.js","webpack:///./resources/assets/js/heatmap/heatmap-normalization.js","webpack:///./resources/assets/js/colormaps.js","webpack:///./node_modules/regl/dist/regl.unchecked.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","flatbuffers","Offset","Table","SIZEOF_SHORT","SIZEOF_INT","FILE_IDENTIFIER_LENGTH","SIZE_PREFIX_LENGTH","Encoding","UTF8_BYTES","UTF16_STRING","int32","Int32Array","float32","Float32Array","buffer","float64","Float64Array","isLittleEndian","Uint16Array","Uint8Array","Long","low","high","this","ZERO","toFloat64","equals","other","Builder","opt_initial_size","initial_size","bb","ByteBuffer","allocate","space","minalign","vtable","vtable_in_use","isNested","object_start","vtables","vector_num_elems","force_defaults","clear","capacity","forceDefaults","dataBuffer","asUint8Array","bytes","subarray","position","offset","prep","size","additional_bytes","align_size","old_buf_size","growByteBuffer","pad","byte_size","writeInt8","writeInt16","writeInt32","writeInt64","writeFloat32","writeFloat64","addInt8","addInt16","addInt32","addInt64","addFloat32","addFloat64","addFieldInt8","voffset","defaultValue","slot","addFieldInt16","addFieldInt32","addFieldInt64","addFieldFloat32","addFieldFloat64","addFieldOffset","addOffset","addFieldStruct","nested","obj","Error","notNested","new_buf_size","nbb","setPosition","set","startObject","numfields","endObject","vtableloc","trimmed_size","len","existing_vtable","vt1","outer_loop","length","vt2","readInt16","j","push","finish","root_table","opt_file_identifier","opt_size_prefix","size_prefix","file_identifier","charCodeAt","finishSizePrefixed","requiredField","table","field","table_start","vtable_start","readInt32","startVector","elem_size","num_elems","alignment","endVector","createString","utf8","codePoint","a","createLong","bytes_","position_","readInt8","readUint8","readUint16","readUint32","readInt64","readUint64","readFloat32","readFloat64","writeUint8","writeUint16","writeUint32","writeUint64","getBufferIdentifier","result","String","fromCharCode","__offset","bb_pos","vtable_offset","__union","__string","opt_encoding","b","__indirect","__vector","__vector_len","__has_identifier","ident","useWebWorker","window","Worker","canvas","document","getElementById","gl","options","getContext","e","getCanvasGl","preserveDrawingBuffer","regl","reglLib","NormalizationFunctions","require","Heatmap","config","canvasWidth","canvasHeight","graphMinPrice","graphMaxPrice","barWidthWithGap","gapWidth","gapHeight","step","barsAreaHeight","firstCandleTime","Date","lastCandleTime","normalization","precisionStep","noiseSmoothingThreshold","opacity","zeroWeightOpacity","opacitySpeed","weightThreshold","isLogScale","colorMap","priceLevelsSize","getConfig","$theme_name","HeatmapView","color","count","stageWidth","stageHeight","offsetX","offsetY","scaleX","scaleY","minTimestamp","maxTimestamp","minPrice","maxPrice","move","update","setPreviousData","vars","rectWidth","rectHeight","minMaxPriceDiff","lastRectWidth","lastRectHeight","lastTimestamp","lastMaxPrice","lastMinPrice","lastMinMaxPriceDiff","lastPixelsPerDollar","properties","limitX","limitY","needsRedraw","setLimits","draw","frag","vert","attributes","uniforms","blend","enable","func","srcRGB","srcAlpha","dstRGB","dstAlpha","primitive","dataForDrawIds","dataForDraw","dataForDrawMaxWeights","dataViews","cachedJson","mustRevalidateCache","BUFFER_VALIDATION_STATUS","bufferDataInvalid","setBufferDataValid","bufferId","requestBufferDataInvalidation","invalidateBufferData","isBufferDataInvalid","requestAllBuffersDataInvalidation","oldCandles","currentCandle","requestDataRequestInProgress","requestDataRequestInProgressTimeout","requestDataOldParams","requestDataAjax","url","getParams","cb","errorCb","paramsJson","JSON","stringify","clearTimeout","setTimeout","ajaxParams","type","data","success","resp","textStatus","request","getResponseHeader","error","console","binary","dataType","$","ajax","requestData","uri","baseUrl","since","$heatmap_settings","local","combined","markets","keys","aggregatedConfig","emptyDrawData","redraw","handleOnCompletionOf","handleCounter","counterCb","handleData","symbol","$symbol","aggregatedPriceSpread","requestSpreadMatrix","market","pairId","timestamps","sort","contentType","appendData","marketId","json","binaryData","response","BitcoinWisdom","Buffers","HeatmapResponse","getRootAsHeatmapResponse","responseDataLength","timestampsLength","timestampVolumeData","timestamp","volumeMapLength","dataLength","timestampData","price","volume","parseFlatBuffers","defaultColorMaps","cividis","dictionaryColorMaps","plasma","inferno","inferno2","viridis","val1RGB","val2RGB","stepsInt","colors","stepsPerc","valClampRGB","clampedR","Math","round","clampedG","clampedB","clampedOpacity","generateColors","bone","pink","spring","cool","Wistia","hot","afmhot","defaultPresets","presets","parse","$is_mobile","colorMaps","calculateColor","weight","preset","backgroundDiff","mod","max","min","regenerateColorMaps","mapName","loadHeatmapPreset","item","localStorage","getItem","savedPresets","saveActiveHeatmapPreset","setItem","saveHeatmapPreset","applyPresetToConfig","applyConfigToPreset","saveConfigToLocalStorage","configCopy","assign","loadAggregatedConfigFromLocalStorage","hasConfigSaved","savedConfig","generateColormapImage","createElement","ctx","width","height","stepHeight","fillStyle","floor","fillRect","toDataURL","populateColormapsHtml","html","join","colorMapSelector","colorMapName","filter","prop","change","val","applyConfigToHtml","$hsymbol","normalizationFunctionsSelector","thresholdSelector","thresholdSelectorValueDiv","opacitySpeedSelector","opacitySpeedSelectorValueDiv","opacitySelector","opacitySelectorValueDiv","noiseSmoothingSelector","noiseSmoothingValueDiv","zeroWeightOpacitySelector","zeroWeightOpacityValueDiv","handleWorker","initAggregatedJquery","inputs","each","hmId","isChecked","is","forceUpdate","saveAggregatedConfigToLocalStorage","initJquery","normalizationFunctionsKeys","append","attr","text","parseInt","click","defaultPreset","getStep","$step","getColor","getCachedData","undefined","defaultMaxWeight","postMessage","onmessage","dataBufferId","messageData","entriesLength","current","buffersInitialized","resultingCoordinates","resultingColors","resizeBuffers","maxSize","buffersChanged","useSize","log","drawLevels","forceRedraw","objectCount","checkBuffers","logDiv","rectPadding","dataView","levels","x","y","toX","toY","rectHeightHalf","rectPaddingHalf","resultingCoordinatesLength","resultingColorsLength","lastColor","lastToX","lastToY","to","barTimestamp","coordinates","slice","populateLevels","maxsDiff","pixelsPerDollar","subX","subY","moveView","rafCallbackData1","rafCallbackData2","oldConfig","rafCallback","refreshBecauseOfConfig","o1","o2","compareObjects","oneOfBuffersIsInvalid","bufferIdName","isOneOfBuffersInvalid","changedConfigValues","diffObjectsProperties","Measurer","start","depth","poll","data1Invalid","data2Invalid","moveGraphProperties","onlyMoveConfigChange","configKey","indexOf","forceData1","forceData2","stop","dpr","old","_gl","flush","hidden","frameLoop","frame","cancel","wasEnabled","alwaysEnabled","initLoad","isEnabled","lStorage","setSettings","weirdCoordinates","To","Mo","canvasSize","parseFloat","h","abs","drawNextFrame","setPriceLevels","stepChange","getColorMaps","sdepth","range","roundTo","now","bidPrice","entry","minRangePrice","roundPrice","maxRangePrice","volumeMap","amount","f","init","loadConfigFromLocalStorage","getSeconds","ready","PriceVolumePair","__init","createPriceVolumePair","TimestampVolumeDataPair","getRootAsTimestampVolumeDataPair","getSizePrefixedRootAsTimestampVolumeDataPair","startTimestampVolumeDataPair","addTimestamp","addData","startDataVector","endTimestampVolumeDataPair","createTimestampVolumeDataPair","getSizePrefixedRootAsHeatmapResponse","bufferHasIdentifier","startHeatmapResponse","addTimestamps","createTimestampsVector","startTimestampsVector","endHeatmapResponse","finishHeatmapResponseBuffer","finishSizePrefixedHeatmapResponseBuffer","createHeatmapResponse","OrderBook","getRootAsOrderBook","getSizePrefixedRootAsOrderBook","asks","asksLength","bids","bidsLength","startOrderBook","addAsks","startAsksVector","addBids","startBidsVector","endOrderBook","finishOrderBookBuffer","finishSizePrefixedOrderBookBuffer","createOrderBook","Side","Ask","Bid","SideName","0","1","Trade","id","side","createTrade","Trades","getRootAsTrades","getSizePrefixedRootAsTrades","trades","tradesLength","startTrades","addTrades","startTradesVector","endTrades","finishTradesBuffer","finishSizePrefixedTradesBuffer","createTrades","SingleTrade","getRootAsSingleTrade","getSizePrefixedRootAsSingleTrade","trade","startSingleTrade","addTrade","endSingleTrade","finishSingleTradeBuffer","finishSizePrefixedSingleTradeBuffer","createSingleTrade","linear","calculateWeight","bar","params","weightedBar","prices","maxVolume","exponential","pow","minWeight","maxWeight","findMinMax","minMaxDiff","map","magma","extend","base","opts","VARIABLE_COUNTER","DynamicVariable","escapeStr","str","replace","toAccessorString","splitParts","firstChar","charAt","lastChar","substr","parts","exec","index","concat","subparts","split","dynamic","define","isDynamic","_reglType","unbox","path","Array","isArray","accessor","raf","next","requestAnimationFrame","cancelAnimationFrame","clock","performance","parseExtensions","input","getElement","desc","querySelector","parseArgs","args_","element","container","args","contextAttributes","extensions","optionalExtensions","pixelRatio","devicePixelRatio","profile","onDone","err","onDestroy","nodeName","appendChild","getBoundingClientRect","drawArrays","drawElements","isWebGLContext","toLowerCase","resizeObserver","resize","w","innerWidth","innerHeight","body","bounds","right","left","bottom","top","style","border","margin","padding","ResizeObserver","observe","addEventListener","disconnect","removeEventListener","removeChild","createCanvas","premultipliedAlpha","createContext","loop","log2","v","shift","createPool","bufferPool","alloc","sz","nextPow16","bin","pop","ArrayBuffer","free","buf","byteLength","allocType","Int8Array","Int16Array","Uint32Array","freeType","array","pool","zero","isTypedArray","Uint8ClampedArray","isNDArrayLike","shape","stride","values","flattenUtils","array_","flatten","out_","out","nx","flatten1D","ny","ptr","row","flatten2D","flatten3D","flattenRec","level","nz","ptr_","col","k","arrayTypes","glTypes","int8","int16","uint8","uint16","uint32","float","usageTypes","stream","arrayFlatten","arrayShape","DTYPES_SIZES","typedArrayCode","toString","copyArray","inp","transpose","shapeX","shapeY","strideX","strideY","primTypes","points","point","lines","line","triangles","triangle","FLOAT","INT","convertToHalfFloat","ushorts","isNaN","Infinity","sgn","exp","frac","isArrayLike","MIPMAP_FILTERS","CHANNELS_FORMAT","FORMAT_CHANNELS","objectName","CANVAS_CLASS","OFFSCREENCANVAS_CLASS","CONTEXT2D_CLASS","BITMAP_CLASS","IMAGE_CLASS","VIDEO_CLASS","PIXEL_CLASSES","TYPE_SIZES","FORMAT_SIZES_SPECIAL","isNumericArray","arr","isRectArray","classString","isCanvasElement","isOffscreenCanvas","isPixelData","className","typedArrayCode$1","preConvert","image","postConvert","getTextureSize","format","isMipmap","isCube","total","createTextureSet","limits","reglPoll","contextState","stats","mipmapHint","wrapModes","magFilters","minFilters","colorSpace","textureTypes","textureFormats","compressedTextureFormats","ext_srgb","srgb","srgba","oes_texture_float","oes_texture_half_float","webgl_depth_texture","webgl_compressed_texture_s3tc","webgl_compressed_texture_atc","webgl_compressed_texture_pvrtc","webgl_compressed_texture_etc1","supportedCompressedFormats","getParameter","forEach","supportedFormats","textureFormatsInvert","textureTypesInvert","magFiltersInvert","minFiltersInvert","wrapModesInvert","colorFormats","reduce","glenum","TexFlags","internalformat","compressed","premultiplyAlpha","flipY","unpackAlignment","channels","copyFlags","parseFlags","flags","hasChannels","radius","hasFormat","formatStr","setFlags","pixelStorei","TexImage","xOffset","yOffset","needsFree","needsCopy","parseImage","copy","viewW","viewportWidth","viewH","viewportHeight","converted","convertData","shapeC","strideC","transposeData","isBitmap","isImageElement","naturalWidth","naturalHeight","isVideoElement","videoWidth","videoHeight","dd","allocData","setImage","info","target","miplevel","texImage2D","compressedTexImage2D","copyTexImage2D","setSubImage","texSubImage2D","compressedTexSubImage2D","copyTexSubImage2D","imagePool","allocImage","freeImage","MipMap","genMipmaps","mipmask","images","parseMipMapFromShape","mipmap","img","parseMipMapFromObject","imgData","mipData","setMipMap","mipPool","allocMipMap","freeMipMap","TexInfo","minFilter","magFilter","wrapS","wrapT","anisotropic","parseTexInfo","mag","wrap","optWrapS","optWrapT","hasMipMap","setTexInfo","texParameteri","ext_texture_filter_anisotropic","hint","generateMipmap","textureCount","textureSet","numTexUnits","maxTextureUnits","textureUnits","REGLTexture","refCount","texture","createTexture","unit","bindCount","texInfo","tempBind","activeTexture","bindTexture","tempRestore","prev","destroy","handle","deleteTexture","pixels","unbind","decRef","getTotalTextureSize","create2D","reglTexture2D","subimage","x_","y_","level_","imageData","w_","h_","_w","_h","_texture","createCube","a0","a1","a2","a3","a4","a5","cubeCount","faces","reglTextureCube","faceInput","npotTextureCube","face","radius_","getTexture","wrapper","restore","tex","refresh","FORMAT_SIZES","getRenderbufferSize","textureFormatChannels","textureTypeSizes","AttributeRecord","state","z","normalized","divisor","wrapReadPixels","framebufferState","context","glAttributes","readPixelsImpl","colorAttachments","framebufferWidth","framebufferHeight","readPixels","setFBO","framebuffer","readPixelsFBO","CUTE_COMPONENTS","S_ELEMENTS","S_PRIMITIVE","S_COUNT","S_OFFSET","S_INSTANCES","NESTED_OPTIONS","blendFuncs","compareFuncs","stencilOps","orientationType","isBufferArgs","sortState","Declaration","thisDep","contextDep","propDep","isStatic","decl","createStaticDecl","createDynamicDecl","dyn","numArgs","subDyn","subArgs","SCOPE_DECL","reglCore","stringStore","bufferState","elementState","textureState","uniformState","attributeState","shaderState","drawState","timer","Record","blendEquations","ext_blend_minmax","extInstancing","angle_instanced_arrays","extDrawBuffers","webgl_draw_buffers","currentState","dirty","nextState","GL_STATE_NAMES","GL_FLAGS","GL_VARIABLES","propName","stateFlag","sname","cap","stateVariable","drawingBufferWidth","drawingBufferHeight","sharedState","strings","elements","shader","vao","sharedConstants","backBuffer","drawBuffer","maxDrawbuffers","drawCallCounter","createREGLEnvironment","env","varCounter","linkedNames","linkedValues","block","code","apply","arguments","def","scope","exit","entryToString","exitToString","save","globalBlock","procedures","global","link","proc","arg","bodyToString","cond","pred","thenBlock","elseBlock","thenToString","elseToString","then","else","elseClause","compile","src","Function","createEnvironment","batchId","SHARED","shared","props","nextVars","currentVars","variable","constants","invoke","argList","ref","attribCache","scopeAttribs","scopeAttrib","binding","parseArguments","static","attribLocations","staticOptions","staticAttributes","sAttributes","bindings","parseAttribLocations","dynamicOptions","getFramebuffer","FRAMEBUFFER","CONTEXT","FRAMEBUFFER_FUNC","FRAMEBUFFER_STATE","parseFramebuffer","viewportAndScissor","parseBox","param","box","BOX_W","S_FRAMEBUFFER","BOX_H","dynBox","BOX","BOX_X","BOX_Y","viewport","prevViewport","VIEWPORT","scissor_box","parseViewportScissor","getElements","ELEMENTS","IS_BUFFER_ARGS","ELEMENT_STATE","elementDefn","elementStream","ifte","parseElements","parseParam","isOffset","OFFSET","dynValue","dynPrimitive","PRIM_TYPES","prim","parsePrimitive","dynCount","parseVertCount","instances","parseDraw","STATE","parseStatic","parseDynamic","COMPARE_FUNCS","dst","BLEND_FUNCS","read","prefix","suffix","SRC_RGB","SRC_ALPHA","rgb","alpha","BLEND_EQUATIONS","RGB","ALPHA","cmp","mask","fail","zfail","zpass","STENCIL_OPS","factor","units","invert","parseGLState","parseShader","progVar","program","fragId","SHADER_STATE","progDef","parseProgram","copyBox","defn","scopeVAO","drawVAO","useVAO","profileEnable","parseProfile","staticUniforms","dynamicUniforms","UNIFORMS","reglType","parseUniforms","getVAO","createVAO","vaoRef","parseVAO","staticBindings","dynamicAttributes","attributeDefs","attribute","record","getBuffer","constant","dtype","cache","isStream","VALUE","BUFFER_STATE","defaultRecord","BUFFER","TYPE","emitReadRecord","parseAttributes","staticContext","dynamicContext","parseContext","emitContext","contextEnter","emitPollFramebuffer","skipCheck","EXT_DRAW_BUFFERS","GL","NEXT","DRAW_BUFFERS","BACK_BUFFER","emitPollState","CURRENT_VARS","NEXT_VARS","CURRENT_STATE","NEXT_STATE","CURRENT","emitSetOptions","flag","injectExtensions","instancing","emitProfile","useScope","incrementCounter","CPU_START","QUERY_COUNTER","USE_PROFILE","STATS","TIMER","profileArg","perfCounter","emitProfileStart","emitProfileEnd","scopeProfile","end","emitAttributes","ATTRIBUTE","LOCATION","BINDING","CONST_COMPONENTS","COMMON_KEYS","emitBuffer","SIZE","DIVISOR","emitConstant","emitBindAttribute","typeLength","emitUniforms","infix","uniform","TEX_VALUE","dim","unroll","TEX","matSize","STORAGE","emitDraw","outer","inner","DRAW_STATE","drawOptions","contextDynamic","emitElements","emitValue","INSTANCES","EXT_INSTANCING","PRIMITIVE","COUNT","emitCount","ELEMENT_TYPE","elementsStatic","emitInstancing","emitRegular","createBody","emitBody","parentEnv","emitDrawBody","emitBatchDynamicShaderBody","all","emitBatchBody","BATCH_ID","PROPS","isInnerDefn","isOuterDefn","needsContext","needsFramebuffer","progCache","PROGRAM","PROG_ID","CACHED_PROC","splatObject","isDynamicObject","globals","objectRef","deps","procs","common","INSTANCING","oes_vertex_array_object","maxAttributes","drawCache","emitDrawProc","saveShader","opt","emitScopeProc","batch","progDefn","batchCache","emitBatchProc","createTimer","ext_disjoint_timer_query","queryPool","freeQuery","query","pendingQueries","PendingStats","startQueryIndex","endQueryIndex","sum","pendingStatsPool","freePendingStats","pendingStats","pushScopeStats","ps","timeSum","queryPtr","beginQuery","createQueryEXT","beginQueryEXT","endQuery","endQueryEXT","queryTime","getQueryObjectEXT","startPtr","endPtr","gpuTime","getNumPendingQueries","deleteQueryEXT","find","haystack","needle","getContextAttributes","extensionState","isContextLost","tryLoadExtension","name_","ext","getExtension","createExtensionCache","stringIds","stringValues","stats$$1","vaoCount","bufferCount","elementsCount","framebufferCount","shaderCount","renderbufferCount","START_TIME","WIDTH","HEIGHT","tick","time","maxAnisotropic","maxColorAttachments","readFloat","readFloatTexture","fbo","createFramebuffer","bindFramebuffer","framebufferTexture2D","checkFramebufferStatus","clearColor","getError","deleteFramebuffer","navigator","test","userAgent","appVersion","cubeTexture","colorBits","depthBits","stencilBits","subpixelBits","pointSizeDims","lineWidthDims","maxViewportDims","maxCombinedTextureUnits","maxCubeMapSize","maxRenderbufferSize","maxTextureSize","maxVertexUniforms","maxVertexTextureUnits","maxVaryingVectors","maxFragmentUniforms","glsl","renderer","vendor","version","wrapLimits","destroyBuffer","bufferSet","REGLBuffer","createBuffer","usage","dimension","persistentData","bindBuffer","streamPool","initBufferFromTypedArray","bufferData","initBufferFromData","persist","flatData","typedData","deleteBuffer","getTotalBufferSize","deferInit","persistent","reglBuffer","setSubData","bufferSubData","_buffer","subdata","offset_","createStream","destroyStream","stream$$1","_initBuffer","wrapBufferState","NUM_ATTRIBUTES","attributeBindings","vaoSet","currentVAO","targetVAO","extVAO","_attr","REGLVAO","updateVAO","bufUpdated","nattributes","spec","rec","buffers","_vao","disableVertexAttribArray","setVAO","bindVertexArrayOES","bindAttrs","exti","extInstanced","enableVertexAttribArray","vertexAttribPointer","offfset","vertexAttribDivisorANGLE","vertexAttrib4f","extension","createVertexArrayOES","deleteVertexArrayOES","wrapAttributeState","elementSet","elementCount","elementTypes","REGLElementBuffer","primType","vertCount","oes_element_index_uint","initElements","predictedType","destroyElements","reglElements","_elements","wrapElementsState","fragShaders","vertShaders","ActiveInfo","location","insertActiveInfo","list","getShader","command","source","createShader","shaderSource","compileShader","programCache","programList","PROGRAM_COUNTER","REGLProgram","vertId","uniformsCount","attributesCount","linkProgram","attributeLocations","fragShader","vertShader","createProgram","attachShader","bindAttribLocation","numUniforms","getProgramParameter","getActiveUniform","getUniformLocation","numAttributes","getActiveAttrib","getAttribLocation","getMaxUniformsCount","getMaxAttributesCount","deleteShader","deleteProgram","prevProgram","idx","splice","wrapShaderState","core","renderbufferState","formatTypes","ext_color_buffer_half_float","webgl_color_buffer_float","formatTypesInvert","renderbufferSet","REGLRenderbuffer","renderbuffer","rb","bindRenderbuffer","deleteRenderbuffer","getTotalRenderbufferSize","createRenderbuffer","reglRenderbuffer","renderbufferStorage","_renderbuffer","wrapRenderbuffers","cur","colorTextureFormats","colorRenderbufferFormats","colorTypes","FramebufferAttachment","attachment","incRefAndCheckShape","attach","framebufferRenderbuffer","parseAttachment","allocAttachment","isTexture","unwrapAttachment","resizeAttachment","framebufferSet","REGLFramebuffer","depthAttachment","stencilAttachment","depthStencilAttachment","decFBORefs","updateFramebuffer","createFBO","reglFramebuffer","needsDepth","needsStencil","colorBuffer","colorTexture","colorFormat","colorType","colorCount","depthBuffer","stencilBuffer","depthStencilBuffer","depthStencilTexture","depthTexture","stencil","depthStencil","commonColorAttachmentSize","colorAttachmentSize","_framebuffer","use","reglFramebufferCube","colorCubes","cubeMapParams","cube","fb","wrapFBOState","rafCallbacks","lossCallbacks","restoreCallbacks","destroyCallbacks","activeRAF","handleRAF","startRAF","stopRAF","handleContextLoss","event","preventDefault","handleContextRestored","compileProcedure","separateDynamic","useArrays","staticItems","dynamicItems","option","merge","child","op","opBack","opFront","flattenNestedOptions","cpuTime","compiled","EMPTY_ARRAY","reserve","clearImpl","_","clearFlags","clearDepth","clearStencil","pendingCancel","pollViewport","scissorBox","framebuffer_reglType","framebufferCube","on","callback","callbacks","hasExtension","_refresh","factory"],"mappings":"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AAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,Q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,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,OAAS,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,IACtpG9e,EAAS,GACT8U,EAAKgK,EAAI1hB,OAEPrI,EAAI,EAAGA,EAAI+f,IACf9U,EAAOxC,KAAK,CACRshB,EAAI/pB,GAAG,GAAI+pB,EAAI/pB,GAAG,GAAI+pB,EAAI/pB,GAAG,GAAI+pB,EAAI/pB,GAAG,KAGvB,MAAlBiL,EAAO5C,QALSrI,KAYvB,OAAOiL,EAgGEiM,GACTC,SA9YJ,WAsQI,IArQA,IAAM4S,EAAM,CAoCR,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,MAAU,SAErB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,OACrB,CAAC,QAAU,QAAU,SAErB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,OAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QAErB,CAAC,QAAU,QAAU,SACrB,CAAC,MAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,MAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,QACrB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,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CrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,OACrB,CAAC,QAAU,QAAU,SAErB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,QACrB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,QAAU,QACrB,CAAC,MAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,OAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,OAAU,QAAU,QACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,MAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,OACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,OAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,OAAU,QACrB,CAAC,QAAU,QAAU,QACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,SACrB,CAAC,QAAU,OAAU,SACrB,CAAC,QAAU,QAAU,UAGnB9e,EAAS,GACT8U,EAAKgK,EAAI1hB,OAEPrI,EAAI,EAAGA,EAAI+f,EAAI/f,IAAK,CACxB,GAAGA,EAAI,GAAM,EAAG,CAGAA,EAAI+f,EAAM,GAEtB9U,EAAOxC,KAAK,CACRshB,EAAI/pB,GAAG,GAAI+pB,EAAI/pB,GAAG,GAAI+pB,EAAI/pB,GAAG,GAAI,IAIzC,GAAqB,MAAlBiL,EAAO5C,OACN,MAMR,OAAO4C,EAkZCgM,GACR+S,MAjrBO,CACH,CAAC,QAAU,OAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,OAAS,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,KAAO,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,MAAQ,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,IAirB7kHjT,QAxrBO,CACH,CAAC,EAAK,QAAU,QAAU,GAAM,CAAC,EAAK,QAAU,QAAU,GAAM,CAAC,EAAK,QAAU,QAAU,GAAM,CAAC,EAAK,QAAU,MAAQ,GAAM,CAAC,EAAK,QAAU,QAAU,GAAM,CAAC,EAAK,QAAU,QAAU,GAAM,CAAC,EAAK,OAAS,QAAU,GAAM,CAAC,EAAK,QAAU,QAAU,GAAM,CAAC,EAAK,OAAS,QAAU,GAAM,CAAC,EAAK,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,OAAS,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,OAAS,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,OAAS,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,OAAS,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,MAAQ,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,GAAM,CAAC,OAAS,QAAU,QAAU,GAAM,CAAC,QAAU,OAAS,QAAU,GAAM,CAAC,QAAU,QAAU,QAAU,IAwrB9hHmB,KAzEJ,WAMI,IALA,IAAM6R,EAAM,CAAC,CAAC,EAAK,EAAK,EAAK,GAAM,CAAC,oBAAsB,oBAAsB,oBAAsB,GAAM,CAAC,oBAAsB,oBAAsB,mBAAqB,GAAM,CAAC,oBAAsB,mBAAqB,mBAAqB,GAAM,CAAC,mBAAqB,mBAAqB,mBAAqB,GAAM,CAAC,mBAAqB,oBAAsB,oBAAsB,GAAM,CAAC,oBAAsB,mBAAqB,mBAAqB,GAAM,CAAC,mBAAqB,mBAAqB,kBAAoB,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,mBAAqB,mBAAqB,kBAAoB,GAAM,CAAC,mBAAqB,mBAAqB,mBAAqB,GAAM,CAAC,mBAAqB,mBAAqB,mBAAqB,GAAM,CAAC,mBAAqB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,mBAAqB,mBAAqB,kBAAoB,GAAM,CAAC,mBAAqB,mBAAqB,kBAAoB,GAAM,CAAC,kBAAoB,mBAAqB,kBAAoB,GAAM,CAAC,mBAAqB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,mBAAqB,kBAAoB,GAAM,CAAC,mBAAqB,kBAAoB,mBAAqB,GAAM,CAAC,mBAAqB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,mBAAqB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,mBAAqB,kBAAoB,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,mBAAqB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,mBAAqB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,mBAAqB,kBAAoB,GAAM,CAAC,kBAAoB,mBAAqB,kBAAoB,GAAM,CAAC,mBAAqB,kBAAoB,kBAAoB,GAAM,CAAC,mBAAqB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,mBAAqB,kBAAoB,GAAM,CAAC,kBAAoB,mBAAqB,kBAAoB,GAAM,CAAC,mBAAqB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,mBAAqB,kBAAoB,GAAM,CAAC,mBAAqB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,mBAAqB,mBAAqB,kBAAoB,GAAM,CAAC,kBAAoB,mBAAqB,kBAAoB,GAAM,CAAC,kBAAoB,mBAAqB,kBAAoB,GAAM,CAAC,mBAAqB,kBAAoB,kBAAoB,GAAM,CAAC,mBAAqB,kBAAoB,kBAAoB,GAAM,CAAC,mBAAqB,mBAAqB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,gBAAkB,GAAM,CAAC,mBAAqB,iBAAmB,iBAAmB,GAAM,CAAC,kBAAoB,mBAAqB,iBAAmB,GAAM,CAAC,mBAAqB,mBAAqB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,mBAAqB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,mBAAqB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,iBAAmB,kBAAoB,GAAM,CAAC,kBAAoB,iBAAmB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,iBAAmB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,iBAAmB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,iBAAmB,kBAAoB,GAAM,CAAC,kBAAoB,iBAAmB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,iBAAmB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,iBAAmB,GAAM,CAAC,kBAAoB,kBAAoB,iBAAmB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,gBAAkB,kBAAoB,GAAM,CAAC,kBAAoB,iBAAmB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,iBAAmB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,kBAAoB,iBAAmB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,EAAK,EAAK,IAEhiN9e,EAAS,GACT8U,EAAKgK,EAAI1hB,OAEPrI,EAAI,EAAGA,EAAI+f,EAAI/f,IAAK,CAWxB,GAJAiL,EAAOxC,KAAK,CACRshB,EAAI/pB,GAAG,GAAI+pB,EAAI/pB,GAAG,GAAI+pB,EAAI/pB,GAAG,GAAI+pB,EAAI/pB,GAAG,KAGvB,MAAlBiL,EAAO5C,OACN,MAIR,OAAO4C,EAmDDiN,GACNC,KAhDO,CAAC,CAAC,MAAQ,EAAK,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,mBAAqB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,mBAAqB,kBAAoB,kBAAoB,GAAM,CAAC,mBAAqB,mBAAqB,mBAAqB,GAAM,CAAC,mBAAqB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,iBAAmB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,mBAAqB,mBAAqB,GAAM,CAAC,iBAAmB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,iBAAmB,mBAAqB,mBAAqB,GAAM,CAAC,iBAAmB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,mBAAqB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,iBAAmB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,iBAAmB,kBAAoB,GAAM,CAAC,iBAAmB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,gBAAkB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,iBAAmB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,gBAAkB,gBAAkB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,iBAAmB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,iBAAmB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,gBAAkB,GAAM,CAAC,iBAAmB,iBAAmB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,iBAAmB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,iBAAmB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,iBAAmB,GAAM,CAAC,EAAK,EAAK,EAAK,IAiD79MC,OA9CJ,WAMI,IALA,IAAM2R,EAAM,CAAC,CAAC,EAAK,EAAK,EAAK,GAAM,CAAC,EAAK,oBAAsB,gBAAkB,GAAM,CAAC,EAAK,oBAAsB,kBAAoB,GAAM,CAAC,EAAK,oBAAsB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,iBAAmB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,iBAAmB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,iBAAmB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,iBAAmB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,mBAAqB,kBAAoB,GAAM,CAAC,EAAK,iBAAmB,iBAAmB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,iBAAmB,iBAAmB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,iBAAmB,mBAAqB,GAAM,CAAC,EAAK,iBAAmB,iBAAmB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,iBAAmB,iBAAmB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,oBAAsB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,oBAAsB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,gBAAkB,oBAAsB,GAAM,CAAC,EAAK,EAAK,EAAK,IAEzkK9e,EAAS,GACT8U,EAAKgK,EAAI1hB,OAEPrI,EAAI,EAAGA,EAAI+f,EAAI/f,IAAK,CAOxB,GAJAiL,EAAOxC,KAAK,CACRshB,EAAI/pB,GAAG,GAAI+pB,EAAI/pB,GAAG,GAAI+pB,EAAI/pB,GAAG,GAAI+pB,EAAI/pB,GAAG,KAGvB,MAAlBiL,EAAO5C,OACN,MAIR,OAAO4C,EA4BCmN,GACRC,KAzBO,CAAC,CAAC,EAAK,EAAK,EAAK,GAAM,CAAC,oBAAsB,gBAAkB,EAAK,GAAM,CAAC,oBAAsB,kBAAoB,EAAK,GAAM,CAAC,oBAAsB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,iBAAmB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,iBAAmB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,iBAAmB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,iBAAmB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,mBAAqB,kBAAoB,EAAK,GAAM,CAAC,iBAAmB,iBAAmB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,iBAAmB,iBAAmB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,iBAAmB,mBAAqB,EAAK,GAAM,CAAC,iBAAmB,iBAAmB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,iBAAmB,iBAAmB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,oBAAsB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,oBAAsB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,gBAAkB,oBAAsB,EAAK,GAAM,CAAC,EAAK,EAAK,EAAK,IA0B1kKC,OAtBO,CAAC,CAAC,kBAAoB,EAAK,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,iBAAmB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,iBAAmB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,iBAAmB,iBAAmB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,iBAAmB,kBAAoB,kBAAoB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,kBAAoB,iBAAmB,mBAAqB,GAAM,CAAC,kBAAoB,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,gBAAkB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,oBAAsB,GAAM,CAAC,EAAK,kBAAoB,oBAAsB,GAAM,CAAC,EAAK,kBAAoB,oBAAsB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,oBAAsB,GAAM,CAAC,EAAK,iBAAmB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,oBAAsB,GAAM,CAAC,EAAK,kBAAoB,oBAAsB,GAAM,CAAC,EAAK,kBAAoB,oBAAsB,GAAM,CAAC,EAAK,kBAAoB,oBAAsB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,iBAAmB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,iBAAmB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,iBAAmB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,iBAAmB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,iBAAmB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,iBAAmB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,iBAAmB,iBAAmB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,IAuBjmKC,IAnBO,CAAC,CAAC,MAAQ,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,iBAAmB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,iBAAmB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,iBAAmB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,EAAK,oBAAsB,EAAK,GAAM,CAAC,EAAK,mBAAqB,EAAK,GAAM,CAAC,EAAK,mBAAqB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,mBAAqB,EAAK,GAAM,CAAC,EAAK,mBAAqB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,mBAAqB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,iBAAmB,EAAK,GAAM,CAAC,EAAK,mBAAqB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,mBAAqB,EAAK,GAAM,CAAC,EAAK,mBAAqB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,iBAAmB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,kBAAoB,EAAK,GAAM,CAAC,EAAK,EAAK,oBAAsB,GAAM,CAAC,EAAK,EAAK,mBAAqB,GAAM,CAAC,EAAK,EAAK,mBAAqB,GAAM,CAAC,EAAK,EAAK,mBAAqB,GAAM,CAAC,EAAK,EAAK,mBAAqB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,mBAAqB,GAAM,CAAC,EAAK,EAAK,mBAAqB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,mBAAqB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,mBAAqB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,iBAAmB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,EAAK,IAoBjnHC,OAhBO,CAAC,CAAC,EAAK,EAAK,EAAK,GAAM,CAAC,oBAAsB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,kBAAoB,EAAK,EAAK,GAAM,CAAC,mBAAqB,EAAK,EAAK,GAAM,CAAC,kBAAoB,oBAAsB,EAAK,GAAM,CAAC,kBAAoB,oBAAsB,EAAK,GAAM,CAAC,kBAAoB,oBAAsB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,iBAAmB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,iBAAmB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,iBAAmB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,mBAAqB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,kBAAoB,kBAAoB,EAAK,GAAM,CAAC,gBAAkB,mBAAqB,EAAK,GAAM,CAAC,EAAK,kBAAoB,oBAAsB,GAAM,CAAC,EAAK,kBAAoB,oBAAsB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,iBAAmB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,iBAAmB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,iBAAmB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,iBAAmB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,mBAAqB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,kBAAoB,kBAAoB,GAAM,CAAC,EAAK,iBAAmB,mBAAqB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,iBAAmB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kBAAoB,GAAM,CAAC,EAAK,EAAK,kB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","file":"/js/orderbook-heatmap.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 13);\n","/// @file\n/// @addtogroup flatbuffers_javascript_api\n/// @{\n/// @cond FLATBUFFERS_INTERNAL\n\n/**\n * @fileoverview\n *\n * Need to suppress 'global this' error so the Node.js export line doesn't cause\n * closure compile to error out.\n * @suppress {globalThis}\n */\n\n/**\n * @const\n * @namespace\n */\nvar flatbuffers = {};\n\n/**\n * @typedef {number}\n */\nflatbuffers.Offset;\n\n/**\n * @typedef {{\n *   bb: flatbuffers.ByteBuffer,\n *   bb_pos: number\n * }}\n */\nflatbuffers.Table;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.SIZEOF_SHORT = 2;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.SIZEOF_INT = 4;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.FILE_IDENTIFIER_LENGTH = 4;\n\n/**\n * @type {number}\n * @const\n */\nflatbuffers.SIZE_PREFIX_LENGTH = 4;\n\n/**\n * @enum {number}\n */\nflatbuffers.Encoding = {\n  UTF8_BYTES: 1,\n  UTF16_STRING: 2\n};\n\n/**\n * @type {Int32Array}\n * @const\n */\nflatbuffers.int32 = new Int32Array(2);\n\n/**\n * @type {Float32Array}\n * @const\n */\nflatbuffers.float32 = new Float32Array(flatbuffers.int32.buffer);\n\n/**\n * @type {Float64Array}\n * @const\n */\nflatbuffers.float64 = new Float64Array(flatbuffers.int32.buffer);\n\n/**\n * @type {boolean}\n * @const\n */\nflatbuffers.isLittleEndian = new Uint16Array(new Uint8Array([1, 0]).buffer)[0] === 1;\n\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * @constructor\n * @param {number} low\n * @param {number} high\n */\nflatbuffers.Long = function(low, high) {\n  /**\n   * @type {number}\n   * @const\n   */\n  this.low = low | 0;\n\n  /**\n   * @type {number}\n   * @const\n   */\n  this.high = high | 0;\n};\n\n/**\n * @param {number} low\n * @param {number} high\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.Long.create = function(low, high) {\n  // Special-case zero to avoid GC overhead for default values\n  return low == 0 && high == 0 ? flatbuffers.Long.ZERO : new flatbuffers.Long(low, high);\n};\n\n/**\n * @returns {number}\n */\nflatbuffers.Long.prototype.toFloat64 = function() {\n  return (this.low >>> 0) + this.high * 0x100000000;\n};\n\n/**\n * @param {flatbuffers.Long} other\n * @returns {boolean}\n */\nflatbuffers.Long.prototype.equals = function(other) {\n  return this.low == other.low && this.high == other.high;\n};\n\n/**\n * @type {!flatbuffers.Long}\n * @const\n */\nflatbuffers.Long.ZERO = new flatbuffers.Long(0, 0);\n\n/// @endcond\n////////////////////////////////////////////////////////////////////////////////\n/**\n * Create a FlatBufferBuilder.\n *\n * @constructor\n * @param {number=} opt_initial_size\n */\nflatbuffers.Builder = function(opt_initial_size) {\n  if (!opt_initial_size) {\n    var initial_size = 1024;\n  } else {\n    var initial_size = opt_initial_size;\n  }\n\n  /**\n   * @type {flatbuffers.ByteBuffer}\n   * @private\n   */\n  this.bb = flatbuffers.ByteBuffer.allocate(initial_size);\n\n  /**\n   * Remaining space in the ByteBuffer.\n   *\n   * @type {number}\n   * @private\n   */\n  this.space = initial_size;\n\n  /**\n   * Minimum alignment encountered so far.\n   *\n   * @type {number}\n   * @private\n   */\n  this.minalign = 1;\n\n  /**\n   * The vtable for the current table.\n   *\n   * @type {Array.<number>}\n   * @private\n   */\n  this.vtable = null;\n\n  /**\n   * The amount of fields we're actually using.\n   *\n   * @type {number}\n   * @private\n   */\n  this.vtable_in_use = 0;\n\n  /**\n   * Whether we are currently serializing a table.\n   *\n   * @type {boolean}\n   * @private\n   */\n  this.isNested = false;\n\n  /**\n   * Starting offset of the current struct/table.\n   *\n   * @type {number}\n   * @private\n   */\n  this.object_start = 0;\n\n  /**\n   * List of offsets of all vtables.\n   *\n   * @type {Array.<number>}\n   * @private\n   */\n  this.vtables = [];\n\n  /**\n   * For the current vector being built.\n   *\n   * @type {number}\n   * @private\n   */\n  this.vector_num_elems = 0;\n\n  /**\n   * False omits default values from the serialized data\n   *\n   * @type {boolean}\n   * @private\n   */\n  this.force_defaults = false;\n};\n\nflatbuffers.Builder.prototype.clear = function() {\n  this.bb.clear();\n  this.space = this.bb.capacity();\n  this.minalign = 1;\n  this.vtable = null;\n  this.vtable_in_use = 0;\n  this.isNested = false;\n  this.object_start = 0;\n  this.vtables = [];\n  this.vector_num_elems = 0;\n  this.force_defaults = false;\n};\n\n/**\n * In order to save space, fields that are set to their default value\n * don't get serialized into the buffer. Forcing defaults provides a\n * way to manually disable this optimization.\n *\n * @param {boolean} forceDefaults true always serializes default values\n */\nflatbuffers.Builder.prototype.forceDefaults = function(forceDefaults) {\n  this.force_defaults = forceDefaults;\n};\n\n/**\n * Get the ByteBuffer representing the FlatBuffer. Only call this after you've\n * called finish(). The actual data starts at the ByteBuffer's current position,\n * not necessarily at 0.\n *\n * @returns {flatbuffers.ByteBuffer}\n */\nflatbuffers.Builder.prototype.dataBuffer = function() {\n  return this.bb;\n};\n\n/**\n * Get the bytes representing the FlatBuffer. Only call this after you've\n * called finish().\n *\n * @returns {!Uint8Array}\n */\nflatbuffers.Builder.prototype.asUint8Array = function() {\n  return this.bb.bytes().subarray(this.bb.position(), this.bb.position() + this.offset());\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * Prepare to write an element of `size` after `additional_bytes` have been\n * written, e.g. if you write a string, you need to align such the int length\n * field is aligned to 4 bytes, and the string data follows it directly. If all\n * you need to do is alignment, `additional_bytes` will be 0.\n *\n * @param {number} size This is the of the new element to write\n * @param {number} additional_bytes The padding size\n */\nflatbuffers.Builder.prototype.prep = function(size, additional_bytes) {\n  // Track the biggest thing we've ever aligned to.\n  if (size > this.minalign) {\n    this.minalign = size;\n  }\n\n  // Find the amount of alignment needed such that `size` is properly\n  // aligned after `additional_bytes`\n  var align_size = ((~(this.bb.capacity() - this.space + additional_bytes)) + 1) & (size - 1);\n\n  // Reallocate the buffer if needed.\n  while (this.space < align_size + size + additional_bytes) {\n    var old_buf_size = this.bb.capacity();\n    this.bb = flatbuffers.Builder.growByteBuffer(this.bb);\n    this.space += this.bb.capacity() - old_buf_size;\n  }\n\n  this.pad(align_size);\n};\n\n/**\n * @param {number} byte_size\n */\nflatbuffers.Builder.prototype.pad = function(byte_size) {\n  for (var i = 0; i < byte_size; i++) {\n    this.bb.writeInt8(--this.space, 0);\n  }\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeInt8 = function(value) {\n  this.bb.writeInt8(this.space -= 1, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeInt16 = function(value) {\n  this.bb.writeInt16(this.space -= 2, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeInt32 = function(value) {\n  this.bb.writeInt32(this.space -= 4, value);\n};\n\n/**\n * @param {flatbuffers.Long} value\n */\nflatbuffers.Builder.prototype.writeInt64 = function(value) {\n  this.bb.writeInt64(this.space -= 8, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeFloat32 = function(value) {\n  this.bb.writeFloat32(this.space -= 4, value);\n};\n\n/**\n * @param {number} value\n */\nflatbuffers.Builder.prototype.writeFloat64 = function(value) {\n  this.bb.writeFloat64(this.space -= 8, value);\n};\n/// @endcond\n\n/**\n * Add an `int8` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `int8` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt8 = function(value) {\n  this.prep(1, 0);\n  this.writeInt8(value);\n};\n\n/**\n * Add an `int16` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `int16` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt16 = function(value) {\n  this.prep(2, 0);\n  this.writeInt16(value);\n};\n\n/**\n * Add an `int32` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `int32` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt32 = function(value) {\n  this.prep(4, 0);\n  this.writeInt32(value);\n};\n\n/**\n * Add an `int64` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {flatbuffers.Long} value The `int64` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addInt64 = function(value) {\n  this.prep(8, 0);\n  this.writeInt64(value);\n};\n\n/**\n * Add a `float32` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `float32` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addFloat32 = function(value) {\n  this.prep(4, 0);\n  this.writeFloat32(value);\n};\n\n/**\n * Add a `float64` to the buffer, properly aligned, and grows the buffer (if necessary).\n * @param {number} value The `float64` to add the the buffer.\n */\nflatbuffers.Builder.prototype.addFloat64 = function(value) {\n  this.prep(8, 0);\n  this.writeFloat64(value);\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt8 = function(voffset, value, defaultValue) {\n  if (this.force_defaults || value != defaultValue) {\n    this.addInt8(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt16 = function(voffset, value, defaultValue) {\n  if (this.force_defaults || value != defaultValue) {\n    this.addInt16(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt32 = function(voffset, value, defaultValue) {\n  if (this.force_defaults || value != defaultValue) {\n    this.addInt32(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * @param {number} voffset\n * @param {flatbuffers.Long} value\n * @param {flatbuffers.Long} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldInt64 = function(voffset, value, defaultValue) {\n  if (this.force_defaults || !value.equals(defaultValue)) {\n    this.addInt64(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldFloat32 = function(voffset, value, defaultValue) {\n  if (this.force_defaults || value != defaultValue) {\n    this.addFloat32(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * @param {number} voffset\n * @param {number} value\n * @param {number} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldFloat64 = function(voffset, value, defaultValue) {\n  if (this.force_defaults || value != defaultValue) {\n    this.addFloat64(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * @param {number} voffset\n * @param {flatbuffers.Offset} value\n * @param {flatbuffers.Offset} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldOffset = function(voffset, value, defaultValue) {\n  if (this.force_defaults || value != defaultValue) {\n    this.addOffset(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * Structs are stored inline, so nothing additional is being added. `d` is always 0.\n *\n * @param {number} voffset\n * @param {flatbuffers.Offset} value\n * @param {flatbuffers.Offset} defaultValue\n */\nflatbuffers.Builder.prototype.addFieldStruct = function(voffset, value, defaultValue) {\n  if (value != defaultValue) {\n    this.nested(value);\n    this.slot(voffset);\n  }\n};\n\n/**\n * Structures are always stored inline, they need to be created right\n * where they're used.  You'll get this assertion failure if you\n * created it elsewhere.\n *\n * @param {flatbuffers.Offset} obj The offset of the created object\n */\nflatbuffers.Builder.prototype.nested = function(obj) {\n  if (obj != this.offset()) {\n    throw new Error('FlatBuffers: struct must be serialized inline.');\n  }\n};\n\n/**\n * Should not be creating any other object, string or vector\n * while an object is being constructed\n */\nflatbuffers.Builder.prototype.notNested = function() {\n  if (this.isNested) {\n    throw new Error('FlatBuffers: object serialization must not be nested.');\n  }\n};\n\n/**\n * Set the current vtable at `voffset` to the current location in the buffer.\n *\n * @param {number} voffset\n */\nflatbuffers.Builder.prototype.slot = function(voffset) {\n  this.vtable[voffset] = this.offset();\n};\n\n/**\n * @returns {flatbuffers.Offset} Offset relative to the end of the buffer.\n */\nflatbuffers.Builder.prototype.offset = function() {\n  return this.bb.capacity() - this.space;\n};\n\n/**\n * Doubles the size of the backing ByteBuffer and copies the old data towards\n * the end of the new buffer (since we build the buffer backwards).\n *\n * @param {flatbuffers.ByteBuffer} bb The current buffer with the existing data\n * @returns {!flatbuffers.ByteBuffer} A new byte buffer with the old data copied\n * to it. The data is located at the end of the buffer.\n *\n * uint8Array.set() formally takes {Array<number>|ArrayBufferView}, so to pass\n * it a uint8Array we need to suppress the type check:\n * @suppress {checkTypes}\n */\nflatbuffers.Builder.growByteBuffer = function(bb) {\n  var old_buf_size = bb.capacity();\n\n  // Ensure we don't grow beyond what fits in an int.\n  if (old_buf_size & 0xC0000000) {\n    throw new Error('FlatBuffers: cannot grow buffer beyond 2 gigabytes.');\n  }\n\n  var new_buf_size = old_buf_size << 1;\n  var nbb = flatbuffers.ByteBuffer.allocate(new_buf_size);\n  nbb.setPosition(new_buf_size - old_buf_size);\n  nbb.bytes().set(bb.bytes(), new_buf_size - old_buf_size);\n  return nbb;\n};\n/// @endcond\n\n/**\n * Adds on offset, relative to where it will be written.\n *\n * @param {flatbuffers.Offset} offset The offset to add.\n */\nflatbuffers.Builder.prototype.addOffset = function(offset) {\n  this.prep(flatbuffers.SIZEOF_INT, 0); // Ensure alignment is already done.\n  this.writeInt32(this.offset() - offset + flatbuffers.SIZEOF_INT);\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * Start encoding a new object in the buffer.  Users will not usually need to\n * call this directly. The FlatBuffers compiler will generate helper methods\n * that call this method internally.\n *\n * @param {number} numfields\n */\nflatbuffers.Builder.prototype.startObject = function(numfields) {\n  this.notNested();\n  if (this.vtable == null) {\n    this.vtable = [];\n  }\n  this.vtable_in_use = numfields;\n  for (var i = 0; i < numfields; i++) {\n    this.vtable[i] = 0; // This will push additional elements as needed\n  }\n  this.isNested = true;\n  this.object_start = this.offset();\n};\n\n/**\n * Finish off writing the object that is under construction.\n *\n * @returns {flatbuffers.Offset} The offset to the object inside `dataBuffer`\n */\nflatbuffers.Builder.prototype.endObject = function() {\n  if (this.vtable == null || !this.isNested) {\n    throw new Error('FlatBuffers: endObject called without startObject');\n  }\n\n  this.addInt32(0);\n  var vtableloc = this.offset();\n\n  // Trim trailing zeroes.\n  var i = this.vtable_in_use - 1;\n  for (; i >= 0 && this.vtable[i] == 0; i--) {}\n  var trimmed_size = i + 1;\n\n  // Write out the current vtable.\n  for (; i >= 0; i--) {\n    // Offset relative to the start of the table.\n    this.addInt16(this.vtable[i] != 0 ? vtableloc - this.vtable[i] : 0);\n  }\n\n  var standard_fields = 2; // The fields below:\n  this.addInt16(vtableloc - this.object_start);\n  var len = (trimmed_size + standard_fields) * flatbuffers.SIZEOF_SHORT;\n  this.addInt16(len);\n\n  // Search for an existing vtable that matches the current one.\n  var existing_vtable = 0;\n  var vt1 = this.space;\nouter_loop:\n  for (i = 0; i < this.vtables.length; i++) {\n    var vt2 = this.bb.capacity() - this.vtables[i];\n    if (len == this.bb.readInt16(vt2)) {\n      for (var j = flatbuffers.SIZEOF_SHORT; j < len; j += flatbuffers.SIZEOF_SHORT) {\n        if (this.bb.readInt16(vt1 + j) != this.bb.readInt16(vt2 + j)) {\n          continue outer_loop;\n        }\n      }\n      existing_vtable = this.vtables[i];\n      break;\n    }\n  }\n\n  if (existing_vtable) {\n    // Found a match:\n    // Remove the current vtable.\n    this.space = this.bb.capacity() - vtableloc;\n\n    // Point table to existing vtable.\n    this.bb.writeInt32(this.space, existing_vtable - vtableloc);\n  } else {\n    // No match:\n    // Add the location of the current vtable to the list of vtables.\n    this.vtables.push(this.offset());\n\n    // Point table to current vtable.\n    this.bb.writeInt32(this.bb.capacity() - vtableloc, this.offset() - vtableloc);\n  }\n\n  this.isNested = false;\n  return vtableloc;\n};\n/// @endcond\n\n/**\n * Finalize a buffer, poiting to the given `root_table`.\n *\n * @param {flatbuffers.Offset} root_table\n * @param {string=} opt_file_identifier\n * @param {boolean=} opt_size_prefix\n */\nflatbuffers.Builder.prototype.finish = function(root_table, opt_file_identifier, opt_size_prefix) {\n  var size_prefix = opt_size_prefix ? flatbuffers.SIZE_PREFIX_LENGTH : 0;\n  if (opt_file_identifier) {\n    var file_identifier = opt_file_identifier;\n    this.prep(this.minalign, flatbuffers.SIZEOF_INT +\n      flatbuffers.FILE_IDENTIFIER_LENGTH + size_prefix);\n    if (file_identifier.length != flatbuffers.FILE_IDENTIFIER_LENGTH) {\n      throw new Error('FlatBuffers: file identifier must be length ' +\n        flatbuffers.FILE_IDENTIFIER_LENGTH);\n    }\n    for (var i = flatbuffers.FILE_IDENTIFIER_LENGTH - 1; i >= 0; i--) {\n      this.writeInt8(file_identifier.charCodeAt(i));\n    }\n  }\n  this.prep(this.minalign, flatbuffers.SIZEOF_INT + size_prefix);\n  this.addOffset(root_table);\n  if (size_prefix) {\n    this.addInt32(this.bb.capacity() - this.space);\n  }\n  this.bb.setPosition(this.space);\n};\n\n/**\n * Finalize a size prefixed buffer, pointing to the given `root_table`.\n *\n * @param {flatbuffers.Offset} root_table\n * @param {string=} opt_file_identifier\n */\nflatbuffers.Builder.prototype.finishSizePrefixed = function (root_table, opt_file_identifier) {\n  this.finish(root_table, opt_file_identifier, true);\n};\n\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * This checks a required field has been set in a given table that has\n * just been constructed.\n *\n * @param {flatbuffers.Offset} table\n * @param {number} field\n */\nflatbuffers.Builder.prototype.requiredField = function(table, field) {\n  var table_start = this.bb.capacity() - table;\n  var vtable_start = table_start - this.bb.readInt32(table_start);\n  var ok = this.bb.readInt16(vtable_start + field) != 0;\n\n  // If this fails, the caller will show what field needs to be set.\n  if (!ok) {\n    throw new Error('FlatBuffers: field ' + field + ' must be set');\n  }\n};\n\n/**\n * Start a new array/vector of objects.  Users usually will not call\n * this directly. The FlatBuffers compiler will create a start/end\n * method for vector types in generated code.\n *\n * @param {number} elem_size The size of each element in the array\n * @param {number} num_elems The number of elements in the array\n * @param {number} alignment The alignment of the array\n */\nflatbuffers.Builder.prototype.startVector = function(elem_size, num_elems, alignment) {\n  this.notNested();\n  this.vector_num_elems = num_elems;\n  this.prep(flatbuffers.SIZEOF_INT, elem_size * num_elems);\n  this.prep(alignment, elem_size * num_elems); // Just in case alignment > int.\n};\n\n/**\n * Finish off the creation of an array and all its elements. The array must be\n * created with `startVector`.\n *\n * @returns {flatbuffers.Offset} The offset at which the newly created array\n * starts.\n */\nflatbuffers.Builder.prototype.endVector = function() {\n  this.writeInt32(this.vector_num_elems);\n  return this.offset();\n};\n/// @endcond\n\n/**\n * Encode the string `s` in the buffer using UTF-8. If a Uint8Array is passed\n * instead of a string, it is assumed to contain valid UTF-8 encoded data.\n *\n * @param {string|Uint8Array} s The string to encode\n * @return {flatbuffers.Offset} The offset in the buffer where the encoded string starts\n */\nflatbuffers.Builder.prototype.createString = function(s) {\n  if (s instanceof Uint8Array) {\n    var utf8 = s;\n  } else {\n    var utf8 = [];\n    var i = 0;\n\n    while (i < s.length) {\n      var codePoint;\n\n      // Decode UTF-16\n      var a = s.charCodeAt(i++);\n      if (a < 0xD800 || a >= 0xDC00) {\n        codePoint = a;\n      } else {\n        var b = s.charCodeAt(i++);\n        codePoint = (a << 10) + b + (0x10000 - (0xD800 << 10) - 0xDC00);\n      }\n\n      // Encode UTF-8\n      if (codePoint < 0x80) {\n        utf8.push(codePoint);\n      } else {\n        if (codePoint < 0x800) {\n          utf8.push(((codePoint >> 6) & 0x1F) | 0xC0);\n        } else {\n          if (codePoint < 0x10000) {\n            utf8.push(((codePoint >> 12) & 0x0F) | 0xE0);\n          } else {\n            utf8.push(\n              ((codePoint >> 18) & 0x07) | 0xF0,\n              ((codePoint >> 12) & 0x3F) | 0x80);\n          }\n          utf8.push(((codePoint >> 6) & 0x3F) | 0x80);\n        }\n        utf8.push((codePoint & 0x3F) | 0x80);\n      }\n    }\n  }\n\n  this.addInt8(0);\n  this.startVector(1, utf8.length, 1);\n  this.bb.setPosition(this.space -= utf8.length);\n  for (var i = 0, offset = this.space, bytes = this.bb.bytes(); i < utf8.length; i++) {\n    bytes[offset++] = utf8[i];\n  }\n  return this.endVector();\n};\n\n/**\n * A helper function to avoid generated code depending on this file directly.\n *\n * @param {number} low\n * @param {number} high\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.Builder.prototype.createLong = function(low, high) {\n  return flatbuffers.Long.create(low, high);\n};\n////////////////////////////////////////////////////////////////////////////////\n/// @cond FLATBUFFERS_INTERNAL\n/**\n * Create a new ByteBuffer with a given array of bytes (`Uint8Array`).\n *\n * @constructor\n * @param {Uint8Array} bytes\n */\nflatbuffers.ByteBuffer = function(bytes) {\n  /**\n   * @type {Uint8Array}\n   * @private\n   */\n  this.bytes_ = bytes;\n\n  /**\n   * @type {number}\n   * @private\n   */\n  this.position_ = 0;\n};\n\n/**\n * Create and allocate a new ByteBuffer with a given size.\n *\n * @param {number} byte_size\n * @returns {!flatbuffers.ByteBuffer}\n */\nflatbuffers.ByteBuffer.allocate = function(byte_size) {\n  return new flatbuffers.ByteBuffer(new Uint8Array(byte_size));\n};\n\nflatbuffers.ByteBuffer.prototype.clear = function() {\n  this.position_ = 0;\n};\n\n/**\n * Get the underlying `Uint8Array`.\n *\n * @returns {Uint8Array}\n */\nflatbuffers.ByteBuffer.prototype.bytes = function() {\n  return this.bytes_;\n};\n\n/**\n * Get the buffer's position.\n *\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.position = function() {\n  return this.position_;\n};\n\n/**\n * Set the buffer's position.\n *\n * @param {number} position\n */\nflatbuffers.ByteBuffer.prototype.setPosition = function(position) {\n  this.position_ = position;\n};\n\n/**\n * Get the buffer's capacity.\n *\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.capacity = function() {\n  return this.bytes_.length;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readInt8 = function(offset) {\n  return this.readUint8(offset) << 24 >> 24;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readUint8 = function(offset) {\n  return this.bytes_[offset];\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readInt16 = function(offset) {\n  return this.readUint16(offset) << 16 >> 16;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readUint16 = function(offset) {\n  return this.bytes_[offset] | this.bytes_[offset + 1] << 8;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readInt32 = function(offset) {\n  return this.bytes_[offset] | this.bytes_[offset + 1] << 8 | this.bytes_[offset + 2] << 16 | this.bytes_[offset + 3] << 24;\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readUint32 = function(offset) {\n  return this.readInt32(offset) >>> 0;\n};\n\n/**\n * @param {number} offset\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.ByteBuffer.prototype.readInt64 = function(offset) {\n  return new flatbuffers.Long(this.readInt32(offset), this.readInt32(offset + 4));\n};\n\n/**\n * @param {number} offset\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.ByteBuffer.prototype.readUint64 = function(offset) {\n  return new flatbuffers.Long(this.readUint32(offset), this.readUint32(offset + 4));\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readFloat32 = function(offset) {\n  flatbuffers.int32[0] = this.readInt32(offset);\n  return flatbuffers.float32[0];\n};\n\n/**\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.readFloat64 = function(offset) {\n  flatbuffers.int32[flatbuffers.isLittleEndian ? 0 : 1] = this.readInt32(offset);\n  flatbuffers.int32[flatbuffers.isLittleEndian ? 1 : 0] = this.readInt32(offset + 4);\n  return flatbuffers.float64[0];\n};\n\n/**\n * @param {number} offset\n * @param {number|boolean} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt8 = function(offset, value) {\n  this.bytes_[offset] = /** @type {number} */(value);\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint8 = function(offset, value) {\n  this.bytes_[offset] = value;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt16 = function(offset, value) {\n  this.bytes_[offset] = value;\n  this.bytes_[offset + 1] = value >> 8;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint16 = function(offset, value) {\n    this.bytes_[offset] = value;\n    this.bytes_[offset + 1] = value >> 8;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt32 = function(offset, value) {\n  this.bytes_[offset] = value;\n  this.bytes_[offset + 1] = value >> 8;\n  this.bytes_[offset + 2] = value >> 16;\n  this.bytes_[offset + 3] = value >> 24;\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint32 = function(offset, value) {\n    this.bytes_[offset] = value;\n    this.bytes_[offset + 1] = value >> 8;\n    this.bytes_[offset + 2] = value >> 16;\n    this.bytes_[offset + 3] = value >> 24;\n};\n\n/**\n * @param {number} offset\n * @param {flatbuffers.Long} value\n */\nflatbuffers.ByteBuffer.prototype.writeInt64 = function(offset, value) {\n  this.writeInt32(offset, value.low);\n  this.writeInt32(offset + 4, value.high);\n};\n\n/**\n * @param {number} offset\n * @param {flatbuffers.Long} value\n */\nflatbuffers.ByteBuffer.prototype.writeUint64 = function(offset, value) {\n    this.writeUint32(offset, value.low);\n    this.writeUint32(offset + 4, value.high);\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeFloat32 = function(offset, value) {\n  flatbuffers.float32[0] = value;\n  this.writeInt32(offset, flatbuffers.int32[0]);\n};\n\n/**\n * @param {number} offset\n * @param {number} value\n */\nflatbuffers.ByteBuffer.prototype.writeFloat64 = function(offset, value) {\n  flatbuffers.float64[0] = value;\n  this.writeInt32(offset, flatbuffers.int32[flatbuffers.isLittleEndian ? 0 : 1]);\n  this.writeInt32(offset + 4, flatbuffers.int32[flatbuffers.isLittleEndian ? 1 : 0]);\n};\n\n/**\n * Return the file identifier.   Behavior is undefined for FlatBuffers whose\n * schema does not include a file_identifier (likely points at padding or the\n * start of a the root vtable).\n * @returns {string}\n */\nflatbuffers.ByteBuffer.prototype.getBufferIdentifier = function() {\n  if (this.bytes_.length < this.position_ + flatbuffers.SIZEOF_INT +\n      flatbuffers.FILE_IDENTIFIER_LENGTH) {\n    throw new Error(\n        'FlatBuffers: ByteBuffer is too short to contain an identifier.');\n  }\n  var result = \"\";\n  for (var i = 0; i < flatbuffers.FILE_IDENTIFIER_LENGTH; i++) {\n    result += String.fromCharCode(\n        this.readInt8(this.position_ + flatbuffers.SIZEOF_INT + i));\n  }\n  return result;\n};\n\n/**\n * Look up a field in the vtable, return an offset into the object, or 0 if the\n * field is not present.\n *\n * @param {number} bb_pos\n * @param {number} vtable_offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__offset = function(bb_pos, vtable_offset) {\n  var vtable = bb_pos - this.readInt32(bb_pos);\n  return vtable_offset < this.readInt16(vtable) ? this.readInt16(vtable + vtable_offset) : 0;\n};\n\n/**\n * Initialize any Table-derived type to point to the union at the given offset.\n *\n * @param {flatbuffers.Table} t\n * @param {number} offset\n * @returns {flatbuffers.Table}\n */\nflatbuffers.ByteBuffer.prototype.__union = function(t, offset) {\n  t.bb_pos = offset + this.readInt32(offset);\n  t.bb = this;\n  return t;\n};\n\n/**\n * Create a JavaScript string from UTF-8 data stored inside the FlatBuffer.\n * This allocates a new string and converts to wide chars upon each access.\n *\n * To avoid the conversion to UTF-16, pass flatbuffers.Encoding.UTF8_BYTES as\n * the \"optionalEncoding\" argument. This is useful for avoiding conversion to\n * and from UTF-16 when the data will just be packaged back up in another\n * FlatBuffer later on.\n *\n * @param {number} offset\n * @param {flatbuffers.Encoding=} opt_encoding Defaults to UTF16_STRING\n * @returns {string|!Uint8Array}\n */\nflatbuffers.ByteBuffer.prototype.__string = function(offset, opt_encoding) {\n  offset += this.readInt32(offset);\n\n  var length = this.readInt32(offset);\n  var result = '';\n  var i = 0;\n\n  offset += flatbuffers.SIZEOF_INT;\n\n  if (opt_encoding === flatbuffers.Encoding.UTF8_BYTES) {\n    return this.bytes_.subarray(offset, offset + length);\n  }\n\n  while (i < length) {\n    var codePoint;\n\n    // Decode UTF-8\n    var a = this.readUint8(offset + i++);\n    if (a < 0xC0) {\n      codePoint = a;\n    } else {\n      var b = this.readUint8(offset + i++);\n      if (a < 0xE0) {\n        codePoint =\n          ((a & 0x1F) << 6) |\n          (b & 0x3F);\n      } else {\n        var c = this.readUint8(offset + i++);\n        if (a < 0xF0) {\n          codePoint =\n            ((a & 0x0F) << 12) |\n            ((b & 0x3F) << 6) |\n            (c & 0x3F);\n        } else {\n          var d = this.readUint8(offset + i++);\n          codePoint =\n            ((a & 0x07) << 18) |\n            ((b & 0x3F) << 12) |\n            ((c & 0x3F) << 6) |\n            (d & 0x3F);\n        }\n      }\n    }\n\n    // Encode UTF-16\n    if (codePoint < 0x10000) {\n      result += String.fromCharCode(codePoint);\n    } else {\n      codePoint -= 0x10000;\n      result += String.fromCharCode(\n        (codePoint >> 10) + 0xD800,\n        (codePoint & ((1 << 10) - 1)) + 0xDC00);\n    }\n  }\n\n  return result;\n};\n\n/**\n * Retrieve the relative offset stored at \"offset\"\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__indirect = function(offset) {\n  return offset + this.readInt32(offset);\n};\n\n/**\n * Get the start of data of a vector whose offset is stored at \"offset\" in this object.\n *\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__vector = function(offset) {\n  return offset + this.readInt32(offset) + flatbuffers.SIZEOF_INT; // data starts after the length\n};\n\n/**\n * Get the length of a vector whose offset is stored at \"offset\" in this object.\n *\n * @param {number} offset\n * @returns {number}\n */\nflatbuffers.ByteBuffer.prototype.__vector_len = function(offset) {\n  return this.readInt32(offset + this.readInt32(offset));\n};\n\n/**\n * @param {string} ident\n * @returns {boolean}\n */\nflatbuffers.ByteBuffer.prototype.__has_identifier = function(ident) {\n  if (ident.length != flatbuffers.FILE_IDENTIFIER_LENGTH) {\n    throw new Error('FlatBuffers: file identifier must be length ' +\n                    flatbuffers.FILE_IDENTIFIER_LENGTH);\n  }\n  for (var i = 0; i < flatbuffers.FILE_IDENTIFIER_LENGTH; i++) {\n    if (ident.charCodeAt(i) != this.readInt8(this.position_ + flatbuffers.SIZEOF_INT + i)) {\n      return false;\n    }\n  }\n  return true;\n};\n\n/**\n * A helper function to avoid generated code depending on this file directly.\n *\n * @param {number} low\n * @param {number} high\n * @returns {!flatbuffers.Long}\n */\nflatbuffers.ByteBuffer.prototype.createLong = function(low, high) {\n  return flatbuffers.Long.create(low, high);\n};\n\n// Exports for Node.js and RequireJS\nexport { flatbuffers };\n\n/// @endcond\n/// @}\n","import { flatbuffers } from 'flatbuffers';\nimport { BitcoinWisdom } from '../../../public/js/flatbuffers_combined.js';\n\nimport dictionaryColorMaps from './colormaps.js';\nimport reglLib from 'regl/dist/regl.unchecked';\n\n(function() {\n    'use strict';\n\n    const useWebWorker = !!window.Worker;\n\n    function getCanvasGl(canvas, options) {\n        try {\n            return canvas.getContext('webgl', options);\n        } catch(e) {\n            return false;\n        }\n    }\n\n    if(!useWebWorker) {\n        console.log('Web Worker is not supported');\n\n        return;\n    }\n\n    const canvas = document.getElementById('canvas_heatmap');\n\n    if(!canvas) {\n        console.error('Heatmaps canvas not found');\n\n        return;\n    }\n\n    const gl = getCanvasGl(canvas, {\n        preserveDrawingBuffer: true\n    });\n\n    if(!gl) {\n        console.error('WebGL context is empty, check if WebGL is supported');\n\n        return;\n    }\n\n    const regl = reglLib({\n    //    canvas: canvas,\n        gl: gl,\n    });\n\n    // placeholder for this script\n    const NormalizationFunctions = require('./heatmap/heatmap-normalization').default;\n\n    window.Heatmap = (function () {\n        const config = {\n            canvasWidth: 100,\n            canvasHeight: 50,\n            graphMinPrice: 0,\n            graphMaxPrice: 0,\n            barWidthWithGap: 1,\n            gapWidth: 1,\n            gapHeight: 1,\n            step: 60,\n            barsAreaHeight: 1,\n            firstCandleTime: +new Date(),\n            lastCandleTime: +new Date(),\n            normalization: 'linear',\n            precisionStep: 10,\n            noiseSmoothingThreshold: 0,\n            opacity: 60,\n            zeroWeightOpacity: 30,\n            opacitySpeed: 25,\n            weightThreshold: 0,\n            isLogScale: false,\n            colorMap: 'viridis',\n            priceLevelsSize: 0\n        };\n\n        // colormap settings don't matter - will be re-init by presets\n\n        if(window.$theme_name === \"light\") {\n            config.colorMap = \"cool\";\n        }\n\n        function getConfig() {\n            return config;\n        }\n\n        const fragCode = `\n        #ifdef GL_FRAGMENT_PRECISION_HIGH\n        precision highp float;\n        #else\n        precision mediump float;\n        #endif\n    \n        varying vec4 fragColor;\n        \n        void main() {\n            gl_FragColor = fragColor;\n        }\n        `;\n\n        // return vec2(2.0 * ((x / stageWidth) * scaleX - (offsetX / stageWidth) - 0.5), -(2.0 * ((y / stageHeight) * scaleY - (offsetY / stageHeight) - 0.5)));\n\n        const vertCode = `\n        #ifdef GL_FRAGMENT_PRECISION_HIGH\n        precision highp float;\n        #else\n        precision mediump float;\n        #endif\n        \n        attribute vec2 position;\n        attribute vec4 color;\n        varying vec4 fragColor;\n        \n        uniform float stageWidth;\n        uniform float stageHeight;\n        uniform float limitX;\n        uniform float limitY;\n        \n        uniform float offsetX;\n        uniform float offsetY;\n        uniform float scaleX;\n        uniform float scaleY;\n        \n        vec2 move(vec2 position) {\n            float x = position[0];\n            float y = position[1];\n            \n            return vec2(\n                ((x - offsetX) * scaleX), \n                ((y - offsetY) * scaleY)\n            );\n        }\n        \n        vec2 normalizeCoords(vec2 position) {\n            float x = position[0];\n            float y = position[1];\n            \n            return vec2(\n                  2.0 * (x / stageWidth - 0.5),\n                -(2.0 * (y / stageHeight - 0.5))\n            );\n        }\n        \n        vec4 getColor(vec2 position, vec4 color) {\n            float x = position[0];\n            float y = position[1];\n            \n            if(x > limitX || y > limitY || x < 0.0 || y < 0.0) {\n                return vec4(0.0, 0.0, 0.0, 0.0);\n            }\n        \n            return color;\n        }\n        \n        void main() {\n            vec2 newPos = move(position);\n            \n            fragColor = getColor(newPos, color);\n            gl_Position = vec4(normalizeCoords(newPos), 0.0, 1.0);\n        }\n                `;\n\n        const reglOptions = {\n            // check for performance hits\n            blend: {\n                enable: true,\n                func: {\n                    srcRGB: 'src alpha',\n                    srcAlpha: 1,\n                    dstRGB: 'one minus src alpha',\n                    dstAlpha: 1\n                },\n                /*  equation: {\n                    rgb: 'add',\n                    alpha: 'add'\n                },\n                color: [0, 0, 0, 0]*/\n            }\n        };\n\n        function HeatmapView() {\n            this.position = [];\n            this.color = [];\n            this.count = 0;\n\n            this.stageWidth = 100;\n            this.stageHeight = 50;\n\n            this.offsetX = 0;\n            this.offsetY = 0;\n            this.scaleX = 1;\n            this.scaleY = 1;\n\n            this.minTimestamp = 0;\n            this.maxTimestamp = 0;\n\n            this.minPrice = 0;\n            this.maxPrice = 0;\n        }\n\n        HeatmapView.prototype.move = function(offsetX, offsetY, scaleX, scaleY) {\n            this.offsetX = offsetX;\n            this.offsetY = offsetY;\n            this.scaleX = scaleX;\n            this.scaleY = scaleY;\n        };\n\n        HeatmapView.prototype.update = function(position, color, count) {\n            this.position = regl.buffer(position);\n            this.color = regl.buffer(color);\n            this.count = count;\n\n            this.move(0, 0, 1, 1);\n        };\n\n        HeatmapView.prototype.setPreviousData = function(vars, rectWidth, rectHeight, minMaxPriceDiff) {\n            this.lastRectWidth = rectWidth;\n            this.lastRectHeight = rectHeight;\n\n            this.lastTimestamp = vars.firstCandleTime;\n\n            this.lastMaxPrice = vars.graphMaxPrice;\n            this.lastMinPrice = vars.graphMinPrice;\n            this.lastMinMaxPriceDiff = minMaxPriceDiff;\n\n            this.lastPixelsPerDollar = vars.barsAreaHeight / minMaxPriceDiff;\n        };\n\n        HeatmapView.prototype.properties = function(stageWidth, stageHeight) {\n            this.stageWidth = stageWidth;\n            this.stageHeight = stageHeight;\n            this.limitX = config.canvasWidth;\n            this.limitY = config.canvasHeight;\n        };\n\n        HeatmapView.prototype.needsRedraw = function(vars) {\n            return  vars.graphMinPrice < this.minPrice || vars.graphMaxPrice > this.maxPrice ||\n                    vars.firstCandleTime < this.minTimestamp || vars.lastCandleTime > this.maxTimestamp;\n        };\n\n        HeatmapView.prototype.setLimits = function(minPrice, maxPrice, minTimestamp, maxTimestamp) {\n            this.minPrice = minPrice;\n            this.maxPrice = maxPrice;\n            this.minTimestamp = minTimestamp;\n            this.maxTimestamp = maxTimestamp;\n        };\n\n        HeatmapView.prototype.draw = regl({\n            frag: fragCode,\n            vert: vertCode,\n\n            attributes: {\n                position: regl.this('position'),\n                color: regl.this('color'),\n            },\n\n            uniforms: {\n                limitX: regl.this('limitX'),\n                limitY: regl.this('limitY'),\n                stageWidth: regl.this('stageWidth'),\n                stageHeight: regl.this('stageHeight'),\n                scaleX: regl.this('scaleX'),\n                scaleY: regl.this('scaleY'),\n                offsetX: regl.this('offsetX'),\n                offsetY: regl.this('offsetY'),\n            },\n\n            count: regl.this('count'),\n\n            blend: reglOptions.blend,\n\n            primitive: 'triangles',\n        });\n\n        // https://codepen.io/BangEqual/pen/VLNowO\n        function generateColors(val1RGB, val2RGB, stepsInt) {\n            const colors = [];\n\n            const stepsPerc = 100 / (stepsInt + 1);\n\n            const valClampRGB = [\n                val2RGB[0] - val1RGB[0],\n                val2RGB[1] - val1RGB[1],\n                val2RGB[2] - val1RGB[2],\n                val2RGB[3] - val1RGB[3],\n            ];\n\n            // build the color array out with color steps\n            for (let i = 0; i < stepsInt; i++) {\n                const clampedR = (valClampRGB[0] > 0)\n                    ? (Math.round(valClampRGB[0] / 100 * (stepsPerc * (i + 1))))\n                    : (Math.round((val1RGB[0] + (valClampRGB[0]) / 100 * (stepsPerc * (i + 1)))));\n\n                const clampedG = (valClampRGB[1] > 0)\n                    ? (Math.round(valClampRGB[1] / 100 * (stepsPerc * (i + 1))))\n                    : (Math.round((val1RGB[1] + (valClampRGB[1]) / 100 * (stepsPerc * (i + 1)))));\n\n                const clampedB = (valClampRGB[2] > 0)\n                    ? (Math.round(valClampRGB[2] / 100 * (stepsPerc * (i + 1))))\n                    : (Math.round((val1RGB[2] + (valClampRGB[2]) / 100 * (stepsPerc * (i + 1)))));\n\n                const clampedOpacity = (valClampRGB[3] > 0)\n                    ? (Math.round(valClampRGB[3] / 100 * (stepsPerc * (i + 1))))\n                    : (Math.round((val1RGB[3] + (valClampRGB[3]) / 100 * (stepsPerc * (i + 1)))));\n\n                colors[i] = [\n                    clampedR / 255,\n                    clampedG / 255,\n                    clampedB / 255,\n                    clampedOpacity / 100\n                ];\n            }\n\n            return colors;\n        }\n\n        const dataForDrawIds = {\n            'currentCandle': 'current',\n            'oldCandles': 'old',\n        };\n\n        const dataForDraw = {\n            'current': [],\n            'old': []\n        };\n\n        const dataForDrawMaxWeights = {\n            'current': 0,\n            'old': 0 // leave as zero to calc every time\n        };\n\n        const dataViews = {\n            'current': new HeatmapView(),\n            'old': new HeatmapView(),\n        };\n\n        let cachedJson = [];\n        // cached data revalidation\n        let mustRevalidateCache = false;\n\n        const BUFFER_VALIDATION_STATUS = {\n            VALID: 0,\n            INVALIDATION_REQUESTED: 1,\n            INVALID: 2\n        };\n\n        /*\n        * Cache revalidation flow:\n        * init buffer invalidation (threshold / smoothing change, any reason)\n        * send postMessage request to Worker\n        * a number of redraws may be called\n        * invalidate cache on actual data receive (onmessage)\n        * */\n        const bufferDataInvalid = {\n            'old': BUFFER_VALIDATION_STATUS.INVALID,\n            'current': BUFFER_VALIDATION_STATUS.INVALID\n        };\n\n        function setBufferDataValid(bufferId) {\n            return bufferDataInvalid[bufferId] = BUFFER_VALIDATION_STATUS.VALID;\n        }\n\n        function isBufferDataValid(bufferId) {\n            return bufferDataInvalid[bufferId] === BUFFER_VALIDATION_STATUS.VALID;\n        }\n\n        function requestBufferDataInvalidation(bufferId) {\n            bufferDataInvalid[bufferId] = BUFFER_VALIDATION_STATUS.INVALIDATION_REQUESTED;\n        }\n\n        function isBufferDataInvalidationRequested(bufferId) {\n            return bufferDataInvalid[bufferId] === BUFFER_VALIDATION_STATUS.INVALIDATION_REQUESTED;\n        }\n\n        function invalidateBufferData(bufferId) {\n            bufferDataInvalid[bufferId] = BUFFER_VALIDATION_STATUS.INVALID;\n        }\n\n        function isBufferDataInvalid(bufferId) {\n            return bufferDataInvalid[bufferId] === BUFFER_VALIDATION_STATUS.INVALID;\n        }\n\n        function requestAllBuffersDataInvalidation() {\n            requestBufferDataInvalidation(dataForDrawIds.oldCandles);\n            requestBufferDataInvalidation(dataForDrawIds.currentCandle);\n        }\n\n        function invalidateAllBuffersData() {\n            invalidateBufferData(dataForDrawIds.oldCandles);\n            invalidateBufferData(dataForDrawIds.currentCandle);\n        }\n\n        function requestSpreadMatrix(step, cb) {\n            let baseUrl = \"https://bitcoinwisdom.io\";\n            let uri = \"/api/heatmaps/price-spread-matrix\";\n\n            if(window.$heatmap_settings.local) {\n                baseUrl = \"https://testing.bitcoinwisdom.io\";\n            }\n\n            const getParams = {\n                symbol: window.$symbol,\n                step: step,\n                since: 0,\n                markets: Object.keys(aggregatedConfig)\n            };\n\n            const ajaxParams = {\n                url: baseUrl + uri,\n                type: 'GET',\n                data: getParams,\n                success: function (resp, textStatus, request) {\n                    aggregatedPriceSpread = resp;\n\n                    cb();\n                },\n                error: function (n, textStatus, e) {\n                    cb();\n\n                    console.error(n, e);\n                }\n            };\n\n            $.ajax(ajaxParams);\n        }\n\n        let requestDataRequestInProgress = false;\n        let requestDataRequestInProgressTimeout = null;\n        let requestDataOldParams = null;\n\n        function requestDataAjax(url, getParams, cb, errorCb) {\n            const paramsJson = JSON.stringify(getParams);\n\n            if(requestDataRequestInProgress && paramsJson === requestDataOldParams) {\n                return false;\n            }\n\n            requestDataRequestInProgress = true;\n            requestDataOldParams = paramsJson;\n\n            if(requestDataRequestInProgressTimeout) {\n                clearTimeout(requestDataRequestInProgressTimeout);\n            }\n\n            requestDataRequestInProgressTimeout = setTimeout(() => {\n                requestDataRequestInProgress = false;\n            }, 30 * 1000);\n\n            const ajaxParams = {\n                url: url,\n                type: 'GET',\n                data: getParams,\n                success: function (resp, textStatus, request) {\n                    cb(resp, request.getResponseHeader('Content-Type'));\n\n                    window.Heatmap.update();\n                },\n                error: function (n, textStatus, e) {\n                    if(errorCb) {\n                        errorCb(n, e);\n                    }\n\n                    console.error(n, e);\n                }\n            };\n\n            if(getParams.hasOwnProperty('binary') && getParams.binary) {\n                ajaxParams.dataType = \"arraybuffer\";\n            }\n\n            $.ajax(ajaxParams);\n        }\n\n        function requestData(step) {\n            let since = 0;\n\n            let uri;\n            let baseUrl = \"https://hm.bitcoinwisdom.io/v2/\";\n\n            const getParams = {\n                step: step,\n                since: since,\n                binary: true\n            };\n\n            if('$heatmap_settings' in window) {\n                if(window.$heatmap_settings.local) {\n                    baseUrl = \"https://192.168.0.100:56000/v2/\";\n                }\n\n                uri = \"data\";\n            }\n\n            if(window.$heatmap_settings.combined) {\n                const markets = Object.keys(aggregatedConfig);\n\n                if(!markets.length) {\n                    emptyDrawData();\n                    invalidateAllBuffersData();\n                    redraw();\n\n                    return;\n                }\n\n                const handleOnCompletionOf = 1 + markets.length;\n                let handleCounter = 0;\n\n                const counterCb = () => {\n                    if(++handleCounter >= handleOnCompletionOf) {\n                        requestDataRequestInProgress = false;\n\n                        handleData();\n                    }\n                };\n\n                requestSpreadMatrix(step, () => {\n                    counterCb();\n                });\n\n                for(let market of markets) {\n                    getParams.pairId = market;\n\n                    if(!mustRevalidateCache && cachedJson.hasOwnProperty(step) && cachedJson[step].hasOwnProperty(market)) {\n                        const timestamps = Object.keys(cachedJson[step][market]);\n\n                        if(timestamps.length) {\n                            timestamps.sort();\n                            getParams.since = timestamps[timestamps.length - 1];\n                        }\n                    }\n\n                    const cb = (resp, contentType) => {\n                        appendData(market, step, resp, contentType);\n\n                        counterCb();\n                    };\n\n                    const errorCb = () => {\n                        counterCb();\n                    };\n\n                    requestDataAjax(baseUrl + uri, getParams, cb, errorCb)\n                }\n            } else {\n                getParams.symbol = window.$symbol;\n\n                const cb = (resp, contentType) => {\n                    appendData(0, step, resp, contentType);\n                    handleData(dataForDrawIds.oldCandles, 0);\n                };\n\n                requestDataAjax(baseUrl + uri, getParams, cb)\n            }\n        }\n\n        function parseFlatBuffers(resp) {\n            const json = [];\n\n            const binaryData = new Uint8Array(resp);\n            const buffer = new flatbuffers.ByteBuffer(binaryData);\n\n            const response = BitcoinWisdom.Buffers.HeatmapResponse.getRootAsHeatmapResponse(buffer);\n            const responseDataLength = response.timestampsLength();\n\n            for(let i = 0; i < responseDataLength; i++) {\n                const timestampVolumeData = response.timestamps(i);\n                const timestamp = timestampVolumeData.timestamp();\n\n                json[timestamp] = {};\n\n                const volumeMapLength = timestampVolumeData.dataLength();\n\n                for(let j = 0; j < volumeMapLength; j++) {\n                    const timestampData = timestampVolumeData.data(j);\n\n                    json[timestamp][timestampData.price()] = timestampData.volume();\n                }\n            }\n\n            return json;\n        }\n\n        function appendData(marketId, step, resp, contentType) {\n            if (!cachedJson.hasOwnProperty(step)) {\n                cachedJson[step] = {};\n            }\n\n            if (!cachedJson[step].hasOwnProperty(marketId)) {\n                cachedJson[step][marketId] = {};\n            }\n\n            if(!contentType || contentType !== \"application/json\") {\n                resp = parseFlatBuffers(resp);\n            }\n\n            if(mustRevalidateCache) {\n                cachedJson[step][marketId] = resp;\n                mustRevalidateCache = false;\n            } else {\n                for(let key in resp) {\n                    if(resp.hasOwnProperty(key)) {\n                        cachedJson[step][marketId][key] = resp[key];\n                    }\n                }\n            }\n\n            const keys = Object.keys(cachedJson[step][marketId]);\n\n            if(keys.length >= 1800) {\n                mustRevalidateCache = true;\n            }\n        }\n\n        const defaultColorMaps = {\n            cividis: dictionaryColorMaps.cividis,\n            plasma: dictionaryColorMaps.plasma,\n            inferno: dictionaryColorMaps.inferno,\n            inferno2: dictionaryColorMaps.inferno2,\n            viridis: dictionaryColorMaps.viridis,\n        //    magma: dictionaryColorMaps.magma,\n            binary: generateColors([255, 255, 255, 0], [255, 255, 255, 100], 100),\n            bone: dictionaryColorMaps.bone,\n            pink: dictionaryColorMaps.pink,\n            spring: dictionaryColorMaps.spring,\n            cool: dictionaryColorMaps.cool,\n            Wistia: dictionaryColorMaps.Wistia,\n            hot: dictionaryColorMaps.hot,\n            afmhot: dictionaryColorMaps.afmhot\n        };\n\n        const defaultPresets = {\n            cividis: {\n                noiseSmoothingThreshold: 0,\n                opacity: 100,\n                zeroWeightOpacity: 30,\n                opacitySpeed: 20,\n                weightThreshold: 0,\n            },\n            inferno: {\n                weightThreshold: 0,\n                opacity: 60,\n                noiseSmoothingThreshold: 0,\n                zeroWeightOpacity: 70,\n                opacitySpeed: 20\n            },/*\n            inferno2: {\n                opacity: 40,\n                noiseSmoothingThreshold: 25,\n                zeroWeightOpacity: 90,\n                weightThreshold: 0,\n                opacitySpeed: 1\n            },*/\n            inferno2: {\n                weightThreshold: 0,\n                opacity: 60,\n                noiseSmoothingThreshold: 0,\n                zeroWeightOpacity: 30,\n                opacitySpeed: 25\n            },\n            plasma: {\n                weightThreshold: 0,\n                opacity: 70,\n                noiseSmoothingThreshold: 0,\n                zeroWeightOpacity: 30,\n                opacitySpeed: 10\n            },\n            viridis: {\n                weightThreshold: 1,\n                opacity: 70,\n                noiseSmoothingThreshold: 0,\n                zeroWeightOpacity: 10,\n                opacitySpeed: 25\n            },\n            binary: {\n                weightThreshold: 5,\n                opacity: 100,\n                noiseSmoothingThreshold: 25,\n                zeroWeightOpacity: 70,\n                opacitySpeed: 10\n            },\n            bone: {\n                weightThreshold: 0,\n                opacity: 100,\n                noiseSmoothingThreshold: 25,\n                zeroWeightOpacity: 100,\n                opacitySpeed: 20\n            },\n            pink: {\n                weightThreshold: 0,\n                opacity: 100,\n                noiseSmoothingThreshold: 25,\n                zeroWeightOpacity: 0,\n                opacitySpeed: 20\n            },\n            spring: {\n                weightThreshold: 0,\n                opacity: 90,\n                noiseSmoothingThreshold: 25,\n                zeroWeightOpacity: 0,\n                opacitySpeed: 25\n            },\n            cool: {\n                weightThreshold: 0,\n                opacity: 70,\n                noiseSmoothingThreshold: 25,\n                zeroWeightOpacity: 0,\n                opacitySpeed: 20\n            },\n            Wistia: {\n                weightThreshold: 0,\n                opacity: 85,\n                noiseSmoothingThreshold: 25,\n                zeroWeightOpacity: 0,\n                opacitySpeed: 25\n            },\n            hot: {\n                weightThreshold: 1,\n                opacity: 70,\n                noiseSmoothingThreshold: 25,\n                zeroWeightOpacity: 70,\n                opacitySpeed: 10\n            },\n            afmhot: {\n                weightThreshold: 0,\n                opacity: 100,\n                noiseSmoothingThreshold: 25,\n                zeroWeightOpacity: 100,\n                opacitySpeed: 20\n            }\n        };\n\n        // potentially slow\n        const presets = JSON.parse(JSON.stringify(defaultPresets));\n\n        if(window.$is_mobile) {\n            presets.viridis.opacity = 70;\n            presets.viridis.noiseSmoothingThreshold = 0;\n        }\n\n        // colorMaps are defined by:\n        // defaultColorMaps, then presets, then config (for active colormap)\n        const colorMaps = {};\n\n        function calculateColor(colorMap, weight, preset) {\n            if(!defaultColorMaps.hasOwnProperty(colorMap)) {\n                return;\n            }\n\n            const data = defaultColorMaps[colorMap];\n\n            // check for weight out of boundaries\n            if(weight >= data.length && data.length > 0) {\n                weight = data.length - 1;\n            }\n\n            const color = data[weight];\n\n            const backgroundDiff = 100 - preset.zeroWeightOpacity;\n\n            const opacitySpeed = preset.opacitySpeed / 10;\n            const mod = Math.max(backgroundDiff - weight * opacitySpeed, 0);\n\n            const opacity = color[3] * (100 - mod) * preset.opacity / 10000;\n\n            return [\n                color[0],\n                color[1],\n                color[2],\n                Math.min(1, opacity)\n            ];\n        }\n\n        function regenerateColorMaps() {\n            for (let mapName in defaultColorMaps) {\n                if(!defaultColorMaps.hasOwnProperty(mapName)) {\n                    continue;\n                }\n\n                colorMaps[mapName] = [];\n\n                const preset = presets.hasOwnProperty(mapName) ? presets[mapName] : config;\n\n                for(let weight = 0; weight <= 100; weight++) {\n                    colorMaps[mapName].push(calculateColor(mapName, weight, preset));\n                }\n            }\n        }\n        \n        function loadHeatmapPreset(colorMap) {\n            if(!('localStorage' in window)) {\n                return;\n            }\n\n            const key = 'heatmap_settings_presets_' + colorMap;\n\n            try {\n                const item = localStorage.getItem(key);\n\n                if(!item) {\n                    return;\n                }\n\n                const savedPresets = JSON.parse(item);\n\n                if(!presets.hasOwnProperty(colorMap)) {\n                    presets[colorMap] = {};\n                }\n\n                for(let key in savedPresets) {\n                    if(savedPresets.hasOwnProperty(key)) {\n                        presets[colorMap][key] = savedPresets[key];\n                    }\n                }\n            } catch(e) {\n                console.error(e);\n            }\n        }\n\n        for(let colorMap in defaultColorMaps) {\n            loadHeatmapPreset(colorMap);\n        }\n\n        function saveHeatmapPreset(colorMap) {\n            if(!('localStorage' in window)) {\n                return;\n            }\n\n            const key = 'heatmap_settings_presets_' + colorMap;\n\n            let preset;\n\n            if(!presets.hasOwnProperty(colorMap)) {\n                return;\n            }\n\n            preset = presets[colorMap];\n\n            try {\n                localStorage.setItem(key, JSON.stringify({\n                    zeroWeightOpacity: preset.zeroWeightOpacity,\n                    opacitySpeed: preset.opacitySpeed,\n                    noiseSmoothingThreshold: preset.noiseSmoothingThreshold,\n                    opacity: preset.opacity,\n                    weightThreshold: preset.weightThreshold\n                }));\n            } catch(e) {\n                console.error(e);\n            }\n        }\n\n        function saveActiveHeatmapPreset() {\n            return saveHeatmapPreset(config.colorMap);\n        }\n\n        function applyPresetToConfig(colorMap) {\n            if(!presets.hasOwnProperty(colorMap)) {\n                return;\n            }\n\n            const preset = presets[colorMap];\n\n            config.opacitySpeed = preset.opacitySpeed;\n            config.zeroWeightOpacity = preset.zeroWeightOpacity;\n            config.noiseSmoothingThreshold = preset.noiseSmoothingThreshold;\n            config.opacity = preset.opacity;\n            config.weightThreshold = preset.weightThreshold;\n        }\n\n        function applyConfigToPreset(colorMap) {\n            if(!presets.hasOwnProperty(colorMap)) {\n                presets[colorMap] = {};\n            }\n\n            const preset = presets[colorMap];\n\n            preset.opacitySpeed = config.opacitySpeed;\n            preset.zeroWeightOpacity = config.zeroWeightOpacity;\n            preset.noiseSmoothingThreshold = config.noiseSmoothingThreshold;\n            preset.opacity = config.opacity;\n            preset.weightThreshold = config.weightThreshold;\n        }\n\n        function resetPreset() {\n            const preset = presets[config.colorMap];\n            const defaultPreset = defaultPresets[config.colorMap];\n\n            preset.opacitySpeed = defaultPreset.opacitySpeed;\n            preset.zeroWeightOpacity = defaultPreset.zeroWeightOpacity;\n            preset.noiseSmoothingThreshold = defaultPreset.noiseSmoothingThreshold;\n            preset.opacity = defaultPreset.opacity;\n            preset.weightThreshold = defaultPreset.weightThreshold;\n        }\n\n        function loadConfigFromLocalStorage() {\n            if(!('localStorage' in window)) {\n                return;\n            }\n\n            let hasConfigSaved = false;\n\n            const key = 'heatmap_settings_' + window.Heatmap.market;\n\n            try {\n                const item = localStorage.getItem(key);\n\n                if(item) {\n                    const savedConfig = JSON.parse(item);\n\n                    for(let key in savedConfig) {\n                        if(savedConfig.hasOwnProperty(key)) {\n                            config[key] = savedConfig[key];\n                        }\n                    }\n\n                    hasConfigSaved = true;\n                }\n            } catch(e) {\n                console.error(e);\n            }\n\n            return hasConfigSaved;\n        }\n\n        function saveConfigToLocalStorage() {\n            if(!('localStorage' in window)) {\n                return;\n            }\n\n            const key = 'heatmap_settings_' + window.Heatmap.market;\n\n            try {\n                const configCopy = Object.assign({}, config);\n\n                localStorage.setItem(key, JSON.stringify(configCopy));\n            } catch(e) {\n                console.error(e);\n            }\n        }\n\n        function loadAggregatedConfigFromLocalStorage() {\n            if(!('localStorage' in window)) {\n                return;\n            }\n\n            let hasConfigSaved = false;\n\n            const key = 'aggregated_heatmap_settings_' + window.Heatmap.market;\n\n            try {\n                const item = localStorage.getItem(key);\n\n                if(item) {\n                    const savedConfig = JSON.parse(item);\n\n                    for(let key in savedConfig) {\n                        if(savedConfig.hasOwnProperty(key)) {\n                            aggregatedConfig[key] = savedConfig[key];\n                        }\n                    }\n\n                    hasConfigSaved = true;\n                } else {\n                    initDefaultAggregatedConfig();\n                }\n            } catch(e) {\n                console.error(e);\n            }\n\n            return hasConfigSaved;\n        }\n\n        function saveAggregatedConfigToLocalStorage() {\n            if(!('localStorage' in window)) {\n                return;\n            }\n\n            const key = 'aggregated_heatmap_settings_' + window.Heatmap.market;\n\n            try {\n                localStorage.setItem(key, JSON.stringify(aggregatedConfig));\n            } catch(e) {\n                console.error(e);\n            }\n        }\n\n        function checkMigrate1() {\n            const key = \"hm_migration_1\";\n\n            if(localStorage.getItem(key) || !localStorage.getItem('heatmap_settings_' + window.Heatmap.market)) {\n                return;\n            }\n\n            migrate1();\n\n            localStorage.setItem(key, \"true\");\n        }\n\n        function migrate1() {\n            const keys = [\n                'heatmap_settings_the_heatmap',\n                'heatmap_settings_bitfinexbtcusd',\n                'heatmap_settings_bitmexxbtusd',\n                'heatmap_settings_gdaxbtcusd'\n            ];\n\n            try {\n                for(let key of keys) {\n                    const item = localStorage.getItem(key);\n\n                    if(item) {\n                        const itemJson = JSON.parse(item);\n\n                        if(itemJson.noiseSmoothingThreshold < 25) {\n                            itemJson.noiseSmoothingThreshold = 25;\n                        }\n\n                        localStorage.setItem(key, JSON.stringify(itemJson));\n                    }\n                }\n            } catch(e) {\n                console.error(e);\n            }\n\n            for(let mapName in colorMaps) {\n                if(!colorMaps.hasOwnProperty(mapName)) {\n                    continue;\n                }\n\n                const key = 'heatmap_settings_presets_' + mapName;\n                const item = localStorage.getItem(key);\n\n                if(item && presets.hasOwnProperty(mapName)) {\n                    const preset = presets[mapName];\n                    const itemJson = JSON.parse(item);\n\n                    if(itemJson.noiseSmoothingThreshold < preset.noiseSmoothingThreshold) {\n                        itemJson.noiseSmoothingThreshold = preset.noiseSmoothingThreshold;\n                    }\n\n                    localStorage.setItem(key, JSON.stringify(itemJson));\n                }\n            }\n        }\n\n        function migrate() {\n            // everybody migrated\n        //    checkMigrate1();\n        }\n\n        function generateColormapImage(colors) {\n            const canvas = document.createElement('canvas');\n            const ctx = canvas.getContext('2d');\n\n            canvas.width = 1000;\n            canvas.height = 20;\n\n            const stepWidth = 10;\n            const stepHeight = canvas.height;\n\n            for(let i = 0; i < colors.length; i++) {\n                ctx.fillStyle = \"rgba(\"+(Math.floor(colors[i][0]*255))+\",\"+\n                    (Math.floor(colors[i][1]*255))+\",\"+\n                    (Math.floor(colors[i][2]*255))+\",\"+\n                    (colors[i][3])+\")\";\n\n                ctx.fillRect(i * stepWidth, 0, stepWidth, stepHeight);\n            }\n\n            return canvas.toDataURL(\"image/png\");\n        }\n\n        function populateColormapsHtml() {\n            const html = [];\n\n            regenerateColorMaps();\n\n            for(let mapName in colorMaps) {\n                if(!colorMaps.hasOwnProperty(mapName)) {\n                    continue;\n                }\n\n                const colors = colorMaps[mapName];\n\n                html.push(`<tr><td><label>`);\n                html.push(`<input type=\"radio\" name=\"heatmap_colormap\" value=\"`+mapName+`\"/>`);\n                html.push(`<div class=\"colors\">`);\n                html.push(`<img src=\"`+generateColormapImage(colors)+`\">`);\n                html.push(`</div>`);\n                html.push(`</label></td></tr>`);\n            }\n\n            $(\"#heatmap_colormaps\").html(html.join(''));\n\n            const colorMapSelector = $(\"#heatmap_settings [name=heatmap_colormap]\");\n            const colorMapName = $(\"#heatmap_settings #colormap_name_value\");\n\n            colorMapSelector.filter(\"[value=\"+config.colorMap+\"]\").prop('checked', true);\n            colorMapName.html(config.colorMap);\n\n            colorMapSelector.change(function() {\n                config.colorMap = $(this).val();\n                colorMapName.html(config.colorMap);\n\n                applyPresetToConfig(config.colorMap);\n\n                requestAllBuffersDataInvalidation();\n\n                handleData();\n\n                saveConfigToLocalStorage();\n\n                populateColormapsHtml();\n                applyConfigToHtml();\n            });\n        }\n\n        function applyConfigToHtml() {\n            const marketName = $(\"#heatmap_settings #heatmap_settings_market_name\");\n            marketName.html(window.$hsymbol);\n\n            const normalizationFunctionsSelector = $(\"#heatmap_settings [name=heatmap_normalization_function]\");\n\n            if(NormalizationFunctions.hasOwnProperty(config.normalization)) {\n                normalizationFunctionsSelector.val(config.normalization);\n            }\n\n            const thresholdSelector = $(\"#heatmap_settings [name=heatmap_threshold]\");\n            const thresholdSelectorValueDiv = $(\"#heatmap_threshold_value\");\n            thresholdSelector.val(config.weightThreshold);\n            thresholdSelectorValueDiv.html(config.weightThreshold);\n\n            const opacitySpeedSelector = $(\"#heatmap_settings [name=opacity_speed]\");\n            const opacitySpeedSelectorValueDiv = $(\"#opacity_speed_value\");\n\n            opacitySpeedSelector.val(config.opacitySpeed);\n            opacitySpeedSelectorValueDiv.html(config.opacitySpeed);\n\n            const opacitySelector = $(\"#heatmap_settings [name=heatmap_opacity]\");\n            const opacitySelectorValueDiv = $(\"#heatmap_opacity_value\");\n\n            opacitySelector.val(config.opacity);\n            opacitySelectorValueDiv.html(config.opacity + '%');\n\n            const noiseSmoothingSelector = $(\"#heatmap_settings [name=noise_smoothing]\");\n            const noiseSmoothingValueDiv = $(\"#noise_smoothing_value\");\n\n            noiseSmoothingSelector.val(config.noiseSmoothingThreshold);\n            noiseSmoothingValueDiv.html(config.noiseSmoothingThreshold);\n\n            const zeroWeightOpacitySelector = $(\"#heatmap_settings [name=zero_weight_opacity]\");\n            const zeroWeightOpacityValueDiv = $(\"#zero_weight_opacity_value\");\n\n            zeroWeightOpacitySelector.val(config.zeroWeightOpacity);\n            zeroWeightOpacityValueDiv.html(config.zeroWeightOpacity);\n\n            applyConfigToPreset(config.colorMap);\n        }\n\n        const aggregatedConfig = {};\n        let aggregatedPriceSpread = {};\n\n        function initDefaultAggregatedConfig() {\n            if(window.$heatmap_settings.local) {\n                aggregatedConfig[1] = 100;\n                aggregatedConfig[438] = 100;\n                aggregatedConfig[1441] = 100;\n            } else {\n                aggregatedConfig[1] = 100;\n                aggregatedConfig[31059] = 100;\n                aggregatedConfig[31419] = 100;\n            }\n        }\n\n        function initAggregatedJquery() {\n            const inputs = $('.content_aggregated_heatmap input');\n\n            loadAggregatedConfigFromLocalStorage();\n\n            inputs.each(function() {\n                const hmId = $(this).data('id');\n\n                if(aggregatedConfig.hasOwnProperty(hmId)) {\n                    $(this).prop(\"checked\", true);\n                }\n            });\n\n            inputs.change(function() {\n                const isChecked = $(this).is(\":checked\");\n                const hmId = $(this).data('id');\n\n                if (isChecked) {\n                    aggregatedConfig[hmId] = 100;\n                } else {\n                    delete aggregatedConfig[hmId];\n                }\n\n                mustRevalidateCache = true;\n\n                window.Heatmap.forceUpdate();\n\n                saveAggregatedConfigToLocalStorage();\n            });\n        }\n\n        function initJquery() {\n            const normalizationFunctionsKeys = Object.keys(NormalizationFunctions);\n\n            let activeNormalizationFunction = null;\n            const normalizationFunctionsSelector = $(\"#heatmap_settings [name=heatmap_normalization_function]\");\n\n            for(let key of normalizationFunctionsKeys) {\n                if(key === config.normalization) {\n                    activeNormalizationFunction = key;\n                }\n\n                normalizationFunctionsSelector.append(\n                    $(\"<option></option>\").attr(\"value\", key).text(key)\n                );\n            }\n\n            normalizationFunctionsSelector.change(function() {\n                const val = $(this).val();\n\n                if(NormalizationFunctions.hasOwnProperty(val)) {\n                    config.normalization = val;\n                }\n\n                requestAllBuffersDataInvalidation();\n\n                handleData();\n\n                saveConfigToLocalStorage();\n                saveActiveHeatmapPreset();\n\n                applyConfigToHtml();\n            });\n\n            const thresholdSelector = $(\"#heatmap_settings [name=heatmap_threshold]\");\n            thresholdSelector.change(function() {\n                const val = $(this).val();\n\n                config.weightThreshold = parseInt(val);\n\n                window.Heatmap.update();\n\n                saveConfigToLocalStorage();\n                saveActiveHeatmapPreset();\n\n                applyConfigToHtml();\n            });\n\n            const opacitySelector = $(\"#heatmap_settings [name=heatmap_opacity]\");\n            const opacitySelectorValueDiv = $(\"#heatmap_opacity_value\");\n\n            opacitySelector.change(function() {\n                const val = $(this).val();\n\n                config.opacity = parseInt(val);\n\n                opacitySelectorValueDiv.html(val + '%');\n\n                window.Heatmap.update();\n\n                saveConfigToLocalStorage();\n                saveActiveHeatmapPreset();\n\n                applyConfigToHtml();\n\n                populateColormapsHtml();\n            });\n\n            const opacitySpeedSelector = $(\"#heatmap_settings [name=opacity_speed]\");\n            const opacitySpeedSelectorValueDiv = $(\"#opacity_speed_value\");\n\n            opacitySpeedSelector.change(function() {\n                const val = $(this).val();\n\n                config.opacitySpeed = parseInt(val);\n\n                opacitySpeedSelectorValueDiv.html('' + val);\n\n                window.Heatmap.update();\n\n                saveConfigToLocalStorage();\n                saveActiveHeatmapPreset();\n\n                applyConfigToHtml();\n\n                populateColormapsHtml();\n            });\n\n            const noiseSmoothingSelector = $(\"#heatmap_settings [name=noise_smoothing]\");\n            const noiseSmoothingValueDiv = $(\"#noise_smoothing_value\");\n            noiseSmoothingSelector.change(function() {\n                const val = $(this).val();\n\n                config.noiseSmoothingThreshold = parseInt(val);\n\n                noiseSmoothingValueDiv.html(val);\n\n                requestAllBuffersDataInvalidation();\n\n                handleData();\n\n                saveConfigToLocalStorage();\n                saveActiveHeatmapPreset();\n\n                applyConfigToHtml();\n\n                populateColormapsHtml();\n            });\n\n            const zeroWeightOpacitySelector = $(\"#heatmap_settings [name=zero_weight_opacity]\");\n            const zeroWeightOpacityValueDiv = $(\"#zero_weight_opacity_value\");\n            zeroWeightOpacitySelector.change(function() {\n                const val = $(this).val();\n\n                config.zeroWeightOpacity = parseInt(val);\n\n                zeroWeightOpacityValueDiv.html(val);\n\n                window.Heatmap.update();\n\n                saveConfigToLocalStorage();\n                saveActiveHeatmapPreset();\n\n                applyConfigToHtml();\n\n                populateColormapsHtml();\n            });\n\n            const resetSettingsButton = $(\"#heatmap_settings #heatmap_reset_to_preset\");\n            resetSettingsButton.click(function() {\n                resetPreset();\n\n                applyPresetToConfig(config.colorMap);\n\n                requestAllBuffersDataInvalidation();\n\n                handleData();\n\n                saveConfigToLocalStorage();\n                saveActiveHeatmapPreset();\n\n                applyConfigToHtml();\n\n                populateColormapsHtml();\n            });\n\n            // todo: run these commands on popup show\n            applyConfigToHtml();\n            populateColormapsHtml();\n        }\n\n        regenerateColorMaps();\n\n        function getStep() {\n            return window.$step;\n        }\n\n        function getColor(weight) {\n            return colorMaps[config.colorMap][weight];\n        }\n\n        // fixing \"Cannot read property '0' of undefined\" error\n        function getCachedData(step, marketId) {\n            if (!cachedJson.hasOwnProperty(step)) {\n                cachedJson[step] = {};\n            }\n\n            if (!cachedJson[step].hasOwnProperty(marketId)) {\n                cachedJson[step][marketId] = {};\n            }\n\n            return cachedJson[step][marketId];\n        }\n\n        let handleWorker;\n\n        if (useWebWorker) {\n            if(window.$heatmap_settings.combined) {\n                handleWorker = new Worker(\"/js/aggregated-heatmap-worker.js?t=1\");\n            } else {\n                handleWorker = new Worker(\"/js/heatmap-worker.js?t=3\");\n            }\n\n            handleWorker.onmessage = function(e) {\n                const dataBufferId = e.data[0];\n                config.precisionStep = e.data[1];\n                const defaultMaxWeight = e.data[2];\n                const messageData = e.data[3];\n\n                dataForDraw[dataBufferId] = [];\n\n                const entriesLength = messageData.length;\n\n                for(let i = 0; i < entriesLength; i++) {\n                    dataForDraw[dataBufferId].push(messageData[i]);\n                }\n\n                // update different maxWeights to the one value\n                if(dataBufferId === dataForDrawIds.oldCandles) {\n                    dataForDrawMaxWeights.current = defaultMaxWeight;\n                }\n\n                if(isBufferDataInvalidationRequested(dataBufferId)) {\n                    invalidateBufferData(dataBufferId);\n                }\n\n            //    console.log('onmessage', bufferDataInvalid.old, bufferDataInvalid.current);\n\n                redraw();\n            }\n        } else {\n            console.error('Your browser doesn\\'t support web workers.')\n        }\n\n        // todo: if(!useWebWorker)\n        function handleData(bufferId, marketId, data) {\n            const vars = getConfig();\n            const step = getStep();\n\n            if(bufferId === undefined) {\n                bufferId = dataForDrawIds.oldCandles;\n            }\n\n            if(data === undefined) {\n                if(window.$heatmap_settings.combined) {\n                    data = {};\n\n                    for(let marketId in aggregatedConfig) {\n                        data[marketId] = getCachedData(step, marketId);\n                    }\n                } else {\n                    data = getCachedData(step, 0);\n                }\n            }\n\n            const defaultMaxWeight = dataForDrawMaxWeights[bufferId];\n\n            if(window.$heatmap_settings.combined) {\n                handleWorker.postMessage([aggregatedPriceSpread, bufferId, data, defaultMaxWeight, vars]);\n            } else {\n                handleWorker.postMessage([bufferId, data, defaultMaxWeight, vars]);\n            }\n        }\n\n        const maxObjectCount = 1000000;\n        const coordinatesAttributesPerEntry = 12;\n        const colorAttributesPerEntry = 24;\n\n        let buffersInitialized = false;\n\n        let resultingCoordinates = new Float32Array(22500);\n        let resultingColors = new Float32Array(45000);\n\n        // 4 byte (float) *\n        // (20% from 10000) / 10 = 200 coordinates for each side = 400 (asks + bids)\n        // 900 = max visible candles\n        // 4 × 400 × 900 = 1440000 bytes\n        // * 12 = 17.28 megabytes for coordinates\n        // * 24 = 34.56 megabytes for colors\n\n        function initBuffers() {\n            if(buffersInitialized) {\n                return;\n            }\n\n            resultingCoordinates = new Float32Array(1440000);\n            resultingColors = new Float32Array(2880000);\n\n            buffersInitialized = true;\n        }\n\n        function resizeBuffers(size, maxSize) {\n            let buffersChanged = false;\n\n            let useSize = Math.min(size, maxSize);\n\n            if(useSize * coordinatesAttributesPerEntry > resultingCoordinates.length) {\n                resultingCoordinates = new Float32Array(resultingCoordinates.length * 2);\n\n                console.log('Heatmap: color coordinates size changed to: ' + resultingCoordinates.length);\n\n                buffersChanged = true;\n            }\n\n            if(useSize * colorAttributesPerEntry > resultingColors.length) {\n                resultingColors = new Float32Array(resultingColors.length * 2);\n\n                console.log('Heatmap: color buffer size changed to: ' + resultingColors.length);\n\n                buffersChanged = true;\n            }\n\n            // looks weird\n            if(useSize >= maxSize) {\n                return false;\n            }\n\n            return buffersChanged;\n        }\n\n        function checkBuffers(objectCount) {\n            let buffersChanged = false;\n            let loopBreaker = 0;\n\n            do {\n                buffersChanged = resizeBuffers(objectCount, maxObjectCount);\n            } while (buffersChanged && loopBreaker < 10);\n\n            return maxObjectCount;\n        }\n\n        function compareObjects(o1, o2){\n            for(let p in o1){\n                if(o1.hasOwnProperty(p)){\n                    if(o1[p] !== o2[p]){\n                        return false;\n                    }\n                }\n            }\n\n            for(let p in o2){\n                if(o2.hasOwnProperty(p)){\n                    if(o1[p] !== o2[p]){\n                        return false;\n                    }\n                }\n            }\n\n            return true;\n        }\n\n        function diffObjectsProperties(o1, o2) {\n            const result = {};\n\n            for(let p in o1){\n                if(o1.hasOwnProperty(p)){\n                    if(o1[p] !== o2[p]){\n                        result[p] = 1;\n                    }\n                }\n            }\n\n            for(let p in o2){\n                if(o2.hasOwnProperty(p)){\n                    if(o1[p] !== o2[p]){\n                        result[p] = 1;\n                    }\n                }\n            }\n\n            return Object.keys(result);\n        }\n\n        let testMoveDraw = false, testMoveDrawCount = 0;\n\n        function sdepth(data, range) {\n            if(window.$heatmap_settings.combined || !dataForDrawMaxWeights.current) {\n                return;\n            }\n\n            const result = {};\n\n            const vars = getConfig();\n            const step = getStep();\n\n            const roundTo = vars.precisionStep;\n\n            if(!roundTo) {\n                console.error('empty roundTo');\n\n                return;\n            }\n\n            const now = +new Date() / 1000;\n            const currentCandle = Math.floor(now / step) * step;\n\n            let bidPrice = 0;\n\n            const bids = data[0];\n\n            for (let entry of bids) {\n                const price = entry[0];\n                const amount = entry[1];\n\n                if(amount && price > bidPrice) {\n                    bidPrice = price;\n                }\n            }\n\n            function roundPrice(price) {\n                if(roundTo === 40) {\n                    return Math.floor(price/40) * 40\n                } else if(roundTo === 20) {\n                    return Math.floor(price/20) * 20\n                } else if(roundTo === 10) {\n                    return Math.floor(price/10) * 10\n                }\n\n                return price+(roundTo/2) - (price+(roundTo/2)) % roundTo;\n            }\n\n            const minRangePrice = roundPrice(bidPrice * (1 - range));\n            const maxRangePrice = roundPrice(bidPrice * (1 + range));\n\n            const volumeMap = {};\n\n            for(let i = 0; i < 2; i++) {\n                const side = data[i];\n\n                for (let entry of side) {\n                    const price = entry[0];\n                    const amount = entry[1];\n\n                    const f = roundPrice(price);\n\n                    // todo: get range for last candle\n                    if(bidPrice && (f > maxRangePrice || f < minRangePrice)) {\n                        continue;\n                    }\n\n                    if (!volumeMap.hasOwnProperty(f)) {\n                        volumeMap[f] = 0;\n                    }\n\n                    volumeMap[f] += amount;\n                }\n            }\n\n            const oldCandles = getCachedData(step, 0);\n\n            result[currentCandle - step] = oldCandles && oldCandles.hasOwnProperty(currentCandle - step) ? oldCandles[currentCandle - step] : {};\n            result[currentCandle] = volumeMap;\n\n            const bufferId = dataForDrawIds.currentCandle;\n\n        //    console.log('candles', roundTo, result);\n\n            invalidateBufferData(bufferId);\n\n            appendData(0, step, result, \"application/json\");\n            handleData(bufferId, 0, result);\n        }\n\n        function populateLevels(data, vars, rectHeight, rectWidth, rectPadding, logDiv, minMaxPriceDiff) {\n            const rectHeightHalf = rectHeight / 2;\n            const rectPaddingHalf = rectPadding / 2;\n\n            let resultingCoordinatesLength = 0;\n            let resultingColorsLength = 0;\n\n            const step = getStep();\n\n            let minPrice = vars.graphMinPrice * 0.97;\n            let maxPrice = vars.graphMaxPrice * 1.03;\n            let minTimestamp = vars.firstCandleTime - step * 20;\n            let maxTimestamp = vars.lastCandleTime + step * 20;\n\n            let count = 0;\n\n            let x, y, toX, toY, color;\n\n            let lastColor = null;\n            let lastToX = 0;\n            let lastToY = 0;\n\n            // const to = Math.min(maxObjectCount, data.length);\n            const to = data.length;\n\n        //    const topBottomOffset = 0.25;\n        //    const leftRightOffset = 0.25;\n\n            /*\n            data is sorted\n            from Bottom to Top (asc price)\n            from Left to Right (asc timestamp)\n            */\n            for (let i = 0; i < to; i++) {\n                const item = data[i];\n\n                const barTimestamp = item.timestamp;\n                const price = item.price;\n                const weight = item.weight;\n\n                if (price > maxPrice || price < minPrice ||\n                    weight < vars.weightThreshold ||\n                    barTimestamp < minTimestamp || barTimestamp > maxTimestamp) {\n                    continue;\n                }\n\n                color = getColor(weight);\n\n                if (!color || !color[3]) {\n                    continue;\n                }\n\n                x = (barTimestamp - vars.firstCandleTime) / step * rectWidth;\n\n                if(vars.isLogScale) {\n                    y = Math.log(vars.graphMaxPrice / price) / logDiv;\n                } else {\n                    y = (vars.graphMaxPrice - price) / minMaxPriceDiff;\n                }\n\n                x = x + vars.gapWidth - rectPaddingHalf;\n                y = y * vars.barsAreaHeight - rectHeightHalf + config.gapHeight;\n\n                toX = x + rectWidth;\n                toY = y + rectHeight;\n\n                // if it is possible to enlarge previous rectangle\n                // (same color and this iteration start === last iteration end)\n                // then update coordinates\n                // best used with 0 threshold\n                if(color === lastColor && lastToX === toX && lastToY === y) {\n                    resultingCoordinates[resultingCoordinatesLength-1] = toY;\n                //    resultingCoordinates[resultingCoordinatesLength-2] = toX;\n                    resultingCoordinates[resultingCoordinatesLength-3] = toY;\n                //    resultingCoordinates[resultingCoordinatesLength-6] = toX;\n                    resultingCoordinates[resultingCoordinatesLength-7] = toY;\n                //    resultingCoordinates[resultingCoordinatesLength-10] = toX;\n                } else {\n                    resultingColors[resultingColorsLength++] = color[0];\n                    resultingColors[resultingColorsLength++] = color[1];\n                    resultingColors[resultingColorsLength++] = color[2];\n                    resultingColors[resultingColorsLength++] = color[3];\n\n                    resultingColors[resultingColorsLength++] = color[0];\n                    resultingColors[resultingColorsLength++] = color[1];\n                    resultingColors[resultingColorsLength++] = color[2];\n                    resultingColors[resultingColorsLength++] = color[3];\n\n                    resultingColors[resultingColorsLength++] = color[0];\n                    resultingColors[resultingColorsLength++] = color[1];\n                    resultingColors[resultingColorsLength++] = color[2];\n                    resultingColors[resultingColorsLength++] = color[3];\n\n                    resultingColors[resultingColorsLength++] = color[0];\n                    resultingColors[resultingColorsLength++] = color[1];\n                    resultingColors[resultingColorsLength++] = color[2];\n                    resultingColors[resultingColorsLength++] = color[3];\n\n                    resultingColors[resultingColorsLength++] = color[0];\n                    resultingColors[resultingColorsLength++] = color[1];\n                    resultingColors[resultingColorsLength++] = color[2];\n                    resultingColors[resultingColorsLength++] = color[3];\n\n                    resultingColors[resultingColorsLength++] = color[0];\n                    resultingColors[resultingColorsLength++] = color[1];\n                    resultingColors[resultingColorsLength++] = color[2];\n                    resultingColors[resultingColorsLength++] = color[3];\n\n                    resultingCoordinates[resultingCoordinatesLength++] = x;\n                    resultingCoordinates[resultingCoordinatesLength++] = y;\n\n                    resultingCoordinates[resultingCoordinatesLength++] = toX;\n                    resultingCoordinates[resultingCoordinatesLength++] = y;\n\n                    resultingCoordinates[resultingCoordinatesLength++] = x;\n                    resultingCoordinates[resultingCoordinatesLength++] = toY;\n\n                    resultingCoordinates[resultingCoordinatesLength++] = toX;\n                    resultingCoordinates[resultingCoordinatesLength++] = y;\n\n                    resultingCoordinates[resultingCoordinatesLength++] = x;\n                    resultingCoordinates[resultingCoordinatesLength++] = toY;\n\n                    resultingCoordinates[resultingCoordinatesLength++] = toX;\n                    resultingCoordinates[resultingCoordinatesLength++] = toY;\n\n                    count++;\n                }\n\n                lastColor = color;\n                lastToX = toX;\n                lastToY = toY;\n            }\n\n            testMoveDraw = count > 1000;\n            testMoveDrawCount = count;\n\n            return {\n                // passing unsliced array is slower, almost 3s\n                coordinates: resultingCoordinates.slice(0, resultingCoordinatesLength),\n                color: resultingColors.slice(0, resultingColorsLength),\n                //    coordinates: resultingCoordinates,\n                //    color: resultingColors,\n                count: count * 6,\n                minPrice: minPrice,\n                maxPrice: maxPrice,\n                minTimestamp: minTimestamp,\n                maxTimestamp: maxTimestamp\n            };\n        }\n\n        /**\n         * @var {HeatmapView} dataView\n         * */\n        function moveView(dataView, vars, rectWidth, rectHeight, logDiv, minMaxPriceDiff) {\n            let scaleX = rectWidth / dataView.lastRectWidth;\n            let scaleY = rectHeight / dataView.lastRectHeight;\n\n            const mmDiff = minMaxPriceDiff - dataView.lastMinMaxPriceDiff;\n            const maxsDiff = dataView.lastMaxPrice - vars.graphMaxPrice;\n            const minsDiff = dataView.lastMinPrice - vars.graphMinPrice;\n            const pixelsPerDollar = vars.barsAreaHeight / minMaxPriceDiff;\n\n            // sub- variables count skipped pixels\n            let subX = rectWidth * Math.floor((vars.firstCandleTime - dataView.lastTimestamp) / getStep());\n            let subY = pixelsPerDollar * maxsDiff;\n\n            // fixme: even though the max price may say the same, subY should be changed,\n            // because of price levels change\n            /*if(dataView.lastMaxPrice === vars.graphMaxPrice) {\n                subY = 50 * dataView.lastPixelsPerDollar\n            }\n\n            console.log(pixelsPerDollar, dataView.lastPixelsPerDollar)*/\n\n            // console.log(mmDiff, minsDiff, maxsDiff, vars.barsAreaHeight*pixelsPerDollar)\n            // console.log(scaleY, subY)\n            // console.log(vars.graphMinPrice, vars.graphMaxPrice)\n\n            // multiply by * (1/scale_)?\n            dataView.move(\n                subX,\n                subY * (1/scaleY),\n                scaleX,\n                scaleY,\n            );\n        }\n\n        function drawLevels(dataBufferId, forceRedraw) {\n            const vars = getConfig();\n\n            const data = dataForDraw[dataBufferId];\n\n            const to = Math.min(maxObjectCount, data.length);\n\n            checkBuffers(to);\n\n            const minMaxPriceDiff = vars.graphMaxPrice - vars.graphMinPrice;\n            const rectHeight = vars.barsAreaHeight / (minMaxPriceDiff / vars.precisionStep);\n            const rectWidth = vars.barWidthWithGap;\n            const logDiv = vars.isLogScale ? Math.log(vars.graphMaxPrice / vars.graphMinPrice) : 0;\n\n            let rectPadding = Math.round(0.2 * rectWidth);\n\n            if (rectPadding < 3) {\n                rectPadding = 3;\n            }\n\n            if (rectWidth === 3) {\n                rectPadding = 2;\n            }\n\n            if (rectWidth === 1) {\n                rectPadding = 1;\n            }\n\n            const dataView = dataViews[dataBufferId];\n\n            if(dataView.needsRedraw(vars) || forceRedraw) {\n                console.log('redraw');\n\n                let levels = populateLevels(data, vars, rectHeight, rectWidth, rectPadding, logDiv, minMaxPriceDiff);\n\n                dataView.update(levels.coordinates, levels.color, levels.count);\n                dataView.setLimits(levels.minPrice, levels.maxPrice, levels.minTimestamp, levels.maxTimestamp);\n                dataView.setPreviousData(vars, rectWidth, rectHeight, minMaxPriceDiff);\n\n                levels = null;\n            } else {\n            // todo: check moveView for log scale\n                moveView(dataView, vars, rectWidth, rectHeight, logDiv, minMaxPriceDiff);\n            }\n\n            return true\n        }\n\n        function emptyDrawData() {\n            for(let key in dataForDraw) {\n                dataForDraw[key] = {};\n            }\n        }\n\n        function clearCanvas() {\n            const frameLoop = regl.frame(() => {\n                regl.clear({\n                    color: [0, 0, 0, 0],\n                    depth: true\n                });\n\n                if (frameLoop) {\n                    frameLoop.cancel();\n                }\n            });\n        }\n\n        let oldConfig = {};\n\n        function isNewViewConfig() {\n            return !compareObjects(oldConfig, config);\n        }\n\n        function isOneOfBuffersInvalid() {\n            let oneOfBuffersIsInvalid = false;\n\n            for(let bufferIdName in dataForDrawIds) {\n                const bufferId = dataForDrawIds[bufferIdName];\n\n                if(isBufferDataInvalid(bufferId)) {\n                    oneOfBuffersIsInvalid = true;\n                    break;\n                }\n            }\n\n            return oneOfBuffersIsInvalid;\n        }\n\n        let rafCallbackData1, rafCallbackData2;\n\n        function rafCallback(cb) {\n        //    console.log(bufferDataInvalid.old, bufferDataInvalid.current);\n\n            const refreshBecauseOfConfig = isNewViewConfig();\n\n        //    console.log('refreshBecauseOfConfig', refreshBecauseOfConfig, 'isOneOfBuffersInvalid', isOneOfBuffersInvalid());\n        //    console.log(bufferDataInvalid[dataForDrawIds.oldCandles], bufferDataInvalid[dataForDrawIds.currentCandle]);\n        //    console.log(isBufferDataInvalid(dataForDrawIds.oldCandles), isBufferDataInvalid(dataForDrawIds.currentCandle));\n\n            if(!refreshBecauseOfConfig && !isOneOfBuffersInvalid()) {\n                if(cb && typeof cb === \"function\") {\n                    cb();\n                }\n\n                return;\n            }\n\n            let changedConfigValues = [];\n\n            if(refreshBecauseOfConfig) {\n                changedConfigValues = diffObjectsProperties(config, oldConfig);\n\n                oldConfig = Object.assign({}, config);\n            }\n\n            if(!buffersInitialized) {\n                initBuffers();\n            }\n\n            if('Measurer' in window) {\n                window.Measurer('heatmap').start();\n            }\n\n            regl.clear({\n                color: [0, 0, 0, 0],\n                depth: true\n            });\n\n            regl.poll();\n\n            window.Measurer('heatmap-1').start();\n\n            const data1Invalid = isBufferDataInvalid(dataForDrawIds.oldCandles);\n            const data2Invalid = isBufferDataInvalid(dataForDrawIds.currentCandle);\n\n            const moveGraphProperties = [\n                \"graphMinPrice\", \"graphMaxPrice\",\n                \"firstCandleTime\", \"lastCandleTime\",\n                // todo: fixme!\n            //    \"barWidthWithGap\", \"gapWidth\"\n            ];\n\n            let onlyMoveConfigChange = true;\n\n            for(let configKey of changedConfigValues) {\n                if(moveGraphProperties.indexOf(configKey) === -1) {\n                    onlyMoveConfigChange = false;\n                }\n            }\n\n            // console.log('onlyMoveConfigChange', onlyMoveConfigChange, changedConfigValues);\n\n            const forceData1 = data1Invalid || !onlyMoveConfigChange;\n            const forceData2 = data2Invalid || !onlyMoveConfigChange;\n\n            if(refreshBecauseOfConfig || forceData1) {\n                window.Measurer('heatmap-1-1').start();\n                rafCallbackData1 = drawLevels(dataForDrawIds.oldCandles, forceData1);\n\n                if(data1Invalid) {\n                    setBufferDataValid(dataForDrawIds.oldCandles);\n                }\n\n                window.Measurer('heatmap-1-1').stop();\n            }\n\n            if(refreshBecauseOfConfig || forceData2) {\n                window.Measurer('heatmap-1-2').start();\n                rafCallbackData2 = drawLevels(dataForDrawIds.currentCandle, forceData2);\n\n                if(data2Invalid) {\n                    setBufferDataValid(dataForDrawIds.currentCandle);\n                }\n\n                window.Measurer('heatmap-1-2').stop();\n            }\n\n            window.Measurer('heatmap-1').stop();\n\n            const dpr = window.dpr() || 1;\n\n            window.Measurer('heatmap-2').start();\n\n        //    console.log('rafCallbackData1', rafCallbackData1);\n        //    console.log('rafCallbackData2', rafCallbackData2);\n\n            if(rafCallbackData1) {\n                dataViews.old.properties(\n                    Math.floor(canvas.width / dpr),\n                    Math.floor(canvas.height / dpr)\n                );\n                dataViews.old.draw();\n            }\n\n            if(rafCallbackData2) {\n                dataViews.current.properties(\n                    Math.floor(canvas.width / dpr),\n                    Math.floor(canvas.height / dpr)\n                );\n                dataViews.current.draw();\n            }\n\n            regl._gl.flush();\n\n            if('Measurer' in window) {\n                window.Measurer('heatmap-2').stop();\n                window.Measurer('heatmap').stop();\n            }\n\n            if(cb && typeof cb === \"function\") {\n                cb();\n            }\n        }\n\n        function redraw() {\n            // focus after long inactivity leads to freeze\n            if('hidden' in document && document.hidden) {\n                return;\n            }\n\n            const frameLoop = regl.frame(function() {\n                rafCallback(function() {\n                    if(frameLoop) {\n                        frameLoop.cancel();\n                    }\n                });\n            });\n        }\n\n        let wasEnabled = false, alwaysEnabled = false, initLoad = false;\n\n        return {\n            market: '',\n            isEnabled: function(lStorage, key) {\n                return lStorage && (lStorage[key] === 'yes' || lStorage[key] === '\"yes\"');\n            },\n            setSettings: function (weirdCoordinates, timestamps, To, Mo, barWidthWithGap, gapWidth, lStorage, canvasSize) {\n                if(!alwaysEnabled) {\n                    if(!this.isEnabled(lStorage, 'enable_heatmap')) {\n                        if(wasEnabled) {\n                            wasEnabled = false;\n\n                            clearCanvas();\n                        }\n\n                        return false;\n                    } else if(!wasEnabled) {\n                        redraw();\n                    }\n                }\n\n                if (!timestamps || !timestamps.length ||\n                    !weirdCoordinates.hasOwnProperty(17) || !weirdCoordinates.hasOwnProperty(18)) {\n                    return false;\n                }\n\n                wasEnabled = true;\n\n                config.step = getStep();\n\n                config.barWidthWithGap = parseInt(barWidthWithGap);\n                config.gapWidth = parseInt(gapWidth);\n\n                config.firstCandleTime = parseInt(timestamps[0]);\n                config.lastCandleTime = parseInt(timestamps[timestamps.length - 1]);\n\n                config.graphMinPrice = parseFloat(weirdCoordinates[18].y);\n                config.graphMaxPrice = parseFloat(weirdCoordinates[18].y + weirdCoordinates[18].h);\n\n                config.barsAreaHeight = Math.abs(weirdCoordinates[17].h);\n                config.gapHeight = parseFloat(weirdCoordinates[17].y - config.barsAreaHeight);\n                config.isLogScale = weirdCoordinates[21] === 26;\n\n                config.canvasWidth = canvasSize.x;\n                config.canvasHeight = canvasSize.y /*+ (window.$is_mobile ? 6 : 16)*/;\n\n                if(!initLoad) {\n                    this.forceUpdate();\n\n                    initLoad = true;\n                }\n\n                return true;\n            },\n            draw: function (weirdCoordinates, timestamps, To, Mo, barWidthWithGap, gapWidth, lStorage, canvasSize) {\n                if(!this.setSettings(weirdCoordinates, timestamps, To, Mo, barWidthWithGap, gapWidth, lStorage, canvasSize)) {\n                    return;\n                }\n\n                // focus after long inactivity leads to freeze\n                if('hidden' in document && document.hidden) {\n                    return;\n                }\n\n                rafCallback();\n            },\n            drawNextFrame: function (weirdCoordinates, timestamps, To, Mo, barWidthWithGap, gapWidth, lStorage) {\n                if(!this.setSettings(weirdCoordinates, timestamps, To, Mo, barWidthWithGap, gapWidth, lStorage)) {\n                    return;\n                }\n\n                redraw();\n            },\n            // fixme: dirty hack to invalidate data instead of calculating right coordinates\n            setPriceLevels: function(levels) {\n                return;\n\n                config.priceLevelsSize = levels.length;\n            },\n            stepChange: function() {\n                for(let key in dataForDrawMaxWeights) {\n                    dataForDrawMaxWeights[key] = 0;\n                }\n            },\n            forceUpdate: function () {\n                if(!alwaysEnabled && !wasEnabled) {\n                    return;\n                }\n\n                // bad, but still\n                initLoad = true;\n\n                requestAllBuffersDataInvalidation();\n\n                const step = getStep();\n\n                requestData(step);\n            },\n            update: function () {\n                if(!alwaysEnabled && !wasEnabled) {\n                    return;\n                }\n\n                requestAllBuffersDataInvalidation();\n\n                const step = getStep();\n\n                if (!cachedJson.hasOwnProperty(step)) {\n                    requestData(step);\n                }\n            },\n            getColorMaps: function () {\n                return colorMaps;\n            },\n            sdepth: function(data) {\n                if(!wasEnabled && !alwaysEnabled) {\n                    return;\n                }\n                \n                const step = getStep();\n\n                let range = 0.05;\n\n                if(step <= 180) {\n                    range /= 2;\n                }\n\n                if(step > 60 * 60 * 4) {\n                    range *= 2;\n                }\n\n                setTimeout(() => {\n                    sdepth(data, range);\n                }, 0);\n            },\n            init: function() {\n                this.market = window.$heatmap_settings.market;\n                alwaysEnabled = window.$heatmap_settings.alwaysEnabled;\n\n                migrate();\n\n                if(loadConfigFromLocalStorage()) {\n                    applyConfigToPreset(config.colorMap);\n                } else {\n                    applyPresetToConfig(config.colorMap);\n                }\n\n                initJquery();\n                initAggregatedJquery();\n\n                setTimeout(() => {\n                    const depthInterval = () => {\n                        if(!wasEnabled && !alwaysEnabled) {\n                            return;\n                        }\n\n                        const step = getStep();\n\n                        requestData(step);\n                    };\n\n                    depthInterval();\n\n                //    setInterval(depthInterval, 60 * 1000); // using < 60s should not be an issue: requests are cached by client and cloudflare\n                }, (60 - new Date().getSeconds() + 2) * 1000);\n            },\n        };\n    }());\n\n    $(document).ready(function() {\n        window.Heatmap.init();\n    });\n})();\n\n\n/*\ndataForDraw = [];\n\ndataForDraw.push({price: 8200, timestamp: 1578875520, weight: 99});\ndataForDraw.push({price: 8100, timestamp: 1578875520, weight: 99});\n\ngetConfig().precisionStep = 10;\n\nif (!localWeights.hasOwnProperty(timestamp)) {\n    localWeights[timestamp] = {};\n    localWeightsKeys[timestamp] = [];\n}\n\nlocalWeights[timestamp][price] = Math.floor(volume / totalVolume * 100);\nlocalWeightsKeys[timestamp].push(price);\n*/\n\n/*\nbarsWeights = localWeights;\nbarsWeightsKeys = localWeightsKeys;\n\nconst data = [];\nconst barsTimestamps = Object.keys(barsWeights);\n\nfor (let barTimestamp of barsTimestamps) {\n    const prices = barsWeightsKeys[barTimestamp];\n\n    for (let price of prices) {\n        const weight = barsWeights[barTimestamp][price];\n\n        drawLevel(data, barTimestamp, price, weight);\n    }\n}*/\n\n/*\nconst data = [];\nconst barsTimestamps = Object.keys(barsWeights);\n\nfor (let barTimestamp of barsTimestamps) {\n    const prices = barsWeightsKeys[barTimestamp];\n\n    for (let price of prices) {\n        const weight = barsWeights[barTimestamp][price];\n\n        drawLevel(data, barTimestamp, price, weight);\n    }\n}\n*/\n","var BitcoinWisdom;(BitcoinWisdom=BitcoinWisdom||{}).Buffers=BitcoinWisdom.Buffers||{},BitcoinWisdom.Buffers.PriceVolumePair=function(){this.bb=null,this.bb_pos=0},BitcoinWisdom.Buffers.PriceVolumePair.prototype.__init=function(i,t){return this.bb_pos=i,this.bb=t,this},BitcoinWisdom.Buffers.PriceVolumePair.prototype.price=function(){return this.bb.readFloat64(this.bb_pos)},BitcoinWisdom.Buffers.PriceVolumePair.prototype.volume=function(){return this.bb.readFloat64(this.bb_pos+8)},BitcoinWisdom.Buffers.PriceVolumePair.createPriceVolumePair=function(i,t,o){return i.prep(8,16),i.writeFloat64(o),i.writeFloat64(t),i.offset()},this.BitcoinWisdom=BitcoinWisdom,(BitcoinWisdom=BitcoinWisdom||{}).Buffers=BitcoinWisdom.Buffers||{},BitcoinWisdom.Buffers.TimestampVolumeDataPair=function(){this.bb=null,this.bb_pos=0},BitcoinWisdom.Buffers.TimestampVolumeDataPair.prototype.__init=function(i,t){return this.bb_pos=i,this.bb=t,this},BitcoinWisdom.Buffers.TimestampVolumeDataPair.getRootAsTimestampVolumeDataPair=function(i,t){return(t||new BitcoinWisdom.Buffers.TimestampVolumeDataPair).__init(i.readInt32(i.position())+i.position(),i)},BitcoinWisdom.Buffers.TimestampVolumeDataPair.getSizePrefixedRootAsTimestampVolumeDataPair=function(i,t){return i.setPosition(i.position()+flatbuffers.SIZE_PREFIX_LENGTH),(t||new BitcoinWisdom.Buffers.TimestampVolumeDataPair).__init(i.readInt32(i.position())+i.position(),i)},BitcoinWisdom.Buffers.TimestampVolumeDataPair.prototype.timestamp=function(){var i=this.bb.__offset(this.bb_pos,4);return i?this.bb.readUint32(this.bb_pos+i):0},BitcoinWisdom.Buffers.TimestampVolumeDataPair.prototype.data=function(i,t){var o=this.bb.__offset(this.bb_pos,6);return o?(t||new BitcoinWisdom.Buffers.PriceVolumePair).__init(this.bb.__vector(this.bb_pos+o)+16*i,this.bb):null},BitcoinWisdom.Buffers.TimestampVolumeDataPair.prototype.dataLength=function(){var i=this.bb.__offset(this.bb_pos,6);return i?this.bb.__vector_len(this.bb_pos+i):0},BitcoinWisdom.Buffers.TimestampVolumeDataPair.startTimestampVolumeDataPair=function(i){i.startObject(2)},BitcoinWisdom.Buffers.TimestampVolumeDataPair.addTimestamp=function(i,t){i.addFieldInt32(0,t,0)},BitcoinWisdom.Buffers.TimestampVolumeDataPair.addData=function(i,t){i.addFieldOffset(1,t,0)},BitcoinWisdom.Buffers.TimestampVolumeDataPair.startDataVector=function(i,t){i.startVector(16,t,8)},BitcoinWisdom.Buffers.TimestampVolumeDataPair.endTimestampVolumeDataPair=function(i){return i.endObject()},BitcoinWisdom.Buffers.TimestampVolumeDataPair.createTimestampVolumeDataPair=function(i,t,o){return BitcoinWisdom.Buffers.TimestampVolumeDataPair.startTimestampVolumeDataPair(i),BitcoinWisdom.Buffers.TimestampVolumeDataPair.addTimestamp(i,t),BitcoinWisdom.Buffers.TimestampVolumeDataPair.addData(i,o),BitcoinWisdom.Buffers.TimestampVolumeDataPair.endTimestampVolumeDataPair(i)},BitcoinWisdom.Buffers.HeatmapResponse=function(){this.bb=null,this.bb_pos=0},BitcoinWisdom.Buffers.HeatmapResponse.prototype.__init=function(i,t){return this.bb_pos=i,this.bb=t,this},BitcoinWisdom.Buffers.HeatmapResponse.getRootAsHeatmapResponse=function(i,t){return(t||new BitcoinWisdom.Buffers.HeatmapResponse).__init(i.readInt32(i.position())+i.position(),i)},BitcoinWisdom.Buffers.HeatmapResponse.getSizePrefixedRootAsHeatmapResponse=function(i,t){return i.setPosition(i.position()+flatbuffers.SIZE_PREFIX_LENGTH),(t||new BitcoinWisdom.Buffers.HeatmapResponse).__init(i.readInt32(i.position())+i.position(),i)},BitcoinWisdom.Buffers.HeatmapResponse.bufferHasIdentifier=function(i){return i.__has_identifier(\"VER2\")},BitcoinWisdom.Buffers.HeatmapResponse.prototype.timestamps=function(i,t){var o=this.bb.__offset(this.bb_pos,4);return o?(t||new BitcoinWisdom.Buffers.TimestampVolumeDataPair).__init(this.bb.__indirect(this.bb.__vector(this.bb_pos+o)+4*i),this.bb):null},BitcoinWisdom.Buffers.HeatmapResponse.prototype.timestampsLength=function(){var i=this.bb.__offset(this.bb_pos,4);return i?this.bb.__vector_len(this.bb_pos+i):0},BitcoinWisdom.Buffers.HeatmapResponse.startHeatmapResponse=function(i){i.startObject(1)},BitcoinWisdom.Buffers.HeatmapResponse.addTimestamps=function(i,t){i.addFieldOffset(0,t,0)},BitcoinWisdom.Buffers.HeatmapResponse.createTimestampsVector=function(i,t){i.startVector(4,t.length,4);for(var o=t.length-1;o>=0;o--)i.addOffset(t[o]);return i.endVector()},BitcoinWisdom.Buffers.HeatmapResponse.startTimestampsVector=function(i,t){i.startVector(4,t,4)},BitcoinWisdom.Buffers.HeatmapResponse.endHeatmapResponse=function(i){return i.endObject()},BitcoinWisdom.Buffers.HeatmapResponse.finishHeatmapResponseBuffer=function(i,t){i.finish(t,\"VER2\")},BitcoinWisdom.Buffers.HeatmapResponse.finishSizePrefixedHeatmapResponseBuffer=function(i,t){i.finish(t,\"VER2\",!0)},BitcoinWisdom.Buffers.HeatmapResponse.createHeatmapResponse=function(i,t){return BitcoinWisdom.Buffers.HeatmapResponse.startHeatmapResponse(i),BitcoinWisdom.Buffers.HeatmapResponse.addTimestamps(i,t),BitcoinWisdom.Buffers.HeatmapResponse.endHeatmapResponse(i)},this.BitcoinWisdom=BitcoinWisdom,(BitcoinWisdom=BitcoinWisdom||{}).Buffers=BitcoinWisdom.Buffers||{},BitcoinWisdom.Buffers.OrderBook=function(){this.bb=null,this.bb_pos=0},BitcoinWisdom.Buffers.OrderBook.prototype.__init=function(i,t){return this.bb_pos=i,this.bb=t,this},BitcoinWisdom.Buffers.OrderBook.getRootAsOrderBook=function(i,t){return(t||new BitcoinWisdom.Buffers.OrderBook).__init(i.readInt32(i.position())+i.position(),i)},BitcoinWisdom.Buffers.OrderBook.getSizePrefixedRootAsOrderBook=function(i,t){return i.setPosition(i.position()+flatbuffers.SIZE_PREFIX_LENGTH),(t||new BitcoinWisdom.Buffers.OrderBook).__init(i.readInt32(i.position())+i.position(),i)},BitcoinWisdom.Buffers.OrderBook.prototype.asks=function(i,t){var o=this.bb.__offset(this.bb_pos,4);return o?(t||new BitcoinWisdom.Buffers.PriceVolumePair).__init(this.bb.__vector(this.bb_pos+o)+16*i,this.bb):null},BitcoinWisdom.Buffers.OrderBook.prototype.asksLength=function(){var i=this.bb.__offset(this.bb_pos,4);return i?this.bb.__vector_len(this.bb_pos+i):0},BitcoinWisdom.Buffers.OrderBook.prototype.bids=function(i,t){var o=this.bb.__offset(this.bb_pos,6);return o?(t||new BitcoinWisdom.Buffers.PriceVolumePair).__init(this.bb.__vector(this.bb_pos+o)+16*i,this.bb):null},BitcoinWisdom.Buffers.OrderBook.prototype.bidsLength=function(){var i=this.bb.__offset(this.bb_pos,6);return i?this.bb.__vector_len(this.bb_pos+i):0},BitcoinWisdom.Buffers.OrderBook.startOrderBook=function(i){i.startObject(2)},BitcoinWisdom.Buffers.OrderBook.addAsks=function(i,t){i.addFieldOffset(0,t,0)},BitcoinWisdom.Buffers.OrderBook.startAsksVector=function(i,t){i.startVector(16,t,8)},BitcoinWisdom.Buffers.OrderBook.addBids=function(i,t){i.addFieldOffset(1,t,0)},BitcoinWisdom.Buffers.OrderBook.startBidsVector=function(i,t){i.startVector(16,t,8)},BitcoinWisdom.Buffers.OrderBook.endOrderBook=function(i){return i.endObject()},BitcoinWisdom.Buffers.OrderBook.finishOrderBookBuffer=function(i,t){i.finish(t)},BitcoinWisdom.Buffers.OrderBook.finishSizePrefixedOrderBookBuffer=function(i,t){i.finish(t,void 0,!0)},BitcoinWisdom.Buffers.OrderBook.createOrderBook=function(i,t,o){return BitcoinWisdom.Buffers.OrderBook.startOrderBook(i),BitcoinWisdom.Buffers.OrderBook.addAsks(i,t),BitcoinWisdom.Buffers.OrderBook.addBids(i,o),BitcoinWisdom.Buffers.OrderBook.endOrderBook(i)},this.BitcoinWisdom=BitcoinWisdom,(BitcoinWisdom=BitcoinWisdom||{}).Buffers=BitcoinWisdom.Buffers||{},BitcoinWisdom.Buffers.Side={Ask:0,Bid:1},BitcoinWisdom.Buffers.SideName={0:\"Ask\",1:\"Bid\"},BitcoinWisdom.Buffers.Trade=function(){this.bb=null,this.bb_pos=0},BitcoinWisdom.Buffers.Trade.prototype.__init=function(i,t){return this.bb_pos=i,this.bb=t,this},BitcoinWisdom.Buffers.Trade.prototype.id=function(){return this.bb.readUint64(this.bb_pos)},BitcoinWisdom.Buffers.Trade.prototype.timestamp=function(){return this.bb.readUint32(this.bb_pos+8)},BitcoinWisdom.Buffers.Trade.prototype.price=function(){return this.bb.readFloat64(this.bb_pos+16)},BitcoinWisdom.Buffers.Trade.prototype.volume=function(){return this.bb.readFloat64(this.bb_pos+24)},BitcoinWisdom.Buffers.Trade.prototype.side=function(){return this.bb.readInt8(this.bb_pos+32)},BitcoinWisdom.Buffers.Trade.createTrade=function(i,t,o,e,s,n){return i.prep(8,40),i.pad(7),i.writeInt8(n),i.writeFloat64(s),i.writeFloat64(e),i.pad(4),i.writeInt32(o),i.writeInt64(t),i.offset()},this.BitcoinWisdom=BitcoinWisdom,(BitcoinWisdom=BitcoinWisdom||{}).Buffers=BitcoinWisdom.Buffers||{},BitcoinWisdom.Buffers.Trades=function(){this.bb=null,this.bb_pos=0},BitcoinWisdom.Buffers.Trades.prototype.__init=function(i,t){return this.bb_pos=i,this.bb=t,this},BitcoinWisdom.Buffers.Trades.getRootAsTrades=function(i,t){return(t||new BitcoinWisdom.Buffers.Trades).__init(i.readInt32(i.position())+i.position(),i)},BitcoinWisdom.Buffers.Trades.getSizePrefixedRootAsTrades=function(i,t){return i.setPosition(i.position()+flatbuffers.SIZE_PREFIX_LENGTH),(t||new BitcoinWisdom.Buffers.Trades).__init(i.readInt32(i.position())+i.position(),i)},BitcoinWisdom.Buffers.Trades.prototype.trades=function(i,t){var o=this.bb.__offset(this.bb_pos,4);return o?(t||new BitcoinWisdom.Buffers.Trade).__init(this.bb.__vector(this.bb_pos+o)+40*i,this.bb):null},BitcoinWisdom.Buffers.Trades.prototype.tradesLength=function(){var i=this.bb.__offset(this.bb_pos,4);return i?this.bb.__vector_len(this.bb_pos+i):0},BitcoinWisdom.Buffers.Trades.startTrades=function(i){i.startObject(1)},BitcoinWisdom.Buffers.Trades.addTrades=function(i,t){i.addFieldOffset(0,t,0)},BitcoinWisdom.Buffers.Trades.startTradesVector=function(i,t){i.startVector(40,t,8)},BitcoinWisdom.Buffers.Trades.endTrades=function(i){return i.endObject()},BitcoinWisdom.Buffers.Trades.finishTradesBuffer=function(i,t){i.finish(t)},BitcoinWisdom.Buffers.Trades.finishSizePrefixedTradesBuffer=function(i,t){i.finish(t,void 0,!0)},BitcoinWisdom.Buffers.Trades.createTrades=function(i,t){return BitcoinWisdom.Buffers.Trades.startTrades(i),BitcoinWisdom.Buffers.Trades.addTrades(i,t),BitcoinWisdom.Buffers.Trades.endTrades(i)},this.BitcoinWisdom=BitcoinWisdom,(BitcoinWisdom=BitcoinWisdom||{}).Buffers=BitcoinWisdom.Buffers||{},BitcoinWisdom.Buffers.SingleTrade=function(){this.bb=null,this.bb_pos=0},BitcoinWisdom.Buffers.SingleTrade.prototype.__init=function(i,t){return this.bb_pos=i,this.bb=t,this},BitcoinWisdom.Buffers.SingleTrade.getRootAsSingleTrade=function(i,t){return(t||new BitcoinWisdom.Buffers.SingleTrade).__init(i.readInt32(i.position())+i.position(),i)},BitcoinWisdom.Buffers.SingleTrade.getSizePrefixedRootAsSingleTrade=function(i,t){return i.setPosition(i.position()+flatbuffers.SIZE_PREFIX_LENGTH),(t||new BitcoinWisdom.Buffers.SingleTrade).__init(i.readInt32(i.position())+i.position(),i)},BitcoinWisdom.Buffers.SingleTrade.prototype.trade=function(i){var t=this.bb.__offset(this.bb_pos,4);return t?(i||new BitcoinWisdom.Buffers.Trade).__init(this.bb_pos+t,this.bb):null},BitcoinWisdom.Buffers.SingleTrade.startSingleTrade=function(i){i.startObject(1)},BitcoinWisdom.Buffers.SingleTrade.addTrade=function(i,t){i.addFieldStruct(0,t,0)},BitcoinWisdom.Buffers.SingleTrade.endSingleTrade=function(i){return i.endObject()},BitcoinWisdom.Buffers.SingleTrade.finishSingleTradeBuffer=function(i,t){i.finish(t)},BitcoinWisdom.Buffers.SingleTrade.finishSizePrefixedSingleTradeBuffer=function(i,t){i.finish(t,void 0,!0)},BitcoinWisdom.Buffers.SingleTrade.createSingleTrade=function(i,t){return BitcoinWisdom.Buffers.SingleTrade.startSingleTrade(i),BitcoinWisdom.Buffers.SingleTrade.addTrade(i,t),BitcoinWisdom.Buffers.SingleTrade.endSingleTrade(i)},this.BitcoinWisdom=BitcoinWisdom;\n","// https://en.wikipedia.org/wiki/Feature_scaling\nconst NormalizationFunctions = {\n    // default\n    // weight = % of total volume\n    linear: function(calculateWeight, bar, params) {\n        const weightedBar = {};\n        const prices = Object.keys(bar);\n\n        const maxVolume = params.defaultMaxWeight;\n\n        for (let price of prices) {\n            const volume = bar[price];\n\n            let weight = Math.floor(volume / maxVolume * 100);\n\n            if(weight > 100) {\n                weight = 100;\n            }\n\n            weightedBar[price] = weight;\n        }\n\n        return weightedBar;\n    },\n\n    // Divide each component by the Euclidean length of the vector\n    /*    unitLength: function(calculateWeight, bar) {\n            const maxValue = 100;\n\n            const weightedBar = {};\n            const prices = Object.keys(bar);\n\n            let squaresSum = 0;\n\n            for (let price of prices) {\n                const weight = calculateWeight(bar[price]);\n\n                squaresSum += weight * weight;\n            }\n\n            const squared = Math.sqrt(squaresSum);\n\n            for (let price of prices) {\n                const volume = calculateWeight(bar[price]);\n\n                weightedBar[price] = Math.floor(volume / squared * maxValue);\n            }\n\n            return weightedBar;\n        },*/\n\n    // min-max normalization\n    /*\n    minMax: function(calculateWeight, bar) {\n        const maxValue = 100;\n\n        const weightedBar = {};\n        const prices = Object.keys(bar);\n\n        let minWeight = Infinity;\n        let maxWeight = -Infinity;\n\n        for (let price of prices) {\n            const weight = calculateWeight(bar[price]);\n\n            if(weight > maxWeight) {\n                maxWeight = weight;\n            }\n\n            if(weight < minWeight) {\n                minWeight = weight;\n            }\n        }\n\n        const minMaxDiff = maxWeight - minWeight;\n\n        for (let price of prices) {\n            const weight = calculateWeight(bar[price]);\n\n            weightedBar[price] = Math.floor((weight - minWeight) / minMaxDiff * maxValue);\n        }\n\n        return weightedBar;\n    },\n    */\n\n    // I really like the result with smoothing > 30 and easeInQuad\n    // linear produces too many noise\n    // easeInCubic and higher too few signals\n    exponential: function(calculateWeight, bar, params) {\n        let maxValue = 100;\n\n        const weightedBar = {};\n        const prices = Object.keys(bar);\n\n        let exp = 1.25;\n\n        /*\n        if(params.easingFunctionKey === \"linear\") {\n            exp = 1;\n        } else if(params.easingFunctionKey === \"easeInQuad\") {\n            exp = 1.25;\n        } else if(params.easingFunctionKey === \"easeInCubic\") {\n            exp = 1.5;\n        } else if(params.easingFunctionKey === \"easeInQuart\") {\n            exp = 1.75;\n        } else if(params.easingFunctionKey === \"easeInQuint\") {\n            exp = 2;\n        }\n\n        if(params.easingFunctionKey === \"easeInQuad\") {\n            exp = 1;\n        } else if(params.easingFunctionKey === \"easeInQuad\") {\n            exp = 1.1;\n        } else if(params.easingFunctionKey === \"easeInCubic\") {\n            exp = 1.2;\n        } else if(params.easingFunctionKey === \"easeInQuart\") {\n            exp = 1.3;\n        } else if(params.easingFunctionKey === \"easeInQuint\") {\n            exp = 1.4;\n        }\n        */\n\n        calculateWeight = (x) => Math.pow(x, exp); // good values are between: [1, 2]\n\n        let minWeight = 0;\n        let maxWeight = params.defaultMaxWeight;\n\n        // does not work\n        function findMinMax1() {\n            let sum = 0;\n\n            for (let price of prices) {\n                sum += calculateWeight(bar[price]);\n            }\n\n            for (let price of prices) {\n                const weight = calculateWeight(bar[price]);\n\n                if(weight < minWeight) {\n                    minWeight = weight;\n                }\n            }\n\n            maxWeight = Math.pow(sum, 1/exp);\n            maxWeight = sum;\n        }\n\n        function findMinMax() {\n            for (let price of prices) {\n                const weight = bar[price];\n\n                if(weight > maxWeight) {\n                    maxWeight = weight;\n                }\n\n                if(weight < minWeight) {\n                    minWeight = weight;\n                }\n            }\n        }\n\n        // findMinMax1();\n        findMinMax();\n\n        minWeight = calculateWeight(minWeight);\n        maxWeight = calculateWeight(maxWeight);\n\n        const minMaxDiff = maxWeight - minWeight;\n\n        for (let price of prices) {\n            const weight = calculateWeight(bar[price]);\n\n            weightedBar[price] = Math.floor((weight - minWeight) / minMaxDiff * maxValue);\n        }\n\n        // min-max again?\n        /*            let minWeight2 = Infinity;\n                    let maxWeight2 = -Infinity;\n\n                    for (let price of prices) {\n                        const weight = weightedBar[price];\n\n                        if(weight > maxWeight2) {\n                            maxWeight2 = weight;\n                        }\n\n                        if(weight < minWeight2) {\n                            minWeight2 = weight;\n                        }\n                    }\n\n                    const minMaxDiff2 = maxWeight2 - minWeight2;\n\n                    for (let price of prices) {\n                        const weight = weightedBar[price];\n\n                        weightedBar[price] = Math.floor((weight - minWeight2) / minMaxDiff2 * 30);\n                    }*/\n\n        /*\n        let sum = 0;\n\n        for (let price of prices) {\n            sum += weightedBar[price];\n        }\n\n        const sumSquared = sum * sum;\n\n        for (let price of prices) {\n            const volume = calculateWeight(weightedBar[price]);\n\n            weightedBar[price] = Math.floor(volume / sumSquared * 100);\n        }\n        */\n\n        //    return this.relative((x) => Math.pow(x, 5), weightedBar);\n\n        return weightedBar;\n    },\n\n    // z-score normalization\n    // Mean normalization with sigma = (max - min)\n    /*\n    score: function (calculateWeight, bar) {\n        const maxValue = 100;\n\n        const weightedBar = {};\n        const prices = Object.keys(bar);\n\n        let minWeight = Infinity;\n        let maxWeight = -Infinity;\n\n        let sum = 0;\n        let divideBy = 0;\n\n        for (let price of prices) {\n            const weight = calculateWeight(bar[price]);\n\n            if(weight > maxWeight) {\n                maxWeight = weight;\n            }\n\n            if(weight < minWeight) {\n                minWeight = weight;\n            }\n\n            sum += calculateWeight(bar[price]);\n\n            divideBy++;\n        }\n\n        const avg = sum / divideBy;\n        const sigma = (maxWeight - minWeight);\n\n        for (let price of prices) {\n            const weight = calculateWeight(bar[price]);\n\n            weightedBar[price] = Math.floor((weight - avg) / sigma * maxValue);\n        }\n\n        return weightedBar;\n    }\n    */\n};\n\nexport default NormalizationFunctions;","function cividis() {\n    return [\n        [0.0, 0.135112, 0.304751, 1.0], [0.0, 0.141013, 0.317579, 1.0], [0.0, 0.146877, 0.330479, 1.0], [0.0, 0.155377, 0.3505, 1.0], [0.0, 0.160495, 0.364534, 1.0], [0.0, 0.165621, 0.378769, 1.0], [0.0, 0.17342, 0.400353, 1.0], [0.0, 0.178802, 0.414764, 1.0], [0.0, 0.18455, 0.428802, 1.0], [0.0, 0.19095, 0.441085, 1.0], [0.003602, 0.195911, 0.441564, 1.0], [0.03211, 0.201199, 0.440785, 1.0], [0.068968, 0.209372, 0.438863, 1.0], [0.087465, 0.214879, 0.437342, 1.0], [0.103401, 0.220406, 0.43579, 1.0], [0.124291, 0.228697, 0.433547, 1.0], [0.13683, 0.234216, 0.432148, 1.0], [0.148638, 0.239724, 0.430752, 1.0], [0.165113, 0.247965, 0.428908, 1.0], [0.17549, 0.253444, 0.42779, 1.0], [0.185453, 0.258914, 0.426788, 1.0], [0.199764, 0.267099, 0.425497, 1.0], [0.208926, 0.272546, 0.424809, 1.0], [0.222264, 0.280702, 0.423914, 1.0], [0.230871, 0.286134, 0.423498, 1.0], [0.239312, 0.291562, 0.423167, 1.0], [0.251675, 0.299698, 0.422873, 1.0], [0.25974, 0.30512, 0.42281, 1.0], [0.267693, 0.310542, 0.422821, 1.0], [0.279411, 0.318677, 0.423031, 1.0], [0.287065, 0.324103, 0.423373, 1.0], [0.294669, 0.329531, 0.423716, 1.0], [0.305886, 0.337681, 0.424512, 1.0], [0.313287, 0.34312, 0.42512, 1.0], [0.320595, 0.348565, 0.425889, 1.0], [0.331474, 0.356744, 0.427144, 1.0], [0.338673, 0.362206, 0.428053, 1.0], [0.345793, 0.367676, 0.429127, 1.0], [0.356418, 0.375896, 0.430823, 1.0], [0.363446, 0.381388, 0.432075, 1.0], [0.37043, 0.38689, 0.433428, 1.0], [0.38083, 0.395164, 0.435653, 1.0], [0.387705, 0.400694, 0.437305, 1.0], [0.394568, 0.406236, 0.438986, 1.0], [0.40482, 0.414572, 0.441642, 1.0], [0.411607, 0.420145, 0.443577, 1.0], [0.421748, 0.428531, 0.44664, 1.0], [0.428462, 0.43414, 0.448864, 1.0], [0.435168, 0.439763, 0.451134, 1.0], [0.445148, 0.448226, 0.454885, 1.0], [0.451759, 0.453887, 0.457582, 1.0], [0.458366, 0.459552, 0.460457, 1.0], [0.468254, 0.468083, 0.464908, 1.0], [0.474812, 0.473832, 0.467681, 1.0], [0.481622, 0.479573, 0.469767, 1.0], [0.492278, 0.488198, 0.471453, 1.0], [0.499552, 0.49396, 0.472032, 1.0], [0.506866, 0.499743, 0.472432, 1.0], [0.51792, 0.508454, 0.472707, 1.0], [0.525348, 0.514285, 0.47266, 1.0], [0.532829, 0.520135, 0.472401, 1.0], [0.544069, 0.528948, 0.471947, 1.0], [0.551612, 0.534849, 0.471439, 1.0], [0.559181, 0.540771, 0.470829, 1.0], [0.570607, 0.549695, 0.469593, 1.0], [0.578236, 0.555673, 0.468724, 1.0], [0.589753, 0.564682, 0.46709, 1.0], [0.597469, 0.570718, 0.465821, 1.0], [0.605211, 0.576777, 0.464441, 1.0], [0.616852, 0.585913, 0.462237, 1.0], [0.624654, 0.592034, 0.460583, 1.0], [0.632506, 0.59818, 0.458668, 1.0], [0.64427, 0.60745, 0.455886, 1.0], [0.652178, 0.613664, 0.453689, 1.0], [0.660082, 0.619904, 0.451534, 1.0], [0.671991, 0.629316, 0.448018, 1.0], [0.679979, 0.635626, 0.445424, 1.0], [0.687957, 0.641966, 0.442886, 1.0], [0.700008, 0.651529, 0.438624, 1.0], [0.708067, 0.657942, 0.435647, 1.0], [0.716177, 0.664384, 0.432386, 1.0], [0.728334, 0.674107, 0.427554, 1.0], [0.736488, 0.680629, 0.424028, 1.0], [0.744664, 0.687181, 0.420393, 1.0], [0.756975, 0.697071, 0.414659, 1.0], [0.765223, 0.703705, 0.410587, 1.0], [0.773486, 0.710373, 0.406422, 1.0], [0.785965, 0.720438, 0.399613, 1.0], [0.794298, 0.72719, 0.395016, 1.0], [0.806859, 0.737385, 0.387684, 1.0], [0.815274, 0.744226, 0.382504, 1.0], [0.823729, 0.751101, 0.377043, 1.0], [0.836429, 0.761483, 0.368747, 1.0], [0.844957, 0.76845, 0.362741, 1.0], [0.853515, 0.775454, 0.3565, 1.0], [0.866421, 0.786028, 0.346571, 1.0], [0.875057, 0.793125, 0.339685, 1.0], [0.88372, 0.800258, 0.332599, 1.0], [0.896818, 0.81103, 0.320982, 1.0], [0.905589, 0.818257, 0.312889, 1.0]\n    ];\n}\n\nfunction magma() {\n    return [\n        [0.001462, 0.000466, 0.013866, 1.0], [0.003279, 0.002305, 0.023708, 1.0], [0.00595, 0.004843, 0.03713, 1.0], [0.011465, 0.009828, 0.06075, 1.0], [0.016156, 0.01384, 0.076603, 1.0], [0.021692, 0.01832, 0.09261, 1.0], [0.031696, 0.025765, 0.116965, 1.0], [0.039608, 0.03109, 0.133515, 1.0], [0.048062, 0.036607, 0.150327, 1.0], [0.060949, 0.044794, 0.176129, 1.0], [0.069764, 0.049726, 0.193735, 1.0], [0.078815, 0.054184, 0.211667, 1.0], [0.092949, 0.059904, 0.239164, 1.0], [0.102815, 0.06301, 0.257854, 1.0], [0.113094, 0.065492, 0.276784, 1.0], [0.12938, 0.067935, 0.305443, 1.0], [0.140858, 0.068654, 0.324538, 1.0], [0.152839, 0.068637, 0.343404, 1.0], [0.171713, 0.067305, 0.370771, 1.0], [0.184801, 0.065732, 0.387973, 1.0], [0.198177, 0.063862, 0.404009, 1.0], [0.218512, 0.061158, 0.425392, 1.0], [0.232077, 0.059889, 0.437695, 1.0], [0.25222, 0.059415, 0.453248, 1.0], [0.265447, 0.060237, 0.46184, 1.0], [0.278493, 0.061978, 0.46919, 1.0], [0.29774, 0.066117, 0.478243, 1.0], [0.310382, 0.069702, 0.483186, 1.0], [0.322899, 0.073782, 0.487408, 1.0], [0.341482, 0.080564, 0.492631, 1.0], [0.353773, 0.085373, 0.495501, 1.0], [0.366012, 0.090314, 0.49796, 1.0], [0.384299, 0.097855, 0.501002, 1.0], [0.396467, 0.102902, 0.502658, 1.0], [0.408629, 0.10793, 0.504052, 1.0], [0.426877, 0.115395, 0.505714, 1.0], [0.439062, 0.120298, 0.506555, 1.0], [0.451271, 0.125132, 0.507198, 1.0], [0.46964, 0.132245, 0.507809, 1.0], [0.481929, 0.136891, 0.507989, 1.0], [0.494258, 0.141462, 0.507988, 1.0], [0.512831, 0.148179, 0.507648, 1.0], [0.52527, 0.152569, 0.507192, 1.0], [0.537755, 0.156894, 0.506551, 1.0], [0.556571, 0.163269, 0.50523, 1.0], [0.569172, 0.167454, 0.504105, 1.0], [0.588158, 0.173652, 0.502035, 1.0], [0.600868, 0.177743, 0.500394, 1.0], [0.613617, 0.181811, 0.498536, 1.0], [0.632805, 0.187893, 0.495332, 1.0], [0.645633, 0.191952, 0.49291, 1.0], [0.658483, 0.196027, 0.490253, 1.0], [0.677786, 0.202203, 0.485819, 1.0], [0.690661, 0.206384, 0.482558, 1.0], [0.703532, 0.210638, 0.479049, 1.0], [0.722805, 0.217194, 0.473316, 1.0], [0.735616, 0.221713, 0.46918, 1.0], [0.748378, 0.226377, 0.464794, 1.0], [0.767398, 0.233705, 0.457755, 1.0], [0.779968, 0.238851, 0.452765, 1.0], [0.792427, 0.244242, 0.447543, 1.0], [0.810855, 0.252861, 0.439305, 1.0], [0.822926, 0.259016, 0.433573, 1.0], [0.834791, 0.26554, 0.427671, 1.0], [0.852126, 0.276106, 0.418573, 1.0], [0.86332, 0.283729, 0.412403, 1.0], [0.879464, 0.296125, 0.403118, 1.0], [0.889731, 0.305079, 0.397002, 1.0], [0.899552, 0.314616, 0.391037, 1.0], [0.913354, 0.330052, 0.382563, 1.0], [0.921884, 0.341098, 0.377376, 1.0], [0.929845, 0.352734, 0.372677, 1.0], [0.940687, 0.371224, 0.366762, 1.0], [0.94718, 0.384178, 0.363701, 1.0], [0.953099, 0.397563, 0.361438, 1.0], [0.960949, 0.418323, 0.35963, 1.0], [0.965549, 0.432519, 0.359529, 1.0], [0.96968, 0.446936, 0.360311, 1.0], [0.975082, 0.468861, 0.363111, 1.0], [0.97821, 0.483612, 0.366025, 1.0], [0.981, 0.498428, 0.369734, 1.0], [0.984622, 0.520713, 0.376698, 1.0], [0.9867, 0.535582, 0.38221, 1.0], [0.988533, 0.550446, 0.388365, 1.0], [0.990871, 0.572706, 0.398714, 1.0], [0.992196, 0.587502, 0.406299, 1.0], [0.993326, 0.602275, 0.41439, 1.0], [0.994738, 0.62435, 0.427397, 1.0], [0.99548, 0.639027, 0.436607, 1.0], [0.996341, 0.660969, 0.45116, 1.0], [0.996775, 0.675541, 0.461314, 1.0], [0.997077, 0.690088, 0.471811, 1.0], [0.997325, 0.711848, 0.488154, 1.0], [0.997351, 0.726324, 0.499428, 1.0], [0.997285, 0.740772, 0.510983, 1.0], [0.997019, 0.762398, 0.528821, 1.0], [0.996727, 0.776795, 0.541039, 1.0], [0.996369, 0.791167, 0.553499, 1.0], [0.99568, 0.812706, 0.572645, 1.0], [0.995131, 0.827052, 0.585701, 1.0]\n    ];\n}\n\nfunction plasma() {\n    const map = [\n        [0.050383, 0.029803, 0.527975],\n        [0.063536, 0.028426, 0.533124],\n        //    [0.075353, 0.027206, 0.538007],\n        //    [0.086222, 0.026125, 0.542658],\n        [0.096379, 0.025165, 0.547103],\n        //    [0.105980, 0.024309, 0.551368],\n        //    [0.115124, 0.023556, 0.555468],\n        [0.123903, 0.022878, 0.559423],\n        [0.132381, 0.022258, 0.563250],\n        //    [0.140603, 0.021687, 0.566959],\n        //    [0.148607, 0.021154, 0.570562],\n        //    [0.156421, 0.020651, 0.574065],\n        [0.164070, 0.020171, 0.577478],\n        //    [0.171574, 0.019706, 0.580806],\n        //    [0.178950, 0.019252, 0.584054],\n        [0.186213, 0.018803, 0.587228],\n        //    [0.193374, 0.018354, 0.590330],\n        [0.200445, 0.017902, 0.593364],\n        [0.207435, 0.017442, 0.596333],\n        //    [0.214350, 0.016973, 0.599239],\n        [0.221197, 0.016497, 0.602083],\n        [0.227983, 0.016007, 0.604867],\n        //    [0.234715, 0.015502, 0.607592],\n        [0.241396, 0.014979, 0.610259],\n        [0.248032, 0.014439, 0.612868],\n        //    [0.254627, 0.013882, 0.615419],\n        [0.261183, 0.013308, 0.617911],\n        [0.267703, 0.012716, 0.620346],\n        //    [0.274191, 0.012109, 0.622722],\n        [0.280648, 0.011488, 0.625038],\n        [0.287076, 0.010855, 0.627295],\n        //    [0.293478, 0.010213, 0.629490],\n        [0.299855, 0.009561, 0.631624],\n        [0.306210, 0.008902, 0.633694],\n        //    [0.312543, 0.008239, 0.635700],\n        [0.318856, 0.007576, 0.637640],\n        [0.325150, 0.006915, 0.639512],\n        //    [0.331426, 0.006261, 0.641316],\n        [0.337683, 0.005618, 0.643049],\n        [0.343925, 0.004991, 0.644710],\n        //    [0.350150, 0.004382, 0.646298],\n        [0.356359, 0.003798, 0.647810],\n        [0.362553, 0.003243, 0.649245],\n        //    [0.368733, 0.002724, 0.650601],\n        [0.374897, 0.002245, 0.651876],\n        [0.381047, 0.001814, 0.653068],\n        //    [0.387183, 0.001434, 0.654177],\n        [0.393304, 0.001114, 0.655199],\n        [0.399411, 0.000859, 0.656133],\n        //    [0.405503, 0.000678, 0.656977],\n        [0.411580, 0.000577, 0.657730],\n        [0.417642, 0.000564, 0.658390],\n        //    [0.423689, 0.000646, 0.658956],\n        [0.429719, 0.000831, 0.659425],\n        [0.435734, 0.001127, 0.659797],\n        //    [0.441732, 0.001540, 0.660069],\n        [0.447714, 0.002080, 0.660240],\n        [0.453677, 0.002755, 0.660310],\n        //    [0.459623, 0.003574, 0.660277],\n        [0.465550, 0.004545, 0.660139],\n        [0.471457, 0.005678, 0.659897],\n        //    [0.477344, 0.006980, 0.659549],\n        [0.483210, 0.008460, 0.659095],\n        [0.489055, 0.010127, 0.658534],\n        //    [0.494877, 0.011990, 0.657865],\n        [0.500678, 0.014055, 0.657088],\n        [0.506454, 0.016333, 0.656202],\n        //    [0.512206, 0.018833, 0.655209],\n        [0.517933, 0.021563, 0.654109],\n        [0.523633, 0.024532, 0.652901],\n        //    [0.529306, 0.027747, 0.651586],\n        [0.534952, 0.031217, 0.650165],\n        [0.540570, 0.034950, 0.648640],\n        //    [0.546157, 0.038954, 0.647010],\n        [0.551715, 0.043136, 0.645277],\n        [0.557243, 0.047331, 0.643443],\n        //    [0.562738, 0.051545, 0.641509],\n        [0.568201, 0.055778, 0.639477],\n        [0.573632, 0.060028, 0.637349],\n        //    [0.579029, 0.064296, 0.635126],\n        [0.584391, 0.068579, 0.632812],\n        [0.589719, 0.072878, 0.630408],\n        //    [0.595011, 0.077190, 0.627917],\n        [0.600266, 0.081516, 0.625342],\n        [0.605485, 0.085854, 0.622686],\n        //    [0.610667, 0.090204, 0.619951],\n        [0.615812, 0.094564, 0.617140],\n        [0.620919, 0.098934, 0.614257],\n        //    [0.625987, 0.103312, 0.611305],\n        [0.631017, 0.107699, 0.608287],\n        [0.636008, 0.112092, 0.605205],\n        //    [0.640959, 0.116492, 0.602065],\n        [0.645872, 0.120898, 0.598867],\n        [0.650746, 0.125309, 0.595617],\n        //    [0.655580, 0.129725, 0.592317],\n        [0.660374, 0.134144, 0.588971],\n        [0.665129, 0.138566, 0.585582],\n        //    [0.669845, 0.142992, 0.582154],\n        [0.674522, 0.147419, 0.578688],\n        [0.679160, 0.151848, 0.575189],\n        //    [0.683758, 0.156278, 0.571660],\n        [0.688318, 0.160709, 0.568103],\n        [0.692840, 0.165141, 0.564522],\n        //    [0.697324, 0.169573, 0.560919],\n        [0.701769, 0.174005, 0.557296],\n        [0.706178, 0.178437, 0.553657],\n        //    [0.710549, 0.182868, 0.550004],\n        [0.714883, 0.187299, 0.546338],\n        [0.719181, 0.191729, 0.542663],\n        //    [0.723444, 0.196158, 0.538981],\n        [0.727670, 0.200586, 0.535293],\n        [0.731862, 0.205013, 0.531601],\n        //    [0.736019, 0.209439, 0.527908],\n        [0.740143, 0.213864, 0.524216],\n        [0.744232, 0.218288, 0.520524],\n        //    [0.748289, 0.222711, 0.516834],\n        [0.752312, 0.227133, 0.513149],\n        [0.756304, 0.231555, 0.509468],\n        //    [0.760264, 0.235976, 0.505794],\n        [0.764193, 0.240396, 0.502126],\n        [0.768090, 0.244817, 0.498465],\n        //    [0.771958, 0.249237, 0.494813],\n        [0.775796, 0.253658, 0.491171],\n        [0.779604, 0.258078, 0.487539],\n        //    [0.783383, 0.262500, 0.483918],\n        [0.787133, 0.266922, 0.480307],\n        [0.790855, 0.271345, 0.476706],\n        //    [0.794549, 0.275770, 0.473117],\n        [0.798216, 0.280197, 0.469538],\n        [0.801855, 0.284626, 0.465971],\n        //    [0.805467, 0.289057, 0.462415],\n        [0.809052, 0.293491, 0.458870],\n        [0.812612, 0.297928, 0.455338],\n        //    [0.816144, 0.302368, 0.451816],\n        [0.819651, 0.306812, 0.448306],\n        [0.823132, 0.311261, 0.444806],\n        //    [0.826588, 0.315714, 0.441316],\n        [0.830018, 0.320172, 0.437836],\n        [0.833422, 0.324635, 0.434366],\n        //    [0.836801, 0.329105, 0.430905],\n        [0.840155, 0.333580, 0.427455],\n        [0.843484, 0.338062, 0.424013],\n        //    [0.846788, 0.342551, 0.420579],\n        [0.850066, 0.347048, 0.417153],\n        [0.853319, 0.351553, 0.413734],\n        //    [0.856547, 0.356066, 0.410322],\n        [0.859750, 0.360588, 0.406917],\n        [0.862927, 0.365119, 0.403519],\n        //    [0.866078, 0.369660, 0.400126],\n        [0.869203, 0.374212, 0.396738],\n        [0.872303, 0.378774, 0.393355],\n        //    [0.875376, 0.383347, 0.389976],\n        [0.878423, 0.387932, 0.386600],\n        [0.881443, 0.392529, 0.383229],\n        //    [0.884436, 0.397139, 0.379860],\n        [0.887402, 0.401762, 0.376494],\n        [0.890340, 0.406398, 0.373130],\n        [0.893250, 0.411048, 0.369768],\n        [0.896131, 0.415712, 0.366407],\n        [0.898984, 0.420392, 0.363047],\n        [0.901807, 0.425087, 0.359688],\n        [0.904601, 0.429797, 0.356329],\n        [0.907365, 0.434524, 0.352970],\n        [0.910098, 0.439268, 0.349610],\n        [0.912800, 0.444029, 0.346251],\n        [0.915471, 0.448807, 0.342890],\n        [0.918109, 0.453603, 0.339529],\n        [0.920714, 0.458417, 0.336166],\n        [0.923287, 0.463251, 0.332801],\n        [0.925825, 0.468103, 0.329435],\n        [0.928329, 0.472975, 0.326067],\n        [0.930798, 0.477867, 0.322697],\n        [0.933232, 0.482780, 0.319325],\n        [0.935630, 0.487712, 0.315952],\n        [0.937990, 0.492667, 0.312575],\n        [0.940313, 0.497642, 0.309197],\n        [0.942598, 0.502639, 0.305816],\n        [0.944844, 0.507658, 0.302433],\n        [0.947051, 0.512699, 0.299049],\n        [0.949217, 0.517763, 0.295662],\n        [0.951344, 0.522850, 0.292275],\n        [0.953428, 0.527960, 0.288883],\n        [0.955470, 0.533093, 0.285490],\n        [0.957469, 0.538250, 0.282096],\n        [0.959424, 0.543431, 0.278701],\n        [0.961336, 0.548636, 0.275305],\n        [0.963203, 0.553865, 0.271909],\n        [0.965024, 0.559118, 0.268513],\n        [0.966798, 0.564396, 0.265118],\n        [0.968526, 0.569700, 0.261721],\n        [0.970205, 0.575028, 0.258325],\n        [0.971835, 0.580382, 0.254931],\n        [0.973416, 0.585761, 0.251540],\n        [0.974947, 0.591165, 0.248151],\n        [0.976428, 0.596595, 0.244767],\n        [0.977856, 0.602051, 0.241387],\n        [0.979233, 0.607532, 0.238013],\n        [0.980556, 0.613039, 0.234646],\n        [0.981826, 0.618572, 0.231287],\n        [0.983041, 0.624131, 0.227937],\n        [0.984199, 0.629718, 0.224595],\n        [0.985301, 0.635330, 0.221265],\n        [0.986345, 0.640969, 0.217948],\n        [0.987332, 0.646633, 0.214648],\n        [0.988260, 0.652325, 0.211364],\n        [0.989128, 0.658043, 0.208100],\n        [0.989935, 0.663787, 0.204859],\n        [0.990681, 0.669558, 0.201642],\n        [0.991365, 0.675355, 0.198453],\n        [0.991985, 0.681179, 0.195295],\n        [0.992541, 0.687030, 0.192170],\n        [0.993032, 0.692907, 0.189084],\n        [0.993456, 0.698810, 0.186041],\n        [0.993814, 0.704741, 0.183043],\n        [0.994103, 0.710698, 0.180097],\n        [0.994324, 0.716681, 0.177208],\n        [0.994474, 0.722691, 0.174381],\n        [0.994553, 0.728728, 0.171622],\n        [0.994561, 0.734791, 0.168938],\n        [0.994495, 0.740880, 0.166335],\n        [0.994355, 0.746995, 0.163821],\n        [0.994141, 0.753137, 0.161404],\n        [0.993851, 0.759304, 0.159092],\n        [0.993482, 0.765499, 0.156891],\n        [0.993033, 0.771720, 0.154808],\n        [0.992505, 0.777967, 0.152855],\n        [0.991897, 0.784239, 0.151042],\n        [0.991209, 0.790537, 0.149377],\n        [0.990439, 0.796859, 0.147870],\n        [0.989587, 0.803205, 0.146529],\n        [0.988648, 0.809579, 0.145357],\n        [0.987621, 0.815978, 0.144363],\n        [0.986509, 0.822401, 0.143557],\n        [0.985314, 0.828846, 0.142945],\n        [0.984031, 0.835315, 0.142528],\n        [0.982653, 0.841812, 0.142303],\n        [0.981190, 0.848329, 0.142279],\n        [0.979644, 0.854866, 0.142453],\n        [0.977995, 0.861432, 0.142808],\n        [0.976265, 0.868016, 0.143351],\n        [0.974443, 0.874622, 0.144061],\n        [0.972530, 0.881250, 0.144923],\n        [0.970533, 0.887896, 0.145919],\n        [0.968443, 0.894564, 0.147014],\n        [0.966271, 0.901249, 0.148180],\n        [0.964021, 0.907950, 0.149370],\n        [0.961681, 0.914672, 0.150520],\n        [0.959276, 0.921407, 0.151566],\n        [0.956808, 0.928152, 0.152409],\n        [0.954287, 0.934908, 0.152921],\n        [0.951726, 0.941671, 0.152925],\n        [0.949151, 0.948435, 0.152178],\n        [0.946602, 0.955190, 0.150328],\n        [0.944152, 0.961916, 0.146861],\n        [0.941896, 0.968590, 0.140956],\n        [0.940015, 0.975158, 0.131326]\n    ];\n\n    const result = [];\n    const to = map.length;\n\n    for(let i = 0; i < to; i++) {\n        if(i % 2 === 0) {\n            let opacity = 30;\n\n            opacity += (i / to) * 30;\n\n            result.push([\n                map[i][0], map[i][1], map[i][2], 1\n            ]);\n        }\n\n        if(result.length === 100) {\n            break;\n        }\n    }\n\n    // console.log(map.length, result.length, result);\n\n    return result;\n}\n\nfunction inferno2() {\n    const map = [\n        /*                [0.001462, 0.000466, 0.013866],\n                        [0.002267, 0.001270, 0.018570],\n                        [0.003299, 0.002249, 0.024239],\n                        [0.004547, 0.003392, 0.030909],\n                        [0.006006, 0.004692, 0.038558],\n                        [0.007676, 0.006136, 0.046836],\n                        [0.009561, 0.007713, 0.055143],\n                        [0.011663, 0.009417, 0.063460],\n                        [0.013995, 0.011225, 0.071862],\n                        [0.016561, 0.013136, 0.080282],\n                        [0.019373, 0.015133, 0.088767],\n                        [0.022447, 0.017199, 0.097327],\n                        [0.025793, 0.019331, 0.105930],\n                        [0.029432, 0.021503, 0.114621],\n                        [0.033385, 0.023702, 0.123397],\n                        [0.037668, 0.025921, 0.132232],\n                        [0.042253, 0.028139, 0.141141],\n                        [0.046915, 0.030324, 0.150164],\n                        [0.051644, 0.032474, 0.159254],\n                        [0.056449, 0.034569, 0.168414],\n                        [0.061340, 0.036590, 0.177642],\n                        [0.066331, 0.038504, 0.186962],\n                        [0.071429, 0.040294, 0.196354],\n                        [0.076637, 0.041905, 0.205799],\n                        [0.081962, 0.043328, 0.215289],\n                        [0.087411, 0.044556, 0.224813],\n                        [0.092990, 0.045583, 0.234358],\n                        [0.098702, 0.046402, 0.243904],\n                        [0.104551, 0.047008, 0.253430],\n                        [0.110536, 0.047399, 0.262912],\n                        [0.116656, 0.047574, 0.272321],\n                        [0.122908, 0.047536, 0.281624],\n                        [0.129285, 0.047293, 0.290788],\n                        [0.135778, 0.046856, 0.299776],\n                        [0.142378, 0.046242, 0.308553],*/\n        [0.149073, 0.045468, 0.317085],\n        [0.155850, 0.044559, 0.325338],\n        //    [0.162689, 0.043554, 0.333277],\n        [0.169575, 0.042489, 0.340874],\n        [0.176493, 0.041402, 0.348111],\n        //    [0.183429, 0.040329, 0.354971],\n        [0.190367, 0.039309, 0.361447],\n        [0.197297, 0.038400, 0.367535],\n        //    [0.204209, 0.037632, 0.373238],\n        [0.211095, 0.037030, 0.378563],\n        [0.217949, 0.036615, 0.383522],\n        //    [0.224763, 0.036405, 0.388129],\n        [0.231538, 0.036405, 0.392400],\n        [0.238273, 0.036621, 0.396353],\n        //    [0.244967, 0.037055, 0.400007],\n        [0.251620, 0.037705, 0.403378],\n        [0.258234, 0.038571, 0.406485],\n        //    [0.264810, 0.039647, 0.409345],\n        [0.271347, 0.040922, 0.411976],\n        [0.277850, 0.042353, 0.414392],\n        //    [0.284321, 0.043933, 0.416608],\n        [0.290763, 0.045644, 0.418637],\n        [0.297178, 0.047470, 0.420491],\n        //    [0.303568, 0.049396, 0.422182],\n        [0.309935, 0.051407, 0.423721],\n        [0.316282, 0.053490, 0.425116],\n        //    [0.322610, 0.055634, 0.426377],\n        [0.328921, 0.057827, 0.427511],\n        [0.335217, 0.060060, 0.428524],\n        //    [0.341500, 0.062325, 0.429425],\n        [0.347771, 0.064616, 0.430217],\n        [0.354032, 0.066925, 0.430906],\n        //    [0.360284, 0.069247, 0.431497],\n        [0.366529, 0.071579, 0.431994],\n        [0.372768, 0.073915, 0.432400],\n        //    [0.379001, 0.076253, 0.432719],\n        [0.385228, 0.078591, 0.432955],\n        [0.391453, 0.080927, 0.433109],\n        //    [0.397674, 0.083257, 0.433183],\n        [0.403894, 0.085580, 0.433179],\n        [0.410113, 0.087896, 0.433098],\n        //    [0.416331, 0.090203, 0.432943],\n        [0.422549, 0.092501, 0.432714],\n        [0.428768, 0.094790, 0.432412],\n        //    [0.434987, 0.097069, 0.432039],\n        [0.441207, 0.099338, 0.431594],\n        [0.447428, 0.101597, 0.431080],\n        //    [0.453651, 0.103848, 0.430498],\n        [0.459875, 0.106089, 0.429846],\n        [0.466100, 0.108322, 0.429125],\n        //    [0.472328, 0.110547, 0.428334],\n        [0.478558, 0.112764, 0.427475],\n        [0.484789, 0.114974, 0.426548],\n        [0.491022, 0.117179, 0.425552],\n        [0.497257, 0.119379, 0.424488],\n        [0.503493, 0.121575, 0.423356],\n        [0.509730, 0.123769, 0.422156],\n        [0.515967, 0.125960, 0.420887],\n        [0.522206, 0.128150, 0.419549],\n        [0.528444, 0.130341, 0.418142],\n        [0.534683, 0.132534, 0.416667],\n        [0.540920, 0.134729, 0.415123],\n        [0.547157, 0.136929, 0.413511],\n        [0.553392, 0.139134, 0.411829],\n        [0.559624, 0.141346, 0.410078],\n        [0.565854, 0.143567, 0.408258],\n        [0.572081, 0.145797, 0.406369],\n        [0.578304, 0.148039, 0.404411],\n        [0.584521, 0.150294, 0.402385],\n        [0.590734, 0.152563, 0.400290],\n        [0.596940, 0.154848, 0.398125],\n        [0.603139, 0.157151, 0.395891],\n        [0.609330, 0.159474, 0.393589],\n        [0.615513, 0.161817, 0.391219],\n        [0.621685, 0.164184, 0.388781],\n        [0.627847, 0.166575, 0.386276],\n        [0.633998, 0.168992, 0.383704],\n        [0.640135, 0.171438, 0.381065],\n        [0.646260, 0.173914, 0.378359],\n        [0.652369, 0.176421, 0.375586],\n        [0.658463, 0.178962, 0.372748],\n        [0.664540, 0.181539, 0.369846],\n        [0.670599, 0.184153, 0.366879],\n        [0.676638, 0.186807, 0.363849],\n        [0.682656, 0.189501, 0.360757],\n        [0.688653, 0.192239, 0.357603],\n        [0.694627, 0.195021, 0.354388],\n        [0.700576, 0.197851, 0.351113],\n        [0.706500, 0.200728, 0.347777],\n        [0.712396, 0.203656, 0.344383],\n        [0.718264, 0.206636, 0.340931],\n        [0.724103, 0.209670, 0.337424],\n        [0.729909, 0.212759, 0.333861],\n        [0.735683, 0.215906, 0.330245],\n        [0.741423, 0.219112, 0.326576],\n        [0.747127, 0.222378, 0.322856],\n        [0.752794, 0.225706, 0.319085],\n        [0.758422, 0.229097, 0.315266],\n        [0.764010, 0.232554, 0.311399],\n        [0.769556, 0.236077, 0.307485],\n        [0.775059, 0.239667, 0.303526],\n        [0.780517, 0.243327, 0.299523],\n        [0.785929, 0.247056, 0.295477],\n        [0.791293, 0.250856, 0.291390],\n        [0.796607, 0.254728, 0.287264],\n        [0.801871, 0.258674, 0.283099],\n        [0.807082, 0.262692, 0.278898],\n        [0.812239, 0.266786, 0.274661],\n        [0.817341, 0.270954, 0.270390],\n        [0.822386, 0.275197, 0.266085],\n        [0.827372, 0.279517, 0.261750],\n        [0.832299, 0.283913, 0.257383],\n        [0.837165, 0.288385, 0.252988],\n        [0.841969, 0.292933, 0.248564],\n        [0.846709, 0.297559, 0.244113],\n        [0.851384, 0.302260, 0.239636],\n        [0.855992, 0.307038, 0.235133],\n        [0.860533, 0.311892, 0.230606],\n        [0.865006, 0.316822, 0.226055],\n        [0.869409, 0.321827, 0.221482],\n        [0.873741, 0.326906, 0.216886],\n        [0.878001, 0.332060, 0.212268],\n        [0.882188, 0.337287, 0.207628],\n        [0.886302, 0.342586, 0.202968],\n        [0.890341, 0.347957, 0.198286],\n        [0.894305, 0.353399, 0.193584],\n        [0.898192, 0.358911, 0.188860],\n        [0.902003, 0.364492, 0.184116],\n        [0.905735, 0.370140, 0.179350],\n        [0.909390, 0.375856, 0.174563],\n        [0.912966, 0.381636, 0.169755],\n        [0.916462, 0.387481, 0.164924],\n        [0.919879, 0.393389, 0.160070],\n        [0.923215, 0.399359, 0.155193],\n        [0.926470, 0.405389, 0.150292],\n        [0.929644, 0.411479, 0.145367],\n        [0.932737, 0.417627, 0.140417],\n        [0.935747, 0.423831, 0.135440],\n        [0.938675, 0.430091, 0.130438],\n        [0.941521, 0.436405, 0.125409],\n        [0.944285, 0.442772, 0.120354],\n        [0.946965, 0.449191, 0.115272],\n        [0.949562, 0.455660, 0.110164],\n        [0.952075, 0.462178, 0.105031],\n        [0.954506, 0.468744, 0.099874],\n        [0.956852, 0.475356, 0.094695],\n        [0.959114, 0.482014, 0.089499],\n        [0.961293, 0.488716, 0.084289],\n        [0.963387, 0.495462, 0.079073],\n        [0.965397, 0.502249, 0.073859],\n        [0.967322, 0.509078, 0.068659],\n        [0.969163, 0.515946, 0.063488],\n        [0.970919, 0.522853, 0.058367],\n        [0.972590, 0.529798, 0.053324],\n        [0.974176, 0.536780, 0.048392],\n        [0.975677, 0.543798, 0.043618],\n        [0.977092, 0.550850, 0.039050],\n        [0.978422, 0.557937, 0.034931],\n        [0.979666, 0.565057, 0.031409],\n        [0.980824, 0.572209, 0.028508],\n        [0.981895, 0.579392, 0.026250],\n        [0.982881, 0.586606, 0.024661],\n        [0.983779, 0.593849, 0.023770],\n        [0.984591, 0.601122, 0.023606],\n        [0.985315, 0.608422, 0.024202],\n        [0.985952, 0.615750, 0.025592],\n        [0.986502, 0.623105, 0.027814],\n        [0.986964, 0.630485, 0.030908],\n        [0.987337, 0.637890, 0.034916],\n        [0.987622, 0.645320, 0.039886],\n        [0.987819, 0.652773, 0.045581],\n        [0.987926, 0.660250, 0.051750],\n        [0.987945, 0.667748, 0.058329],\n        [0.987874, 0.675267, 0.065257],\n        [0.987714, 0.682807, 0.072489],\n        [0.987464, 0.690366, 0.079990],\n        [0.987124, 0.697944, 0.087731],\n        [0.986694, 0.705540, 0.095694],\n        [0.986175, 0.713153, 0.103863],\n        [0.985566, 0.720782, 0.112229],\n        [0.984865, 0.728427, 0.120785],\n        [0.984075, 0.736087, 0.129527],\n        [0.983196, 0.743758, 0.138453],\n        [0.982228, 0.751442, 0.147565],\n        [0.981173, 0.759135, 0.156863],\n        [0.980032, 0.766837, 0.166353],\n        [0.978806, 0.774545, 0.176037],\n        [0.977497, 0.782258, 0.185923],\n        [0.976108, 0.789974, 0.196018],\n        [0.974638, 0.797692, 0.206332],\n        [0.973088, 0.805409, 0.216877],\n        [0.971468, 0.813122, 0.227658],\n        [0.969783, 0.820825, 0.238686],\n        [0.968041, 0.828515, 0.249972],\n        [0.966243, 0.836191, 0.261534],\n        [0.964394, 0.843848, 0.273391],\n        [0.962517, 0.851476, 0.285546],\n        [0.960626, 0.859069, 0.298010],\n        [0.958720, 0.866624, 0.310820],\n        [0.956834, 0.874129, 0.323974],\n        [0.954997, 0.881569, 0.337475],\n        [0.953215, 0.888942, 0.351369],\n        [0.951546, 0.896226, 0.365627],\n        [0.950018, 0.903409, 0.380271],\n        [0.948683, 0.910473, 0.395289],\n        [0.947594, 0.917399, 0.410665],\n        [0.946809, 0.924168, 0.426373],\n        [0.946392, 0.930761, 0.442367],\n        [0.946403, 0.937159, 0.458592],\n        [0.946903, 0.943348, 0.474970],\n        [0.947937, 0.949318, 0.491426],\n        [0.949545, 0.955063, 0.507860],\n        [0.951740, 0.960587, 0.524203],\n        [0.954529, 0.965896, 0.540361],\n        [0.957896, 0.971003, 0.556275],\n        [0.961812, 0.975924, 0.571925],\n        [0.966249, 0.980678, 0.587206],\n        [0.971162, 0.985282, 0.602154],\n        [0.976511, 0.989753, 0.616760],\n        [0.982257, 0.994109, 0.631017],\n        [0.988362, 0.998364, 0.644924]\n    ];\n    const result = [];\n    const to = map.length;\n\n    for(let i = 0; i < to; i++) {\n        if(i % 2 === 0) {\n            let opacity = 30;\n\n            opacity += (i / to) * 30; // 30 * i / 100 => 0.3 * i + 30\n\n            result.push([\n                map[i][0], map[i][1], map[i][2], 1\n            ]);\n        }\n\n        if(result.length === 100) {\n            break;\n        }\n    }\n\n    // console.log(map.length, result.length, result);\n\n    return result;\n}\n\nfunction inferno() {\n    const map = [\n        [0.104551, 0.047008, 0.25343, 1.0], [0.116656, 0.047574, 0.272321, 1.0], [0.129285, 0.047293, 0.290788, 1.0], [0.149073, 0.045468, 0.317085, 1.0], [0.162689, 0.043554, 0.333277, 1.0], [0.176493, 0.041402, 0.348111, 1.0], [0.197297, 0.0384, 0.367535, 1.0], [0.211095, 0.03703, 0.378563, 1.0], [0.224763, 0.036405, 0.388129, 1.0], [0.244967, 0.037055, 0.400007, 1.0], [0.258234, 0.038571, 0.406485, 1.0], [0.27785, 0.042353, 0.414392, 1.0], [0.290763, 0.045644, 0.418637, 1.0], [0.303568, 0.049396, 0.422182, 1.0], [0.32261, 0.055634, 0.426377, 1.0], [0.335217, 0.06006, 0.428524, 1.0], [0.347771, 0.064616, 0.430217, 1.0], [0.366529, 0.071579, 0.431994, 1.0], [0.379001, 0.076253, 0.432719, 1.0], [0.391453, 0.080927, 0.433109, 1.0], [0.410113, 0.087896, 0.433098, 1.0], [0.422549, 0.092501, 0.432714, 1.0], [0.434987, 0.097069, 0.432039, 1.0], [0.453651, 0.103848, 0.430498, 1.0], [0.4661, 0.108322, 0.429125, 1.0], [0.478558, 0.112764, 0.427475, 1.0], [0.497257, 0.119379, 0.424488, 1.0], [0.50973, 0.123769, 0.422156, 1.0], [0.522206, 0.12815, 0.419549, 1.0], [0.54092, 0.134729, 0.415123, 1.0], [0.553392, 0.139134, 0.411829, 1.0], [0.565854, 0.143567, 0.408258, 1.0], [0.584521, 0.150294, 0.402385, 1.0], [0.59694, 0.154848, 0.398125, 1.0], [0.615513, 0.161817, 0.391219, 1.0], [0.627847, 0.166575, 0.386276, 1.0], [0.640135, 0.171438, 0.381065, 1.0], [0.658463, 0.178962, 0.372748, 1.0], [0.670599, 0.184153, 0.366879, 1.0], [0.682656, 0.189501, 0.360757, 1.0], [0.700576, 0.197851, 0.351113, 1.0], [0.712396, 0.203656, 0.344383, 1.0], [0.724103, 0.20967, 0.337424, 1.0], [0.741423, 0.219112, 0.326576, 1.0], [0.752794, 0.225706, 0.319085, 1.0], [0.76401, 0.232554, 0.311399, 1.0], [0.780517, 0.243327, 0.299523, 1.0], [0.791293, 0.250856, 0.29139, 1.0], [0.801871, 0.258674, 0.283099, 1.0], [0.817341, 0.270954, 0.27039, 1.0], [0.827372, 0.279517, 0.26175, 1.0], [0.837165, 0.288385, 0.252988, 1.0], [0.851384, 0.30226, 0.239636, 1.0], [0.860533, 0.311892, 0.230606, 1.0], [0.873741, 0.326906, 0.216886, 1.0], [0.882188, 0.337287, 0.207628, 1.0], [0.890341, 0.347957, 0.198286, 1.0], [0.902003, 0.364492, 0.184116, 1.0], [0.90939, 0.375856, 0.174563, 1.0], [0.916462, 0.387481, 0.164924, 1.0], [0.92647, 0.405389, 0.150292, 1.0], [0.932737, 0.417627, 0.140417, 1.0], [0.938675, 0.430091, 0.130438, 1.0], [0.946965, 0.449191, 0.115272, 1.0], [0.952075, 0.462178, 0.105031, 1.0], [0.956852, 0.475356, 0.094695, 1.0], [0.963387, 0.495462, 0.079073, 1.0], [0.967322, 0.509078, 0.068659, 1.0], [0.970919, 0.522853, 0.058367, 1.0], [0.975677, 0.543798, 0.043618, 1.0], [0.978422, 0.557937, 0.034931, 1.0], [0.980824, 0.572209, 0.028508, 1.0], [0.983779, 0.593849, 0.02377, 1.0], [0.985315, 0.608422, 0.024202, 1.0], [0.986502, 0.623105, 0.027814, 1.0], [0.987622, 0.64532, 0.039886, 1.0], [0.987926, 0.66025, 0.05175, 1.0], [0.987714, 0.682807, 0.072489, 1.0], [0.987124, 0.697944, 0.087731, 1.0], [0.986175, 0.713153, 0.103863, 1.0], [0.984075, 0.736087, 0.129527, 1.0], [0.982228, 0.751442, 0.147565, 1.0], [0.980032, 0.766837, 0.166353, 1.0], [0.976108, 0.789974, 0.196018, 1.0], [0.973088, 0.805409, 0.216877, 1.0], [0.969783, 0.820825, 0.238686, 1.0], [0.964394, 0.843848, 0.273391, 1.0], [0.960626, 0.859069, 0.29801, 1.0]];\n    const result = [];\n    const to = map.length;\n\n    for(let i = 0; i < to; i++) {\n        result.push([\n            map[i][0], map[i][1], map[i][2], map[i][3]\n        ]);\n\n        if(result.length === 100) {\n            break;\n        }\n    }\n\n    // console.log(map.length, result.length, result);\n\n    return result;\n}\n\nfunction viridis() {\n    const map = [[0.267004, 0.004874, 0.329415, 1.0], [0.269944, 0.014625, 0.341379, 1.0], [0.273809, 0.031497, 0.358853, 1.0], [0.276022, 0.044167, 0.370164, 1.0], [0.278791, 0.062145, 0.386592, 1.0], [0.280267, 0.073417, 0.397163, 1.0], [0.281924, 0.089666, 0.412415, 1.0], [0.28291, 0.105393, 0.426902, 1.0], [0.283197, 0.11568, 0.436115, 1.0], [0.283072, 0.130895, 0.449241, 1.0], [0.282623, 0.140926, 0.457517, 1.0], [0.281412, 0.155834, 0.469201, 1.0], [0.279574, 0.170599, 0.479997, 1.0], [0.278012, 0.180367, 0.486697, 1.0], [0.275191, 0.194905, 0.496005, 1.0], [0.273006, 0.20452, 0.501721, 1.0], [0.269308, 0.218818, 0.509577, 1.0], [0.26658, 0.228262, 0.514349, 1.0], [0.262138, 0.242286, 0.520837, 1.0], [0.257322, 0.25613, 0.526563, 1.0], [0.253935, 0.265254, 0.529983, 1.0], [0.248629, 0.278775, 0.534556, 1.0], [0.244972, 0.287675, 0.53726, 1.0], [0.239346, 0.300855, 0.540844, 1.0], [0.233603, 0.313828, 0.543914, 1.0], [0.229739, 0.322361, 0.545706, 1.0], [0.223925, 0.334994, 0.548053, 1.0], [0.220057, 0.343307, 0.549413, 1.0], [0.214298, 0.355619, 0.551184, 1.0], [0.210503, 0.363727, 0.552206, 1.0], [0.204903, 0.375746, 0.553533, 1.0], [0.19943, 0.387607, 0.554642, 1.0], [0.19586, 0.395433, 0.555276, 1.0], [0.190631, 0.407061, 0.556089, 1.0], [0.187231, 0.414746, 0.556547, 1.0], [0.182256, 0.426184, 0.55712, 1.0], [0.177423, 0.437527, 0.557565, 1.0], [0.174274, 0.445044, 0.557792, 1.0], [0.169646, 0.456262, 0.55803, 1.0], [0.166617, 0.463708, 0.558119, 1.0], [0.162142, 0.474838, 0.55814, 1.0], [0.157729, 0.485932, 0.558013, 1.0], [0.154815, 0.493313, 0.55784, 1.0], [0.150476, 0.504369, 0.55743, 1.0], [0.147607, 0.511733, 0.557049, 1.0], [0.143343, 0.522773, 0.556295, 1.0], [0.140536, 0.530132, 0.555659, 1.0], [0.136408, 0.541173, 0.554483, 1.0], [0.132444, 0.552216, 0.553018, 1.0], [0.129933, 0.559582, 0.551864, 1.0], [0.126453, 0.570633, 0.549841, 1.0], [0.124395, 0.578002, 0.548287, 1.0], [0.121831, 0.589055, 0.545623, 1.0], [0.120092, 0.600104, 0.54253, 1.0], [0.119512, 0.607464, 0.540218, 1.0], [0.119699, 0.61849, 0.536347, 1.0], [0.120638, 0.625828, 0.533488, 1.0], [0.123444, 0.636809, 0.528763, 1.0], [0.126326, 0.644107, 0.525311, 1.0], [0.132268, 0.655014, 0.519661, 1.0], [0.14021, 0.665859, 0.513427, 1.0], [0.146616, 0.67305, 0.508936, 1.0], [0.157851, 0.683765, 0.501686, 1.0], [0.166383, 0.690856, 0.496502, 1.0], [0.180653, 0.701402, 0.488189, 1.0], [0.196571, 0.711827, 0.479221, 1.0], [0.20803, 0.718701, 0.472873, 1.0], [0.226397, 0.728888, 0.462789, 1.0], [0.239374, 0.735588, 0.455688, 1.0], [0.259857, 0.745492, 0.444467, 1.0], [0.281477, 0.755203, 0.432552, 1.0], [0.296479, 0.761561, 0.424223, 1.0], [0.319809, 0.770914, 0.411152, 1.0], [0.335885, 0.777018, 0.402049, 1.0], [0.360741, 0.785964, 0.387814, 1.0], [0.377779, 0.791781, 0.377939, 1.0], [0.404001, 0.800275, 0.362552, 1.0], [0.430983, 0.808473, 0.346476, 1.0], [0.449368, 0.813768, 0.335384, 1.0], [0.477504, 0.821444, 0.318195, 1.0], [0.496615, 0.826376, 0.306377, 1.0], [0.525776, 0.833491, 0.288127, 1.0], [0.555484, 0.840254, 0.269281, 1.0], [0.575563, 0.844566, 0.256415, 1.0], [0.606045, 0.850733, 0.236712, 1.0], [0.626579, 0.854645, 0.223353, 1.0], [0.657642, 0.860219, 0.203082, 1.0], [0.678489, 0.863742, 0.189503, 1.0], [0.709898, 0.868751, 0.169257, 1.0], [0.741388, 0.873449, 0.149561, 1.0], [0.762373, 0.876424, 0.137064, 1.0], [0.79376, 0.880678, 0.120005, 1.0], [0.814576, 0.883393, 0.110347, 1.0], [0.845561, 0.887322, 0.099702, 1.0], [0.876168, 0.891125, 0.09525, 1.0], [0.89632, 0.893616, 0.096335, 1.0], [0.926106, 0.89733, 0.104071, 1.0], [0.945636, 0.899815, 0.112838, 1.0], [0.974417, 0.90359, 0.130215, 1.0], [0.993248, 0.906157, 0.143936, 1.0]];\n\n    const result = [];\n    const to = map.length;\n\n    for(let i = 0; i < to; i++) {\n        let opacity = 100;\n\n    //    opacity += (i / to) * 30;\n\n        result.push([\n            map[i][0], map[i][1], map[i][2], map[i][3]\n        ]);\n\n        if(result.length === 100) {\n            break;\n        }\n    }\n\n    // console.log(map.length, result.length, result);\n\n    return result;\n}\n\nfunction bone() {\n    const map = [[0.0, 0.0, 0.0, 0.0], [0.008838383838383838, 0.008838380379882358, 0.012296881862099256, 1.0], [0.017676767676767676, 0.017676760759764716, 0.02459376372419851, 1.0], [0.026515151515151512, 0.02651514113964707, 0.03689064558629777, 1.0], [0.03535353535353535, 0.03535352151952943, 0.04918752744839702, 1.0], [0.04419191919191919, 0.044191901899411794, 0.061484409310496285, 1.0], [0.053030303030303025, 0.05303028227929414, 0.07378129117259553, 1.0], [0.06186868686868687, 0.06186866265917651, 0.0860781730346948, 1.0], [0.0707070707070707, 0.07070704303905886, 0.09837505489679405, 1.0], [0.07954545454545454, 0.07954542341894122, 0.1106719367588933, 1.0], [0.08838383838383838, 0.08838380379882359, 0.12296881862099257, 1.0], [0.09722222222222221, 0.09722218417870591, 0.13526570048309178, 1.0], [0.10606060606060605, 0.10606056455858828, 0.14756258234519107, 1.0], [0.1148989898989899, 0.11489894493847065, 0.15985946420729033, 1.0], [0.12373737373737374, 0.12373732531835302, 0.1721563460693896, 1.0], [0.13257575757575757, 0.13257570569823535, 0.1844532279314888, 1.0], [0.1414141414141414, 0.14141408607811773, 0.1967501097935881, 1.0], [0.15025252525252528, 0.1502524664580001, 0.20904699165568738, 1.0], [0.1590909090909091, 0.15909084683788244, 0.2213438735177866, 1.0], [0.16792929292929293, 0.1679292272177648, 0.23364075537988585, 1.0], [0.17676767676767677, 0.17676760759764718, 0.24593763724198514, 1.0], [0.1856060606060606, 0.1856059879775295, 0.25823451910408435, 1.0], [0.19444444444444442, 0.19444436835741183, 0.27053140096618356, 1.0], [0.2032828282828283, 0.20328274873729424, 0.2828282828282829, 1.0], [0.2121212121212121, 0.21212112911717657, 0.29512516469038214, 1.0], [0.22095959595959594, 0.22095950949705892, 0.30742204655248134, 1.0], [0.2297979797979798, 0.2297978898769413, 0.31971892841458066, 1.0], [0.23863636363636365, 0.23863627025682366, 0.33201581027667987, 1.0], [0.2474747474747475, 0.24747465063670604, 0.3443126921387792, 1.0], [0.2563131313131313, 0.25631303101658837, 0.3566095740008784, 1.0], [0.26515151515151514, 0.2651514113964707, 0.3689064558629776, 1.0], [0.27398989898989895, 0.2739897917763531, 0.38120333772507686, 1.0], [0.2828282828282828, 0.28282817215623546, 0.3935002195871762, 1.0], [0.2916666666666667, 0.29166655253611784, 0.4057971014492755, 1.0], [0.30050505050505055, 0.3005049329160002, 0.41809398331137476, 1.0], [0.3093434343434344, 0.30934331329588255, 0.43039086517347397, 1.0], [0.3181818181818182, 0.3181816936757649, 0.4426877470355732, 1.0], [0.327020202020202, 0.32986110412713765, 0.4520200787248184, 1.0], [0.33585858585858586, 0.3420138798334226, 0.46085846455183743, 1.0], [0.3446969696969698, 0.3541666555397076, 0.46969685037885656, 1.0], [0.35353535353535354, 0.36631943124599253, 0.4785352362058756, 1.0], [0.3623737373737374, 0.37847220695227746, 0.4873736220328947, 1.0], [0.3712121212121212, 0.39062498265856227, 0.4962120078599137, 1.0], [0.38005050505050497, 0.4027777583648472, 0.5050503936869327, 1.0], [0.38888888888888884, 0.4149305340711322, 0.5138887795139517, 1.0], [0.39772727272727276, 0.42708330977741715, 0.5227271653409709, 1.0], [0.4065656565656566, 0.4392360854837021, 0.53156555116799, 1.0], [0.41540404040404044, 0.451388861189987, 0.540403936995009, 1.0], [0.4242424242424242, 0.46354163689627187, 0.549242322822028, 1.0], [0.43308080808080807, 0.47569441260255685, 0.5580807086490471, 1.0], [0.4419191919191919, 0.4878471883088417, 0.5669190944760661, 1.0], [0.4507575757575758, 0.49999996401512675, 0.5757574803030853, 1.0], [0.4595959595959596, 0.5121527397214116, 0.5845958661301043, 1.0], [0.46843434343434337, 0.5243055154276965, 0.5934342519571233, 1.0], [0.4772727272727273, 0.5364582911339816, 0.6022726377841424, 1.0], [0.4861111111111111, 0.5486110668402664, 0.6111110236111614, 1.0], [0.494949494949495, 0.5607638425465513, 0.6199494094381806, 1.0], [0.5037878787878788, 0.5729166182528362, 0.6287877952651996, 1.0], [0.5126262626262627, 0.5850693939591212, 0.6376261810922186, 1.0], [0.5214646464646465, 0.5972221696654062, 0.6464645669192377, 1.0], [0.5303030303030303, 0.609374945371691, 0.6553029527462567, 1.0], [0.5391414141414141, 0.621527721077976, 0.6641413385732758, 1.0], [0.5479797979797979, 0.6336804967842609, 0.6729797244002949, 1.0], [0.5568181818181819, 0.6458332724905459, 0.681818110227314, 1.0], [0.5656565656565656, 0.6579860481968307, 0.6906564960543329, 1.0], [0.5744949494949495, 0.6701388239031156, 0.699494881881352, 1.0], [0.5833333333333334, 0.6822915996094008, 0.7083332677083711, 1.0], [0.5921717171717171, 0.6944443753156855, 0.7171716535353901, 1.0], [0.6010101010101011, 0.7065971510219706, 0.7260100393624094, 1.0], [0.6098484848484848, 0.7187499267282553, 0.7348484251894283, 1.0], [0.6186868686868688, 0.7309027024345405, 0.7436868110164474, 1.0], [0.6275252525252525, 0.7430554781408252, 0.7525251968434663, 1.0], [0.6363636363636364, 0.7552082538471101, 0.7613635826704854, 1.0], [0.6452020202020203, 0.7673610295533952, 0.7702019684975046, 1.0], [0.6547505070232342, 0.779040404040404, 0.7790403543245235, 1.0], [0.6685604867423051, 0.787878787878788, 0.7878787401515427, 1.0], [0.6823704664613754, 0.7967171717171717, 0.7967171259785616, 1.0], [0.6961804461804462, 0.8055555555555555, 0.8055555118055807, 1.0], [0.709990425899517, 0.8143939393939394, 0.8143938976325998, 1.0], [0.7238004056185874, 0.8232323232323232, 0.8232322834596189, 1.0], [0.7376103853376582, 0.8320707070707072, 0.832070669286638, 1.0], [0.7514203650567286, 0.8409090909090908, 0.8409090551136569, 1.0], [0.7652303447757995, 0.8497474747474748, 0.8497474409406761, 1.0], [0.7790403244948699, 0.8585858585858586, 0.858585826767695, 1.0], [0.7928503042139405, 0.8674242424242424, 0.867424212594714, 1.0], [0.8066602839330114, 0.8762626262626263, 0.8762625984217333, 1.0], [0.8204702636520818, 0.88510101010101, 0.8851009842487522, 1.0], [0.8342802433711527, 0.893939393939394, 0.8939393700757714, 1.0], [0.8480902230902231, 0.9027777777777778, 0.9027777559027903, 1.0], [0.8619002028092939, 0.9116161616161618, 0.9116161417298095, 1.0], [0.8757101825283645, 0.9204545454545455, 0.9204545275568286, 1.0], [0.8895201622474349, 0.9292929292929293, 0.9292929133838475, 1.0], [0.9033301419665059, 0.9381313131313133, 0.9381312992108667, 1.0], [0.9171401216855762, 0.946969696969697, 0.9469696850378855, 1.0], [0.9309501014046471, 0.9558080808080809, 0.9558080708649048, 1.0], [0.9447600811237177, 0.9646464646464648, 0.9646464566919237, 1.0], [0.9585700608427881, 0.9734848484848485, 0.9734848425189429, 1.0], [0.972380040561859, 0.9823232323232325, 0.982323228345962, 1.0], [0.9861900202809293, 0.9911616161616161, 0.9911616141729809, 1.0], [1.0, 1.0, 1.0, 1.0]];\n\n    const result = [];\n    const to = map.length;\n\n    for(let i = 0; i < to; i++) {\n        let opacity = 100;\n\n    //    if(i > 1) {\n    //        opacity = 100;\n    //    }\n\n        result.push([\n            map[i][0], map[i][1], map[i][2], map[i][3]\n        ]);\n\n        if(result.length === 100) {\n            break;\n        }\n    }\n\n    return result;\n}\n\nfunction pink() {\n    return [[0.1178, 0.0, 0.0, 1.0], [0.1674726860363224, 0.06546215637124728, 0.06546215637124728, 1.0], [0.21080361520516067, 0.1144899633218724, 0.1144899633218724, 1.0], [0.245678922807741, 0.1416054449828086, 0.1416054449828086, 1.0], [0.2751012958724777, 0.16331271958735594, 0.16331271958735594, 1.0], [0.3025328509055782, 0.18318572406736044, 0.18318572406736044, 1.0], [0.3272594210866938, 0.2007264688808325, 0.2007264688808325, 1.0], [0.3501368822376095, 0.2167762899924718, 0.2167762899924718, 1.0], [0.3720012526983436, 0.2320179299477481, 0.2320179299477481, 1.0], [0.3922249092856366, 0.24598867119121665, 0.24598867119121665, 1.0], [0.4115972782483692, 0.25931794666376484, 0.25931794666376484, 1.0], [0.4303311928571929, 0.27216613153713154, 0.27216613153713154, 1.0], [0.4478636649351195, 0.2841240525859617, 0.2841240525859617, 1.0], [0.46496903314885135, 0.2957707823774188, 0.2957707823774188, 1.0], [0.48150495877568605, 0.30700261179106636, 0.30700261179106636, 1.0], [0.49731705355387174, 0.3177124320697048, 0.3177124320697048, 1.0], [0.5128010576278758, 0.3281870707579798, 0.3281870707579798, 1.0], [0.527766436229618, 0.3382912626803536, 0.3382912626803536, 1.0], [0.5422790761498943, 0.34807362831108285, 0.34807362831108285, 1.0], [0.556530625295989, 0.3576709941168123, 0.3576709941168123, 1.0], [0.5703021845220937, 0.3669307306492761, 0.3669307306492761, 1.0], [0.583788642362006, 0.37599045983173257, 0.37599045983173257, 1.0], [0.5970612821282821, 0.3849001891401892, 0.3849001891401892, 1.0], [0.609885294952295, 0.39349747046474326, 0.39349747046474326, 1.0], [0.622535843517389, 0.4019736540991086, 0.4019736540991086, 1.0], [0.6349551286639468, 0.4102883896865715, 0.4102883896865715, 1.0], [0.647056949635586, 0.41838330042439137, 0.41838330042439137, 1.0], [0.6590093161973163, 0.4263750294668477, 0.4263750294668477, 1.0], [0.670720327908328, 0.43420040092858275, 0.43420040092858275, 1.0], [0.6822090578677852, 0.4418721297890389, 0.4418721297890389, 1.0], [0.6935676969830606, 0.44945422239022237, 0.44945422239022237, 1.0], [0.7046792535491626, 0.4568672298032298, 0.4568672298032298, 1.0], [0.7156384379465288, 0.46417550407877683, 0.46417550407877683, 1.0], [0.7264833496713498, 0.47140523295323306, 0.47140523295323306, 1.0], [0.737079451176542, 0.47846442183060367, 0.47846442183060367, 1.0], [0.747576271847181, 0.48545569607115063, 0.48545569607115063, 1.0], [0.7579407367571004, 0.49235643024461206, 0.49235643024461206, 1.0], [0.7632038905606179, 0.5065463881472064, 0.49913006802288623, 1.0], [0.767605802565439, 0.5217541046596502, 0.5058425240007968, 1.0], [0.7719795342118979, 0.5364700284664832, 0.5124549851587125, 1.0], [0.7763259916038099, 0.5507541099096556, 0.5189747138511684, 1.0], [0.7806561762181763, 0.5647890111694659, 0.5254395334018062, 1.0], [0.7849541805161806, 0.5783652065638429, 0.5317974488506307, 1.0], [0.7892310923180015, 0.5916679268352905, 0.5380891775010866, 1.0], [0.7934921859201859, 0.6047655573125573, 0.5443312697802698, 1.0], [0.7977176446910993, 0.6174317517969338, 0.5504626395480032, 1.0], [0.8019283746085565, 0.6299302010058375, 0.5565490044857317, 1.0], [0.8061194697087425, 0.6422050314624862, 0.5625753741484651, 1.0], [0.8102811086140177, 0.6541743902682086, 0.5685166481370117, 1.0], [0.814428309642984, 0.665998813815998, 0.5744163625877013, 1.0], [0.818551690357016, 0.6775881861840021, 0.5802476374122987, 1.0], [0.8226525308652581, 0.6889621854569128, 0.5860150880244518, 1.0], [0.8267397183006274, 0.7002101189657554, 0.5917446432885525, 1.0], [0.8307990859963588, 0.7112185845196755, 0.5974000125802853, 1.0], [0.8348410005211824, 0.72207869812088, 0.6030081128674766, 1.0], [0.8388698227318228, 0.7328275270515271, 0.6085807548037548, 1.0], [0.8428687371376462, 0.7433339118622756, 0.6140738547059457, 1.0], [0.8468551060023788, 0.7537434773113865, 0.6195347724437725, 1.0], [0.8508247463356554, 0.7640239421373057, 0.6249527778617778, 1.0], [0.8547692969307515, 0.7741216882177792, 0.6303080589343317, 1.0], [0.8587014838061202, 0.7841318878961606, 0.6356330669843396, 1.0], [0.8626132149905786, 0.7939993523090797, 0.6409085268052541, 1.0], [0.8665054017329472, 0.8037322782369146, 0.6461358073038073, 1.0], [0.870385952034043, 0.8133860215803853, 0.6513345421212694, 1.0], [0.8742435922553196, 0.8228875765364857, 0.6564776381734563, 1.0], [0.8780859606580516, 0.8322924099751372, 0.6615854635970999, 1.0], [0.8819168735798736, 0.8416246920346921, 0.6666668323148324, 1.0], [0.8857216964275146, 0.8507978882760701, 0.6716871120783848, 1.0], [0.8895156101123375, 0.8599059021640841, 0.6766828461468463, 1.0], [0.8932949775280685, 0.8689270020942748, 0.6816458511098511, 1.0], [0.8970530729362548, 0.8778237425957427, 0.6865608576968577, 1.0], [0.9008007137315318, 0.8866604825932098, 0.6914522277725914, 1.0], [0.9045310810982629, 0.8953990367863095, 0.6963045053521416, 1.0], [0.9082441763664492, 0.9040435034952309, 0.7011195115611479, 1.0], [0.9119469988430898, 0.9119469988430898, 0.7072274692632875, 1.0], [0.9156296388893662, 0.9156296388893662, 0.7211842104927562, 1.0], [0.919298824931734, 0.919298824931734, 0.7349071429515974, 1.0], [0.9229579194999195, 0.9229579194999195, 0.7484547019537019, 1.0], [0.92659474180856, 0.92659474180856, 0.7616280869954508, 1.0], [0.9302220186181095, 0.9302220186181095, 0.7746533798070161, 1.0], [0.9338365676872041, 0.9338365676872041, 0.7874812108166654, 1.0], [0.9374325716912081, 0.9374325716912081, 0.800034683951593, 1.0], [0.9410193029246666, 0.9410193029246666, 0.8124578833079744, 1.0], [0.9445905792232155, 0.9445905792232155, 0.8246697137016228, 1.0], [0.948146855836765, 0.948146855836765, 0.8366833664389118, 1.0], [0.9516941324083142, 0.9516941324083142, 0.8485808365358367, 1.0], [0.9552234086648632, 0.9552234086648632, 0.8602568482118482, 1.0], [0.9587410488021398, 0.9587410488021398, 0.8717946809714993, 1.0], [0.9622499614019614, 0.9622499614019614, 0.8832288742238743, 1.0], [0.9657391469263288, 0.9657391469263288, 0.89443397885807, 1.0], [0.969219877865787, 0.969219877865787, 0.9055474465329921, 1.0], [0.9726893358806995, 0.9726893358806995, 0.9165387302515484, 1.0], [0.976142430392885, 0.976142430392885, 0.9273554699410156, 1.0], [0.9795873430487066, 0.9795873430487066, 0.9380882091544819, 1.0], [0.9830186192072556, 0.9830186192072556, 0.9486836742954017, 1.0], [0.9864362590785318, 0.9864362590785318, 0.9591491401643222, 1.0], [0.989845898907808, 0.989845898907808, 0.9695378783697874, 1.0], [0.9932402659385388, 0.9932402659385388, 0.9797782522465251, 1.0], [0.9966240875331784, 0.9966240875331784, 0.989924444469899, 1.0], [1.0, 1.0, 1.0, 1.0]];\n}\n\nfunction spring() {\n    const map = [[1.0, 0.0, 1.0, 1.0], [1.0, 0.010101010101010102, 0.98989898989899, 1.0], [1.0, 0.020202020202020204, 0.9797979797979798, 1.0], [1.0, 0.030303030303030304, 0.9696969696969697, 1.0], [1.0, 0.04040404040404041, 0.9595959595959596, 1.0], [1.0, 0.05050505050505051, 0.9494949494949495, 1.0], [1.0, 0.06060606060606061, 0.9393939393939394, 1.0], [1.0, 0.07070707070707072, 0.9292929292929293, 1.0], [1.0, 0.08080808080808081, 0.9191919191919192, 1.0], [1.0, 0.09090909090909091, 0.9090909090909091, 1.0], [1.0, 0.10101010101010102, 0.898989898989899, 1.0], [1.0, 0.1111111111111111, 0.8888888888888888, 1.0], [1.0, 0.12121212121212122, 0.8787878787878788, 1.0], [1.0, 0.13131313131313133, 0.8686868686868687, 1.0], [1.0, 0.14141414141414144, 0.8585858585858586, 1.0], [1.0, 0.15151515151515152, 0.8484848484848485, 1.0], [1.0, 0.16161616161616163, 0.8383838383838383, 1.0], [1.0, 0.17171717171717174, 0.8282828282828283, 1.0], [1.0, 0.18181818181818182, 0.8181818181818181, 1.0], [1.0, 0.1919191919191919, 0.8080808080808081, 1.0], [1.0, 0.20202020202020204, 0.797979797979798, 1.0], [1.0, 0.21212121212121213, 0.7878787878787878, 1.0], [1.0, 0.2222222222222222, 0.7777777777777778, 1.0], [1.0, 0.23232323232323235, 0.7676767676767676, 1.0], [1.0, 0.24242424242424243, 0.7575757575757576, 1.0], [1.0, 0.25252525252525254, 0.7474747474747474, 1.0], [1.0, 0.26262626262626265, 0.7373737373737373, 1.0], [1.0, 0.27272727272727276, 0.7272727272727273, 1.0], [1.0, 0.2828282828282829, 0.7171717171717171, 1.0], [1.0, 0.29292929292929293, 0.7070707070707071, 1.0], [1.0, 0.30303030303030304, 0.696969696969697, 1.0], [1.0, 0.31313131313131315, 0.6868686868686869, 1.0], [1.0, 0.32323232323232326, 0.6767676767676767, 1.0], [1.0, 0.3333333333333334, 0.6666666666666665, 1.0], [1.0, 0.3434343434343435, 0.6565656565656566, 1.0], [1.0, 0.3535353535353536, 0.6464646464646464, 1.0], [1.0, 0.36363636363636365, 0.6363636363636364, 1.0], [1.0, 0.37373737373737376, 0.6262626262626263, 1.0], [1.0, 0.3838383838383838, 0.6161616161616161, 1.0], [1.0, 0.39393939393939403, 0.606060606060606, 1.0], [1.0, 0.4040404040404041, 0.5959595959595959, 1.0], [1.0, 0.4141414141414142, 0.5858585858585859, 1.0], [1.0, 0.42424242424242425, 0.5757575757575757, 1.0], [1.0, 0.43434343434343436, 0.5656565656565656, 1.0], [1.0, 0.4444444444444444, 0.5555555555555556, 1.0], [1.0, 0.45454545454545464, 0.5454545454545454, 1.0], [1.0, 0.4646464646464647, 0.5353535353535352, 1.0], [1.0, 0.4747474747474748, 0.5252525252525252, 1.0], [1.0, 0.48484848484848486, 0.5151515151515151, 1.0], [1.0, 0.494949494949495, 0.505050505050505, 1.0], [1.0, 0.5050505050505051, 0.4949494949494949, 1.0], [1.0, 0.5151515151515152, 0.48484848484848475, 1.0], [1.0, 0.5252525252525253, 0.4747474747474747, 1.0], [1.0, 0.5353535353535354, 0.46464646464646464, 1.0], [1.0, 0.5454545454545455, 0.4545454545454545, 1.0], [1.0, 0.5555555555555556, 0.4444444444444444, 1.0], [1.0, 0.5656565656565657, 0.43434343434343425, 1.0], [1.0, 0.5757575757575758, 0.4242424242424242, 1.0], [1.0, 0.5858585858585859, 0.41414141414141414, 1.0], [1.0, 0.595959595959596, 0.404040404040404, 1.0], [1.0, 0.6060606060606061, 0.3939393939393939, 1.0], [1.0, 0.6161616161616162, 0.38383838383838376, 1.0], [1.0, 0.6262626262626263, 0.3737373737373737, 1.0], [1.0, 0.6363636363636365, 0.36363636363636354, 1.0], [1.0, 0.6464646464646465, 0.3535353535353535, 1.0], [1.0, 0.6565656565656566, 0.3434343434343434, 1.0], [1.0, 0.6666666666666669, 0.33333333333333315, 1.0], [1.0, 0.6767676767676768, 0.3232323232323232, 1.0], [1.0, 0.686868686868687, 0.31313131313131304, 1.0], [1.0, 0.696969696969697, 0.303030303030303, 1.0], [1.0, 0.7070707070707072, 0.2929292929292928, 1.0], [1.0, 0.7171717171717171, 0.2828282828282829, 1.0], [1.0, 0.7272727272727273, 0.2727272727272727, 1.0], [1.0, 0.7373737373737376, 0.26262626262626243, 1.0], [1.0, 0.7474747474747475, 0.2525252525252525, 1.0], [1.0, 0.7575757575757577, 0.24242424242424232, 1.0], [1.0, 0.7676767676767676, 0.23232323232323238, 1.0], [1.0, 0.7777777777777778, 0.2222222222222222, 1.0], [1.0, 0.7878787878787881, 0.21212121212121193, 1.0], [1.0, 0.797979797979798, 0.202020202020202, 1.0], [1.0, 0.8080808080808082, 0.19191919191919182, 1.0], [1.0, 0.8181818181818182, 0.18181818181818177, 1.0], [1.0, 0.8282828282828284, 0.1717171717171716, 1.0], [1.0, 0.8383838383838383, 0.16161616161616166, 1.0], [1.0, 0.8484848484848485, 0.1515151515151515, 1.0], [1.0, 0.8585858585858587, 0.14141414141414133, 1.0], [1.0, 0.8686868686868687, 0.13131313131313127, 1.0], [1.0, 0.8787878787878789, 0.1212121212121211, 1.0], [1.0, 0.8888888888888888, 0.11111111111111116, 1.0], [1.0, 0.8989898989898991, 0.10101010101010088, 1.0], [1.0, 0.9090909090909093, 0.09090909090909072, 1.0], [1.0, 0.9191919191919192, 0.08080808080808077, 1.0], [1.0, 0.9292929292929294, 0.07070707070707061, 1.0], [1.0, 0.9393939393939394, 0.06060606060606055, 1.0], [1.0, 0.9494949494949496, 0.050505050505050386, 1.0], [1.0, 0.9595959595959598, 0.04040404040404022, 1.0], [1.0, 0.9696969696969697, 0.030303030303030276, 1.0], [1.0, 0.9797979797979799, 0.02020202020202011, 1.0], [1.0, 0.98989898989899, 0.010101010101010055, 1.0], [1.0, 1.0, 0.0, 1.0]];\n\n    const result = [];\n    const to = map.length;\n\n    for(let i = 0; i < to; i++) {\n        let opacity = 100; // Math.max(30, i + 30);\n\n        result.push([\n            map[i][0], map[i][1], map[i][2], map[i][3]\n        ]);\n\n        if(result.length === 100) {\n            break;\n        }\n    }\n\n    return result;\n}\n\nfunction cool() {\n    return [[0.0, 1.0, 1.0, 1.0], [0.010101010101010102, 0.98989898989899, 1.0, 1.0], [0.020202020202020204, 0.9797979797979798, 1.0, 1.0], [0.030303030303030304, 0.9696969696969697, 1.0, 1.0], [0.04040404040404041, 0.9595959595959596, 1.0, 1.0], [0.05050505050505051, 0.9494949494949495, 1.0, 1.0], [0.06060606060606061, 0.9393939393939394, 1.0, 1.0], [0.07070707070707072, 0.9292929292929293, 1.0, 1.0], [0.08080808080808081, 0.9191919191919192, 1.0, 1.0], [0.09090909090909091, 0.9090909090909091, 1.0, 1.0], [0.10101010101010102, 0.898989898989899, 1.0, 1.0], [0.1111111111111111, 0.8888888888888888, 1.0, 1.0], [0.12121212121212122, 0.8787878787878788, 1.0, 1.0], [0.13131313131313133, 0.8686868686868687, 1.0, 1.0], [0.14141414141414144, 0.8585858585858586, 1.0, 1.0], [0.15151515151515152, 0.8484848484848485, 1.0, 1.0], [0.16161616161616163, 0.8383838383838383, 1.0, 1.0], [0.17171717171717174, 0.8282828282828283, 1.0, 1.0], [0.18181818181818182, 0.8181818181818181, 1.0, 1.0], [0.1919191919191919, 0.8080808080808081, 1.0, 1.0], [0.20202020202020204, 0.797979797979798, 1.0, 1.0], [0.21212121212121213, 0.7878787878787878, 1.0, 1.0], [0.2222222222222222, 0.7777777777777778, 1.0, 1.0], [0.23232323232323235, 0.7676767676767676, 1.0, 1.0], [0.24242424242424243, 0.7575757575757576, 1.0, 1.0], [0.25252525252525254, 0.7474747474747474, 1.0, 1.0], [0.26262626262626265, 0.7373737373737373, 1.0, 1.0], [0.27272727272727276, 0.7272727272727273, 1.0, 1.0], [0.2828282828282829, 0.7171717171717171, 1.0, 1.0], [0.29292929292929293, 0.7070707070707071, 1.0, 1.0], [0.30303030303030304, 0.696969696969697, 1.0, 1.0], [0.31313131313131315, 0.6868686868686869, 1.0, 1.0], [0.32323232323232326, 0.6767676767676767, 1.0, 1.0], [0.3333333333333334, 0.6666666666666665, 1.0, 1.0], [0.3434343434343435, 0.6565656565656566, 1.0, 1.0], [0.3535353535353536, 0.6464646464646464, 1.0, 1.0], [0.36363636363636365, 0.6363636363636364, 1.0, 1.0], [0.37373737373737376, 0.6262626262626263, 1.0, 1.0], [0.3838383838383838, 0.6161616161616161, 1.0, 1.0], [0.39393939393939403, 0.606060606060606, 1.0, 1.0], [0.4040404040404041, 0.5959595959595959, 1.0, 1.0], [0.4141414141414142, 0.5858585858585859, 1.0, 1.0], [0.42424242424242425, 0.5757575757575757, 1.0, 1.0], [0.43434343434343436, 0.5656565656565656, 1.0, 1.0], [0.4444444444444444, 0.5555555555555556, 1.0, 1.0], [0.45454545454545464, 0.5454545454545454, 1.0, 1.0], [0.4646464646464647, 0.5353535353535352, 1.0, 1.0], [0.4747474747474748, 0.5252525252525252, 1.0, 1.0], [0.48484848484848486, 0.5151515151515151, 1.0, 1.0], [0.494949494949495, 0.505050505050505, 1.0, 1.0], [0.5050505050505051, 0.4949494949494949, 1.0, 1.0], [0.5151515151515152, 0.48484848484848475, 1.0, 1.0], [0.5252525252525253, 0.4747474747474747, 1.0, 1.0], [0.5353535353535354, 0.46464646464646464, 1.0, 1.0], [0.5454545454545455, 0.4545454545454545, 1.0, 1.0], [0.5555555555555556, 0.4444444444444444, 1.0, 1.0], [0.5656565656565657, 0.43434343434343425, 1.0, 1.0], [0.5757575757575758, 0.4242424242424242, 1.0, 1.0], [0.5858585858585859, 0.41414141414141414, 1.0, 1.0], [0.595959595959596, 0.404040404040404, 1.0, 1.0], [0.6060606060606061, 0.3939393939393939, 1.0, 1.0], [0.6161616161616162, 0.38383838383838376, 1.0, 1.0], [0.6262626262626263, 0.3737373737373737, 1.0, 1.0], [0.6363636363636365, 0.36363636363636354, 1.0, 1.0], [0.6464646464646465, 0.3535353535353535, 1.0, 1.0], [0.6565656565656566, 0.3434343434343434, 1.0, 1.0], [0.6666666666666669, 0.33333333333333315, 1.0, 1.0], [0.6767676767676768, 0.3232323232323232, 1.0, 1.0], [0.686868686868687, 0.31313131313131304, 1.0, 1.0], [0.696969696969697, 0.303030303030303, 1.0, 1.0], [0.7070707070707072, 0.2929292929292928, 1.0, 1.0], [0.7171717171717171, 0.2828282828282829, 1.0, 1.0], [0.7272727272727273, 0.2727272727272727, 1.0, 1.0], [0.7373737373737376, 0.26262626262626243, 1.0, 1.0], [0.7474747474747475, 0.2525252525252525, 1.0, 1.0], [0.7575757575757577, 0.24242424242424232, 1.0, 1.0], [0.7676767676767676, 0.23232323232323238, 1.0, 1.0], [0.7777777777777778, 0.2222222222222222, 1.0, 1.0], [0.7878787878787881, 0.21212121212121193, 1.0, 1.0], [0.797979797979798, 0.202020202020202, 1.0, 1.0], [0.8080808080808082, 0.19191919191919182, 1.0, 1.0], [0.8181818181818182, 0.18181818181818177, 1.0, 1.0], [0.8282828282828284, 0.1717171717171716, 1.0, 1.0], [0.8383838383838383, 0.16161616161616166, 1.0, 1.0], [0.8484848484848485, 0.1515151515151515, 1.0, 1.0], [0.8585858585858587, 0.14141414141414133, 1.0, 1.0], [0.8686868686868687, 0.13131313131313127, 1.0, 1.0], [0.8787878787878789, 0.1212121212121211, 1.0, 1.0], [0.8888888888888888, 0.11111111111111116, 1.0, 1.0], [0.8989898989898991, 0.10101010101010088, 1.0, 1.0], [0.9090909090909093, 0.09090909090909072, 1.0, 1.0], [0.9191919191919192, 0.08080808080808077, 1.0, 1.0], [0.9292929292929294, 0.07070707070707061, 1.0, 1.0], [0.9393939393939394, 0.06060606060606055, 1.0, 1.0], [0.9494949494949496, 0.050505050505050386, 1.0, 1.0], [0.9595959595959598, 0.04040404040404022, 1.0, 1.0], [0.9696969696969697, 0.030303030303030276, 1.0, 1.0], [0.9797979797979799, 0.02020202020202011, 1.0, 1.0], [0.98989898989899, 0.010101010101010055, 1.0, 1.0], [1.0, 0.0, 1.0, 1.0]];\n}\n\nfunction Wistia() {\n    return [[0.8941176470588236, 1.0, 0.47843137254901963, 1.0], [0.8983957219251337, 0.9963557140027728, 0.46322043969102794, 1.0], [0.9026737967914439, 0.9927114280055457, 0.44800950683303625, 1.0], [0.906951871657754, 0.9890671420083185, 0.43279857397504456, 1.0], [0.9112299465240642, 0.9854228560110913, 0.4175876411170529, 1.0], [0.9155080213903743, 0.9817785700138641, 0.40237670825906124, 1.0], [0.9197860962566845, 0.9781342840166369, 0.38716577540106956, 1.0], [0.9240641711229947, 0.9744899980194097, 0.37195484254307787, 1.0], [0.9283422459893048, 0.9708457120221826, 0.3567439096850862, 1.0], [0.932620320855615, 0.9672014260249554, 0.3415329768270945, 1.0], [0.9368983957219251, 0.9635571400277283, 0.3263220439691028, 1.0], [0.9411764705882353, 0.9599128540305011, 0.3111111111111111, 1.0], [0.9454545454545454, 0.9562685680332739, 0.29590017825311943, 1.0], [0.9497326203208556, 0.9526242820360468, 0.28068924539512774, 1.0], [0.9540106951871659, 0.9489799960388196, 0.26547831253713605, 1.0], [0.9582887700534759, 0.9453357100415923, 0.25026737967914436, 1.0], [0.9625668449197862, 0.9416914240443652, 0.2350564468211527, 1.0], [0.9668449197860963, 0.938047138047138, 0.219845513963161, 1.0], [0.9711229946524065, 0.9344028520499108, 0.20463458110516936, 1.0], [0.9754010695187165, 0.9307585660526837, 0.18942364824717772, 1.0], [0.9796791443850268, 0.9271142800554565, 0.17421271538918598, 1.0], [0.983957219251337, 0.9234699940582294, 0.1590017825311943, 1.0], [0.9882352941176471, 0.9198257080610022, 0.14379084967320266, 1.0], [0.9925133689839573, 0.916181422063775, 0.12857991681521092, 1.0], [0.9967914438502674, 0.9125371360665478, 0.11336898395721928, 1.0], [1.0, 0.9081006139829669, 0.10093087740146564, 1.0], [1.0, 0.9012873836403248, 0.0968112497524262, 1.0], [1.0, 0.8944741532976827, 0.0926916221033868, 1.0], [1.0, 0.8876609229550406, 0.08857199445434738, 1.0], [1.0, 0.8808476926123985, 0.08445236680530799, 1.0], [1.0, 0.8740344622697563, 0.08033273915626857, 1.0], [1.0, 0.8672212319271143, 0.07621311150722915, 1.0], [1.0, 0.8604080015844722, 0.07209348385818974, 1.0], [1.0, 0.85359477124183, 0.0679738562091503, 1.0], [1.0, 0.8467815408991879, 0.06385422856011089, 1.0], [1.0, 0.8399683105565459, 0.05973460091107147, 1.0], [1.0, 0.8331550802139037, 0.05561497326203209, 1.0], [1.0, 0.8263418498712616, 0.05149534561299267, 1.0], [1.0, 0.8195286195286196, 0.047375717963953255, 1.0], [1.0, 0.8127153891859774, 0.043256090314913814, 1.0], [1.0, 0.8059021588433353, 0.039136462665874394, 1.0], [1.0, 0.7990889285006931, 0.03501683501683499, 1.0], [1.0, 0.7922756981580511, 0.030897207367795596, 1.0], [1.0, 0.785462467815409, 0.02677757971875619, 1.0], [1.0, 0.7786492374727669, 0.02265795206971677, 1.0], [1.0, 0.7718360071301248, 0.018538324420677335, 1.0], [1.0, 0.7650227767874827, 0.014418696771637915, 1.0], [1.0, 0.7582095464448405, 0.010299069122598509, 1.0], [1.0, 0.7513963161021985, 0.006179441473559116, 1.0], [1.0, 0.7445830857595563, 0.00205981382451971, 1.0], [1.0, 0.7388789859378095, 0.0, 1.0], [1.0, 0.7342840166369579, 0.0, 1.0], [1.0, 0.7296890473361062, 0.0, 1.0], [1.0, 0.7250940780352545, 0.0, 1.0], [1.0, 0.7204991087344028, 0.0, 1.0], [1.0, 0.7159041394335512, 0.0, 1.0], [1.0, 0.7113091701326996, 0.0, 1.0], [1.0, 0.7067142008318479, 0.0, 1.0], [1.0, 0.7021192315309963, 0.0, 1.0], [1.0, 0.6975242622301445, 0.0, 1.0], [1.0, 0.692929292929293, 0.0, 1.0], [1.0, 0.6883343236284413, 0.0, 1.0], [1.0, 0.6837393543275896, 0.0, 1.0], [1.0, 0.6791443850267379, 0.0, 1.0], [1.0, 0.6745494157258863, 0.0, 1.0], [1.0, 0.6699544464250347, 0.0, 1.0], [1.0, 0.665359477124183, 0.0, 1.0], [1.0, 0.6607645078233314, 0.0, 1.0], [1.0, 0.6561695385224796, 0.0, 1.0], [1.0, 0.651574569221628, 0.0, 1.0], [1.0, 0.6469795999207764, 0.0, 1.0], [1.0, 0.6423846306199248, 0.0, 1.0], [1.0, 0.6377896613190731, 0.0, 1.0], [1.0, 0.6331946920182213, 0.0, 1.0], [1.0, 0.6285997227173697, 0.0, 1.0], [0.9996434937611408, 0.6235294117647058, 0.0, 1.0], [0.9991681521093286, 0.6183006535947713, 0.0, 1.0], [0.9986928104575163, 0.6130718954248366, 0.0, 1.0], [0.9982174688057041, 0.6078431372549019, 0.0, 1.0], [0.9977421271538919, 0.6026143790849673, 0.0, 1.0], [0.9972667855020796, 0.5973856209150326, 0.0, 1.0], [0.9967914438502674, 0.592156862745098, 0.0, 1.0], [0.9963161021984551, 0.5869281045751633, 0.0, 1.0], [0.995840760546643, 0.5816993464052288, 0.0, 1.0], [0.9953654188948307, 0.5764705882352941, 0.0, 1.0], [0.9948900772430185, 0.5712418300653594, 0.0, 1.0], [0.9944147355912062, 0.5660130718954248, 0.0, 1.0], [0.9939393939393939, 0.5607843137254901, 0.0, 1.0], [0.9934640522875817, 0.5555555555555556, 0.0, 1.0], [0.9929887106357694, 0.5503267973856208, 0.0, 1.0], [0.9925133689839573, 0.5450980392156862, 0.0, 1.0], [0.992038027332145, 0.5398692810457516, 0.0, 1.0], [0.9915626856803328, 0.5346405228758169, 0.0, 1.0], [0.9910873440285205, 0.5294117647058824, 0.0, 1.0], [0.9906120023767083, 0.5241830065359476, 0.0, 1.0], [0.990136660724896, 0.518954248366013, 0.0, 1.0], [0.9896613190730839, 0.5137254901960784, 0.0, 1.0], [0.9891859774212716, 0.5084967320261438, 0.0, 1.0], [0.9887106357694594, 0.5032679738562091, 0.0, 1.0], [0.9882352941176471, 0.4980392156862745, 0.0, 1.0]];\n}\n\nfunction hot() {\n    return [[0.0416, 0.0, 0.0, 1.0], [0.0681170225644534, 0.0, 0.0, 1.0], [0.0946340451289068, 0.0, 0.0, 1.0], [0.12115106769336019, 0.0, 0.0, 1.0], [0.14766809025781358, 0.0, 0.0, 1.0], [0.174185112822267, 0.0, 0.0, 1.0], [0.20070213538672038, 0.0, 0.0, 1.0], [0.2272191579511738, 0.0, 0.0, 1.0], [0.2537361805156272, 0.0, 0.0, 1.0], [0.2802532030800806, 0.0, 0.0, 1.0], [0.30677022564453404, 0.0, 0.0, 1.0], [0.33328724820898736, 0.0, 0.0, 1.0], [0.3598042707734408, 0.0, 0.0, 1.0], [0.3863212933378942, 0.0, 0.0, 1.0], [0.41283831590234765, 0.0, 0.0, 1.0], [0.43935533846680097, 0.0, 0.0, 1.0], [0.4658723610312544, 0.0, 0.0, 1.0], [0.49238938359570783, 0.0, 0.0, 1.0], [0.5189064061601611, 0.0, 0.0, 1.0], [0.5454234287246146, 0.0, 0.0, 1.0], [0.571940451289068, 0.0, 0.0, 1.0], [0.5984574738535213, 0.0, 0.0, 1.0], [0.6249744964179746, 0.0, 0.0, 1.0], [0.6514915189824282, 0.0, 0.0, 1.0], [0.6780085415468815, 0.0, 0.0, 1.0], [0.7045255641113349, 0.0, 0.0, 1.0], [0.7310425866757884, 0.0, 0.0, 1.0], [0.7575596092402418, 0.0, 0.0, 1.0], [0.7840766318046952, 0.0, 0.0, 1.0], [0.8105936543691485, 0.0, 0.0, 1.0], [0.8371106769336019, 0.0, 0.0, 1.0], [0.8636276994980552, 0.0, 0.0, 1.0], [0.8901447220625087, 0.0, 0.0, 1.0], [0.9166617446269623, 0.0, 0.0, 1.0], [0.9431787671914157, 0.0, 0.0, 1.0], [0.969695789755869, 0.0, 0.0, 1.0], [0.9962128123203223, 0.0, 0.0, 1.0], [1.0, 0.022728194127290657, 0.0, 1.0], [1.0, 0.04924330255539097, 0.0, 1.0], [1.0, 0.07575841098349148, 0.0, 1.0], [1.0, 0.1022735194115918, 0.0, 1.0], [1.0, 0.1287886278396921, 0.0, 1.0], [1.0, 0.15530373626779223, 0.0, 1.0], [1.0, 0.18181884469589257, 0.0, 1.0], [1.0, 0.2083339531239929, 0.0, 1.0], [1.0, 0.23484906155209337, 0.0, 1.0], [1.0, 0.2613641699801937, 0.0, 1.0], [1.0, 0.287879278408294, 0.0, 1.0], [1.0, 0.31439438683639415, 0.0, 1.0], [1.0, 0.3409094952644945, 0.0, 1.0], [1.0, 0.3674246036925948, 0.0, 1.0], [1.0, 0.3939397121206953, 0.0, 1.0], [1.0, 0.4204548205487956, 0.0, 1.0], [1.0, 0.44696992897689575, 0.0, 1.0], [1.0, 0.47348503740499626, 0.0, 1.0], [1.0, 0.5000001458330964, 0.0, 1.0], [1.0, 0.5265152542611968, 0.0, 1.0], [1.0, 0.5530303626892972, 0.0, 1.0], [1.0, 0.5795454711173973, 0.0, 1.0], [1.0, 0.6060605795454979, 0.0, 1.0], [1.0, 0.632575687973598, 0.0, 1.0], [1.0, 0.6590907964016984, 0.0, 1.0], [1.0, 0.6856059048297986, 0.0, 1.0], [1.0, 0.7121210132578991, 0.0, 1.0], [1.0, 0.7386361216859992, 0.0, 1.0], [1.0, 0.7651512301140996, 0.0, 1.0], [1.0, 0.7916663385422003, 0.0, 1.0], [1.0, 0.8181814469703002, 0.0, 1.0], [1.0, 0.8446965553984008, 0.0, 1.0], [1.0, 0.8712116638265008, 0.0, 1.0], [1.0, 0.8977267722546015, 0.0, 1.0], [1.0, 0.9242418806827014, 0.0, 1.0], [1.0, 0.9507569891108018, 0.0, 1.0], [1.0, 0.9772720975389024, 0.0, 1.0], [1.0, 1.0, 0.005680823862641985, 1.0], [1.0, 1.0, 0.04545359090813687, 1.0], [1.0, 1.0, 0.08522635795363062, 1.0], [1.0, 1.0, 0.12499912499912495, 1.0], [1.0, 1.0, 0.16477189204461984, 1.0], [1.0, 1.0, 0.2045446590901136, 1.0], [1.0, 1.0, 0.24431742613560847, 1.0], [1.0, 1.0, 0.28409019318110224, 1.0], [1.0, 1.0, 0.3238629602265971, 1.0], [1.0, 1.0, 0.36363572727209087, 1.0], [1.0, 1.0, 0.4034084943175852, 1.0], [1.0, 1.0, 0.44318126136308006, 1.0], [1.0, 1.0, 0.4829540284085738, 1.0], [1.0, 1.0, 0.5227267954540687, 1.0], [1.0, 1.0, 0.5624995624995625, 1.0], [1.0, 1.0, 0.6022723295450574, 1.0], [1.0, 1.0, 0.6420450965905516, 1.0], [1.0, 1.0, 0.6818178636360455, 1.0], [1.0, 1.0, 0.7215906306815403, 1.0], [1.0, 1.0, 0.7613633977270341, 1.0], [1.0, 1.0, 0.8011361647725289, 1.0], [1.0, 1.0, 0.8409089318180233, 1.0], [1.0, 1.0, 0.880681698863517, 1.0], [1.0, 1.0, 0.9204544659090119, 1.0], [1.0, 1.0, 0.9602272329545056, 1.0], [1.0, 1.0, 1.0, 1.0]];\n}\n\nfunction afmhot() {\n    return [[0.0, 0.0, 0.0, 0.0], [0.020202020202020204, 0.0, 0.0, 1.0], [0.04040404040404041, 0.0, 0.0, 1.0], [0.06060606060606061, 0.0, 0.0, 1.0], [0.08080808080808081, 0.0, 0.0, 1.0], [0.10101010101010102, 0.0, 0.0, 1.0], [0.12121212121212122, 0.0, 0.0, 1.0], [0.14141414141414144, 0.0, 0.0, 1.0], [0.16161616161616163, 0.0, 0.0, 1.0], [0.18181818181818182, 0.0, 0.0, 1.0], [0.20202020202020204, 0.0, 0.0, 1.0], [0.22222222222222224, 0.0, 0.0, 1.0], [0.24242424242424243, 0.0, 0.0, 1.0], [0.26262626262626265, 0.0, 0.0, 1.0], [0.2828282828282829, 0.0, 0.0, 1.0], [0.30303030303030304, 0.0, 0.0, 1.0], [0.32323232323232326, 0.0, 0.0, 1.0], [0.3434343434343435, 0.0, 0.0, 1.0], [0.36363636363636365, 0.0, 0.0, 1.0], [0.38383838383838387, 0.0, 0.0, 1.0], [0.4040404040404041, 0.0, 0.0, 1.0], [0.42424242424242425, 0.0, 0.0, 1.0], [0.4444444444444445, 0.0, 0.0, 1.0], [0.4646464646464647, 0.0, 0.0, 1.0], [0.48484848484848486, 0.0, 0.0, 1.0], [0.5050505050505051, 0.005050505050505083, 0.0, 1.0], [0.5252525252525253, 0.025252525252525304, 0.0, 1.0], [0.5454545454545455, 0.045454545454545525, 0.0, 1.0], [0.5656565656565657, 0.06565656565656575, 0.0, 1.0], [0.5858585858585859, 0.08585858585858586, 0.0, 1.0], [0.6060606060606061, 0.10606060606060608, 0.0, 1.0], [0.6262626262626263, 0.1262626262626263, 0.0, 1.0], [0.6464646464646465, 0.14646464646464652, 0.0, 1.0], [0.6666666666666667, 0.16666666666666674, 0.0, 1.0], [0.686868686868687, 0.18686868686868696, 0.0, 1.0], [0.7070707070707072, 0.20707070707070718, 0.0, 1.0], [0.7272727272727273, 0.2272727272727273, 0.0, 1.0], [0.7474747474747475, 0.24747474747474751, 0.0, 1.0], [0.7676767676767677, 0.26767676767676774, 0.0, 1.0], [0.787878787878788, 0.28787878787878796, 0.0, 1.0], [0.8080808080808082, 0.3080808080808082, 0.0, 1.0], [0.8282828282828284, 0.3282828282828284, 0.0, 1.0], [0.8484848484848485, 0.3484848484848485, 0.0, 1.0], [0.8686868686868687, 0.36868686868686873, 0.0, 1.0], [0.888888888888889, 0.38888888888888895, 0.0, 1.0], [0.9090909090909092, 0.40909090909090917, 0.0, 1.0], [0.9292929292929294, 0.4292929292929294, 0.0, 1.0], [0.9494949494949496, 0.4494949494949496, 0.0, 1.0], [0.9696969696969697, 0.4696969696969697, 0.0, 1.0], [0.98989898989899, 0.48989898989898994, 0.0, 1.0], [1.0, 0.5101010101010102, 0.010101010101010166, 1.0], [1.0, 0.5303030303030305, 0.030303030303030498, 1.0], [1.0, 0.5505050505050506, 0.05050505050505061, 1.0], [1.0, 0.5707070707070707, 0.07070707070707072, 1.0], [1.0, 0.590909090909091, 0.09090909090909105, 1.0], [1.0, 0.6111111111111112, 0.11111111111111116, 1.0], [1.0, 0.6313131313131315, 0.1313131313131315, 1.0], [1.0, 0.6515151515151516, 0.1515151515151516, 1.0], [1.0, 0.6717171717171717, 0.1717171717171717, 1.0], [1.0, 0.691919191919192, 0.19191919191919204, 1.0], [1.0, 0.7121212121212122, 0.21212121212121215, 1.0], [1.0, 0.7323232323232325, 0.2323232323232325, 1.0], [1.0, 0.7525252525252526, 0.2525252525252526, 1.0], [1.0, 0.7727272727272729, 0.27272727272727293, 1.0], [1.0, 0.792929292929293, 0.29292929292929304, 1.0], [1.0, 0.8131313131313131, 0.31313131313131315, 1.0], [1.0, 0.8333333333333335, 0.3333333333333335, 1.0], [1.0, 0.8535353535353536, 0.3535353535353536, 1.0], [1.0, 0.8737373737373739, 0.3737373737373739, 1.0], [1.0, 0.893939393939394, 0.39393939393939403, 1.0], [1.0, 0.9141414141414144, 0.41414141414141437, 1.0], [1.0, 0.9343434343434345, 0.4343434343434345, 1.0], [1.0, 0.9545454545454546, 0.4545454545454546, 1.0], [1.0, 0.9747474747474749, 0.4747474747474749, 1.0], [1.0, 0.994949494949495, 0.49494949494949503, 1.0], [1.0, 1.0, 0.5151515151515154, 1.0], [1.0, 1.0, 0.5353535353535355, 1.0], [1.0, 1.0, 0.5555555555555556, 1.0], [1.0, 1.0, 0.5757575757575759, 1.0], [1.0, 1.0, 0.595959595959596, 1.0], [1.0, 1.0, 0.6161616161616164, 1.0], [1.0, 1.0, 0.6363636363636365, 1.0], [1.0, 1.0, 0.6565656565656568, 1.0], [1.0, 1.0, 0.6767676767676769, 1.0], [1.0, 1.0, 0.696969696969697, 1.0], [1.0, 1.0, 0.7171717171717173, 1.0], [1.0, 1.0, 0.7373737373737375, 1.0], [1.0, 1.0, 0.7575757575757578, 1.0], [1.0, 1.0, 0.7777777777777779, 1.0], [1.0, 1.0, 0.7979797979797982, 1.0], [1.0, 1.0, 0.8181818181818183, 1.0], [1.0, 1.0, 0.8383838383838385, 1.0], [1.0, 1.0, 0.8585858585858588, 1.0], [1.0, 1.0, 0.8787878787878789, 1.0], [1.0, 1.0, 0.8989898989898992, 1.0], [1.0, 1.0, 0.9191919191919193, 1.0], [1.0, 1.0, 0.9393939393939394, 1.0], [1.0, 1.0, 0.9595959595959598, 1.0], [1.0, 1.0, 0.9797979797979799, 1.0], [1.0, 1.0, 1.0, 1.0]];\n}\n\nmodule.exports = {\n    viridis: viridis(),\n    inferno: inferno(),\n    inferno2: inferno2(),\n    plasma: plasma(),\n    magma: magma(),\n    cividis: cividis(),\n    bone: bone(),\n    pink: pink(),\n    spring: spring(),\n    cool: cool(),\n    Wistia: Wistia(),\n    hot: hot(),\n    afmhot: afmhot(),\n};","(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (global.createREGL = factory());\n}(this, (function () { 'use strict';\n\nvar extend = function (base, opts) {\n  var keys = Object.keys(opts)\n  for (var i = 0; i < keys.length; ++i) {\n    base[keys[i]] = opts[keys[i]]\n  }\n  return base\n}\n\nvar VARIABLE_COUNTER = 0\n\nvar DYN_FUNC = 0\nvar DYN_CONSTANT = 5\nvar DYN_ARRAY = 6\n\nfunction DynamicVariable (type, data) {\n  this.id = (VARIABLE_COUNTER++)\n  this.type = type\n  this.data = data\n}\n\nfunction escapeStr (str) {\n  return str.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')\n}\n\nfunction splitParts (str) {\n  if (str.length === 0) {\n    return []\n  }\n\n  var firstChar = str.charAt(0)\n  var lastChar = str.charAt(str.length - 1)\n\n  if (str.length > 1 &&\n      firstChar === lastChar &&\n      (firstChar === '\"' || firstChar === \"'\")) {\n    return ['\"' + escapeStr(str.substr(1, str.length - 2)) + '\"']\n  }\n\n  var parts = /\\[(false|true|null|\\d+|'[^']*'|\"[^\"]*\")\\]/.exec(str)\n  if (parts) {\n    return (\n      splitParts(str.substr(0, parts.index))\n        .concat(splitParts(parts[1]))\n        .concat(splitParts(str.substr(parts.index + parts[0].length)))\n    )\n  }\n\n  var subparts = str.split('.')\n  if (subparts.length === 1) {\n    return ['\"' + escapeStr(str) + '\"']\n  }\n\n  var result = []\n  for (var i = 0; i < subparts.length; ++i) {\n    result = result.concat(splitParts(subparts[i]))\n  }\n  return result\n}\n\nfunction toAccessorString (str) {\n  return '[' + splitParts(str).join('][') + ']'\n}\n\nfunction defineDynamic (type, data) {\n  return new DynamicVariable(type, toAccessorString(data + ''))\n}\n\nfunction isDynamic (x) {\n  return (typeof x === 'function' && !x._reglType) || (x instanceof DynamicVariable)\n}\n\nfunction unbox (x, path) {\n  if (typeof x === 'function') {\n    return new DynamicVariable(DYN_FUNC, x)\n  } else if (typeof x === 'number' || typeof x === 'boolean') {\n    return new DynamicVariable(DYN_CONSTANT, x)\n  } else if (Array.isArray(x)) {\n    return new DynamicVariable(DYN_ARRAY, x.map((y, i) => unbox(y, path + '[' + i + ']')))\n  } else if (x instanceof DynamicVariable) {\n    return x\n  }\n  \n}\n\nvar dynamic = {\n  DynamicVariable: DynamicVariable,\n  define: defineDynamic,\n  isDynamic: isDynamic,\n  unbox: unbox,\n  accessor: toAccessorString\n};\n\n/* globals requestAnimationFrame, cancelAnimationFrame */\nvar raf = {\n  next: typeof requestAnimationFrame === 'function'\n    ? function (cb) { return requestAnimationFrame(cb) }\n    : function (cb) { return setTimeout(cb, 16) },\n  cancel: typeof cancelAnimationFrame === 'function'\n    ? function (raf) { return cancelAnimationFrame(raf) }\n    : clearTimeout\n};\n\n/* globals performance */\nvar clock = (typeof performance !== 'undefined' && performance.now)\n    ? function () { return performance.now() }\n    : function () { return +(new Date()) };\n\nfunction createStringStore () {\n  var stringIds = { '': 0 }\n  var stringValues = ['']\n  return {\n    id: function (str) {\n      var result = stringIds[str]\n      if (result) {\n        return result\n      }\n      result = stringIds[str] = stringValues.length\n      stringValues.push(str)\n      return result\n    },\n\n    str: function (id) {\n      return stringValues[id]\n    }\n  }\n}\n\n// Context and canvas creation helper functions\n\nfunction createCanvas (element, onDone, pixelRatio) {\n  var canvas = document.createElement('canvas')\n  extend(canvas.style, {\n    border: 0,\n    margin: 0,\n    padding: 0,\n    top: 0,\n    left: 0\n  })\n  element.appendChild(canvas)\n\n  if (element === document.body) {\n    canvas.style.position = 'absolute'\n    extend(element.style, {\n      margin: 0,\n      padding: 0\n    })\n  }\n\n  function resize () {\n    var w = window.innerWidth\n    var h = window.innerHeight\n    if (element !== document.body) {\n      var bounds = element.getBoundingClientRect()\n      w = bounds.right - bounds.left\n      h = bounds.bottom - bounds.top\n    }\n    canvas.width = pixelRatio * w\n    canvas.height = pixelRatio * h\n    extend(canvas.style, {\n      width: w + 'px',\n      height: h + 'px'\n    })\n  }\n\n  var resizeObserver\n  if (element !== document.body && typeof ResizeObserver === 'function') {\n    // ignore 'ResizeObserver' is not defined\n    // eslint-disable-next-line\n    resizeObserver = new ResizeObserver(function () {\n      // setTimeout to avoid flicker\n      setTimeout(resize)\n    })\n    resizeObserver.observe(element)\n  } else {\n    window.addEventListener('resize', resize, false)\n  }\n\n  function onDestroy () {\n    if (resizeObserver) {\n      resizeObserver.disconnect()\n    } else {\n      window.removeEventListener('resize', resize)\n    }\n    element.removeChild(canvas)\n  }\n\n  resize()\n\n  return {\n    canvas: canvas,\n    onDestroy: onDestroy\n  }\n}\n\nfunction createContext (canvas, contextAttributes) {\n  function get (name) {\n    try {\n      return canvas.getContext(name, contextAttributes)\n    } catch (e) {\n      return null\n    }\n  }\n  return (\n    get('webgl') ||\n    get('experimental-webgl') ||\n    get('webgl-experimental')\n  )\n}\n\nfunction isHTMLElement (obj) {\n  return (\n    typeof obj.nodeName === 'string' &&\n    typeof obj.appendChild === 'function' &&\n    typeof obj.getBoundingClientRect === 'function'\n  )\n}\n\nfunction isWebGLContext (obj) {\n  return (\n    typeof obj.drawArrays === 'function' ||\n    typeof obj.drawElements === 'function'\n  )\n}\n\nfunction parseExtensions (input) {\n  if (typeof input === 'string') {\n    return input.split()\n  }\n  \n  return input\n}\n\nfunction getElement (desc) {\n  if (typeof desc === 'string') {\n    \n    return document.querySelector(desc)\n  }\n  return desc\n}\n\nfunction parseArgs (args_) {\n  var args = args_ || {}\n  var element, container, canvas, gl\n  var contextAttributes = {}\n  var extensions = []\n  var optionalExtensions = []\n  var pixelRatio = (typeof window === 'undefined' ? 1 : window.devicePixelRatio)\n  var profile = false\n  var onDone = function (err) {\n    if (err) {\n      \n    }\n  }\n  var onDestroy = function () {}\n  if (typeof args === 'string') {\n    \n    element = document.querySelector(args)\n    \n  } else if (typeof args === 'object') {\n    if (isHTMLElement(args)) {\n      element = args\n    } else if (isWebGLContext(args)) {\n      gl = args\n      canvas = gl.canvas\n    } else {\n      \n      if ('gl' in args) {\n        gl = args.gl\n      } else if ('canvas' in args) {\n        canvas = getElement(args.canvas)\n      } else if ('container' in args) {\n        container = getElement(args.container)\n      }\n      if ('attributes' in args) {\n        contextAttributes = args.attributes\n        \n      }\n      if ('extensions' in args) {\n        extensions = parseExtensions(args.extensions)\n      }\n      if ('optionalExtensions' in args) {\n        optionalExtensions = parseExtensions(args.optionalExtensions)\n      }\n      if ('onDone' in args) {\n        \n        onDone = args.onDone\n      }\n      if ('profile' in args) {\n        profile = !!args.profile\n      }\n      if ('pixelRatio' in args) {\n        pixelRatio = +args.pixelRatio\n        \n      }\n    }\n  } else {\n    \n  }\n\n  if (element) {\n    if (element.nodeName.toLowerCase() === 'canvas') {\n      canvas = element\n    } else {\n      container = element\n    }\n  }\n\n  if (!gl) {\n    if (!canvas) {\n      \n      var result = createCanvas(container || document.body, onDone, pixelRatio)\n      if (!result) {\n        return null\n      }\n      canvas = result.canvas\n      onDestroy = result.onDestroy\n    }\n    // workaround for chromium bug, premultiplied alpha value is platform dependent\n    if (contextAttributes.premultipliedAlpha === undefined) contextAttributes.premultipliedAlpha = true\n    gl = createContext(canvas, contextAttributes)\n  }\n\n  if (!gl) {\n    onDestroy()\n    onDone('webgl not supported, try upgrading your browser or graphics drivers http://get.webgl.org')\n    return null\n  }\n\n  return {\n    gl: gl,\n    canvas: canvas,\n    container: container,\n    extensions: extensions,\n    optionalExtensions: optionalExtensions,\n    pixelRatio: pixelRatio,\n    profile: profile,\n    onDone: onDone,\n    onDestroy: onDestroy\n  }\n}\n\nfunction createExtensionCache (gl, config) {\n  var extensions = {}\n\n  function tryLoadExtension (name_) {\n    \n    var name = name_.toLowerCase()\n    var ext\n    try {\n      ext = extensions[name] = gl.getExtension(name)\n    } catch (e) {}\n    return !!ext\n  }\n\n  for (var i = 0; i < config.extensions.length; ++i) {\n    var name = config.extensions[i]\n    if (!tryLoadExtension(name)) {\n      config.onDestroy()\n      config.onDone('\"' + name + '\" extension is not supported by the current WebGL context, try upgrading your system or a different browser')\n      return null\n    }\n  }\n\n  config.optionalExtensions.forEach(tryLoadExtension)\n\n  return {\n    extensions: extensions,\n    restore: function () {\n      Object.keys(extensions).forEach(function (name) {\n        if (extensions[name] && !tryLoadExtension(name)) {\n          throw new Error('(regl): error restoring extension ' + name)\n        }\n      })\n    }\n  }\n}\n\nfunction loop (n, f) {\n  var result = Array(n)\n  for (var i = 0; i < n; ++i) {\n    result[i] = f(i)\n  }\n  return result\n}\n\nvar GL_BYTE = 5120\nvar GL_UNSIGNED_BYTE$1 = 5121\nvar GL_SHORT = 5122\nvar GL_UNSIGNED_SHORT = 5123\nvar GL_INT = 5124\nvar GL_UNSIGNED_INT = 5125\nvar GL_FLOAT$1 = 5126\n\nfunction nextPow16 (v) {\n  for (var i = 16; i <= (1 << 28); i *= 16) {\n    if (v <= i) {\n      return i\n    }\n  }\n  return 0\n}\n\nfunction log2 (v) {\n  var r, shift\n  r = (v > 0xFFFF) << 4\n  v >>>= r\n  shift = (v > 0xFF) << 3\n  v >>>= shift; r |= shift\n  shift = (v > 0xF) << 2\n  v >>>= shift; r |= shift\n  shift = (v > 0x3) << 1\n  v >>>= shift; r |= shift\n  return r | (v >> 1)\n}\n\nfunction createPool () {\n  var bufferPool = loop(8, function () {\n    return []\n  })\n\n  function alloc (n) {\n    var sz = nextPow16(n)\n    var bin = bufferPool[log2(sz) >> 2]\n    if (bin.length > 0) {\n      return bin.pop()\n    }\n    return new ArrayBuffer(sz)\n  }\n\n  function free (buf) {\n    bufferPool[log2(buf.byteLength) >> 2].push(buf)\n  }\n\n  function allocType (type, n) {\n    var result = null\n    switch (type) {\n      case GL_BYTE:\n        result = new Int8Array(alloc(n), 0, n)\n        break\n      case GL_UNSIGNED_BYTE$1:\n        result = new Uint8Array(alloc(n), 0, n)\n        break\n      case GL_SHORT:\n        result = new Int16Array(alloc(2 * n), 0, n)\n        break\n      case GL_UNSIGNED_SHORT:\n        result = new Uint16Array(alloc(2 * n), 0, n)\n        break\n      case GL_INT:\n        result = new Int32Array(alloc(4 * n), 0, n)\n        break\n      case GL_UNSIGNED_INT:\n        result = new Uint32Array(alloc(4 * n), 0, n)\n        break\n      case GL_FLOAT$1:\n        result = new Float32Array(alloc(4 * n), 0, n)\n        break\n      default:\n        return null\n    }\n    if (result.length !== n) {\n      return result.subarray(0, n)\n    }\n    return result\n  }\n\n  function freeType (array) {\n    free(array.buffer)\n  }\n\n  return {\n    alloc: alloc,\n    free: free,\n    allocType: allocType,\n    freeType: freeType\n  }\n}\n\nvar pool = createPool()\n\n// zero pool for initial zero data\npool.zero = createPool()\n\nvar GL_SUBPIXEL_BITS = 0x0D50\nvar GL_RED_BITS = 0x0D52\nvar GL_GREEN_BITS = 0x0D53\nvar GL_BLUE_BITS = 0x0D54\nvar GL_ALPHA_BITS = 0x0D55\nvar GL_DEPTH_BITS = 0x0D56\nvar GL_STENCIL_BITS = 0x0D57\n\nvar GL_ALIASED_POINT_SIZE_RANGE = 0x846D\nvar GL_ALIASED_LINE_WIDTH_RANGE = 0x846E\n\nvar GL_MAX_TEXTURE_SIZE = 0x0D33\nvar GL_MAX_VIEWPORT_DIMS = 0x0D3A\nvar GL_MAX_VERTEX_ATTRIBS = 0x8869\nvar GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB\nvar GL_MAX_VARYING_VECTORS = 0x8DFC\nvar GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D\nvar GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C\nvar GL_MAX_TEXTURE_IMAGE_UNITS = 0x8872\nvar GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD\nvar GL_MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C\nvar GL_MAX_RENDERBUFFER_SIZE = 0x84E8\n\nvar GL_VENDOR = 0x1F00\nvar GL_RENDERER = 0x1F01\nvar GL_VERSION = 0x1F02\nvar GL_SHADING_LANGUAGE_VERSION = 0x8B8C\n\nvar GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF\n\nvar GL_MAX_COLOR_ATTACHMENTS_WEBGL = 0x8CDF\nvar GL_MAX_DRAW_BUFFERS_WEBGL = 0x8824\n\nvar GL_TEXTURE_2D = 0x0DE1\nvar GL_TEXTURE_CUBE_MAP = 0x8513\nvar GL_TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515\nvar GL_TEXTURE0 = 0x84C0\nvar GL_RGBA = 0x1908\nvar GL_FLOAT = 0x1406\nvar GL_UNSIGNED_BYTE = 0x1401\nvar GL_FRAMEBUFFER = 0x8D40\nvar GL_FRAMEBUFFER_COMPLETE = 0x8CD5\nvar GL_COLOR_ATTACHMENT0 = 0x8CE0\nvar GL_COLOR_BUFFER_BIT$1 = 0x4000\n\nvar wrapLimits = function (gl, extensions) {\n  var maxAnisotropic = 1\n  if (extensions.ext_texture_filter_anisotropic) {\n    maxAnisotropic = gl.getParameter(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT)\n  }\n\n  var maxDrawbuffers = 1\n  var maxColorAttachments = 1\n  if (extensions.webgl_draw_buffers) {\n    maxDrawbuffers = gl.getParameter(GL_MAX_DRAW_BUFFERS_WEBGL)\n    maxColorAttachments = gl.getParameter(GL_MAX_COLOR_ATTACHMENTS_WEBGL)\n  }\n\n  // detect if reading float textures is available (Safari doesn't support)\n  var readFloat = !!extensions.oes_texture_float\n  if (readFloat) {\n    var readFloatTexture = gl.createTexture()\n    gl.bindTexture(GL_TEXTURE_2D, readFloatTexture)\n    gl.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_FLOAT, null)\n\n    var fbo = gl.createFramebuffer()\n    gl.bindFramebuffer(GL_FRAMEBUFFER, fbo)\n    gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, readFloatTexture, 0)\n    gl.bindTexture(GL_TEXTURE_2D, null)\n\n    if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) !== GL_FRAMEBUFFER_COMPLETE) readFloat = false\n\n    else {\n      gl.viewport(0, 0, 1, 1)\n      gl.clearColor(1.0, 0.0, 0.0, 1.0)\n      gl.clear(GL_COLOR_BUFFER_BIT$1)\n      var pixels = pool.allocType(GL_FLOAT, 4)\n      gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, pixels)\n\n      if (gl.getError()) readFloat = false\n      else {\n        gl.deleteFramebuffer(fbo)\n        gl.deleteTexture(readFloatTexture)\n\n        readFloat = pixels[0] === 1.0\n      }\n\n      pool.freeType(pixels)\n    }\n  }\n\n  // detect non power of two cube textures support (IE doesn't support)\n  var isIE = typeof navigator !== 'undefined' && (/MSIE/.test(navigator.userAgent) || /Trident\\//.test(navigator.appVersion) || /Edge/.test(navigator.userAgent))\n\n  var npotTextureCube = true\n\n  if (!isIE) {\n    var cubeTexture = gl.createTexture()\n    var data = pool.allocType(GL_UNSIGNED_BYTE, 36)\n    gl.activeTexture(GL_TEXTURE0)\n    gl.bindTexture(GL_TEXTURE_CUBE_MAP, cubeTexture)\n    gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, data)\n    pool.freeType(data)\n    gl.bindTexture(GL_TEXTURE_CUBE_MAP, null)\n    gl.deleteTexture(cubeTexture)\n    npotTextureCube = !gl.getError()\n  }\n\n  return {\n    // drawing buffer bit depth\n    colorBits: [\n      gl.getParameter(GL_RED_BITS),\n      gl.getParameter(GL_GREEN_BITS),\n      gl.getParameter(GL_BLUE_BITS),\n      gl.getParameter(GL_ALPHA_BITS)\n    ],\n    depthBits: gl.getParameter(GL_DEPTH_BITS),\n    stencilBits: gl.getParameter(GL_STENCIL_BITS),\n    subpixelBits: gl.getParameter(GL_SUBPIXEL_BITS),\n\n    // supported extensions\n    extensions: Object.keys(extensions).filter(function (ext) {\n      return !!extensions[ext]\n    }),\n\n    // max aniso samples\n    maxAnisotropic: maxAnisotropic,\n\n    // max draw buffers\n    maxDrawbuffers: maxDrawbuffers,\n    maxColorAttachments: maxColorAttachments,\n\n    // point and line size ranges\n    pointSizeDims: gl.getParameter(GL_ALIASED_POINT_SIZE_RANGE),\n    lineWidthDims: gl.getParameter(GL_ALIASED_LINE_WIDTH_RANGE),\n    maxViewportDims: gl.getParameter(GL_MAX_VIEWPORT_DIMS),\n    maxCombinedTextureUnits: gl.getParameter(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS),\n    maxCubeMapSize: gl.getParameter(GL_MAX_CUBE_MAP_TEXTURE_SIZE),\n    maxRenderbufferSize: gl.getParameter(GL_MAX_RENDERBUFFER_SIZE),\n    maxTextureUnits: gl.getParameter(GL_MAX_TEXTURE_IMAGE_UNITS),\n    maxTextureSize: gl.getParameter(GL_MAX_TEXTURE_SIZE),\n    maxAttributes: gl.getParameter(GL_MAX_VERTEX_ATTRIBS),\n    maxVertexUniforms: gl.getParameter(GL_MAX_VERTEX_UNIFORM_VECTORS),\n    maxVertexTextureUnits: gl.getParameter(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS),\n    maxVaryingVectors: gl.getParameter(GL_MAX_VARYING_VECTORS),\n    maxFragmentUniforms: gl.getParameter(GL_MAX_FRAGMENT_UNIFORM_VECTORS),\n\n    // vendor info\n    glsl: gl.getParameter(GL_SHADING_LANGUAGE_VERSION),\n    renderer: gl.getParameter(GL_RENDERER),\n    vendor: gl.getParameter(GL_VENDOR),\n    version: gl.getParameter(GL_VERSION),\n\n    // quirks\n    readFloat: readFloat,\n    npotTextureCube: npotTextureCube\n  }\n}\n\nvar isTypedArray = function (x) {\n  return (\n    x instanceof Uint8Array ||\n    x instanceof Uint16Array ||\n    x instanceof Uint32Array ||\n    x instanceof Int8Array ||\n    x instanceof Int16Array ||\n    x instanceof Int32Array ||\n    x instanceof Float32Array ||\n    x instanceof Float64Array ||\n    x instanceof Uint8ClampedArray\n  )\n}\n\nfunction isNDArrayLike (obj) {\n  return (\n    !!obj &&\n    typeof obj === 'object' &&\n    Array.isArray(obj.shape) &&\n    Array.isArray(obj.stride) &&\n    typeof obj.offset === 'number' &&\n    obj.shape.length === obj.stride.length &&\n    (Array.isArray(obj.data) ||\n      isTypedArray(obj.data)))\n}\n\nvar values = function (obj) {\n  return Object.keys(obj).map(function (key) { return obj[key] })\n}\n\nvar flattenUtils = {\n  shape: arrayShape$1,\n  flatten: flattenArray\n};\n\nfunction flatten1D (array, nx, out) {\n  for (var i = 0; i < nx; ++i) {\n    out[i] = array[i]\n  }\n}\n\nfunction flatten2D (array, nx, ny, out) {\n  var ptr = 0\n  for (var i = 0; i < nx; ++i) {\n    var row = array[i]\n    for (var j = 0; j < ny; ++j) {\n      out[ptr++] = row[j]\n    }\n  }\n}\n\nfunction flatten3D (array, nx, ny, nz, out, ptr_) {\n  var ptr = ptr_\n  for (var i = 0; i < nx; ++i) {\n    var row = array[i]\n    for (var j = 0; j < ny; ++j) {\n      var col = row[j]\n      for (var k = 0; k < nz; ++k) {\n        out[ptr++] = col[k]\n      }\n    }\n  }\n}\n\nfunction flattenRec (array, shape, level, out, ptr) {\n  var stride = 1\n  for (var i = level + 1; i < shape.length; ++i) {\n    stride *= shape[i]\n  }\n  var n = shape[level]\n  if (shape.length - level === 4) {\n    var nx = shape[level + 1]\n    var ny = shape[level + 2]\n    var nz = shape[level + 3]\n    for (i = 0; i < n; ++i) {\n      flatten3D(array[i], nx, ny, nz, out, ptr)\n      ptr += stride\n    }\n  } else {\n    for (i = 0; i < n; ++i) {\n      flattenRec(array[i], shape, level + 1, out, ptr)\n      ptr += stride\n    }\n  }\n}\n\nfunction flattenArray (array, shape, type, out_) {\n  var sz = 1\n  if (shape.length) {\n    for (var i = 0; i < shape.length; ++i) {\n      sz *= shape[i]\n    }\n  } else {\n    sz = 0\n  }\n  var out = out_ || pool.allocType(type, sz)\n  switch (shape.length) {\n    case 0:\n      break\n    case 1:\n      flatten1D(array, shape[0], out)\n      break\n    case 2:\n      flatten2D(array, shape[0], shape[1], out)\n      break\n    case 3:\n      flatten3D(array, shape[0], shape[1], shape[2], out, 0)\n      break\n    default:\n      flattenRec(array, shape, 0, out, 0)\n  }\n  return out\n}\n\nfunction arrayShape$1 (array_) {\n  var shape = []\n  for (var array = array_; array.length; array = array[0]) {\n    shape.push(array.length)\n  }\n  return shape\n}\n\nvar arrayTypes = {\n\t\"[object Int8Array]\": 5120,\n\t\"[object Int16Array]\": 5122,\n\t\"[object Int32Array]\": 5124,\n\t\"[object Uint8Array]\": 5121,\n\t\"[object Uint8ClampedArray]\": 5121,\n\t\"[object Uint16Array]\": 5123,\n\t\"[object Uint32Array]\": 5125,\n\t\"[object Float32Array]\": 5126,\n\t\"[object Float64Array]\": 5121,\n\t\"[object ArrayBuffer]\": 5121\n};\n\nvar int8 = 5120;\nvar int16 = 5122;\nvar int32 = 5124;\nvar uint8 = 5121;\nvar uint16 = 5123;\nvar uint32 = 5125;\nvar float = 5126;\nvar float32 = 5126;\nvar glTypes = {\n\tint8: int8,\n\tint16: int16,\n\tint32: int32,\n\tuint8: uint8,\n\tuint16: uint16,\n\tuint32: uint32,\n\tfloat: float,\n\tfloat32: float32\n};\n\nvar dynamic$1 = 35048;\nvar stream = 35040;\nvar usageTypes = {\n\tdynamic: dynamic$1,\n\tstream: stream,\n\t\"static\": 35044\n};\n\nvar arrayFlatten = flattenUtils.flatten\nvar arrayShape = flattenUtils.shape\n\nvar GL_STATIC_DRAW = 0x88E4\nvar GL_STREAM_DRAW = 0x88E0\n\nvar GL_UNSIGNED_BYTE$2 = 5121\nvar GL_FLOAT$2 = 5126\n\nvar DTYPES_SIZES = []\nDTYPES_SIZES[5120] = 1 // int8\nDTYPES_SIZES[5122] = 2 // int16\nDTYPES_SIZES[5124] = 4 // int32\nDTYPES_SIZES[5121] = 1 // uint8\nDTYPES_SIZES[5123] = 2 // uint16\nDTYPES_SIZES[5125] = 4 // uint32\nDTYPES_SIZES[5126] = 4 // float32\n\nfunction typedArrayCode (data) {\n  return arrayTypes[Object.prototype.toString.call(data)] | 0\n}\n\nfunction copyArray (out, inp) {\n  for (var i = 0; i < inp.length; ++i) {\n    out[i] = inp[i]\n  }\n}\n\nfunction transpose (\n  result, data, shapeX, shapeY, strideX, strideY, offset) {\n  var ptr = 0\n  for (var i = 0; i < shapeX; ++i) {\n    for (var j = 0; j < shapeY; ++j) {\n      result[ptr++] = data[strideX * i + strideY * j + offset]\n    }\n  }\n}\n\nfunction wrapBufferState (gl, stats, config, destroyBuffer) {\n  var bufferCount = 0\n  var bufferSet = {}\n\n  function REGLBuffer (type) {\n    this.id = bufferCount++\n    this.buffer = gl.createBuffer()\n    this.type = type\n    this.usage = GL_STATIC_DRAW\n    this.byteLength = 0\n    this.dimension = 1\n    this.dtype = GL_UNSIGNED_BYTE$2\n\n    this.persistentData = null\n\n    if (config.profile) {\n      this.stats = { size: 0 }\n    }\n  }\n\n  REGLBuffer.prototype.bind = function () {\n    gl.bindBuffer(this.type, this.buffer)\n  }\n\n  REGLBuffer.prototype.destroy = function () {\n    destroy(this)\n  }\n\n  var streamPool = []\n\n  function createStream (type, data) {\n    var buffer = streamPool.pop()\n    if (!buffer) {\n      buffer = new REGLBuffer(type)\n    }\n    buffer.bind()\n    initBufferFromData(buffer, data, GL_STREAM_DRAW, 0, 1, false)\n    return buffer\n  }\n\n  function destroyStream (stream$$1) {\n    streamPool.push(stream$$1)\n  }\n\n  function initBufferFromTypedArray (buffer, data, usage) {\n    buffer.byteLength = data.byteLength\n    gl.bufferData(buffer.type, data, usage)\n  }\n\n  function initBufferFromData (buffer, data, usage, dtype, dimension, persist) {\n    var shape\n    buffer.usage = usage\n    if (Array.isArray(data)) {\n      buffer.dtype = dtype || GL_FLOAT$2\n      if (data.length > 0) {\n        var flatData\n        if (Array.isArray(data[0])) {\n          shape = arrayShape(data)\n          var dim = 1\n          for (var i = 1; i < shape.length; ++i) {\n            dim *= shape[i]\n          }\n          buffer.dimension = dim\n          flatData = arrayFlatten(data, shape, buffer.dtype)\n          initBufferFromTypedArray(buffer, flatData, usage)\n          if (persist) {\n            buffer.persistentData = flatData\n          } else {\n            pool.freeType(flatData)\n          }\n        } else if (typeof data[0] === 'number') {\n          buffer.dimension = dimension\n          var typedData = pool.allocType(buffer.dtype, data.length)\n          copyArray(typedData, data)\n          initBufferFromTypedArray(buffer, typedData, usage)\n          if (persist) {\n            buffer.persistentData = typedData\n          } else {\n            pool.freeType(typedData)\n          }\n        } else if (isTypedArray(data[0])) {\n          buffer.dimension = data[0].length\n          buffer.dtype = dtype || typedArrayCode(data[0]) || GL_FLOAT$2\n          flatData = arrayFlatten(\n            data,\n            [data.length, data[0].length],\n            buffer.dtype)\n          initBufferFromTypedArray(buffer, flatData, usage)\n          if (persist) {\n            buffer.persistentData = flatData\n          } else {\n            pool.freeType(flatData)\n          }\n        } else {\n          \n        }\n      }\n    } else if (isTypedArray(data)) {\n      buffer.dtype = dtype || typedArrayCode(data)\n      buffer.dimension = dimension\n      initBufferFromTypedArray(buffer, data, usage)\n      if (persist) {\n        buffer.persistentData = new Uint8Array(new Uint8Array(data.buffer))\n      }\n    } else if (isNDArrayLike(data)) {\n      shape = data.shape\n      var stride = data.stride\n      var offset = data.offset\n\n      var shapeX = 0\n      var shapeY = 0\n      var strideX = 0\n      var strideY = 0\n      if (shape.length === 1) {\n        shapeX = shape[0]\n        shapeY = 1\n        strideX = stride[0]\n        strideY = 0\n      } else if (shape.length === 2) {\n        shapeX = shape[0]\n        shapeY = shape[1]\n        strideX = stride[0]\n        strideY = stride[1]\n      } else {\n        \n      }\n\n      buffer.dtype = dtype || typedArrayCode(data.data) || GL_FLOAT$2\n      buffer.dimension = shapeY\n\n      var transposeData = pool.allocType(buffer.dtype, shapeX * shapeY)\n      transpose(transposeData,\n        data.data,\n        shapeX, shapeY,\n        strideX, strideY,\n        offset)\n      initBufferFromTypedArray(buffer, transposeData, usage)\n      if (persist) {\n        buffer.persistentData = transposeData\n      } else {\n        pool.freeType(transposeData)\n      }\n    } else if (data instanceof ArrayBuffer) {\n      buffer.dtype = GL_UNSIGNED_BYTE$2\n      buffer.dimension = dimension\n      initBufferFromTypedArray(buffer, data, usage)\n      if (persist) {\n        buffer.persistentData = new Uint8Array(new Uint8Array(data))\n      }\n    } else {\n      \n    }\n  }\n\n  function destroy (buffer) {\n    stats.bufferCount--\n\n    // remove attribute link\n    destroyBuffer(buffer)\n\n    var handle = buffer.buffer\n    \n    gl.deleteBuffer(handle)\n    buffer.buffer = null\n    delete bufferSet[buffer.id]\n  }\n\n  function createBuffer (options, type, deferInit, persistent) {\n    stats.bufferCount++\n\n    var buffer = new REGLBuffer(type)\n    bufferSet[buffer.id] = buffer\n\n    function reglBuffer (options) {\n      var usage = GL_STATIC_DRAW\n      var data = null\n      var byteLength = 0\n      var dtype = 0\n      var dimension = 1\n      if (Array.isArray(options) ||\n          isTypedArray(options) ||\n          isNDArrayLike(options) ||\n          options instanceof ArrayBuffer) {\n        data = options\n      } else if (typeof options === 'number') {\n        byteLength = options | 0\n      } else if (options) {\n        \n\n        if ('data' in options) {\n          \n          data = options.data\n        }\n\n        if ('usage' in options) {\n          \n          usage = usageTypes[options.usage]\n        }\n\n        if ('type' in options) {\n          \n          dtype = glTypes[options.type]\n        }\n\n        if ('dimension' in options) {\n          \n          dimension = options.dimension | 0\n        }\n\n        if ('length' in options) {\n          \n          byteLength = options.length | 0\n        }\n      }\n\n      buffer.bind()\n      if (!data) {\n        // #475\n        if (byteLength) gl.bufferData(buffer.type, byteLength, usage)\n        buffer.dtype = dtype || GL_UNSIGNED_BYTE$2\n        buffer.usage = usage\n        buffer.dimension = dimension\n        buffer.byteLength = byteLength\n      } else {\n        initBufferFromData(buffer, data, usage, dtype, dimension, persistent)\n      }\n\n      if (config.profile) {\n        buffer.stats.size = buffer.byteLength * DTYPES_SIZES[buffer.dtype]\n      }\n\n      return reglBuffer\n    }\n\n    function setSubData (data, offset) {\n      \n\n      gl.bufferSubData(buffer.type, offset, data)\n    }\n\n    function subdata (data, offset_) {\n      var offset = (offset_ || 0) | 0\n      var shape\n      buffer.bind()\n      if (isTypedArray(data) || data instanceof ArrayBuffer) {\n        setSubData(data, offset)\n      } else if (Array.isArray(data)) {\n        if (data.length > 0) {\n          if (typeof data[0] === 'number') {\n            var converted = pool.allocType(buffer.dtype, data.length)\n            copyArray(converted, data)\n            setSubData(converted, offset)\n            pool.freeType(converted)\n          } else if (Array.isArray(data[0]) || isTypedArray(data[0])) {\n            shape = arrayShape(data)\n            var flatData = arrayFlatten(data, shape, buffer.dtype)\n            setSubData(flatData, offset)\n            pool.freeType(flatData)\n          } else {\n            \n          }\n        }\n      } else if (isNDArrayLike(data)) {\n        shape = data.shape\n        var stride = data.stride\n\n        var shapeX = 0\n        var shapeY = 0\n        var strideX = 0\n        var strideY = 0\n        if (shape.length === 1) {\n          shapeX = shape[0]\n          shapeY = 1\n          strideX = stride[0]\n          strideY = 0\n        } else if (shape.length === 2) {\n          shapeX = shape[0]\n          shapeY = shape[1]\n          strideX = stride[0]\n          strideY = stride[1]\n        } else {\n          \n        }\n        var dtype = Array.isArray(data.data)\n          ? buffer.dtype\n          : typedArrayCode(data.data)\n\n        var transposeData = pool.allocType(dtype, shapeX * shapeY)\n        transpose(transposeData,\n          data.data,\n          shapeX, shapeY,\n          strideX, strideY,\n          data.offset)\n        setSubData(transposeData, offset)\n        pool.freeType(transposeData)\n      } else {\n        \n      }\n      return reglBuffer\n    }\n\n    if (!deferInit) {\n      reglBuffer(options)\n    }\n\n    reglBuffer._reglType = 'buffer'\n    reglBuffer._buffer = buffer\n    reglBuffer.subdata = subdata\n    if (config.profile) {\n      reglBuffer.stats = buffer.stats\n    }\n    reglBuffer.destroy = function () { destroy(buffer) }\n\n    return reglBuffer\n  }\n\n  function restoreBuffers () {\n    values(bufferSet).forEach(function (buffer) {\n      buffer.buffer = gl.createBuffer()\n      gl.bindBuffer(buffer.type, buffer.buffer)\n      gl.bufferData(\n        buffer.type, buffer.persistentData || buffer.byteLength, buffer.usage)\n    })\n  }\n\n  if (config.profile) {\n    stats.getTotalBufferSize = function () {\n      var total = 0\n      // TODO: Right now, the streams are not part of the total count.\n      Object.keys(bufferSet).forEach(function (key) {\n        total += bufferSet[key].stats.size\n      })\n      return total\n    }\n  }\n\n  return {\n    create: createBuffer,\n\n    createStream: createStream,\n    destroyStream: destroyStream,\n\n    clear: function () {\n      values(bufferSet).forEach(destroy)\n      streamPool.forEach(destroy)\n    },\n\n    getBuffer: function (wrapper) {\n      if (wrapper && wrapper._buffer instanceof REGLBuffer) {\n        return wrapper._buffer\n      }\n      return null\n    },\n\n    restore: restoreBuffers,\n\n    _initBuffer: initBufferFromData\n  }\n}\n\nvar points = 0;\nvar point = 0;\nvar lines = 1;\nvar line = 1;\nvar triangles = 4;\nvar triangle = 4;\nvar primTypes = {\n\tpoints: points,\n\tpoint: point,\n\tlines: lines,\n\tline: line,\n\ttriangles: triangles,\n\ttriangle: triangle,\n\t\"line loop\": 2,\n\t\"line strip\": 3,\n\t\"triangle strip\": 5,\n\t\"triangle fan\": 6\n};\n\nvar GL_POINTS = 0\nvar GL_LINES = 1\nvar GL_TRIANGLES = 4\n\nvar GL_BYTE$1 = 5120\nvar GL_UNSIGNED_BYTE$3 = 5121\nvar GL_SHORT$1 = 5122\nvar GL_UNSIGNED_SHORT$1 = 5123\nvar GL_INT$1 = 5124\nvar GL_UNSIGNED_INT$1 = 5125\n\nvar GL_ELEMENT_ARRAY_BUFFER = 34963\n\nvar GL_STREAM_DRAW$1 = 0x88E0\nvar GL_STATIC_DRAW$1 = 0x88E4\n\nfunction wrapElementsState (gl, extensions, bufferState, stats) {\n  var elementSet = {}\n  var elementCount = 0\n\n  var elementTypes = {\n    'uint8': GL_UNSIGNED_BYTE$3,\n    'uint16': GL_UNSIGNED_SHORT$1\n  }\n\n  if (extensions.oes_element_index_uint) {\n    elementTypes.uint32 = GL_UNSIGNED_INT$1\n  }\n\n  function REGLElementBuffer (buffer) {\n    this.id = elementCount++\n    elementSet[this.id] = this\n    this.buffer = buffer\n    this.primType = GL_TRIANGLES\n    this.vertCount = 0\n    this.type = 0\n  }\n\n  REGLElementBuffer.prototype.bind = function () {\n    this.buffer.bind()\n  }\n\n  var bufferPool = []\n\n  function createElementStream (data) {\n    var result = bufferPool.pop()\n    if (!result) {\n      result = new REGLElementBuffer(bufferState.create(\n        null,\n        GL_ELEMENT_ARRAY_BUFFER,\n        true,\n        false)._buffer)\n    }\n    initElements(result, data, GL_STREAM_DRAW$1, -1, -1, 0, 0)\n    return result\n  }\n\n  function destroyElementStream (elements) {\n    bufferPool.push(elements)\n  }\n\n  function initElements (\n    elements,\n    data,\n    usage,\n    prim,\n    count,\n    byteLength,\n    type) {\n    elements.buffer.bind()\n    var dtype\n    if (data) {\n      var predictedType = type\n      if (!type && (\n        !isTypedArray(data) ||\n         (isNDArrayLike(data) && !isTypedArray(data.data)))) {\n        predictedType = extensions.oes_element_index_uint\n          ? GL_UNSIGNED_INT$1\n          : GL_UNSIGNED_SHORT$1\n      }\n      bufferState._initBuffer(\n        elements.buffer,\n        data,\n        usage,\n        predictedType,\n        3)\n    } else {\n      gl.bufferData(GL_ELEMENT_ARRAY_BUFFER, byteLength, usage)\n      elements.buffer.dtype = dtype || GL_UNSIGNED_BYTE$3\n      elements.buffer.usage = usage\n      elements.buffer.dimension = 3\n      elements.buffer.byteLength = byteLength\n    }\n\n    dtype = type\n    if (!type) {\n      switch (elements.buffer.dtype) {\n        case GL_UNSIGNED_BYTE$3:\n        case GL_BYTE$1:\n          dtype = GL_UNSIGNED_BYTE$3\n          break\n\n        case GL_UNSIGNED_SHORT$1:\n        case GL_SHORT$1:\n          dtype = GL_UNSIGNED_SHORT$1\n          break\n\n        case GL_UNSIGNED_INT$1:\n        case GL_INT$1:\n          dtype = GL_UNSIGNED_INT$1\n          break\n\n        default:\n          \n      }\n      elements.buffer.dtype = dtype\n    }\n    elements.type = dtype\n\n    // Check oes_element_index_uint extension\n    \n\n    // try to guess default primitive type and arguments\n    var vertCount = count\n    if (vertCount < 0) {\n      vertCount = elements.buffer.byteLength\n      if (dtype === GL_UNSIGNED_SHORT$1) {\n        vertCount >>= 1\n      } else if (dtype === GL_UNSIGNED_INT$1) {\n        vertCount >>= 2\n      }\n    }\n    elements.vertCount = vertCount\n\n    // try to guess primitive type from cell dimension\n    var primType = prim\n    if (prim < 0) {\n      primType = GL_TRIANGLES\n      var dimension = elements.buffer.dimension\n      if (dimension === 1) primType = GL_POINTS\n      if (dimension === 2) primType = GL_LINES\n      if (dimension === 3) primType = GL_TRIANGLES\n    }\n    elements.primType = primType\n  }\n\n  function destroyElements (elements) {\n    stats.elementsCount--\n\n    \n    delete elementSet[elements.id]\n    elements.buffer.destroy()\n    elements.buffer = null\n  }\n\n  function createElements (options, persistent) {\n    var buffer = bufferState.create(null, GL_ELEMENT_ARRAY_BUFFER, true)\n    var elements = new REGLElementBuffer(buffer._buffer)\n    stats.elementsCount++\n\n    function reglElements (options) {\n      if (!options) {\n        buffer()\n        elements.primType = GL_TRIANGLES\n        elements.vertCount = 0\n        elements.type = GL_UNSIGNED_BYTE$3\n      } else if (typeof options === 'number') {\n        buffer(options)\n        elements.primType = GL_TRIANGLES\n        elements.vertCount = options | 0\n        elements.type = GL_UNSIGNED_BYTE$3\n      } else {\n        var data = null\n        var usage = GL_STATIC_DRAW$1\n        var primType = -1\n        var vertCount = -1\n        var byteLength = 0\n        var dtype = 0\n        if (Array.isArray(options) ||\n            isTypedArray(options) ||\n            isNDArrayLike(options)) {\n          data = options\n        } else {\n          \n          if ('data' in options) {\n            data = options.data\n            \n          }\n          if ('usage' in options) {\n            \n            usage = usageTypes[options.usage]\n          }\n          if ('primitive' in options) {\n            \n            primType = primTypes[options.primitive]\n          }\n          if ('count' in options) {\n            \n            vertCount = options.count | 0\n          }\n          if ('type' in options) {\n            \n            dtype = elementTypes[options.type]\n          }\n          if ('length' in options) {\n            byteLength = options.length | 0\n          } else {\n            byteLength = vertCount\n            if (dtype === GL_UNSIGNED_SHORT$1 || dtype === GL_SHORT$1) {\n              byteLength *= 2\n            } else if (dtype === GL_UNSIGNED_INT$1 || dtype === GL_INT$1) {\n              byteLength *= 4\n            }\n          }\n        }\n        initElements(\n          elements,\n          data,\n          usage,\n          primType,\n          vertCount,\n          byteLength,\n          dtype)\n      }\n\n      return reglElements\n    }\n\n    reglElements(options)\n\n    reglElements._reglType = 'elements'\n    reglElements._elements = elements\n    reglElements.subdata = function (data, offset) {\n      buffer.subdata(data, offset)\n      return reglElements\n    }\n    reglElements.destroy = function () {\n      destroyElements(elements)\n    }\n\n    return reglElements\n  }\n\n  return {\n    create: createElements,\n    createStream: createElementStream,\n    destroyStream: destroyElementStream,\n    getElements: function (elements) {\n      if (typeof elements === 'function' &&\n          elements._elements instanceof REGLElementBuffer) {\n        return elements._elements\n      }\n      return null\n    },\n    clear: function () {\n      values(elementSet).forEach(destroyElements)\n    }\n  }\n}\n\nvar FLOAT = new Float32Array(1)\nvar INT = new Uint32Array(FLOAT.buffer)\n\nvar GL_UNSIGNED_SHORT$3 = 5123\n\nfunction convertToHalfFloat (array) {\n  var ushorts = pool.allocType(GL_UNSIGNED_SHORT$3, array.length)\n\n  for (var i = 0; i < array.length; ++i) {\n    if (isNaN(array[i])) {\n      ushorts[i] = 0xffff\n    } else if (array[i] === Infinity) {\n      ushorts[i] = 0x7c00\n    } else if (array[i] === -Infinity) {\n      ushorts[i] = 0xfc00\n    } else {\n      FLOAT[0] = array[i]\n      var x = INT[0]\n\n      var sgn = (x >>> 31) << 15\n      var exp = ((x << 1) >>> 24) - 127\n      var frac = (x >> 13) & ((1 << 10) - 1)\n\n      if (exp < -24) {\n        // round non-representable denormals to 0\n        ushorts[i] = sgn\n      } else if (exp < -14) {\n        // handle denormals\n        var s = -14 - exp\n        ushorts[i] = sgn + ((frac + (1 << 10)) >> s)\n      } else if (exp > 15) {\n        // round overflow to +/- Infinity\n        ushorts[i] = sgn + 0x7c00\n      } else {\n        // otherwise convert directly\n        ushorts[i] = sgn + ((exp + 15) << 10) + frac\n      }\n    }\n  }\n\n  return ushorts\n}\n\nfunction isArrayLike (s) {\n  return Array.isArray(s) || isTypedArray(s)\n}\n\nvar GL_COMPRESSED_TEXTURE_FORMATS = 0x86A3\n\nvar GL_TEXTURE_2D$1 = 0x0DE1\nvar GL_TEXTURE_CUBE_MAP$1 = 0x8513\nvar GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 = 0x8515\n\nvar GL_RGBA$1 = 0x1908\nvar GL_ALPHA = 0x1906\nvar GL_RGB = 0x1907\nvar GL_LUMINANCE = 0x1909\nvar GL_LUMINANCE_ALPHA = 0x190A\n\nvar GL_RGBA4 = 0x8056\nvar GL_RGB5_A1 = 0x8057\nvar GL_RGB565 = 0x8D62\n\nvar GL_UNSIGNED_SHORT_4_4_4_4 = 0x8033\nvar GL_UNSIGNED_SHORT_5_5_5_1 = 0x8034\nvar GL_UNSIGNED_SHORT_5_6_5 = 0x8363\nvar GL_UNSIGNED_INT_24_8_WEBGL = 0x84FA\n\nvar GL_DEPTH_COMPONENT = 0x1902\nvar GL_DEPTH_STENCIL = 0x84F9\n\nvar GL_SRGB_EXT = 0x8C40\nvar GL_SRGB_ALPHA_EXT = 0x8C42\n\nvar GL_HALF_FLOAT_OES = 0x8D61\n\nvar GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0\nvar GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1\nvar GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2\nvar GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3\n\nvar GL_COMPRESSED_RGB_ATC_WEBGL = 0x8C92\nvar GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 0x8C93\nvar GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 0x87EE\n\nvar GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8C00\nvar GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8C01\nvar GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02\nvar GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03\n\nvar GL_COMPRESSED_RGB_ETC1_WEBGL = 0x8D64\n\nvar GL_UNSIGNED_BYTE$4 = 0x1401\nvar GL_UNSIGNED_SHORT$2 = 0x1403\nvar GL_UNSIGNED_INT$2 = 0x1405\nvar GL_FLOAT$3 = 0x1406\n\nvar GL_TEXTURE_WRAP_S = 0x2802\nvar GL_TEXTURE_WRAP_T = 0x2803\n\nvar GL_REPEAT = 0x2901\nvar GL_CLAMP_TO_EDGE = 0x812F\nvar GL_MIRRORED_REPEAT = 0x8370\n\nvar GL_TEXTURE_MAG_FILTER = 0x2800\nvar GL_TEXTURE_MIN_FILTER = 0x2801\n\nvar GL_NEAREST = 0x2600\nvar GL_LINEAR = 0x2601\nvar GL_NEAREST_MIPMAP_NEAREST = 0x2700\nvar GL_LINEAR_MIPMAP_NEAREST = 0x2701\nvar GL_NEAREST_MIPMAP_LINEAR = 0x2702\nvar GL_LINEAR_MIPMAP_LINEAR = 0x2703\n\nvar GL_GENERATE_MIPMAP_HINT = 0x8192\nvar GL_DONT_CARE = 0x1100\nvar GL_FASTEST = 0x1101\nvar GL_NICEST = 0x1102\n\nvar GL_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE\n\nvar GL_UNPACK_ALIGNMENT = 0x0CF5\nvar GL_UNPACK_FLIP_Y_WEBGL = 0x9240\nvar GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241\nvar GL_UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243\n\nvar GL_BROWSER_DEFAULT_WEBGL = 0x9244\n\nvar GL_TEXTURE0$1 = 0x84C0\n\nvar MIPMAP_FILTERS = [\n  GL_NEAREST_MIPMAP_NEAREST,\n  GL_NEAREST_MIPMAP_LINEAR,\n  GL_LINEAR_MIPMAP_NEAREST,\n  GL_LINEAR_MIPMAP_LINEAR\n]\n\nvar CHANNELS_FORMAT = [\n  0,\n  GL_LUMINANCE,\n  GL_LUMINANCE_ALPHA,\n  GL_RGB,\n  GL_RGBA$1\n]\n\nvar FORMAT_CHANNELS = {}\nFORMAT_CHANNELS[GL_LUMINANCE] =\nFORMAT_CHANNELS[GL_ALPHA] =\nFORMAT_CHANNELS[GL_DEPTH_COMPONENT] = 1\nFORMAT_CHANNELS[GL_DEPTH_STENCIL] =\nFORMAT_CHANNELS[GL_LUMINANCE_ALPHA] = 2\nFORMAT_CHANNELS[GL_RGB] =\nFORMAT_CHANNELS[GL_SRGB_EXT] = 3\nFORMAT_CHANNELS[GL_RGBA$1] =\nFORMAT_CHANNELS[GL_SRGB_ALPHA_EXT] = 4\n\nfunction objectName (str) {\n  return '[object ' + str + ']'\n}\n\nvar CANVAS_CLASS = objectName('HTMLCanvasElement')\nvar OFFSCREENCANVAS_CLASS = objectName('OffscreenCanvas')\nvar CONTEXT2D_CLASS = objectName('CanvasRenderingContext2D')\nvar BITMAP_CLASS = objectName('ImageBitmap')\nvar IMAGE_CLASS = objectName('HTMLImageElement')\nvar VIDEO_CLASS = objectName('HTMLVideoElement')\n\nvar PIXEL_CLASSES = Object.keys(arrayTypes).concat([\n  CANVAS_CLASS,\n  OFFSCREENCANVAS_CLASS,\n  CONTEXT2D_CLASS,\n  BITMAP_CLASS,\n  IMAGE_CLASS,\n  VIDEO_CLASS\n])\n\n// for every texture type, store\n// the size in bytes.\nvar TYPE_SIZES = []\nTYPE_SIZES[GL_UNSIGNED_BYTE$4] = 1\nTYPE_SIZES[GL_FLOAT$3] = 4\nTYPE_SIZES[GL_HALF_FLOAT_OES] = 2\n\nTYPE_SIZES[GL_UNSIGNED_SHORT$2] = 2\nTYPE_SIZES[GL_UNSIGNED_INT$2] = 4\n\nvar FORMAT_SIZES_SPECIAL = []\nFORMAT_SIZES_SPECIAL[GL_RGBA4] = 2\nFORMAT_SIZES_SPECIAL[GL_RGB5_A1] = 2\nFORMAT_SIZES_SPECIAL[GL_RGB565] = 2\nFORMAT_SIZES_SPECIAL[GL_DEPTH_STENCIL] = 4\n\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_S3TC_DXT1_EXT] = 0.5\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_S3TC_DXT1_EXT] = 0.5\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_S3TC_DXT3_EXT] = 1\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_S3TC_DXT5_EXT] = 1\n\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_ATC_WEBGL] = 0.5\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL] = 1\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL] = 1\n\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG] = 0.5\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG] = 0.25\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG] = 0.5\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG] = 0.25\n\nFORMAT_SIZES_SPECIAL[GL_COMPRESSED_RGB_ETC1_WEBGL] = 0.5\n\nfunction isNumericArray (arr) {\n  return (\n    Array.isArray(arr) &&\n    (arr.length === 0 ||\n    typeof arr[0] === 'number'))\n}\n\nfunction isRectArray (arr) {\n  if (!Array.isArray(arr)) {\n    return false\n  }\n  var width = arr.length\n  if (width === 0 || !isArrayLike(arr[0])) {\n    return false\n  }\n  return true\n}\n\nfunction classString (x) {\n  return Object.prototype.toString.call(x)\n}\n\nfunction isCanvasElement (object) {\n  return classString(object) === CANVAS_CLASS\n}\n\nfunction isOffscreenCanvas (object) {\n  return classString(object) === OFFSCREENCANVAS_CLASS\n}\n\nfunction isContext2D (object) {\n  return classString(object) === CONTEXT2D_CLASS\n}\n\nfunction isBitmap (object) {\n  return classString(object) === BITMAP_CLASS\n}\n\nfunction isImageElement (object) {\n  return classString(object) === IMAGE_CLASS\n}\n\nfunction isVideoElement (object) {\n  return classString(object) === VIDEO_CLASS\n}\n\nfunction isPixelData (object) {\n  if (!object) {\n    return false\n  }\n  var className = classString(object)\n  if (PIXEL_CLASSES.indexOf(className) >= 0) {\n    return true\n  }\n  return (\n    isNumericArray(object) ||\n    isRectArray(object) ||\n    isNDArrayLike(object))\n}\n\nfunction typedArrayCode$1 (data) {\n  return arrayTypes[Object.prototype.toString.call(data)] | 0\n}\n\nfunction convertData (result, data) {\n  var n = data.length\n  switch (result.type) {\n    case GL_UNSIGNED_BYTE$4:\n    case GL_UNSIGNED_SHORT$2:\n    case GL_UNSIGNED_INT$2:\n    case GL_FLOAT$3:\n      var converted = pool.allocType(result.type, n)\n      converted.set(data)\n      result.data = converted\n      break\n\n    case GL_HALF_FLOAT_OES:\n      result.data = convertToHalfFloat(data)\n      break\n\n    default:\n      \n  }\n}\n\nfunction preConvert (image, n) {\n  return pool.allocType(\n    image.type === GL_HALF_FLOAT_OES\n      ? GL_FLOAT$3\n      : image.type, n)\n}\n\nfunction postConvert (image, data) {\n  if (image.type === GL_HALF_FLOAT_OES) {\n    image.data = convertToHalfFloat(data)\n    pool.freeType(data)\n  } else {\n    image.data = data\n  }\n}\n\nfunction transposeData (image, array, strideX, strideY, strideC, offset) {\n  var w = image.width\n  var h = image.height\n  var c = image.channels\n  var n = w * h * c\n  var data = preConvert(image, n)\n\n  var p = 0\n  for (var i = 0; i < h; ++i) {\n    for (var j = 0; j < w; ++j) {\n      for (var k = 0; k < c; ++k) {\n        data[p++] = array[strideX * j + strideY * i + strideC * k + offset]\n      }\n    }\n  }\n\n  postConvert(image, data)\n}\n\nfunction getTextureSize (format, type, width, height, isMipmap, isCube) {\n  var s\n  if (typeof FORMAT_SIZES_SPECIAL[format] !== 'undefined') {\n    // we have a special array for dealing with weird color formats such as RGB5A1\n    s = FORMAT_SIZES_SPECIAL[format]\n  } else {\n    s = FORMAT_CHANNELS[format] * TYPE_SIZES[type]\n  }\n\n  if (isCube) {\n    s *= 6\n  }\n\n  if (isMipmap) {\n    // compute the total size of all the mipmaps.\n    var total = 0\n\n    var w = width\n    while (w >= 1) {\n      // we can only use mipmaps on a square image,\n      // so we can simply use the width and ignore the height:\n      total += s * w * w\n      w /= 2\n    }\n    return total\n  } else {\n    return s * width * height\n  }\n}\n\nfunction createTextureSet (\n  gl, extensions, limits, reglPoll, contextState, stats, config) {\n  // -------------------------------------------------------\n  // Initialize constants and parameter tables here\n  // -------------------------------------------------------\n  var mipmapHint = {\n    \"don't care\": GL_DONT_CARE,\n    'dont care': GL_DONT_CARE,\n    'nice': GL_NICEST,\n    'fast': GL_FASTEST\n  }\n\n  var wrapModes = {\n    'repeat': GL_REPEAT,\n    'clamp': GL_CLAMP_TO_EDGE,\n    'mirror': GL_MIRRORED_REPEAT\n  }\n\n  var magFilters = {\n    'nearest': GL_NEAREST,\n    'linear': GL_LINEAR\n  }\n\n  var minFilters = extend({\n    'mipmap': GL_LINEAR_MIPMAP_LINEAR,\n    'nearest mipmap nearest': GL_NEAREST_MIPMAP_NEAREST,\n    'linear mipmap nearest': GL_LINEAR_MIPMAP_NEAREST,\n    'nearest mipmap linear': GL_NEAREST_MIPMAP_LINEAR,\n    'linear mipmap linear': GL_LINEAR_MIPMAP_LINEAR\n  }, magFilters)\n\n  var colorSpace = {\n    'none': 0,\n    'browser': GL_BROWSER_DEFAULT_WEBGL\n  }\n\n  var textureTypes = {\n    'uint8': GL_UNSIGNED_BYTE$4,\n    'rgba4': GL_UNSIGNED_SHORT_4_4_4_4,\n    'rgb565': GL_UNSIGNED_SHORT_5_6_5,\n    'rgb5 a1': GL_UNSIGNED_SHORT_5_5_5_1\n  }\n\n  var textureFormats = {\n    'alpha': GL_ALPHA,\n    'luminance': GL_LUMINANCE,\n    'luminance alpha': GL_LUMINANCE_ALPHA,\n    'rgb': GL_RGB,\n    'rgba': GL_RGBA$1,\n    'rgba4': GL_RGBA4,\n    'rgb5 a1': GL_RGB5_A1,\n    'rgb565': GL_RGB565\n  }\n\n  var compressedTextureFormats = {}\n\n  if (extensions.ext_srgb) {\n    textureFormats.srgb = GL_SRGB_EXT\n    textureFormats.srgba = GL_SRGB_ALPHA_EXT\n  }\n\n  if (extensions.oes_texture_float) {\n    textureTypes.float32 = textureTypes.float = GL_FLOAT$3\n  }\n\n  if (extensions.oes_texture_half_float) {\n    textureTypes['float16'] = textureTypes['half float'] = GL_HALF_FLOAT_OES\n  }\n\n  if (extensions.webgl_depth_texture) {\n    extend(textureFormats, {\n      'depth': GL_DEPTH_COMPONENT,\n      'depth stencil': GL_DEPTH_STENCIL\n    })\n\n    extend(textureTypes, {\n      'uint16': GL_UNSIGNED_SHORT$2,\n      'uint32': GL_UNSIGNED_INT$2,\n      'depth stencil': GL_UNSIGNED_INT_24_8_WEBGL\n    })\n  }\n\n  if (extensions.webgl_compressed_texture_s3tc) {\n    extend(compressedTextureFormats, {\n      'rgb s3tc dxt1': GL_COMPRESSED_RGB_S3TC_DXT1_EXT,\n      'rgba s3tc dxt1': GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,\n      'rgba s3tc dxt3': GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,\n      'rgba s3tc dxt5': GL_COMPRESSED_RGBA_S3TC_DXT5_EXT\n    })\n  }\n\n  if (extensions.webgl_compressed_texture_atc) {\n    extend(compressedTextureFormats, {\n      'rgb atc': GL_COMPRESSED_RGB_ATC_WEBGL,\n      'rgba atc explicit alpha': GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL,\n      'rgba atc interpolated alpha': GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL\n    })\n  }\n\n  if (extensions.webgl_compressed_texture_pvrtc) {\n    extend(compressedTextureFormats, {\n      'rgb pvrtc 4bppv1': GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG,\n      'rgb pvrtc 2bppv1': GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG,\n      'rgba pvrtc 4bppv1': GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,\n      'rgba pvrtc 2bppv1': GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG\n    })\n  }\n\n  if (extensions.webgl_compressed_texture_etc1) {\n    compressedTextureFormats['rgb etc1'] = GL_COMPRESSED_RGB_ETC1_WEBGL\n  }\n\n  // Copy over all texture formats\n  var supportedCompressedFormats = Array.prototype.slice.call(\n    gl.getParameter(GL_COMPRESSED_TEXTURE_FORMATS))\n  Object.keys(compressedTextureFormats).forEach(function (name) {\n    var format = compressedTextureFormats[name]\n    if (supportedCompressedFormats.indexOf(format) >= 0) {\n      textureFormats[name] = format\n    }\n  })\n\n  var supportedFormats = Object.keys(textureFormats)\n  limits.textureFormats = supportedFormats\n\n  // associate with every format string its\n  // corresponding GL-value.\n  var textureFormatsInvert = []\n  Object.keys(textureFormats).forEach(function (key) {\n    var val = textureFormats[key]\n    textureFormatsInvert[val] = key\n  })\n\n  // associate with every type string its\n  // corresponding GL-value.\n  var textureTypesInvert = []\n  Object.keys(textureTypes).forEach(function (key) {\n    var val = textureTypes[key]\n    textureTypesInvert[val] = key\n  })\n\n  var magFiltersInvert = []\n  Object.keys(magFilters).forEach(function (key) {\n    var val = magFilters[key]\n    magFiltersInvert[val] = key\n  })\n\n  var minFiltersInvert = []\n  Object.keys(minFilters).forEach(function (key) {\n    var val = minFilters[key]\n    minFiltersInvert[val] = key\n  })\n\n  var wrapModesInvert = []\n  Object.keys(wrapModes).forEach(function (key) {\n    var val = wrapModes[key]\n    wrapModesInvert[val] = key\n  })\n\n  // colorFormats[] gives the format (channels) associated to an\n  // internalformat\n  var colorFormats = supportedFormats.reduce(function (color, key) {\n    var glenum = textureFormats[key]\n    if (glenum === GL_LUMINANCE ||\n        glenum === GL_ALPHA ||\n        glenum === GL_LUMINANCE ||\n        glenum === GL_LUMINANCE_ALPHA ||\n        glenum === GL_DEPTH_COMPONENT ||\n        glenum === GL_DEPTH_STENCIL ||\n        (extensions.ext_srgb &&\n                (glenum === GL_SRGB_EXT ||\n                 glenum === GL_SRGB_ALPHA_EXT))) {\n      color[glenum] = glenum\n    } else if (glenum === GL_RGB5_A1 || key.indexOf('rgba') >= 0) {\n      color[glenum] = GL_RGBA$1\n    } else {\n      color[glenum] = GL_RGB\n    }\n    return color\n  }, {})\n\n  function TexFlags () {\n    // format info\n    this.internalformat = GL_RGBA$1\n    this.format = GL_RGBA$1\n    this.type = GL_UNSIGNED_BYTE$4\n    this.compressed = false\n\n    // pixel storage\n    this.premultiplyAlpha = false\n    this.flipY = false\n    this.unpackAlignment = 1\n    this.colorSpace = GL_BROWSER_DEFAULT_WEBGL\n\n    // shape info\n    this.width = 0\n    this.height = 0\n    this.channels = 0\n  }\n\n  function copyFlags (result, other) {\n    result.internalformat = other.internalformat\n    result.format = other.format\n    result.type = other.type\n    result.compressed = other.compressed\n\n    result.premultiplyAlpha = other.premultiplyAlpha\n    result.flipY = other.flipY\n    result.unpackAlignment = other.unpackAlignment\n    result.colorSpace = other.colorSpace\n\n    result.width = other.width\n    result.height = other.height\n    result.channels = other.channels\n  }\n\n  function parseFlags (flags, options) {\n    if (typeof options !== 'object' || !options) {\n      return\n    }\n\n    if ('premultiplyAlpha' in options) {\n      \n      flags.premultiplyAlpha = options.premultiplyAlpha\n    }\n\n    if ('flipY' in options) {\n      \n      flags.flipY = options.flipY\n    }\n\n    if ('alignment' in options) {\n      \n      flags.unpackAlignment = options.alignment\n    }\n\n    if ('colorSpace' in options) {\n      \n      flags.colorSpace = colorSpace[options.colorSpace]\n    }\n\n    if ('type' in options) {\n      var type = options.type\n      \n      \n      \n      \n      flags.type = textureTypes[type]\n    }\n\n    var w = flags.width\n    var h = flags.height\n    var c = flags.channels\n    var hasChannels = false\n    if ('shape' in options) {\n      \n      w = options.shape[0]\n      h = options.shape[1]\n      if (options.shape.length === 3) {\n        c = options.shape[2]\n        \n        hasChannels = true\n      }\n      \n      \n    } else {\n      if ('radius' in options) {\n        w = h = options.radius\n        \n      }\n      if ('width' in options) {\n        w = options.width\n        \n      }\n      if ('height' in options) {\n        h = options.height\n        \n      }\n      if ('channels' in options) {\n        c = options.channels\n        \n        hasChannels = true\n      }\n    }\n    flags.width = w | 0\n    flags.height = h | 0\n    flags.channels = c | 0\n\n    var hasFormat = false\n    if ('format' in options) {\n      var formatStr = options.format\n      \n      \n      var internalformat = flags.internalformat = textureFormats[formatStr]\n      flags.format = colorFormats[internalformat]\n      if (formatStr in textureTypes) {\n        if (!('type' in options)) {\n          flags.type = textureTypes[formatStr]\n        }\n      }\n      if (formatStr in compressedTextureFormats) {\n        flags.compressed = true\n      }\n      hasFormat = true\n    }\n\n    // Reconcile channels and format\n    if (!hasChannels && hasFormat) {\n      flags.channels = FORMAT_CHANNELS[flags.format]\n    } else if (hasChannels && !hasFormat) {\n      if (flags.channels !== CHANNELS_FORMAT[flags.format]) {\n        flags.format = flags.internalformat = CHANNELS_FORMAT[flags.channels]\n      }\n    } else if (hasFormat && hasChannels) {\n      \n    }\n  }\n\n  function setFlags (flags) {\n    gl.pixelStorei(GL_UNPACK_FLIP_Y_WEBGL, flags.flipY)\n    gl.pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL, flags.premultiplyAlpha)\n    gl.pixelStorei(GL_UNPACK_COLORSPACE_CONVERSION_WEBGL, flags.colorSpace)\n    gl.pixelStorei(GL_UNPACK_ALIGNMENT, flags.unpackAlignment)\n  }\n\n  // -------------------------------------------------------\n  // Tex image data\n  // -------------------------------------------------------\n  function TexImage () {\n    TexFlags.call(this)\n\n    this.xOffset = 0\n    this.yOffset = 0\n\n    // data\n    this.data = null\n    this.needsFree = false\n\n    // html element\n    this.element = null\n\n    // copyTexImage info\n    this.needsCopy = false\n  }\n\n  function parseImage (image, options) {\n    var data = null\n    if (isPixelData(options)) {\n      data = options\n    } else if (options) {\n      \n      parseFlags(image, options)\n      if ('x' in options) {\n        image.xOffset = options.x | 0\n      }\n      if ('y' in options) {\n        image.yOffset = options.y | 0\n      }\n      if (isPixelData(options.data)) {\n        data = options.data\n      }\n    }\n\n    \n\n    if (options.copy) {\n      \n      var viewW = contextState.viewportWidth\n      var viewH = contextState.viewportHeight\n      image.width = image.width || (viewW - image.xOffset)\n      image.height = image.height || (viewH - image.yOffset)\n      image.needsCopy = true\n      \n    } else if (!data) {\n      image.width = image.width || 1\n      image.height = image.height || 1\n      image.channels = image.channels || 4\n    } else if (isTypedArray(data)) {\n      image.channels = image.channels || 4\n      image.data = data\n      if (!('type' in options) && image.type === GL_UNSIGNED_BYTE$4) {\n        image.type = typedArrayCode$1(data)\n      }\n    } else if (isNumericArray(data)) {\n      image.channels = image.channels || 4\n      convertData(image, data)\n      image.alignment = 1\n      image.needsFree = true\n    } else if (isNDArrayLike(data)) {\n      var array = data.data\n      if (!Array.isArray(array) && image.type === GL_UNSIGNED_BYTE$4) {\n        image.type = typedArrayCode$1(array)\n      }\n      var shape = data.shape\n      var stride = data.stride\n      var shapeX, shapeY, shapeC, strideX, strideY, strideC\n      if (shape.length === 3) {\n        shapeC = shape[2]\n        strideC = stride[2]\n      } else {\n        \n        shapeC = 1\n        strideC = 1\n      }\n      shapeX = shape[0]\n      shapeY = shape[1]\n      strideX = stride[0]\n      strideY = stride[1]\n      image.alignment = 1\n      image.width = shapeX\n      image.height = shapeY\n      image.channels = shapeC\n      image.format = image.internalformat = CHANNELS_FORMAT[shapeC]\n      image.needsFree = true\n      transposeData(image, array, strideX, strideY, strideC, data.offset)\n    } else if (isCanvasElement(data) || isOffscreenCanvas(data) || isContext2D(data)) {\n      if (isCanvasElement(data) || isOffscreenCanvas(data)) {\n        image.element = data\n      } else {\n        image.element = data.canvas\n      }\n      image.width = image.element.width\n      image.height = image.element.height\n      image.channels = 4\n    } else if (isBitmap(data)) {\n      image.element = data\n      image.width = data.width\n      image.height = data.height\n      image.channels = 4\n    } else if (isImageElement(data)) {\n      image.element = data\n      image.width = data.naturalWidth\n      image.height = data.naturalHeight\n      image.channels = 4\n    } else if (isVideoElement(data)) {\n      image.element = data\n      image.width = data.videoWidth\n      image.height = data.videoHeight\n      image.channels = 4\n    } else if (isRectArray(data)) {\n      var w = image.width || data[0].length\n      var h = image.height || data.length\n      var c = image.channels\n      if (isArrayLike(data[0][0])) {\n        c = c || data[0][0].length\n      } else {\n        c = c || 1\n      }\n      var arrayShape = flattenUtils.shape(data)\n      var n = 1\n      for (var dd = 0; dd < arrayShape.length; ++dd) {\n        n *= arrayShape[dd]\n      }\n      var allocData = preConvert(image, n)\n      flattenUtils.flatten(data, arrayShape, '', allocData)\n      postConvert(image, allocData)\n      image.alignment = 1\n      image.width = w\n      image.height = h\n      image.channels = c\n      image.format = image.internalformat = CHANNELS_FORMAT[c]\n      image.needsFree = true\n    }\n\n    if (image.type === GL_FLOAT$3) {\n      \n    } else if (image.type === GL_HALF_FLOAT_OES) {\n      \n    }\n\n    // do compressed texture  validation here.\n  }\n\n  function setImage (info, target, miplevel) {\n    var element = info.element\n    var data = info.data\n    var internalformat = info.internalformat\n    var format = info.format\n    var type = info.type\n    var width = info.width\n    var height = info.height\n\n    setFlags(info)\n\n    if (element) {\n      gl.texImage2D(target, miplevel, format, format, type, element)\n    } else if (info.compressed) {\n      gl.compressedTexImage2D(target, miplevel, internalformat, width, height, 0, data)\n    } else if (info.needsCopy) {\n      reglPoll()\n      gl.copyTexImage2D(\n        target, miplevel, format, info.xOffset, info.yOffset, width, height, 0)\n    } else {\n      gl.texImage2D(target, miplevel, format, width, height, 0, format, type, data || null)\n    }\n  }\n\n  function setSubImage (info, target, x, y, miplevel) {\n    var element = info.element\n    var data = info.data\n    var internalformat = info.internalformat\n    var format = info.format\n    var type = info.type\n    var width = info.width\n    var height = info.height\n\n    setFlags(info)\n\n    if (element) {\n      gl.texSubImage2D(\n        target, miplevel, x, y, format, type, element)\n    } else if (info.compressed) {\n      gl.compressedTexSubImage2D(\n        target, miplevel, x, y, internalformat, width, height, data)\n    } else if (info.needsCopy) {\n      reglPoll()\n      gl.copyTexSubImage2D(\n        target, miplevel, x, y, info.xOffset, info.yOffset, width, height)\n    } else {\n      gl.texSubImage2D(\n        target, miplevel, x, y, width, height, format, type, data)\n    }\n  }\n\n  // texImage pool\n  var imagePool = []\n\n  function allocImage () {\n    return imagePool.pop() || new TexImage()\n  }\n\n  function freeImage (image) {\n    if (image.needsFree) {\n      pool.freeType(image.data)\n    }\n    TexImage.call(image)\n    imagePool.push(image)\n  }\n\n  // -------------------------------------------------------\n  // Mip map\n  // -------------------------------------------------------\n  function MipMap () {\n    TexFlags.call(this)\n\n    this.genMipmaps = false\n    this.mipmapHint = GL_DONT_CARE\n    this.mipmask = 0\n    this.images = Array(16)\n  }\n\n  function parseMipMapFromShape (mipmap, width, height) {\n    var img = mipmap.images[0] = allocImage()\n    mipmap.mipmask = 1\n    img.width = mipmap.width = width\n    img.height = mipmap.height = height\n    img.channels = mipmap.channels = 4\n  }\n\n  function parseMipMapFromObject (mipmap, options) {\n    var imgData = null\n    if (isPixelData(options)) {\n      imgData = mipmap.images[0] = allocImage()\n      copyFlags(imgData, mipmap)\n      parseImage(imgData, options)\n      mipmap.mipmask = 1\n    } else {\n      parseFlags(mipmap, options)\n      if (Array.isArray(options.mipmap)) {\n        var mipData = options.mipmap\n        for (var i = 0; i < mipData.length; ++i) {\n          imgData = mipmap.images[i] = allocImage()\n          copyFlags(imgData, mipmap)\n          imgData.width >>= i\n          imgData.height >>= i\n          parseImage(imgData, mipData[i])\n          mipmap.mipmask |= (1 << i)\n        }\n      } else {\n        imgData = mipmap.images[0] = allocImage()\n        copyFlags(imgData, mipmap)\n        parseImage(imgData, options)\n        mipmap.mipmask = 1\n      }\n    }\n    copyFlags(mipmap, mipmap.images[0])\n\n    // For textures of the compressed format WEBGL_compressed_texture_s3tc\n    // we must have that\n    //\n    // \"When level equals zero width and height must be a multiple of 4.\n    // When level is greater than 0 width and height must be 0, 1, 2 or a multiple of 4. \"\n    //\n    // but we do not yet support having multiple mipmap levels for compressed textures,\n    // so we only test for level zero.\n\n    if (\n      mipmap.compressed &&\n      (\n        mipmap.internalformat === GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||\n        mipmap.internalformat === GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||\n        mipmap.internalformat === GL_COMPRESSED_RGBA_S3TC_DXT3_EXT ||\n        mipmap.internalformat === GL_COMPRESSED_RGBA_S3TC_DXT5_EXT\n      )\n    ) {\n      \n    }\n  }\n\n  function setMipMap (mipmap, target) {\n    var images = mipmap.images\n    for (var i = 0; i < images.length; ++i) {\n      if (!images[i]) {\n        return\n      }\n      setImage(images[i], target, i)\n    }\n  }\n\n  var mipPool = []\n\n  function allocMipMap () {\n    var result = mipPool.pop() || new MipMap()\n    TexFlags.call(result)\n    result.mipmask = 0\n    for (var i = 0; i < 16; ++i) {\n      result.images[i] = null\n    }\n    return result\n  }\n\n  function freeMipMap (mipmap) {\n    var images = mipmap.images\n    for (var i = 0; i < images.length; ++i) {\n      if (images[i]) {\n        freeImage(images[i])\n      }\n      images[i] = null\n    }\n    mipPool.push(mipmap)\n  }\n\n  // -------------------------------------------------------\n  // Tex info\n  // -------------------------------------------------------\n  function TexInfo () {\n    this.minFilter = GL_NEAREST\n    this.magFilter = GL_NEAREST\n\n    this.wrapS = GL_CLAMP_TO_EDGE\n    this.wrapT = GL_CLAMP_TO_EDGE\n\n    this.anisotropic = 1\n\n    this.genMipmaps = false\n    this.mipmapHint = GL_DONT_CARE\n  }\n\n  function parseTexInfo (info, options) {\n    if ('min' in options) {\n      var minFilter = options.min\n      \n      info.minFilter = minFilters[minFilter]\n      if (MIPMAP_FILTERS.indexOf(info.minFilter) >= 0 && !('faces' in options)) {\n        info.genMipmaps = true\n      }\n    }\n\n    if ('mag' in options) {\n      var magFilter = options.mag\n      \n      info.magFilter = magFilters[magFilter]\n    }\n\n    var wrapS = info.wrapS\n    var wrapT = info.wrapT\n    if ('wrap' in options) {\n      var wrap = options.wrap\n      if (typeof wrap === 'string') {\n        \n        wrapS = wrapT = wrapModes[wrap]\n      } else if (Array.isArray(wrap)) {\n        \n        \n        wrapS = wrapModes[wrap[0]]\n        wrapT = wrapModes[wrap[1]]\n      }\n    } else {\n      if ('wrapS' in options) {\n        var optWrapS = options.wrapS\n        \n        wrapS = wrapModes[optWrapS]\n      }\n      if ('wrapT' in options) {\n        var optWrapT = options.wrapT\n        \n        wrapT = wrapModes[optWrapT]\n      }\n    }\n    info.wrapS = wrapS\n    info.wrapT = wrapT\n\n    if ('anisotropic' in options) {\n      var anisotropic = options.anisotropic\n      \n      info.anisotropic = options.anisotropic\n    }\n\n    if ('mipmap' in options) {\n      var hasMipMap = false\n      switch (typeof options.mipmap) {\n        case 'string':\n          \n          info.mipmapHint = mipmapHint[options.mipmap]\n          info.genMipmaps = true\n          hasMipMap = true\n          break\n\n        case 'boolean':\n          hasMipMap = info.genMipmaps = options.mipmap\n          break\n\n        case 'object':\n          \n          info.genMipmaps = false\n          hasMipMap = true\n          break\n\n        default:\n          \n      }\n      if (hasMipMap && !('min' in options)) {\n        info.minFilter = GL_NEAREST_MIPMAP_NEAREST\n      }\n    }\n  }\n\n  function setTexInfo (info, target) {\n    gl.texParameteri(target, GL_TEXTURE_MIN_FILTER, info.minFilter)\n    gl.texParameteri(target, GL_TEXTURE_MAG_FILTER, info.magFilter)\n    gl.texParameteri(target, GL_TEXTURE_WRAP_S, info.wrapS)\n    gl.texParameteri(target, GL_TEXTURE_WRAP_T, info.wrapT)\n    if (extensions.ext_texture_filter_anisotropic) {\n      gl.texParameteri(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, info.anisotropic)\n    }\n    if (info.genMipmaps) {\n      gl.hint(GL_GENERATE_MIPMAP_HINT, info.mipmapHint)\n      gl.generateMipmap(target)\n    }\n  }\n\n  // -------------------------------------------------------\n  // Full texture object\n  // -------------------------------------------------------\n  var textureCount = 0\n  var textureSet = {}\n  var numTexUnits = limits.maxTextureUnits\n  var textureUnits = Array(numTexUnits).map(function () {\n    return null\n  })\n\n  function REGLTexture (target) {\n    TexFlags.call(this)\n    this.mipmask = 0\n    this.internalformat = GL_RGBA$1\n\n    this.id = textureCount++\n\n    this.refCount = 1\n\n    this.target = target\n    this.texture = gl.createTexture()\n\n    this.unit = -1\n    this.bindCount = 0\n\n    this.texInfo = new TexInfo()\n\n    if (config.profile) {\n      this.stats = { size: 0 }\n    }\n  }\n\n  function tempBind (texture) {\n    gl.activeTexture(GL_TEXTURE0$1)\n    gl.bindTexture(texture.target, texture.texture)\n  }\n\n  function tempRestore () {\n    var prev = textureUnits[0]\n    if (prev) {\n      gl.bindTexture(prev.target, prev.texture)\n    } else {\n      gl.bindTexture(GL_TEXTURE_2D$1, null)\n    }\n  }\n\n  function destroy (texture) {\n    var handle = texture.texture\n    \n    var unit = texture.unit\n    var target = texture.target\n    if (unit >= 0) {\n      gl.activeTexture(GL_TEXTURE0$1 + unit)\n      gl.bindTexture(target, null)\n      textureUnits[unit] = null\n    }\n    gl.deleteTexture(handle)\n    texture.texture = null\n    texture.params = null\n    texture.pixels = null\n    texture.refCount = 0\n    delete textureSet[texture.id]\n    stats.textureCount--\n  }\n\n  extend(REGLTexture.prototype, {\n    bind: function () {\n      var texture = this\n      texture.bindCount += 1\n      var unit = texture.unit\n      if (unit < 0) {\n        for (var i = 0; i < numTexUnits; ++i) {\n          var other = textureUnits[i]\n          if (other) {\n            if (other.bindCount > 0) {\n              continue\n            }\n            other.unit = -1\n          }\n          textureUnits[i] = texture\n          unit = i\n          break\n        }\n        if (unit >= numTexUnits) {\n          \n        }\n        if (config.profile && stats.maxTextureUnits < (unit + 1)) {\n          stats.maxTextureUnits = unit + 1 // +1, since the units are zero-based\n        }\n        texture.unit = unit\n        gl.activeTexture(GL_TEXTURE0$1 + unit)\n        gl.bindTexture(texture.target, texture.texture)\n      }\n      return unit\n    },\n\n    unbind: function () {\n      this.bindCount -= 1\n    },\n\n    decRef: function () {\n      if (--this.refCount <= 0) {\n        destroy(this)\n      }\n    }\n  })\n\n  function createTexture2D (a, b) {\n    var texture = new REGLTexture(GL_TEXTURE_2D$1)\n    textureSet[texture.id] = texture\n    stats.textureCount++\n\n    function reglTexture2D (a, b) {\n      var texInfo = texture.texInfo\n      TexInfo.call(texInfo)\n      var mipData = allocMipMap()\n\n      if (typeof a === 'number') {\n        if (typeof b === 'number') {\n          parseMipMapFromShape(mipData, a | 0, b | 0)\n        } else {\n          parseMipMapFromShape(mipData, a | 0, a | 0)\n        }\n      } else if (a) {\n        \n        parseTexInfo(texInfo, a)\n        parseMipMapFromObject(mipData, a)\n      } else {\n        // empty textures get assigned a default shape of 1x1\n        parseMipMapFromShape(mipData, 1, 1)\n      }\n\n      if (texInfo.genMipmaps) {\n        mipData.mipmask = (mipData.width << 1) - 1\n      }\n      texture.mipmask = mipData.mipmask\n\n      copyFlags(texture, mipData)\n\n      \n      texture.internalformat = mipData.internalformat\n\n      reglTexture2D.width = mipData.width\n      reglTexture2D.height = mipData.height\n\n      tempBind(texture)\n      setMipMap(mipData, GL_TEXTURE_2D$1)\n      setTexInfo(texInfo, GL_TEXTURE_2D$1)\n      tempRestore()\n\n      freeMipMap(mipData)\n\n      if (config.profile) {\n        texture.stats.size = getTextureSize(\n          texture.internalformat,\n          texture.type,\n          mipData.width,\n          mipData.height,\n          texInfo.genMipmaps,\n          false)\n      }\n      reglTexture2D.format = textureFormatsInvert[texture.internalformat]\n      reglTexture2D.type = textureTypesInvert[texture.type]\n\n      reglTexture2D.mag = magFiltersInvert[texInfo.magFilter]\n      reglTexture2D.min = minFiltersInvert[texInfo.minFilter]\n\n      reglTexture2D.wrapS = wrapModesInvert[texInfo.wrapS]\n      reglTexture2D.wrapT = wrapModesInvert[texInfo.wrapT]\n\n      return reglTexture2D\n    }\n\n    function subimage (image, x_, y_, level_) {\n      \n\n      var x = x_ | 0\n      var y = y_ | 0\n      var level = level_ | 0\n\n      var imageData = allocImage()\n      copyFlags(imageData, texture)\n      imageData.width = 0\n      imageData.height = 0\n      parseImage(imageData, image)\n      imageData.width = imageData.width || ((texture.width >> level) - x)\n      imageData.height = imageData.height || ((texture.height >> level) - y)\n\n      \n      \n      \n      \n\n      tempBind(texture)\n      setSubImage(imageData, GL_TEXTURE_2D$1, x, y, level)\n      tempRestore()\n\n      freeImage(imageData)\n\n      return reglTexture2D\n    }\n\n    function resize (w_, h_) {\n      var w = w_ | 0\n      var h = (h_ | 0) || w\n      if (w === texture.width && h === texture.height) {\n        return reglTexture2D\n      }\n\n      reglTexture2D.width = texture.width = w\n      reglTexture2D.height = texture.height = h\n\n      tempBind(texture)\n\n      for (var i = 0; texture.mipmask >> i; ++i) {\n        var _w = w >> i\n        var _h = h >> i\n        if (!_w || !_h) break\n        gl.texImage2D(\n          GL_TEXTURE_2D$1,\n          i,\n          texture.format,\n          _w,\n          _h,\n          0,\n          texture.format,\n          texture.type,\n          null)\n      }\n      tempRestore()\n\n      // also, recompute the texture size.\n      if (config.profile) {\n        texture.stats.size = getTextureSize(\n          texture.internalformat,\n          texture.type,\n          w,\n          h,\n          false,\n          false)\n      }\n\n      return reglTexture2D\n    }\n\n    reglTexture2D(a, b)\n\n    reglTexture2D.subimage = subimage\n    reglTexture2D.resize = resize\n    reglTexture2D._reglType = 'texture2d'\n    reglTexture2D._texture = texture\n    if (config.profile) {\n      reglTexture2D.stats = texture.stats\n    }\n    reglTexture2D.destroy = function () {\n      texture.decRef()\n    }\n\n    return reglTexture2D\n  }\n\n  function createTextureCube (a0, a1, a2, a3, a4, a5) {\n    var texture = new REGLTexture(GL_TEXTURE_CUBE_MAP$1)\n    textureSet[texture.id] = texture\n    stats.cubeCount++\n\n    var faces = new Array(6)\n\n    function reglTextureCube (a0, a1, a2, a3, a4, a5) {\n      var i\n      var texInfo = texture.texInfo\n      TexInfo.call(texInfo)\n      for (i = 0; i < 6; ++i) {\n        faces[i] = allocMipMap()\n      }\n\n      if (typeof a0 === 'number' || !a0) {\n        var s = (a0 | 0) || 1\n        for (i = 0; i < 6; ++i) {\n          parseMipMapFromShape(faces[i], s, s)\n        }\n      } else if (typeof a0 === 'object') {\n        if (a1) {\n          parseMipMapFromObject(faces[0], a0)\n          parseMipMapFromObject(faces[1], a1)\n          parseMipMapFromObject(faces[2], a2)\n          parseMipMapFromObject(faces[3], a3)\n          parseMipMapFromObject(faces[4], a4)\n          parseMipMapFromObject(faces[5], a5)\n        } else {\n          parseTexInfo(texInfo, a0)\n          parseFlags(texture, a0)\n          if ('faces' in a0) {\n            var faceInput = a0.faces\n            \n            for (i = 0; i < 6; ++i) {\n              \n              copyFlags(faces[i], texture)\n              parseMipMapFromObject(faces[i], faceInput[i])\n            }\n          } else {\n            for (i = 0; i < 6; ++i) {\n              parseMipMapFromObject(faces[i], a0)\n            }\n          }\n        }\n      } else {\n        \n      }\n\n      copyFlags(texture, faces[0])\n\n      if (!limits.npotTextureCube) {\n        \n      }\n\n      if (texInfo.genMipmaps) {\n        texture.mipmask = (faces[0].width << 1) - 1\n      } else {\n        texture.mipmask = faces[0].mipmask\n      }\n\n      \n      texture.internalformat = faces[0].internalformat\n\n      reglTextureCube.width = faces[0].width\n      reglTextureCube.height = faces[0].height\n\n      tempBind(texture)\n      for (i = 0; i < 6; ++i) {\n        setMipMap(faces[i], GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 + i)\n      }\n      setTexInfo(texInfo, GL_TEXTURE_CUBE_MAP$1)\n      tempRestore()\n\n      if (config.profile) {\n        texture.stats.size = getTextureSize(\n          texture.internalformat,\n          texture.type,\n          reglTextureCube.width,\n          reglTextureCube.height,\n          texInfo.genMipmaps,\n          true)\n      }\n\n      reglTextureCube.format = textureFormatsInvert[texture.internalformat]\n      reglTextureCube.type = textureTypesInvert[texture.type]\n\n      reglTextureCube.mag = magFiltersInvert[texInfo.magFilter]\n      reglTextureCube.min = minFiltersInvert[texInfo.minFilter]\n\n      reglTextureCube.wrapS = wrapModesInvert[texInfo.wrapS]\n      reglTextureCube.wrapT = wrapModesInvert[texInfo.wrapT]\n\n      for (i = 0; i < 6; ++i) {\n        freeMipMap(faces[i])\n      }\n\n      return reglTextureCube\n    }\n\n    function subimage (face, image, x_, y_, level_) {\n      \n      \n\n      var x = x_ | 0\n      var y = y_ | 0\n      var level = level_ | 0\n\n      var imageData = allocImage()\n      copyFlags(imageData, texture)\n      imageData.width = 0\n      imageData.height = 0\n      parseImage(imageData, image)\n      imageData.width = imageData.width || ((texture.width >> level) - x)\n      imageData.height = imageData.height || ((texture.height >> level) - y)\n\n      \n      \n      \n      \n\n      tempBind(texture)\n      setSubImage(imageData, GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 + face, x, y, level)\n      tempRestore()\n\n      freeImage(imageData)\n\n      return reglTextureCube\n    }\n\n    function resize (radius_) {\n      var radius = radius_ | 0\n      if (radius === texture.width) {\n        return\n      }\n\n      reglTextureCube.width = texture.width = radius\n      reglTextureCube.height = texture.height = radius\n\n      tempBind(texture)\n      for (var i = 0; i < 6; ++i) {\n        for (var j = 0; texture.mipmask >> j; ++j) {\n          gl.texImage2D(\n            GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 + i,\n            j,\n            texture.format,\n            radius >> j,\n            radius >> j,\n            0,\n            texture.format,\n            texture.type,\n            null)\n        }\n      }\n      tempRestore()\n\n      if (config.profile) {\n        texture.stats.size = getTextureSize(\n          texture.internalformat,\n          texture.type,\n          reglTextureCube.width,\n          reglTextureCube.height,\n          false,\n          true)\n      }\n\n      return reglTextureCube\n    }\n\n    reglTextureCube(a0, a1, a2, a3, a4, a5)\n\n    reglTextureCube.subimage = subimage\n    reglTextureCube.resize = resize\n    reglTextureCube._reglType = 'textureCube'\n    reglTextureCube._texture = texture\n    if (config.profile) {\n      reglTextureCube.stats = texture.stats\n    }\n    reglTextureCube.destroy = function () {\n      texture.decRef()\n    }\n\n    return reglTextureCube\n  }\n\n  // Called when regl is destroyed\n  function destroyTextures () {\n    for (var i = 0; i < numTexUnits; ++i) {\n      gl.activeTexture(GL_TEXTURE0$1 + i)\n      gl.bindTexture(GL_TEXTURE_2D$1, null)\n      textureUnits[i] = null\n    }\n    values(textureSet).forEach(destroy)\n\n    stats.cubeCount = 0\n    stats.textureCount = 0\n  }\n\n  if (config.profile) {\n    stats.getTotalTextureSize = function () {\n      var total = 0\n      Object.keys(textureSet).forEach(function (key) {\n        total += textureSet[key].stats.size\n      })\n      return total\n    }\n  }\n\n  function restoreTextures () {\n    for (var i = 0; i < numTexUnits; ++i) {\n      var tex = textureUnits[i]\n      if (tex) {\n        tex.bindCount = 0\n        tex.unit = -1\n        textureUnits[i] = null\n      }\n    }\n\n    values(textureSet).forEach(function (texture) {\n      texture.texture = gl.createTexture()\n      gl.bindTexture(texture.target, texture.texture)\n      for (var i = 0; i < 32; ++i) {\n        if ((texture.mipmask & (1 << i)) === 0) {\n          continue\n        }\n        if (texture.target === GL_TEXTURE_2D$1) {\n          gl.texImage2D(GL_TEXTURE_2D$1,\n            i,\n            texture.internalformat,\n            texture.width >> i,\n            texture.height >> i,\n            0,\n            texture.internalformat,\n            texture.type,\n            null)\n        } else {\n          for (var j = 0; j < 6; ++j) {\n            gl.texImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X$1 + j,\n              i,\n              texture.internalformat,\n              texture.width >> i,\n              texture.height >> i,\n              0,\n              texture.internalformat,\n              texture.type,\n              null)\n          }\n        }\n      }\n      setTexInfo(texture.texInfo, texture.target)\n    })\n  }\n\n  function refreshTextures () {\n    for (var i = 0; i < numTexUnits; ++i) {\n      var tex = textureUnits[i]\n      if (tex) {\n        tex.bindCount = 0\n        tex.unit = -1\n        textureUnits[i] = null\n      }\n      gl.activeTexture(GL_TEXTURE0$1 + i)\n      gl.bindTexture(GL_TEXTURE_2D$1, null)\n      gl.bindTexture(GL_TEXTURE_CUBE_MAP$1, null)\n    }\n  }\n\n  return {\n    create2D: createTexture2D,\n    createCube: createTextureCube,\n    clear: destroyTextures,\n    getTexture: function (wrapper) {\n      return null\n    },\n    restore: restoreTextures,\n    refresh: refreshTextures\n  }\n}\n\nvar GL_RENDERBUFFER = 0x8D41\n\nvar GL_RGBA4$1 = 0x8056\nvar GL_RGB5_A1$1 = 0x8057\nvar GL_RGB565$1 = 0x8D62\nvar GL_DEPTH_COMPONENT16 = 0x81A5\nvar GL_STENCIL_INDEX8 = 0x8D48\nvar GL_DEPTH_STENCIL$1 = 0x84F9\n\nvar GL_SRGB8_ALPHA8_EXT = 0x8C43\n\nvar GL_RGBA32F_EXT = 0x8814\n\nvar GL_RGBA16F_EXT = 0x881A\nvar GL_RGB16F_EXT = 0x881B\n\nvar FORMAT_SIZES = []\n\nFORMAT_SIZES[GL_RGBA4$1] = 2\nFORMAT_SIZES[GL_RGB5_A1$1] = 2\nFORMAT_SIZES[GL_RGB565$1] = 2\n\nFORMAT_SIZES[GL_DEPTH_COMPONENT16] = 2\nFORMAT_SIZES[GL_STENCIL_INDEX8] = 1\nFORMAT_SIZES[GL_DEPTH_STENCIL$1] = 4\n\nFORMAT_SIZES[GL_SRGB8_ALPHA8_EXT] = 4\nFORMAT_SIZES[GL_RGBA32F_EXT] = 16\nFORMAT_SIZES[GL_RGBA16F_EXT] = 8\nFORMAT_SIZES[GL_RGB16F_EXT] = 6\n\nfunction getRenderbufferSize (format, width, height) {\n  return FORMAT_SIZES[format] * width * height\n}\n\nvar wrapRenderbuffers = function (gl, extensions, limits, stats, config) {\n  var formatTypes = {\n    'rgba4': GL_RGBA4$1,\n    'rgb565': GL_RGB565$1,\n    'rgb5 a1': GL_RGB5_A1$1,\n    'depth': GL_DEPTH_COMPONENT16,\n    'stencil': GL_STENCIL_INDEX8,\n    'depth stencil': GL_DEPTH_STENCIL$1\n  }\n\n  if (extensions.ext_srgb) {\n    formatTypes['srgba'] = GL_SRGB8_ALPHA8_EXT\n  }\n\n  if (extensions.ext_color_buffer_half_float) {\n    formatTypes['rgba16f'] = GL_RGBA16F_EXT\n    formatTypes['rgb16f'] = GL_RGB16F_EXT\n  }\n\n  if (extensions.webgl_color_buffer_float) {\n    formatTypes['rgba32f'] = GL_RGBA32F_EXT\n  }\n\n  var formatTypesInvert = []\n  Object.keys(formatTypes).forEach(function (key) {\n    var val = formatTypes[key]\n    formatTypesInvert[val] = key\n  })\n\n  var renderbufferCount = 0\n  var renderbufferSet = {}\n\n  function REGLRenderbuffer (renderbuffer) {\n    this.id = renderbufferCount++\n    this.refCount = 1\n\n    this.renderbuffer = renderbuffer\n\n    this.format = GL_RGBA4$1\n    this.width = 0\n    this.height = 0\n\n    if (config.profile) {\n      this.stats = { size: 0 }\n    }\n  }\n\n  REGLRenderbuffer.prototype.decRef = function () {\n    if (--this.refCount <= 0) {\n      destroy(this)\n    }\n  }\n\n  function destroy (rb) {\n    var handle = rb.renderbuffer\n    \n    gl.bindRenderbuffer(GL_RENDERBUFFER, null)\n    gl.deleteRenderbuffer(handle)\n    rb.renderbuffer = null\n    rb.refCount = 0\n    delete renderbufferSet[rb.id]\n    stats.renderbufferCount--\n  }\n\n  function createRenderbuffer (a, b) {\n    var renderbuffer = new REGLRenderbuffer(gl.createRenderbuffer())\n    renderbufferSet[renderbuffer.id] = renderbuffer\n    stats.renderbufferCount++\n\n    function reglRenderbuffer (a, b) {\n      var w = 0\n      var h = 0\n      var format = GL_RGBA4$1\n\n      if (typeof a === 'object' && a) {\n        var options = a\n        if ('shape' in options) {\n          var shape = options.shape\n          \n          w = shape[0] | 0\n          h = shape[1] | 0\n        } else {\n          if ('radius' in options) {\n            w = h = options.radius | 0\n          }\n          if ('width' in options) {\n            w = options.width | 0\n          }\n          if ('height' in options) {\n            h = options.height | 0\n          }\n        }\n        if ('format' in options) {\n          \n          format = formatTypes[options.format]\n        }\n      } else if (typeof a === 'number') {\n        w = a | 0\n        if (typeof b === 'number') {\n          h = b | 0\n        } else {\n          h = w\n        }\n      } else if (!a) {\n        w = h = 1\n      } else {\n        \n      }\n\n      // check shape\n      \n\n      if (w === renderbuffer.width &&\n          h === renderbuffer.height &&\n          format === renderbuffer.format) {\n        return\n      }\n\n      reglRenderbuffer.width = renderbuffer.width = w\n      reglRenderbuffer.height = renderbuffer.height = h\n      renderbuffer.format = format\n\n      gl.bindRenderbuffer(GL_RENDERBUFFER, renderbuffer.renderbuffer)\n      gl.renderbufferStorage(GL_RENDERBUFFER, format, w, h)\n\n      \n\n      if (config.profile) {\n        renderbuffer.stats.size = getRenderbufferSize(renderbuffer.format, renderbuffer.width, renderbuffer.height)\n      }\n      reglRenderbuffer.format = formatTypesInvert[renderbuffer.format]\n\n      return reglRenderbuffer\n    }\n\n    function resize (w_, h_) {\n      var w = w_ | 0\n      var h = (h_ | 0) || w\n\n      if (w === renderbuffer.width && h === renderbuffer.height) {\n        return reglRenderbuffer\n      }\n\n      // check shape\n      \n\n      reglRenderbuffer.width = renderbuffer.width = w\n      reglRenderbuffer.height = renderbuffer.height = h\n\n      gl.bindRenderbuffer(GL_RENDERBUFFER, renderbuffer.renderbuffer)\n      gl.renderbufferStorage(GL_RENDERBUFFER, renderbuffer.format, w, h)\n\n      \n\n      // also, recompute size.\n      if (config.profile) {\n        renderbuffer.stats.size = getRenderbufferSize(\n          renderbuffer.format, renderbuffer.width, renderbuffer.height)\n      }\n\n      return reglRenderbuffer\n    }\n\n    reglRenderbuffer(a, b)\n\n    reglRenderbuffer.resize = resize\n    reglRenderbuffer._reglType = 'renderbuffer'\n    reglRenderbuffer._renderbuffer = renderbuffer\n    if (config.profile) {\n      reglRenderbuffer.stats = renderbuffer.stats\n    }\n    reglRenderbuffer.destroy = function () {\n      renderbuffer.decRef()\n    }\n\n    return reglRenderbuffer\n  }\n\n  if (config.profile) {\n    stats.getTotalRenderbufferSize = function () {\n      var total = 0\n      Object.keys(renderbufferSet).forEach(function (key) {\n        total += renderbufferSet[key].stats.size\n      })\n      return total\n    }\n  }\n\n  function restoreRenderbuffers () {\n    values(renderbufferSet).forEach(function (rb) {\n      rb.renderbuffer = gl.createRenderbuffer()\n      gl.bindRenderbuffer(GL_RENDERBUFFER, rb.renderbuffer)\n      gl.renderbufferStorage(GL_RENDERBUFFER, rb.format, rb.width, rb.height)\n    })\n    gl.bindRenderbuffer(GL_RENDERBUFFER, null)\n  }\n\n  return {\n    create: createRenderbuffer,\n    clear: function () {\n      values(renderbufferSet).forEach(destroy)\n    },\n    restore: restoreRenderbuffers\n  }\n}\n\n// We store these constants so that the minifier can inline them\nvar GL_FRAMEBUFFER$1 = 0x8D40\nvar GL_RENDERBUFFER$1 = 0x8D41\n\nvar GL_TEXTURE_2D$2 = 0x0DE1\nvar GL_TEXTURE_CUBE_MAP_POSITIVE_X$2 = 0x8515\n\nvar GL_COLOR_ATTACHMENT0$1 = 0x8CE0\nvar GL_DEPTH_ATTACHMENT = 0x8D00\nvar GL_STENCIL_ATTACHMENT = 0x8D20\nvar GL_DEPTH_STENCIL_ATTACHMENT = 0x821A\n\nvar GL_FRAMEBUFFER_COMPLETE$1 = 0x8CD5\nvar GL_HALF_FLOAT_OES$1 = 0x8D61\nvar GL_UNSIGNED_BYTE$5 = 0x1401\nvar GL_FLOAT$4 = 0x1406\n\nvar GL_RGB$1 = 0x1907\nvar GL_RGBA$2 = 0x1908\n\n// for every texture format, store\n// the number of channels\nvar textureFormatChannels = []\ntextureFormatChannels[GL_RGBA$2] = 4\ntextureFormatChannels[GL_RGB$1] = 3\n\n// for every texture type, store\n// the size in bytes.\nvar textureTypeSizes = []\ntextureTypeSizes[GL_UNSIGNED_BYTE$5] = 1\ntextureTypeSizes[GL_FLOAT$4] = 4\ntextureTypeSizes[GL_HALF_FLOAT_OES$1] = 2\n\nfunction wrapFBOState (\n  gl,\n  extensions,\n  limits,\n  textureState,\n  renderbufferState,\n  stats) {\n  var framebufferState = {\n    cur: null,\n    next: null,\n    dirty: false,\n    setFBO: null\n  }\n\n  var colorTextureFormats = ['rgba']\n  var colorRenderbufferFormats = ['rgba4', 'rgb565', 'rgb5 a1']\n\n  if (extensions.ext_srgb) {\n    colorRenderbufferFormats.push('srgba')\n  }\n\n  if (extensions.ext_color_buffer_half_float) {\n    colorRenderbufferFormats.push('rgba16f', 'rgb16f')\n  }\n\n  if (extensions.webgl_color_buffer_float) {\n    colorRenderbufferFormats.push('rgba32f')\n  }\n\n  var colorTypes = ['uint8']\n  if (extensions.oes_texture_half_float) {\n    colorTypes.push('half float', 'float16')\n  }\n  if (extensions.oes_texture_float) {\n    colorTypes.push('float', 'float32')\n  }\n\n  function FramebufferAttachment (target, texture, renderbuffer) {\n    this.target = target\n    this.texture = texture\n    this.renderbuffer = renderbuffer\n\n    var w = 0\n    var h = 0\n    if (texture) {\n      w = texture.width\n      h = texture.height\n    } else if (renderbuffer) {\n      w = renderbuffer.width\n      h = renderbuffer.height\n    }\n    this.width = w\n    this.height = h\n  }\n\n  function decRef (attachment) {\n    if (attachment) {\n      if (attachment.texture) {\n        attachment.texture._texture.decRef()\n      }\n      if (attachment.renderbuffer) {\n        attachment.renderbuffer._renderbuffer.decRef()\n      }\n    }\n  }\n\n  function incRefAndCheckShape (attachment, width, height) {\n    if (!attachment) {\n      return\n    }\n    if (attachment.texture) {\n      var texture = attachment.texture._texture\n      var tw = Math.max(1, texture.width)\n      var th = Math.max(1, texture.height)\n      \n      texture.refCount += 1\n    } else {\n      var renderbuffer = attachment.renderbuffer._renderbuffer\n      \n      renderbuffer.refCount += 1\n    }\n  }\n\n  function attach (location, attachment) {\n    if (attachment) {\n      if (attachment.texture) {\n        gl.framebufferTexture2D(\n          GL_FRAMEBUFFER$1,\n          location,\n          attachment.target,\n          attachment.texture._texture.texture,\n          0)\n      } else {\n        gl.framebufferRenderbuffer(\n          GL_FRAMEBUFFER$1,\n          location,\n          GL_RENDERBUFFER$1,\n          attachment.renderbuffer._renderbuffer.renderbuffer)\n      }\n    }\n  }\n\n  function parseAttachment (attachment) {\n    var target = GL_TEXTURE_2D$2\n    var texture = null\n    var renderbuffer = null\n\n    var data = attachment\n    if (typeof attachment === 'object') {\n      data = attachment.data\n      if ('target' in attachment) {\n        target = attachment.target | 0\n      }\n    }\n\n    \n\n    var type = data._reglType\n    if (type === 'texture2d') {\n      texture = data\n      \n    } else if (type === 'textureCube') {\n      texture = data\n      \n    } else if (type === 'renderbuffer') {\n      renderbuffer = data\n      target = GL_RENDERBUFFER$1\n    } else {\n      \n    }\n\n    return new FramebufferAttachment(target, texture, renderbuffer)\n  }\n\n  function allocAttachment (\n    width,\n    height,\n    isTexture,\n    format,\n    type) {\n    if (isTexture) {\n      var texture = textureState.create2D({\n        width: width,\n        height: height,\n        format: format,\n        type: type\n      })\n      texture._texture.refCount = 0\n      return new FramebufferAttachment(GL_TEXTURE_2D$2, texture, null)\n    } else {\n      var rb = renderbufferState.create({\n        width: width,\n        height: height,\n        format: format\n      })\n      rb._renderbuffer.refCount = 0\n      return new FramebufferAttachment(GL_RENDERBUFFER$1, null, rb)\n    }\n  }\n\n  function unwrapAttachment (attachment) {\n    return attachment && (attachment.texture || attachment.renderbuffer)\n  }\n\n  function resizeAttachment (attachment, w, h) {\n    if (attachment) {\n      if (attachment.texture) {\n        attachment.texture.resize(w, h)\n      } else if (attachment.renderbuffer) {\n        attachment.renderbuffer.resize(w, h)\n      }\n      attachment.width = w\n      attachment.height = h\n    }\n  }\n\n  var framebufferCount = 0\n  var framebufferSet = {}\n\n  function REGLFramebuffer () {\n    this.id = framebufferCount++\n    framebufferSet[this.id] = this\n\n    this.framebuffer = gl.createFramebuffer()\n    this.width = 0\n    this.height = 0\n\n    this.colorAttachments = []\n    this.depthAttachment = null\n    this.stencilAttachment = null\n    this.depthStencilAttachment = null\n  }\n\n  function decFBORefs (framebuffer) {\n    framebuffer.colorAttachments.forEach(decRef)\n    decRef(framebuffer.depthAttachment)\n    decRef(framebuffer.stencilAttachment)\n    decRef(framebuffer.depthStencilAttachment)\n  }\n\n  function destroy (framebuffer) {\n    var handle = framebuffer.framebuffer\n    \n    gl.deleteFramebuffer(handle)\n    framebuffer.framebuffer = null\n    stats.framebufferCount--\n    delete framebufferSet[framebuffer.id]\n  }\n\n  function updateFramebuffer (framebuffer) {\n    var i\n\n    gl.bindFramebuffer(GL_FRAMEBUFFER$1, framebuffer.framebuffer)\n    var colorAttachments = framebuffer.colorAttachments\n    for (i = 0; i < colorAttachments.length; ++i) {\n      attach(GL_COLOR_ATTACHMENT0$1 + i, colorAttachments[i])\n    }\n    for (i = colorAttachments.length; i < limits.maxColorAttachments; ++i) {\n      gl.framebufferTexture2D(\n        GL_FRAMEBUFFER$1,\n        GL_COLOR_ATTACHMENT0$1 + i,\n        GL_TEXTURE_2D$2,\n        null,\n        0)\n    }\n\n    gl.framebufferTexture2D(\n      GL_FRAMEBUFFER$1,\n      GL_DEPTH_STENCIL_ATTACHMENT,\n      GL_TEXTURE_2D$2,\n      null,\n      0)\n    gl.framebufferTexture2D(\n      GL_FRAMEBUFFER$1,\n      GL_DEPTH_ATTACHMENT,\n      GL_TEXTURE_2D$2,\n      null,\n      0)\n    gl.framebufferTexture2D(\n      GL_FRAMEBUFFER$1,\n      GL_STENCIL_ATTACHMENT,\n      GL_TEXTURE_2D$2,\n      null,\n      0)\n\n    attach(GL_DEPTH_ATTACHMENT, framebuffer.depthAttachment)\n    attach(GL_STENCIL_ATTACHMENT, framebuffer.stencilAttachment)\n    attach(GL_DEPTH_STENCIL_ATTACHMENT, framebuffer.depthStencilAttachment)\n\n    // Check status code\n    var status = gl.checkFramebufferStatus(GL_FRAMEBUFFER$1)\n    if (!gl.isContextLost() && status !== GL_FRAMEBUFFER_COMPLETE$1) {\n      \n    }\n\n    gl.bindFramebuffer(GL_FRAMEBUFFER$1, framebufferState.next ? framebufferState.next.framebuffer : null)\n    framebufferState.cur = framebufferState.next\n\n    // FIXME: Clear error code here.  This is a work around for a bug in\n    // headless-gl\n    gl.getError()\n  }\n\n  function createFBO (a0, a1) {\n    var framebuffer = new REGLFramebuffer()\n    stats.framebufferCount++\n\n    function reglFramebuffer (a, b) {\n      var i\n\n      \n\n      var width = 0\n      var height = 0\n\n      var needsDepth = true\n      var needsStencil = true\n\n      var colorBuffer = null\n      var colorTexture = true\n      var colorFormat = 'rgba'\n      var colorType = 'uint8'\n      var colorCount = 1\n\n      var depthBuffer = null\n      var stencilBuffer = null\n      var depthStencilBuffer = null\n      var depthStencilTexture = false\n\n      if (typeof a === 'number') {\n        width = a | 0\n        height = (b | 0) || width\n      } else if (!a) {\n        width = height = 1\n      } else {\n        \n        var options = a\n\n        if ('shape' in options) {\n          var shape = options.shape\n          \n          width = shape[0]\n          height = shape[1]\n        } else {\n          if ('radius' in options) {\n            width = height = options.radius\n          }\n          if ('width' in options) {\n            width = options.width\n          }\n          if ('height' in options) {\n            height = options.height\n          }\n        }\n\n        if ('color' in options ||\n            'colors' in options) {\n          colorBuffer =\n            options.color ||\n            options.colors\n          if (Array.isArray(colorBuffer)) {\n            \n          }\n        }\n\n        if (!colorBuffer) {\n          if ('colorCount' in options) {\n            colorCount = options.colorCount | 0\n            \n          }\n\n          if ('colorTexture' in options) {\n            colorTexture = !!options.colorTexture\n            colorFormat = 'rgba4'\n          }\n\n          if ('colorType' in options) {\n            colorType = options.colorType\n            if (!colorTexture) {\n              if (colorType === 'half float' || colorType === 'float16') {\n                \n                colorFormat = 'rgba16f'\n              } else if (colorType === 'float' || colorType === 'float32') {\n                \n                colorFormat = 'rgba32f'\n              }\n            } else {\n              \n              \n            }\n            \n          }\n\n          if ('colorFormat' in options) {\n            colorFormat = options.colorFormat\n            if (colorTextureFormats.indexOf(colorFormat) >= 0) {\n              colorTexture = true\n            } else if (colorRenderbufferFormats.indexOf(colorFormat) >= 0) {\n              colorTexture = false\n            } else {\n              if (colorTexture) {\n                \n              } else {\n                \n              }\n            }\n          }\n        }\n\n        if ('depthTexture' in options || 'depthStencilTexture' in options) {\n          depthStencilTexture = !!(options.depthTexture ||\n            options.depthStencilTexture)\n          \n        }\n\n        if ('depth' in options) {\n          if (typeof options.depth === 'boolean') {\n            needsDepth = options.depth\n          } else {\n            depthBuffer = options.depth\n            needsStencil = false\n          }\n        }\n\n        if ('stencil' in options) {\n          if (typeof options.stencil === 'boolean') {\n            needsStencil = options.stencil\n          } else {\n            stencilBuffer = options.stencil\n            needsDepth = false\n          }\n        }\n\n        if ('depthStencil' in options) {\n          if (typeof options.depthStencil === 'boolean') {\n            needsDepth = needsStencil = options.depthStencil\n          } else {\n            depthStencilBuffer = options.depthStencil\n            needsDepth = false\n            needsStencil = false\n          }\n        }\n      }\n\n      // parse attachments\n      var colorAttachments = null\n      var depthAttachment = null\n      var stencilAttachment = null\n      var depthStencilAttachment = null\n\n      // Set up color attachments\n      if (Array.isArray(colorBuffer)) {\n        colorAttachments = colorBuffer.map(parseAttachment)\n      } else if (colorBuffer) {\n        colorAttachments = [parseAttachment(colorBuffer)]\n      } else {\n        colorAttachments = new Array(colorCount)\n        for (i = 0; i < colorCount; ++i) {\n          colorAttachments[i] = allocAttachment(\n            width,\n            height,\n            colorTexture,\n            colorFormat,\n            colorType)\n        }\n      }\n\n      \n      \n\n      width = width || colorAttachments[0].width\n      height = height || colorAttachments[0].height\n\n      if (depthBuffer) {\n        depthAttachment = parseAttachment(depthBuffer)\n      } else if (needsDepth && !needsStencil) {\n        depthAttachment = allocAttachment(\n          width,\n          height,\n          depthStencilTexture,\n          'depth',\n          'uint32')\n      }\n\n      if (stencilBuffer) {\n        stencilAttachment = parseAttachment(stencilBuffer)\n      } else if (needsStencil && !needsDepth) {\n        stencilAttachment = allocAttachment(\n          width,\n          height,\n          false,\n          'stencil',\n          'uint8')\n      }\n\n      if (depthStencilBuffer) {\n        depthStencilAttachment = parseAttachment(depthStencilBuffer)\n      } else if (!depthBuffer && !stencilBuffer && needsStencil && needsDepth) {\n        depthStencilAttachment = allocAttachment(\n          width,\n          height,\n          depthStencilTexture,\n          'depth stencil',\n          'depth stencil')\n      }\n\n      \n\n      var commonColorAttachmentSize = null\n\n      for (i = 0; i < colorAttachments.length; ++i) {\n        incRefAndCheckShape(colorAttachments[i], width, height)\n        \n\n        if (colorAttachments[i] && colorAttachments[i].texture) {\n          var colorAttachmentSize =\n              textureFormatChannels[colorAttachments[i].texture._texture.format] *\n              textureTypeSizes[colorAttachments[i].texture._texture.type]\n\n          if (commonColorAttachmentSize === null) {\n            commonColorAttachmentSize = colorAttachmentSize\n          } else {\n            // We need to make sure that all color attachments have the same number of bitplanes\n            // (that is, the same numer of bits per pixel)\n            // This is required by the GLES2.0 standard. See the beginning of Chapter 4 in that document.\n            \n          }\n        }\n      }\n      incRefAndCheckShape(depthAttachment, width, height)\n      \n      incRefAndCheckShape(stencilAttachment, width, height)\n      \n      incRefAndCheckShape(depthStencilAttachment, width, height)\n      \n\n      // decrement references\n      decFBORefs(framebuffer)\n\n      framebuffer.width = width\n      framebuffer.height = height\n\n      framebuffer.colorAttachments = colorAttachments\n      framebuffer.depthAttachment = depthAttachment\n      framebuffer.stencilAttachment = stencilAttachment\n      framebuffer.depthStencilAttachment = depthStencilAttachment\n\n      reglFramebuffer.color = colorAttachments.map(unwrapAttachment)\n      reglFramebuffer.depth = unwrapAttachment(depthAttachment)\n      reglFramebuffer.stencil = unwrapAttachment(stencilAttachment)\n      reglFramebuffer.depthStencil = unwrapAttachment(depthStencilAttachment)\n\n      reglFramebuffer.width = framebuffer.width\n      reglFramebuffer.height = framebuffer.height\n\n      updateFramebuffer(framebuffer)\n\n      return reglFramebuffer\n    }\n\n    function resize (w_, h_) {\n      \n\n      var w = Math.max(w_ | 0, 1)\n      var h = Math.max((h_ | 0) || w, 1)\n      if (w === framebuffer.width && h === framebuffer.height) {\n        return reglFramebuffer\n      }\n\n      // resize all buffers\n      var colorAttachments = framebuffer.colorAttachments\n      for (var i = 0; i < colorAttachments.length; ++i) {\n        resizeAttachment(colorAttachments[i], w, h)\n      }\n      resizeAttachment(framebuffer.depthAttachment, w, h)\n      resizeAttachment(framebuffer.stencilAttachment, w, h)\n      resizeAttachment(framebuffer.depthStencilAttachment, w, h)\n\n      framebuffer.width = reglFramebuffer.width = w\n      framebuffer.height = reglFramebuffer.height = h\n\n      updateFramebuffer(framebuffer)\n\n      return reglFramebuffer\n    }\n\n    reglFramebuffer(a0, a1)\n\n    return extend(reglFramebuffer, {\n      resize: resize,\n      _reglType: 'framebuffer',\n      _framebuffer: framebuffer,\n      destroy: function () {\n        destroy(framebuffer)\n        decFBORefs(framebuffer)\n      },\n      use: function (block) {\n        framebufferState.setFBO({\n          framebuffer: reglFramebuffer\n        }, block)\n      }\n    })\n  }\n\n  function createCubeFBO (options) {\n    var faces = Array(6)\n\n    function reglFramebufferCube (a) {\n      var i\n\n      \n\n      var params = {\n        color: null\n      }\n\n      var radius = 0\n\n      var colorBuffer = null\n      var colorFormat = 'rgba'\n      var colorType = 'uint8'\n      var colorCount = 1\n\n      if (typeof a === 'number') {\n        radius = a | 0\n      } else if (!a) {\n        radius = 1\n      } else {\n        \n        var options = a\n\n        if ('shape' in options) {\n          var shape = options.shape\n          \n          \n          radius = shape[0]\n        } else {\n          if ('radius' in options) {\n            radius = options.radius | 0\n          }\n          if ('width' in options) {\n            radius = options.width | 0\n            if ('height' in options) {\n              \n            }\n          } else if ('height' in options) {\n            radius = options.height | 0\n          }\n        }\n\n        if ('color' in options ||\n            'colors' in options) {\n          colorBuffer =\n            options.color ||\n            options.colors\n          if (Array.isArray(colorBuffer)) {\n            \n          }\n        }\n\n        if (!colorBuffer) {\n          if ('colorCount' in options) {\n            colorCount = options.colorCount | 0\n            \n          }\n\n          if ('colorType' in options) {\n            \n            colorType = options.colorType\n          }\n\n          if ('colorFormat' in options) {\n            colorFormat = options.colorFormat\n            \n          }\n        }\n\n        if ('depth' in options) {\n          params.depth = options.depth\n        }\n\n        if ('stencil' in options) {\n          params.stencil = options.stencil\n        }\n\n        if ('depthStencil' in options) {\n          params.depthStencil = options.depthStencil\n        }\n      }\n\n      var colorCubes\n      if (colorBuffer) {\n        if (Array.isArray(colorBuffer)) {\n          colorCubes = []\n          for (i = 0; i < colorBuffer.length; ++i) {\n            colorCubes[i] = colorBuffer[i]\n          }\n        } else {\n          colorCubes = [ colorBuffer ]\n        }\n      } else {\n        colorCubes = Array(colorCount)\n        var cubeMapParams = {\n          radius: radius,\n          format: colorFormat,\n          type: colorType\n        }\n        for (i = 0; i < colorCount; ++i) {\n          colorCubes[i] = textureState.createCube(cubeMapParams)\n        }\n      }\n\n      // Check color cubes\n      params.color = Array(colorCubes.length)\n      for (i = 0; i < colorCubes.length; ++i) {\n        var cube = colorCubes[i]\n        \n        radius = radius || cube.width\n        \n        params.color[i] = {\n          target: GL_TEXTURE_CUBE_MAP_POSITIVE_X$2,\n          data: colorCubes[i]\n        }\n      }\n\n      for (i = 0; i < 6; ++i) {\n        for (var j = 0; j < colorCubes.length; ++j) {\n          params.color[j].target = GL_TEXTURE_CUBE_MAP_POSITIVE_X$2 + i\n        }\n        // reuse depth-stencil attachments across all cube maps\n        if (i > 0) {\n          params.depth = faces[0].depth\n          params.stencil = faces[0].stencil\n          params.depthStencil = faces[0].depthStencil\n        }\n        if (faces[i]) {\n          (faces[i])(params)\n        } else {\n          faces[i] = createFBO(params)\n        }\n      }\n\n      return extend(reglFramebufferCube, {\n        width: radius,\n        height: radius,\n        color: colorCubes\n      })\n    }\n\n    function resize (radius_) {\n      var i\n      var radius = radius_ | 0\n      \n\n      if (radius === reglFramebufferCube.width) {\n        return reglFramebufferCube\n      }\n\n      var colors = reglFramebufferCube.color\n      for (i = 0; i < colors.length; ++i) {\n        colors[i].resize(radius)\n      }\n\n      for (i = 0; i < 6; ++i) {\n        faces[i].resize(radius)\n      }\n\n      reglFramebufferCube.width = reglFramebufferCube.height = radius\n\n      return reglFramebufferCube\n    }\n\n    reglFramebufferCube(options)\n\n    return extend(reglFramebufferCube, {\n      faces: faces,\n      resize: resize,\n      _reglType: 'framebufferCube',\n      destroy: function () {\n        faces.forEach(function (f) {\n          f.destroy()\n        })\n      }\n    })\n  }\n\n  function restoreFramebuffers () {\n    framebufferState.cur = null\n    framebufferState.next = null\n    framebufferState.dirty = true\n    values(framebufferSet).forEach(function (fb) {\n      fb.framebuffer = gl.createFramebuffer()\n      updateFramebuffer(fb)\n    })\n  }\n\n  return extend(framebufferState, {\n    getFramebuffer: function (object) {\n      if (typeof object === 'function' && object._reglType === 'framebuffer') {\n        var fbo = object._framebuffer\n        if (fbo instanceof REGLFramebuffer) {\n          return fbo\n        }\n      }\n      return null\n    },\n    create: createFBO,\n    createCube: createCubeFBO,\n    clear: function () {\n      values(framebufferSet).forEach(destroy)\n    },\n    restore: restoreFramebuffers\n  })\n}\n\nvar GL_FLOAT$5 = 5126\nvar GL_ARRAY_BUFFER$1 = 34962\n\nfunction AttributeRecord () {\n  this.state = 0\n\n  this.x = 0.0\n  this.y = 0.0\n  this.z = 0.0\n  this.w = 0.0\n\n  this.buffer = null\n  this.size = 0\n  this.normalized = false\n  this.type = GL_FLOAT$5\n  this.offset = 0\n  this.stride = 0\n  this.divisor = 0\n}\n\nfunction wrapAttributeState (\n  gl,\n  extensions,\n  limits,\n  stats,\n  bufferState) {\n  var NUM_ATTRIBUTES = limits.maxAttributes\n  var attributeBindings = new Array(NUM_ATTRIBUTES)\n  for (var i = 0; i < NUM_ATTRIBUTES; ++i) {\n    attributeBindings[i] = new AttributeRecord()\n  }\n  var vaoCount = 0\n  var vaoSet = {}\n\n  var state = {\n    Record: AttributeRecord,\n    scope: {},\n    state: attributeBindings,\n    currentVAO: null,\n    targetVAO: null,\n    restore: extVAO() ? restoreVAO : function () {},\n    createVAO: createVAO,\n    getVAO: getVAO,\n    destroyBuffer: destroyBuffer,\n    setVAO: extVAO() ? setVAOEXT : setVAOEmulated,\n    clear: extVAO() ? destroyVAOEXT : function () {}\n  }\n\n  function destroyBuffer (buffer) {\n    for (var i = 0; i < attributeBindings.length; ++i) {\n      var record = attributeBindings[i]\n      if (record.buffer === buffer) {\n        gl.disableVertexAttribArray(i)\n        record.buffer = null\n      }\n    }\n  }\n\n  function extVAO () {\n    return extensions.oes_vertex_array_object\n  }\n\n  function extInstanced () {\n    return extensions.angle_instanced_arrays\n  }\n\n  function getVAO (vao) {\n    if (typeof vao === 'function' && vao._vao) {\n      return vao._vao\n    }\n    return null\n  }\n\n  function setVAOEXT (vao) {\n    if (vao === state.currentVAO) {\n      return\n    }\n    var ext = extVAO()\n    if (vao) {\n      ext.bindVertexArrayOES(vao.vao)\n    } else {\n      ext.bindVertexArrayOES(null)\n    }\n    state.currentVAO = vao\n  }\n\n  function setVAOEmulated (vao) {\n    if (vao === state.currentVAO) {\n      return\n    }\n    if (vao) {\n      vao.bindAttrs()\n    } else {\n      var exti = extInstanced()\n      for (var i = 0; i < attributeBindings.length; ++i) {\n        var binding = attributeBindings[i]\n        if (binding.buffer) {\n          gl.enableVertexAttribArray(i)\n          gl.vertexAttribPointer(i, binding.size, binding.type, binding.normalized, binding.stride, binding.offfset)\n          if (exti && binding.divisor) {\n            exti.vertexAttribDivisorANGLE(i, binding.divisor)\n          }\n        } else {\n          gl.disableVertexAttribArray(i)\n          gl.vertexAttrib4f(i, binding.x, binding.y, binding.z, binding.w)\n        }\n      }\n    }\n    state.currentVAO = vao\n  }\n\n  function destroyVAOEXT () {\n    values(vaoSet).forEach(function (vao) {\n      vao.destroy()\n    })\n  }\n\n  function REGLVAO () {\n    this.id = ++vaoCount\n    this.attributes = []\n    var extension = extVAO()\n    if (extension) {\n      this.vao = extension.createVertexArrayOES()\n    } else {\n      this.vao = null\n    }\n    vaoSet[this.id] = this\n    this.buffers = []\n  }\n\n  REGLVAO.prototype.bindAttrs = function () {\n    var exti = extInstanced()\n    var attributes = this.attributes\n    for (var i = 0; i < attributes.length; ++i) {\n      var attr = attributes[i]\n      if (attr.buffer) {\n        gl.enableVertexAttribArray(i)\n        gl.bindBuffer(GL_ARRAY_BUFFER$1, attr.buffer.buffer)\n        gl.vertexAttribPointer(i, attr.size, attr.type, attr.normalized, attr.stride, attr.offset)\n        if (exti && attr.divisor) {\n          exti.vertexAttribDivisorANGLE(i, attr.divisor)\n        }\n      } else {\n        gl.disableVertexAttribArray(i)\n        gl.vertexAttrib4f(i, attr.x, attr.y, attr.z, attr.w)\n      }\n    }\n    for (var j = attributes.length; j < NUM_ATTRIBUTES; ++j) {\n      gl.disableVertexAttribArray(j)\n    }\n  }\n\n  REGLVAO.prototype.refresh = function () {\n    var ext = extVAO()\n    if (ext) {\n      ext.bindVertexArrayOES(this.vao)\n      this.bindAttrs()\n      state.currentVAO = this\n    }\n  }\n\n  REGLVAO.prototype.destroy = function () {\n    if (this.vao) {\n      var extension = extVAO()\n      if (this === state.currentVAO) {\n        state.currentVAO = null\n        extension.bindVertexArrayOES(null)\n      }\n      extension.deleteVertexArrayOES(this.vao)\n      this.vao = null\n    }\n    if (vaoSet[this.id]) {\n      delete vaoSet[this.id]\n      stats.vaoCount -= 1\n    }\n  }\n\n  function restoreVAO () {\n    var ext = extVAO()\n    if (ext) {\n      values(vaoSet).forEach(function (vao) {\n        vao.refresh()\n      })\n    }\n  }\n\n  function createVAO (_attr) {\n    var vao = new REGLVAO()\n    stats.vaoCount += 1\n\n    function updateVAO (attributes) {\n      \n      \n      \n\n      var bufUpdated = {}\n      var nattributes = vao.attributes\n      nattributes.length = attributes.length\n      for (var i = 0; i < attributes.length; ++i) {\n        var spec = attributes[i]\n        var rec = nattributes[i] = new AttributeRecord()\n        var data = spec.data || spec\n        if (Array.isArray(data) || isTypedArray(data) || isNDArrayLike(data)) {\n          var buf\n          if (vao.buffers[i]) {\n            buf = vao.buffers[i]\n            if (isTypedArray(data) && buf._buffer.byteLength >= data.byteLength) {\n              buf.subdata(data)\n            } else {\n              buf.destroy()\n              vao.buffers[i] = null\n            }\n          }\n          if (!vao.buffers[i]) {\n            buf = vao.buffers[i] = bufferState.create(spec, GL_ARRAY_BUFFER$1, false, true)\n          }\n          rec.buffer = bufferState.getBuffer(buf)\n          rec.size = rec.buffer.dimension | 0\n          rec.normalized = false\n          rec.type = rec.buffer.dtype\n          rec.offset = 0\n          rec.stride = 0\n          rec.divisor = 0\n          rec.state = 1\n          bufUpdated[i] = 1\n        } else if (bufferState.getBuffer(spec)) {\n          rec.buffer = bufferState.getBuffer(spec)\n          rec.size = rec.buffer.dimension | 0\n          rec.normalized = false\n          rec.type = rec.buffer.dtype\n          rec.offset = 0\n          rec.stride = 0\n          rec.divisor = 0\n          rec.state = 1\n        } else if (bufferState.getBuffer(spec.buffer)) {\n          rec.buffer = bufferState.getBuffer(spec.buffer)\n          rec.size = ((+spec.size) || rec.buffer.dimension) | 0\n          rec.normalized = !!spec.normalized || false\n          if ('type' in spec) {\n            \n            rec.type = glTypes[spec.type]\n          } else {\n            rec.type = rec.buffer.dtype\n          }\n          rec.offset = (spec.offset || 0) | 0\n          rec.stride = (spec.stride || 0) | 0\n          rec.divisor = (spec.divisor || 0) | 0\n          rec.state = 1\n\n          \n          \n          \n          \n          \n        } else if ('x' in spec) {\n          \n          rec.x = +spec.x || 0\n          rec.y = +spec.y || 0\n          rec.z = +spec.z || 0\n          rec.w = +spec.w || 0\n          rec.state = 2\n        } else {\n          \n        }\n      }\n\n      // retire unused buffers\n      for (var j = 0; j < vao.buffers.length; ++j) {\n        if (!bufUpdated[j] && vao.buffers[j]) {\n          vao.buffers[j].destroy()\n          vao.buffers[j] = null\n        }\n      }\n\n      vao.refresh()\n      return updateVAO\n    }\n\n    updateVAO.destroy = function () {\n      for (var j = 0; j < vao.buffers.length; ++j) {\n        if (vao.buffers[j]) {\n          vao.buffers[j].destroy()\n        }\n      }\n      vao.buffers.length = 0\n      vao.destroy()\n    }\n\n    updateVAO._vao = vao\n    updateVAO._reglType = 'vao'\n\n    return updateVAO(_attr)\n  }\n\n  return state\n}\n\nvar GL_FRAGMENT_SHADER = 35632\nvar GL_VERTEX_SHADER = 35633\n\nvar GL_ACTIVE_UNIFORMS = 0x8B86\nvar GL_ACTIVE_ATTRIBUTES = 0x8B89\n\nfunction wrapShaderState (gl, stringStore, stats, config) {\n  // ===================================================\n  // glsl compilation and linking\n  // ===================================================\n  var fragShaders = {}\n  var vertShaders = {}\n\n  function ActiveInfo (name, id, location, info) {\n    this.name = name\n    this.id = id\n    this.location = location\n    this.info = info\n  }\n\n  function insertActiveInfo (list, info) {\n    for (var i = 0; i < list.length; ++i) {\n      if (list[i].id === info.id) {\n        list[i].location = info.location\n        return\n      }\n    }\n    list.push(info)\n  }\n\n  function getShader (type, id, command) {\n    var cache = type === GL_FRAGMENT_SHADER ? fragShaders : vertShaders\n    var shader = cache[id]\n\n    if (!shader) {\n      var source = stringStore.str(id)\n      shader = gl.createShader(type)\n      gl.shaderSource(shader, source)\n      gl.compileShader(shader)\n      \n      cache[id] = shader\n    }\n\n    return shader\n  }\n\n  // ===================================================\n  // program linking\n  // ===================================================\n  var programCache = {}\n  var programList = []\n\n  var PROGRAM_COUNTER = 0\n\n  function REGLProgram (fragId, vertId) {\n    this.id = PROGRAM_COUNTER++\n    this.fragId = fragId\n    this.vertId = vertId\n    this.program = null\n    this.uniforms = []\n    this.attributes = []\n    this.refCount = 1\n\n    if (config.profile) {\n      this.stats = {\n        uniformsCount: 0,\n        attributesCount: 0\n      }\n    }\n  }\n\n  function linkProgram (desc, command, attributeLocations) {\n    var i, info\n\n    // -------------------------------\n    // compile & link\n    // -------------------------------\n    var fragShader = getShader(GL_FRAGMENT_SHADER, desc.fragId)\n    var vertShader = getShader(GL_VERTEX_SHADER, desc.vertId)\n\n    var program = desc.program = gl.createProgram()\n    gl.attachShader(program, fragShader)\n    gl.attachShader(program, vertShader)\n    if (attributeLocations) {\n      for (i = 0; i < attributeLocations.length; ++i) {\n        var binding = attributeLocations[i]\n        gl.bindAttribLocation(program, binding[0], binding[1])\n      }\n    }\n\n    gl.linkProgram(program)\n    \n\n    // -------------------------------\n    // grab uniforms\n    // -------------------------------\n    var numUniforms = gl.getProgramParameter(program, GL_ACTIVE_UNIFORMS)\n    if (config.profile) {\n      desc.stats.uniformsCount = numUniforms\n    }\n    var uniforms = desc.uniforms\n    for (i = 0; i < numUniforms; ++i) {\n      info = gl.getActiveUniform(program, i)\n      if (info) {\n        if (info.size > 1) {\n          for (var j = 0; j < info.size; ++j) {\n            var name = info.name.replace('[0]', '[' + j + ']')\n            insertActiveInfo(uniforms, new ActiveInfo(\n              name,\n              stringStore.id(name),\n              gl.getUniformLocation(program, name),\n              info))\n          }\n        } else {\n          insertActiveInfo(uniforms, new ActiveInfo(\n            info.name,\n            stringStore.id(info.name),\n            gl.getUniformLocation(program, info.name),\n            info))\n        }\n      }\n    }\n\n    // -------------------------------\n    // grab attributes\n    // -------------------------------\n    var numAttributes = gl.getProgramParameter(program, GL_ACTIVE_ATTRIBUTES)\n    if (config.profile) {\n      desc.stats.attributesCount = numAttributes\n    }\n\n    var attributes = desc.attributes\n    for (i = 0; i < numAttributes; ++i) {\n      info = gl.getActiveAttrib(program, i)\n      if (info) {\n        insertActiveInfo(attributes, new ActiveInfo(\n          info.name,\n          stringStore.id(info.name),\n          gl.getAttribLocation(program, info.name),\n          info))\n      }\n    }\n  }\n\n  if (config.profile) {\n    stats.getMaxUniformsCount = function () {\n      var m = 0\n      programList.forEach(function (desc) {\n        if (desc.stats.uniformsCount > m) {\n          m = desc.stats.uniformsCount\n        }\n      })\n      return m\n    }\n\n    stats.getMaxAttributesCount = function () {\n      var m = 0\n      programList.forEach(function (desc) {\n        if (desc.stats.attributesCount > m) {\n          m = desc.stats.attributesCount\n        }\n      })\n      return m\n    }\n  }\n\n  function restoreShaders () {\n    fragShaders = {}\n    vertShaders = {}\n    for (var i = 0; i < programList.length; ++i) {\n      linkProgram(programList[i], null, programList[i].attributes.map(function (info) {\n        return [info.location, info.name]\n      }))\n    }\n  }\n\n  return {\n    clear: function () {\n      var deleteShader = gl.deleteShader.bind(gl)\n      values(fragShaders).forEach(deleteShader)\n      fragShaders = {}\n      values(vertShaders).forEach(deleteShader)\n      vertShaders = {}\n\n      programList.forEach(function (desc) {\n        gl.deleteProgram(desc.program)\n      })\n      programList.length = 0\n      programCache = {}\n\n      stats.shaderCount = 0\n    },\n\n    program: function (vertId, fragId, command, attribLocations) {\n      \n      \n\n      var cache = programCache[fragId]\n      if (!cache) {\n        cache = programCache[fragId] = {}\n      }\n      var prevProgram = cache[vertId]\n      if (prevProgram) {\n        prevProgram.refCount++\n        if (!attribLocations) {\n          return prevProgram\n        }\n      }\n      var program = new REGLProgram(fragId, vertId)\n      stats.shaderCount++\n      linkProgram(program, command, attribLocations)\n      if (!prevProgram) {\n        cache[vertId] = program\n      }\n      programList.push(program)\n      return extend(program, {\n        destroy: function () {\n          program.refCount--\n          if (program.refCount <= 0) {\n            gl.deleteProgram(program.program)\n            var idx = programList.indexOf(program)\n            programList.splice(idx, 1)\n            stats.shaderCount--\n          }\n          // no program is linked to this vert anymore\n          if (cache[program.vertId].refCount <= 0) {\n            gl.deleteShader(vertShaders[program.vertId])\n            delete vertShaders[program.vertId]\n            delete programCache[program.fragId][program.vertId]\n          }\n          // no program is linked to this frag anymore\n          if (!Object.keys(programCache[program.fragId]).length) {\n            gl.deleteShader(fragShaders[program.fragId])\n            delete fragShaders[program.fragId]\n            delete programCache[program.fragId]\n          }\n        }\n      })\n    },\n\n    restore: restoreShaders,\n\n    shader: getShader,\n\n    frag: -1,\n    vert: -1\n  }\n}\n\nvar GL_RGBA$3 = 6408\nvar GL_UNSIGNED_BYTE$6 = 5121\nvar GL_PACK_ALIGNMENT = 0x0D05\nvar GL_FLOAT$6 = 0x1406 // 5126\n\nfunction wrapReadPixels (\n  gl,\n  framebufferState,\n  reglPoll,\n  context,\n  glAttributes,\n  extensions,\n  limits) {\n  function readPixelsImpl (input) {\n    var type\n    if (framebufferState.next === null) {\n      \n      type = GL_UNSIGNED_BYTE$6\n    } else {\n      \n      type = framebufferState.next.colorAttachments[0].texture._texture.type\n\n      if (extensions.oes_texture_float) {\n        \n\n        if (type === GL_FLOAT$6) {\n          \n        }\n      } else {\n        \n      }\n    }\n\n    var x = 0\n    var y = 0\n    var width = context.framebufferWidth\n    var height = context.framebufferHeight\n    var data = null\n\n    if (isTypedArray(input)) {\n      data = input\n    } else if (input) {\n      \n      x = input.x | 0\n      y = input.y | 0\n      \n      \n      width = (input.width || (context.framebufferWidth - x)) | 0\n      height = (input.height || (context.framebufferHeight - y)) | 0\n      data = input.data || null\n    }\n\n    // sanity check input.data\n    if (data) {\n      if (type === GL_UNSIGNED_BYTE$6) {\n        \n      } else if (type === GL_FLOAT$6) {\n        \n      }\n    }\n\n    \n    \n\n    // Update WebGL state\n    reglPoll()\n\n    // Compute size\n    var size = width * height * 4\n\n    // Allocate data\n    if (!data) {\n      if (type === GL_UNSIGNED_BYTE$6) {\n        data = new Uint8Array(size)\n      } else if (type === GL_FLOAT$6) {\n        data = data || new Float32Array(size)\n      }\n    }\n\n    // Type check\n    \n    \n\n    // Run read pixels\n    gl.pixelStorei(GL_PACK_ALIGNMENT, 4)\n    gl.readPixels(x, y, width, height, GL_RGBA$3,\n      type,\n      data)\n\n    return data\n  }\n\n  function readPixelsFBO (options) {\n    var result\n    framebufferState.setFBO({\n      framebuffer: options.framebuffer\n    }, function () {\n      result = readPixelsImpl(options)\n    })\n    return result\n  }\n\n  function readPixels (options) {\n    if (!options || !('framebuffer' in options)) {\n      return readPixelsImpl(options)\n    } else {\n      return readPixelsFBO(options)\n    }\n  }\n\n  return readPixels\n}\n\nfunction slice (x) {\n  return Array.prototype.slice.call(x)\n}\n\nfunction join (x) {\n  return slice(x).join('')\n}\n\nfunction createEnvironment () {\n  // Unique variable id counter\n  var varCounter = 0\n\n  // Linked values are passed from this scope into the generated code block\n  // Calling link() passes a value into the generated scope and returns\n  // the variable name which it is bound to\n  var linkedNames = []\n  var linkedValues = []\n  function link (value) {\n    for (var i = 0; i < linkedValues.length; ++i) {\n      if (linkedValues[i] === value) {\n        return linkedNames[i]\n      }\n    }\n\n    var name = 'g' + (varCounter++)\n    linkedNames.push(name)\n    linkedValues.push(value)\n    return name\n  }\n\n  // create a code block\n  function block () {\n    var code = []\n    function push () {\n      code.push.apply(code, slice(arguments))\n    }\n\n    var vars = []\n    function def () {\n      var name = 'v' + (varCounter++)\n      vars.push(name)\n\n      if (arguments.length > 0) {\n        code.push(name, '=')\n        code.push.apply(code, slice(arguments))\n        code.push(';')\n      }\n\n      return name\n    }\n\n    return extend(push, {\n      def: def,\n      toString: function () {\n        return join([\n          (vars.length > 0 ? 'var ' + vars.join(',') + ';' : ''),\n          join(code)\n        ])\n      }\n    })\n  }\n\n  function scope () {\n    var entry = block()\n    var exit = block()\n\n    var entryToString = entry.toString\n    var exitToString = exit.toString\n\n    function save (object, prop) {\n      exit(object, prop, '=', entry.def(object, prop), ';')\n    }\n\n    return extend(function () {\n      entry.apply(entry, slice(arguments))\n    }, {\n      def: entry.def,\n      entry: entry,\n      exit: exit,\n      save: save,\n      set: function (object, prop, value) {\n        save(object, prop)\n        entry(object, prop, '=', value, ';')\n      },\n      toString: function () {\n        return entryToString() + exitToString()\n      }\n    })\n  }\n\n  function conditional () {\n    var pred = join(arguments)\n    var thenBlock = scope()\n    var elseBlock = scope()\n\n    var thenToString = thenBlock.toString\n    var elseToString = elseBlock.toString\n\n    return extend(thenBlock, {\n      then: function () {\n        thenBlock.apply(thenBlock, slice(arguments))\n        return this\n      },\n      else: function () {\n        elseBlock.apply(elseBlock, slice(arguments))\n        return this\n      },\n      toString: function () {\n        var elseClause = elseToString()\n        if (elseClause) {\n          elseClause = 'else{' + elseClause + '}'\n        }\n        return join([\n          'if(', pred, '){',\n          thenToString(),\n          '}', elseClause\n        ])\n      }\n    })\n  }\n\n  // procedure list\n  var globalBlock = block()\n  var procedures = {}\n  function proc (name, count) {\n    var args = []\n    function arg () {\n      var name = 'a' + args.length\n      args.push(name)\n      return name\n    }\n\n    count = count || 0\n    for (var i = 0; i < count; ++i) {\n      arg()\n    }\n\n    var body = scope()\n    var bodyToString = body.toString\n\n    var result = procedures[name] = extend(body, {\n      arg: arg,\n      toString: function () {\n        return join([\n          'function(', args.join(), '){',\n          bodyToString(),\n          '}'\n        ])\n      }\n    })\n\n    return result\n  }\n\n  function compile () {\n    var code = ['\"use strict\";',\n      globalBlock,\n      'return {']\n    Object.keys(procedures).forEach(function (name) {\n      code.push('\"', name, '\":', procedures[name].toString(), ',')\n    })\n    code.push('}')\n    var src = join(code)\n      .replace(/;/g, ';\\n')\n      .replace(/}/g, '}\\n')\n      .replace(/{/g, '{\\n')\n    var proc = Function.apply(null, linkedNames.concat(src))\n    return proc.apply(null, linkedValues)\n  }\n\n  return {\n    global: globalBlock,\n    link: link,\n    block: block,\n    proc: proc,\n    scope: scope,\n    cond: conditional,\n    compile: compile\n  }\n}\n\n// \"cute\" names for vector components\nvar CUTE_COMPONENTS = 'xyzw'.split('')\n\nvar GL_UNSIGNED_BYTE$7 = 5121\n\nvar ATTRIB_STATE_POINTER = 1\nvar ATTRIB_STATE_CONSTANT = 2\n\nvar DYN_FUNC$1 = 0\nvar DYN_PROP$1 = 1\nvar DYN_CONTEXT$1 = 2\nvar DYN_STATE$1 = 3\nvar DYN_THUNK = 4\nvar DYN_CONSTANT$1 = 5\nvar DYN_ARRAY$1 = 6\n\nvar S_DITHER = 'dither'\nvar S_BLEND_ENABLE = 'blend.enable'\nvar S_BLEND_COLOR = 'blend.color'\nvar S_BLEND_EQUATION = 'blend.equation'\nvar S_BLEND_FUNC = 'blend.func'\nvar S_DEPTH_ENABLE = 'depth.enable'\nvar S_DEPTH_FUNC = 'depth.func'\nvar S_DEPTH_RANGE = 'depth.range'\nvar S_DEPTH_MASK = 'depth.mask'\nvar S_COLOR_MASK = 'colorMask'\nvar S_CULL_ENABLE = 'cull.enable'\nvar S_CULL_FACE = 'cull.face'\nvar S_FRONT_FACE = 'frontFace'\nvar S_LINE_WIDTH = 'lineWidth'\nvar S_POLYGON_OFFSET_ENABLE = 'polygonOffset.enable'\nvar S_POLYGON_OFFSET_OFFSET = 'polygonOffset.offset'\nvar S_SAMPLE_ALPHA = 'sample.alpha'\nvar S_SAMPLE_ENABLE = 'sample.enable'\nvar S_SAMPLE_COVERAGE = 'sample.coverage'\nvar S_STENCIL_ENABLE = 'stencil.enable'\nvar S_STENCIL_MASK = 'stencil.mask'\nvar S_STENCIL_FUNC = 'stencil.func'\nvar S_STENCIL_OPFRONT = 'stencil.opFront'\nvar S_STENCIL_OPBACK = 'stencil.opBack'\nvar S_SCISSOR_ENABLE = 'scissor.enable'\nvar S_SCISSOR_BOX = 'scissor.box'\nvar S_VIEWPORT = 'viewport'\n\nvar S_PROFILE = 'profile'\n\nvar S_FRAMEBUFFER = 'framebuffer'\nvar S_VERT = 'vert'\nvar S_FRAG = 'frag'\nvar S_ELEMENTS = 'elements'\nvar S_PRIMITIVE = 'primitive'\nvar S_COUNT = 'count'\nvar S_OFFSET = 'offset'\nvar S_INSTANCES = 'instances'\nvar S_VAO = 'vao'\n\nvar SUFFIX_WIDTH = 'Width'\nvar SUFFIX_HEIGHT = 'Height'\n\nvar S_FRAMEBUFFER_WIDTH = S_FRAMEBUFFER + SUFFIX_WIDTH\nvar S_FRAMEBUFFER_HEIGHT = S_FRAMEBUFFER + SUFFIX_HEIGHT\nvar S_VIEWPORT_WIDTH = S_VIEWPORT + SUFFIX_WIDTH\nvar S_VIEWPORT_HEIGHT = S_VIEWPORT + SUFFIX_HEIGHT\nvar S_DRAWINGBUFFER = 'drawingBuffer'\nvar S_DRAWINGBUFFER_WIDTH = S_DRAWINGBUFFER + SUFFIX_WIDTH\nvar S_DRAWINGBUFFER_HEIGHT = S_DRAWINGBUFFER + SUFFIX_HEIGHT\n\nvar NESTED_OPTIONS = [\n  S_BLEND_FUNC,\n  S_BLEND_EQUATION,\n  S_STENCIL_FUNC,\n  S_STENCIL_OPFRONT,\n  S_STENCIL_OPBACK,\n  S_SAMPLE_COVERAGE,\n  S_VIEWPORT,\n  S_SCISSOR_BOX,\n  S_POLYGON_OFFSET_OFFSET\n]\n\nvar GL_ARRAY_BUFFER$2 = 34962\nvar GL_ELEMENT_ARRAY_BUFFER$1 = 34963\n\nvar GL_CULL_FACE = 0x0B44\nvar GL_BLEND = 0x0BE2\nvar GL_DITHER = 0x0BD0\nvar GL_STENCIL_TEST = 0x0B90\nvar GL_DEPTH_TEST = 0x0B71\nvar GL_SCISSOR_TEST = 0x0C11\nvar GL_POLYGON_OFFSET_FILL = 0x8037\nvar GL_SAMPLE_ALPHA_TO_COVERAGE = 0x809E\nvar GL_SAMPLE_COVERAGE = 0x80A0\n\nvar GL_FLOAT$7 = 5126\nvar GL_FLOAT_VEC2 = 35664\nvar GL_FLOAT_VEC3 = 35665\nvar GL_FLOAT_VEC4 = 35666\nvar GL_INT$2 = 5124\nvar GL_INT_VEC2 = 35667\nvar GL_INT_VEC3 = 35668\nvar GL_INT_VEC4 = 35669\nvar GL_BOOL = 35670\nvar GL_BOOL_VEC2 = 35671\nvar GL_BOOL_VEC3 = 35672\nvar GL_BOOL_VEC4 = 35673\nvar GL_FLOAT_MAT2 = 35674\nvar GL_FLOAT_MAT3 = 35675\nvar GL_FLOAT_MAT4 = 35676\nvar GL_SAMPLER_2D = 35678\nvar GL_SAMPLER_CUBE = 35680\n\nvar GL_TRIANGLES$1 = 4\n\nvar GL_FRONT = 1028\nvar GL_BACK = 1029\nvar GL_CW = 0x0900\nvar GL_CCW = 0x0901\nvar GL_MIN_EXT = 0x8007\nvar GL_MAX_EXT = 0x8008\nvar GL_ALWAYS = 519\nvar GL_KEEP = 7680\nvar GL_ZERO = 0\nvar GL_ONE = 1\nvar GL_FUNC_ADD = 0x8006\nvar GL_LESS = 513\n\nvar GL_FRAMEBUFFER$2 = 0x8D40\nvar GL_COLOR_ATTACHMENT0$2 = 0x8CE0\n\nvar blendFuncs = {\n  '0': 0,\n  '1': 1,\n  'zero': 0,\n  'one': 1,\n  'src color': 768,\n  'one minus src color': 769,\n  'src alpha': 770,\n  'one minus src alpha': 771,\n  'dst color': 774,\n  'one minus dst color': 775,\n  'dst alpha': 772,\n  'one minus dst alpha': 773,\n  'constant color': 32769,\n  'one minus constant color': 32770,\n  'constant alpha': 32771,\n  'one minus constant alpha': 32772,\n  'src alpha saturate': 776\n}\n\nvar compareFuncs = {\n  'never': 512,\n  'less': 513,\n  '<': 513,\n  'equal': 514,\n  '=': 514,\n  '==': 514,\n  '===': 514,\n  'lequal': 515,\n  '<=': 515,\n  'greater': 516,\n  '>': 516,\n  'notequal': 517,\n  '!=': 517,\n  '!==': 517,\n  'gequal': 518,\n  '>=': 518,\n  'always': 519\n}\n\nvar stencilOps = {\n  '0': 0,\n  'zero': 0,\n  'keep': 7680,\n  'replace': 7681,\n  'increment': 7682,\n  'decrement': 7683,\n  'increment wrap': 34055,\n  'decrement wrap': 34056,\n  'invert': 5386\n}\n\nvar orientationType = {\n  'cw': GL_CW,\n  'ccw': GL_CCW\n}\n\nfunction isBufferArgs (x) {\n  return Array.isArray(x) ||\n    isTypedArray(x) ||\n    isNDArrayLike(x)\n}\n\n// Make sure viewport is processed first\nfunction sortState (state) {\n  return state.sort(function (a, b) {\n    if (a === S_VIEWPORT) {\n      return -1\n    } else if (b === S_VIEWPORT) {\n      return 1\n    }\n    return (a < b) ? -1 : 1\n  })\n}\n\nfunction Declaration (thisDep, contextDep, propDep, append) {\n  this.thisDep = thisDep\n  this.contextDep = contextDep\n  this.propDep = propDep\n  this.append = append\n}\n\nfunction isStatic (decl) {\n  return decl && !(decl.thisDep || decl.contextDep || decl.propDep)\n}\n\nfunction createStaticDecl (append) {\n  return new Declaration(false, false, false, append)\n}\n\nfunction createDynamicDecl (dyn, append) {\n  var type = dyn.type\n  if (type === DYN_FUNC$1) {\n    var numArgs = dyn.data.length\n    return new Declaration(\n      true,\n      numArgs >= 1,\n      numArgs >= 2,\n      append)\n  } else if (type === DYN_THUNK) {\n    var data = dyn.data\n    return new Declaration(\n      data.thisDep,\n      data.contextDep,\n      data.propDep,\n      append)\n  } else if (type === DYN_CONSTANT$1) {\n    return new Declaration(\n      false,\n      false,\n      false,\n      append)\n  } else if (type === DYN_ARRAY$1) {\n    var thisDep = false\n    var contextDep = false\n    var propDep = false\n    for (var i = 0; i < dyn.data.length; ++i) {\n      var subDyn = dyn.data[i]\n      if (subDyn.type === DYN_PROP$1) {\n        propDep = true\n      } else if (subDyn.type === DYN_CONTEXT$1) {\n        contextDep = true\n      } else if (subDyn.type === DYN_STATE$1) {\n        thisDep = true\n      } else if (subDyn.type === DYN_FUNC$1) {\n        thisDep = true\n        var subArgs = subDyn.data\n        if (subArgs >= 1) {\n          contextDep = true\n        }\n        if (subArgs >= 2) {\n          propDep = true\n        }\n      } else if (subDyn.type === DYN_THUNK) {\n        thisDep = thisDep || subDyn.data.thisDep\n        contextDep = contextDep || subDyn.data.contextDep\n        propDep = propDep || subDyn.data.propDep\n      }\n    }\n    return new Declaration(\n      thisDep,\n      contextDep,\n      propDep,\n      append)\n  } else {\n    return new Declaration(\n      type === DYN_STATE$1,\n      type === DYN_CONTEXT$1,\n      type === DYN_PROP$1,\n      append)\n  }\n}\n\nvar SCOPE_DECL = new Declaration(false, false, false, function () {})\n\nfunction reglCore (\n  gl,\n  stringStore,\n  extensions,\n  limits,\n  bufferState,\n  elementState,\n  textureState,\n  framebufferState,\n  uniformState,\n  attributeState,\n  shaderState,\n  drawState,\n  contextState,\n  timer,\n  config) {\n  var AttributeRecord = attributeState.Record\n\n  var blendEquations = {\n    'add': 32774,\n    'subtract': 32778,\n    'reverse subtract': 32779\n  }\n  if (extensions.ext_blend_minmax) {\n    blendEquations.min = GL_MIN_EXT\n    blendEquations.max = GL_MAX_EXT\n  }\n\n  var extInstancing = extensions.angle_instanced_arrays\n  var extDrawBuffers = extensions.webgl_draw_buffers\n\n  // ===================================================\n  // ===================================================\n  // WEBGL STATE\n  // ===================================================\n  // ===================================================\n  var currentState = {\n    dirty: true,\n    profile: config.profile\n  }\n  var nextState = {}\n  var GL_STATE_NAMES = []\n  var GL_FLAGS = {}\n  var GL_VARIABLES = {}\n\n  function propName (name) {\n    return name.replace('.', '_')\n  }\n\n  function stateFlag (sname, cap, init) {\n    var name = propName(sname)\n    GL_STATE_NAMES.push(sname)\n    nextState[name] = currentState[name] = !!init\n    GL_FLAGS[name] = cap\n  }\n\n  function stateVariable (sname, func, init) {\n    var name = propName(sname)\n    GL_STATE_NAMES.push(sname)\n    if (Array.isArray(init)) {\n      currentState[name] = init.slice()\n      nextState[name] = init.slice()\n    } else {\n      currentState[name] = nextState[name] = init\n    }\n    GL_VARIABLES[name] = func\n  }\n\n  // Dithering\n  stateFlag(S_DITHER, GL_DITHER)\n\n  // Blending\n  stateFlag(S_BLEND_ENABLE, GL_BLEND)\n  stateVariable(S_BLEND_COLOR, 'blendColor', [0, 0, 0, 0])\n  stateVariable(S_BLEND_EQUATION, 'blendEquationSeparate',\n    [GL_FUNC_ADD, GL_FUNC_ADD])\n  stateVariable(S_BLEND_FUNC, 'blendFuncSeparate',\n    [GL_ONE, GL_ZERO, GL_ONE, GL_ZERO])\n\n  // Depth\n  stateFlag(S_DEPTH_ENABLE, GL_DEPTH_TEST, true)\n  stateVariable(S_DEPTH_FUNC, 'depthFunc', GL_LESS)\n  stateVariable(S_DEPTH_RANGE, 'depthRange', [0, 1])\n  stateVariable(S_DEPTH_MASK, 'depthMask', true)\n\n  // Color mask\n  stateVariable(S_COLOR_MASK, S_COLOR_MASK, [true, true, true, true])\n\n  // Face culling\n  stateFlag(S_CULL_ENABLE, GL_CULL_FACE)\n  stateVariable(S_CULL_FACE, 'cullFace', GL_BACK)\n\n  // Front face orientation\n  stateVariable(S_FRONT_FACE, S_FRONT_FACE, GL_CCW)\n\n  // Line width\n  stateVariable(S_LINE_WIDTH, S_LINE_WIDTH, 1)\n\n  // Polygon offset\n  stateFlag(S_POLYGON_OFFSET_ENABLE, GL_POLYGON_OFFSET_FILL)\n  stateVariable(S_POLYGON_OFFSET_OFFSET, 'polygonOffset', [0, 0])\n\n  // Sample coverage\n  stateFlag(S_SAMPLE_ALPHA, GL_SAMPLE_ALPHA_TO_COVERAGE)\n  stateFlag(S_SAMPLE_ENABLE, GL_SAMPLE_COVERAGE)\n  stateVariable(S_SAMPLE_COVERAGE, 'sampleCoverage', [1, false])\n\n  // Stencil\n  stateFlag(S_STENCIL_ENABLE, GL_STENCIL_TEST)\n  stateVariable(S_STENCIL_MASK, 'stencilMask', -1)\n  stateVariable(S_STENCIL_FUNC, 'stencilFunc', [GL_ALWAYS, 0, -1])\n  stateVariable(S_STENCIL_OPFRONT, 'stencilOpSeparate',\n    [GL_FRONT, GL_KEEP, GL_KEEP, GL_KEEP])\n  stateVariable(S_STENCIL_OPBACK, 'stencilOpSeparate',\n    [GL_BACK, GL_KEEP, GL_KEEP, GL_KEEP])\n\n  // Scissor\n  stateFlag(S_SCISSOR_ENABLE, GL_SCISSOR_TEST)\n  stateVariable(S_SCISSOR_BOX, 'scissor',\n    [0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight])\n\n  // Viewport\n  stateVariable(S_VIEWPORT, S_VIEWPORT,\n    [0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight])\n\n  // ===================================================\n  // ===================================================\n  // ENVIRONMENT\n  // ===================================================\n  // ===================================================\n  var sharedState = {\n    gl: gl,\n    context: contextState,\n    strings: stringStore,\n    next: nextState,\n    current: currentState,\n    draw: drawState,\n    elements: elementState,\n    buffer: bufferState,\n    shader: shaderState,\n    attributes: attributeState.state,\n    vao: attributeState,\n    uniforms: uniformState,\n    framebuffer: framebufferState,\n    extensions: extensions,\n\n    timer: timer,\n    isBufferArgs: isBufferArgs\n  }\n\n  var sharedConstants = {\n    primTypes: primTypes,\n    compareFuncs: compareFuncs,\n    blendFuncs: blendFuncs,\n    blendEquations: blendEquations,\n    stencilOps: stencilOps,\n    glTypes: glTypes,\n    orientationType: orientationType\n  }\n\n  \n\n  if (extDrawBuffers) {\n    sharedConstants.backBuffer = [GL_BACK]\n    sharedConstants.drawBuffer = loop(limits.maxDrawbuffers, function (i) {\n      if (i === 0) {\n        return [0]\n      }\n      return loop(i, function (j) {\n        return GL_COLOR_ATTACHMENT0$2 + j\n      })\n    })\n  }\n\n  var drawCallCounter = 0\n  function createREGLEnvironment () {\n    var env = createEnvironment()\n    var link = env.link\n    var global = env.global\n    env.id = drawCallCounter++\n\n    env.batchId = '0'\n\n    // link shared state\n    var SHARED = link(sharedState)\n    var shared = env.shared = {\n      props: 'a0'\n    }\n    Object.keys(sharedState).forEach(function (prop) {\n      shared[prop] = global.def(SHARED, '.', prop)\n    })\n\n    // Inject runtime assertion stuff for debug builds\n    \n\n    // Copy GL state variables over\n    var nextVars = env.next = {}\n    var currentVars = env.current = {}\n    Object.keys(GL_VARIABLES).forEach(function (variable) {\n      if (Array.isArray(currentState[variable])) {\n        nextVars[variable] = global.def(shared.next, '.', variable)\n        currentVars[variable] = global.def(shared.current, '.', variable)\n      }\n    })\n\n    // Initialize shared constants\n    var constants = env.constants = {}\n    Object.keys(sharedConstants).forEach(function (name) {\n      constants[name] = global.def(JSON.stringify(sharedConstants[name]))\n    })\n\n    // Helper function for calling a block\n    env.invoke = function (block, x) {\n      switch (x.type) {\n        case DYN_FUNC$1:\n          var argList = [\n            'this',\n            shared.context,\n            shared.props,\n            env.batchId\n          ]\n          return block.def(\n            link(x.data), '.call(',\n            argList.slice(0, Math.max(x.data.length + 1, 4)),\n            ')')\n        case DYN_PROP$1:\n          return block.def(shared.props, x.data)\n        case DYN_CONTEXT$1:\n          return block.def(shared.context, x.data)\n        case DYN_STATE$1:\n          return block.def('this', x.data)\n        case DYN_THUNK:\n          x.data.append(env, block)\n          return x.data.ref\n        case DYN_CONSTANT$1:\n          return x.data.toString()\n        case DYN_ARRAY$1:\n          return x.data.map(function (y) {\n            return env.invoke(block, y)\n          })\n      }\n    }\n\n    env.attribCache = {}\n\n    var scopeAttribs = {}\n    env.scopeAttrib = function (name) {\n      var id = stringStore.id(name)\n      if (id in scopeAttribs) {\n        return scopeAttribs[id]\n      }\n      var binding = attributeState.scope[id]\n      if (!binding) {\n        binding = attributeState.scope[id] = new AttributeRecord()\n      }\n      var result = scopeAttribs[id] = link(binding)\n      return result\n    }\n\n    return env\n  }\n\n  // ===================================================\n  // ===================================================\n  // PARSING\n  // ===================================================\n  // ===================================================\n  function parseProfile (options) {\n    var staticOptions = options.static\n    var dynamicOptions = options.dynamic\n\n    var profileEnable\n    if (S_PROFILE in staticOptions) {\n      var value = !!staticOptions[S_PROFILE]\n      profileEnable = createStaticDecl(function (env, scope) {\n        return value\n      })\n      profileEnable.enable = value\n    } else if (S_PROFILE in dynamicOptions) {\n      var dyn = dynamicOptions[S_PROFILE]\n      profileEnable = createDynamicDecl(dyn, function (env, scope) {\n        return env.invoke(scope, dyn)\n      })\n    }\n\n    return profileEnable\n  }\n\n  function parseFramebuffer (options, env) {\n    var staticOptions = options.static\n    var dynamicOptions = options.dynamic\n\n    if (S_FRAMEBUFFER in staticOptions) {\n      var framebuffer = staticOptions[S_FRAMEBUFFER]\n      if (framebuffer) {\n        framebuffer = framebufferState.getFramebuffer(framebuffer)\n        \n        return createStaticDecl(function (env, block) {\n          var FRAMEBUFFER = env.link(framebuffer)\n          var shared = env.shared\n          block.set(\n            shared.framebuffer,\n            '.next',\n            FRAMEBUFFER)\n          var CONTEXT = shared.context\n          block.set(\n            CONTEXT,\n            '.' + S_FRAMEBUFFER_WIDTH,\n            FRAMEBUFFER + '.width')\n          block.set(\n            CONTEXT,\n            '.' + S_FRAMEBUFFER_HEIGHT,\n            FRAMEBUFFER + '.height')\n          return FRAMEBUFFER\n        })\n      } else {\n        return createStaticDecl(function (env, scope) {\n          var shared = env.shared\n          scope.set(\n            shared.framebuffer,\n            '.next',\n            'null')\n          var CONTEXT = shared.context\n          scope.set(\n            CONTEXT,\n            '.' + S_FRAMEBUFFER_WIDTH,\n            CONTEXT + '.' + S_DRAWINGBUFFER_WIDTH)\n          scope.set(\n            CONTEXT,\n            '.' + S_FRAMEBUFFER_HEIGHT,\n            CONTEXT + '.' + S_DRAWINGBUFFER_HEIGHT)\n          return 'null'\n        })\n      }\n    } else if (S_FRAMEBUFFER in dynamicOptions) {\n      var dyn = dynamicOptions[S_FRAMEBUFFER]\n      return createDynamicDecl(dyn, function (env, scope) {\n        var FRAMEBUFFER_FUNC = env.invoke(scope, dyn)\n        var shared = env.shared\n        var FRAMEBUFFER_STATE = shared.framebuffer\n        var FRAMEBUFFER = scope.def(\n          FRAMEBUFFER_STATE, '.getFramebuffer(', FRAMEBUFFER_FUNC, ')')\n\n        \n\n        scope.set(\n          FRAMEBUFFER_STATE,\n          '.next',\n          FRAMEBUFFER)\n        var CONTEXT = shared.context\n        scope.set(\n          CONTEXT,\n          '.' + S_FRAMEBUFFER_WIDTH,\n          FRAMEBUFFER + '?' + FRAMEBUFFER + '.width:' +\n          CONTEXT + '.' + S_DRAWINGBUFFER_WIDTH)\n        scope.set(\n          CONTEXT,\n          '.' + S_FRAMEBUFFER_HEIGHT,\n          FRAMEBUFFER +\n          '?' + FRAMEBUFFER + '.height:' +\n          CONTEXT + '.' + S_DRAWINGBUFFER_HEIGHT)\n        return FRAMEBUFFER\n      })\n    } else {\n      return null\n    }\n  }\n\n  function parseViewportScissor (options, framebuffer, env) {\n    var staticOptions = options.static\n    var dynamicOptions = options.dynamic\n\n    function parseBox (param) {\n      if (param in staticOptions) {\n        var box = staticOptions[param]\n        \n\n        var isStatic = true\n        var x = box.x | 0\n        var y = box.y | 0\n        var w, h\n        if ('width' in box) {\n          w = box.width | 0\n          \n        } else {\n          isStatic = false\n        }\n        if ('height' in box) {\n          h = box.height | 0\n          \n        } else {\n          isStatic = false\n        }\n\n        return new Declaration(\n          !isStatic && framebuffer && framebuffer.thisDep,\n          !isStatic && framebuffer && framebuffer.contextDep,\n          !isStatic && framebuffer && framebuffer.propDep,\n          function (env, scope) {\n            var CONTEXT = env.shared.context\n            var BOX_W = w\n            if (!('width' in box)) {\n              BOX_W = scope.def(CONTEXT, '.', S_FRAMEBUFFER_WIDTH, '-', x)\n            }\n            var BOX_H = h\n            if (!('height' in box)) {\n              BOX_H = scope.def(CONTEXT, '.', S_FRAMEBUFFER_HEIGHT, '-', y)\n            }\n            return [x, y, BOX_W, BOX_H]\n          })\n      } else if (param in dynamicOptions) {\n        var dynBox = dynamicOptions[param]\n        var result = createDynamicDecl(dynBox, function (env, scope) {\n          var BOX = env.invoke(scope, dynBox)\n\n          \n\n          var CONTEXT = env.shared.context\n          var BOX_X = scope.def(BOX, '.x|0')\n          var BOX_Y = scope.def(BOX, '.y|0')\n          var BOX_W = scope.def(\n            '\"width\" in ', BOX, '?', BOX, '.width|0:',\n            '(', CONTEXT, '.', S_FRAMEBUFFER_WIDTH, '-', BOX_X, ')')\n          var BOX_H = scope.def(\n            '\"height\" in ', BOX, '?', BOX, '.height|0:',\n            '(', CONTEXT, '.', S_FRAMEBUFFER_HEIGHT, '-', BOX_Y, ')')\n\n          \n\n          return [BOX_X, BOX_Y, BOX_W, BOX_H]\n        })\n        if (framebuffer) {\n          result.thisDep = result.thisDep || framebuffer.thisDep\n          result.contextDep = result.contextDep || framebuffer.contextDep\n          result.propDep = result.propDep || framebuffer.propDep\n        }\n        return result\n      } else if (framebuffer) {\n        return new Declaration(\n          framebuffer.thisDep,\n          framebuffer.contextDep,\n          framebuffer.propDep,\n          function (env, scope) {\n            var CONTEXT = env.shared.context\n            return [\n              0, 0,\n              scope.def(CONTEXT, '.', S_FRAMEBUFFER_WIDTH),\n              scope.def(CONTEXT, '.', S_FRAMEBUFFER_HEIGHT)]\n          })\n      } else {\n        return null\n      }\n    }\n\n    var viewport = parseBox(S_VIEWPORT)\n\n    if (viewport) {\n      var prevViewport = viewport\n      viewport = new Declaration(\n        viewport.thisDep,\n        viewport.contextDep,\n        viewport.propDep,\n        function (env, scope) {\n          var VIEWPORT = prevViewport.append(env, scope)\n          var CONTEXT = env.shared.context\n          scope.set(\n            CONTEXT,\n            '.' + S_VIEWPORT_WIDTH,\n            VIEWPORT[2])\n          scope.set(\n            CONTEXT,\n            '.' + S_VIEWPORT_HEIGHT,\n            VIEWPORT[3])\n          return VIEWPORT\n        })\n    }\n\n    return {\n      viewport: viewport,\n      scissor_box: parseBox(S_SCISSOR_BOX)\n    }\n  }\n\n  function parseAttribLocations (options, attributes) {\n    var staticOptions = options.static\n    var staticProgram =\n      typeof staticOptions[S_FRAG] === 'string' &&\n      typeof staticOptions[S_VERT] === 'string'\n    if (staticProgram) {\n      if (Object.keys(attributes.dynamic).length > 0) {\n        return null\n      }\n      var staticAttributes = attributes.static\n      var sAttributes = Object.keys(staticAttributes)\n      if (sAttributes.length > 0 && typeof staticAttributes[sAttributes[0]] === 'number') {\n        var bindings = []\n        for (var i = 0; i < sAttributes.length; ++i) {\n          \n          bindings.push([staticAttributes[sAttributes[i]] | 0, sAttributes[i]])\n        }\n        return bindings\n      }\n    }\n    return null\n  }\n\n  function parseProgram (options, env, attribLocations) {\n    var staticOptions = options.static\n    var dynamicOptions = options.dynamic\n\n    function parseShader (name) {\n      if (name in staticOptions) {\n        var id = stringStore.id(staticOptions[name])\n        \n        var result = createStaticDecl(function () {\n          return id\n        })\n        result.id = id\n        return result\n      } else if (name in dynamicOptions) {\n        var dyn = dynamicOptions[name]\n        return createDynamicDecl(dyn, function (env, scope) {\n          var str = env.invoke(scope, dyn)\n          var id = scope.def(env.shared.strings, '.id(', str, ')')\n          \n          return id\n        })\n      }\n      return null\n    }\n\n    var frag = parseShader(S_FRAG)\n    var vert = parseShader(S_VERT)\n\n    var program = null\n    var progVar\n    if (isStatic(frag) && isStatic(vert)) {\n      program = shaderState.program(vert.id, frag.id, null, attribLocations)\n      progVar = createStaticDecl(function (env, scope) {\n        return env.link(program)\n      })\n    } else {\n      progVar = new Declaration(\n        (frag && frag.thisDep) || (vert && vert.thisDep),\n        (frag && frag.contextDep) || (vert && vert.contextDep),\n        (frag && frag.propDep) || (vert && vert.propDep),\n        function (env, scope) {\n          var SHADER_STATE = env.shared.shader\n          var fragId\n          if (frag) {\n            fragId = frag.append(env, scope)\n          } else {\n            fragId = scope.def(SHADER_STATE, '.', S_FRAG)\n          }\n          var vertId\n          if (vert) {\n            vertId = vert.append(env, scope)\n          } else {\n            vertId = scope.def(SHADER_STATE, '.', S_VERT)\n          }\n          var progDef = SHADER_STATE + '.program(' + vertId + ',' + fragId\n          \n          return scope.def(progDef + ')')\n        })\n    }\n\n    return {\n      frag: frag,\n      vert: vert,\n      progVar: progVar,\n      program: program\n    }\n  }\n\n  function parseDraw (options, env) {\n    var staticOptions = options.static\n    var dynamicOptions = options.dynamic\n\n    function parseElements () {\n      if (S_ELEMENTS in staticOptions) {\n        var elements = staticOptions[S_ELEMENTS]\n        if (isBufferArgs(elements)) {\n          elements = elementState.getElements(elementState.create(elements, true))\n        } else if (elements) {\n          elements = elementState.getElements(elements)\n          \n        }\n        var result = createStaticDecl(function (env, scope) {\n          if (elements) {\n            var result = env.link(elements)\n            env.ELEMENTS = result\n            return result\n          }\n          env.ELEMENTS = null\n          return null\n        })\n        result.value = elements\n        return result\n      } else if (S_ELEMENTS in dynamicOptions) {\n        var dyn = dynamicOptions[S_ELEMENTS]\n        return createDynamicDecl(dyn, function (env, scope) {\n          var shared = env.shared\n\n          var IS_BUFFER_ARGS = shared.isBufferArgs\n          var ELEMENT_STATE = shared.elements\n\n          var elementDefn = env.invoke(scope, dyn)\n          var elements = scope.def('null')\n          var elementStream = scope.def(IS_BUFFER_ARGS, '(', elementDefn, ')')\n\n          var ifte = env.cond(elementStream)\n            .then(elements, '=', ELEMENT_STATE, '.createStream(', elementDefn, ');')\n            .else(elements, '=', ELEMENT_STATE, '.getElements(', elementDefn, ');')\n\n          \n\n          scope.entry(ifte)\n          scope.exit(\n            env.cond(elementStream)\n              .then(ELEMENT_STATE, '.destroyStream(', elements, ');'))\n\n          env.ELEMENTS = elements\n\n          return elements\n        })\n      }\n\n      return null\n    }\n\n    var elements = parseElements()\n\n    function parsePrimitive () {\n      if (S_PRIMITIVE in staticOptions) {\n        var primitive = staticOptions[S_PRIMITIVE]\n        \n        return createStaticDecl(function (env, scope) {\n          return primTypes[primitive]\n        })\n      } else if (S_PRIMITIVE in dynamicOptions) {\n        var dynPrimitive = dynamicOptions[S_PRIMITIVE]\n        return createDynamicDecl(dynPrimitive, function (env, scope) {\n          var PRIM_TYPES = env.constants.primTypes\n          var prim = env.invoke(scope, dynPrimitive)\n          \n          return scope.def(PRIM_TYPES, '[', prim, ']')\n        })\n      } else if (elements) {\n        if (isStatic(elements)) {\n          if (elements.value) {\n            return createStaticDecl(function (env, scope) {\n              return scope.def(env.ELEMENTS, '.primType')\n            })\n          } else {\n            return createStaticDecl(function () {\n              return GL_TRIANGLES$1\n            })\n          }\n        } else {\n          return new Declaration(\n            elements.thisDep,\n            elements.contextDep,\n            elements.propDep,\n            function (env, scope) {\n              var elements = env.ELEMENTS\n              return scope.def(elements, '?', elements, '.primType:', GL_TRIANGLES$1)\n            })\n        }\n      }\n      return null\n    }\n\n    function parseParam (param, isOffset) {\n      if (param in staticOptions) {\n        var value = staticOptions[param] | 0\n        \n        return createStaticDecl(function (env, scope) {\n          if (isOffset) {\n            env.OFFSET = value\n          }\n          return value\n        })\n      } else if (param in dynamicOptions) {\n        var dynValue = dynamicOptions[param]\n        return createDynamicDecl(dynValue, function (env, scope) {\n          var result = env.invoke(scope, dynValue)\n          if (isOffset) {\n            env.OFFSET = result\n            \n          }\n          return result\n        })\n      } else if (isOffset && elements) {\n        return createStaticDecl(function (env, scope) {\n          env.OFFSET = '0'\n          return 0\n        })\n      }\n      return null\n    }\n\n    var OFFSET = parseParam(S_OFFSET, true)\n\n    function parseVertCount () {\n      if (S_COUNT in staticOptions) {\n        var count = staticOptions[S_COUNT] | 0\n        \n        return createStaticDecl(function () {\n          return count\n        })\n      } else if (S_COUNT in dynamicOptions) {\n        var dynCount = dynamicOptions[S_COUNT]\n        return createDynamicDecl(dynCount, function (env, scope) {\n          var result = env.invoke(scope, dynCount)\n          \n          return result\n        })\n      } else if (elements) {\n        if (isStatic(elements)) {\n          if (elements) {\n            if (OFFSET) {\n              return new Declaration(\n                OFFSET.thisDep,\n                OFFSET.contextDep,\n                OFFSET.propDep,\n                function (env, scope) {\n                  var result = scope.def(\n                    env.ELEMENTS, '.vertCount-', env.OFFSET)\n\n                  \n\n                  return result\n                })\n            } else {\n              return createStaticDecl(function (env, scope) {\n                return scope.def(env.ELEMENTS, '.vertCount')\n              })\n            }\n          } else {\n            var result = createStaticDecl(function () {\n              return -1\n            })\n            \n            return result\n          }\n        } else {\n          var variable = new Declaration(\n            elements.thisDep || OFFSET.thisDep,\n            elements.contextDep || OFFSET.contextDep,\n            elements.propDep || OFFSET.propDep,\n            function (env, scope) {\n              var elements = env.ELEMENTS\n              if (env.OFFSET) {\n                return scope.def(elements, '?', elements, '.vertCount-',\n                  env.OFFSET, ':-1')\n              }\n              return scope.def(elements, '?', elements, '.vertCount:-1')\n            })\n          \n          return variable\n        }\n      }\n      return null\n    }\n\n    return {\n      elements: elements,\n      primitive: parsePrimitive(),\n      count: parseVertCount(),\n      instances: parseParam(S_INSTANCES, false),\n      offset: OFFSET\n    }\n  }\n\n  function parseGLState (options, env) {\n    var staticOptions = options.static\n    var dynamicOptions = options.dynamic\n\n    var STATE = {}\n\n    GL_STATE_NAMES.forEach(function (prop) {\n      var param = propName(prop)\n\n      function parseParam (parseStatic, parseDynamic) {\n        if (prop in staticOptions) {\n          var value = parseStatic(staticOptions[prop])\n          STATE[param] = createStaticDecl(function () {\n            return value\n          })\n        } else if (prop in dynamicOptions) {\n          var dyn = dynamicOptions[prop]\n          STATE[param] = createDynamicDecl(dyn, function (env, scope) {\n            return parseDynamic(env, scope, env.invoke(scope, dyn))\n          })\n        }\n      }\n\n      switch (prop) {\n        case S_CULL_ENABLE:\n        case S_BLEND_ENABLE:\n        case S_DITHER:\n        case S_STENCIL_ENABLE:\n        case S_DEPTH_ENABLE:\n        case S_SCISSOR_ENABLE:\n        case S_POLYGON_OFFSET_ENABLE:\n        case S_SAMPLE_ALPHA:\n        case S_SAMPLE_ENABLE:\n        case S_DEPTH_MASK:\n          return parseParam(\n            function (value) {\n              \n              return value\n            },\n            function (env, scope, value) {\n              \n              return value\n            })\n\n        case S_DEPTH_FUNC:\n          return parseParam(\n            function (value) {\n              \n              return compareFuncs[value]\n            },\n            function (env, scope, value) {\n              var COMPARE_FUNCS = env.constants.compareFuncs\n              \n              return scope.def(COMPARE_FUNCS, '[', value, ']')\n            })\n\n        case S_DEPTH_RANGE:\n          return parseParam(\n            function (value) {\n              \n              return value\n            },\n            function (env, scope, value) {\n              \n\n              var Z_NEAR = scope.def('+', value, '[0]')\n              var Z_FAR = scope.def('+', value, '[1]')\n              return [Z_NEAR, Z_FAR]\n            })\n\n        case S_BLEND_FUNC:\n          return parseParam(\n            function (value) {\n              \n              var srcRGB = ('srcRGB' in value ? value.srcRGB : value.src)\n              var srcAlpha = ('srcAlpha' in value ? value.srcAlpha : value.src)\n              var dstRGB = ('dstRGB' in value ? value.dstRGB : value.dst)\n              var dstAlpha = ('dstAlpha' in value ? value.dstAlpha : value.dst)\n              \n              \n              \n              \n\n              \n\n              return [\n                blendFuncs[srcRGB],\n                blendFuncs[dstRGB],\n                blendFuncs[srcAlpha],\n                blendFuncs[dstAlpha]\n              ]\n            },\n            function (env, scope, value) {\n              var BLEND_FUNCS = env.constants.blendFuncs\n\n              \n\n              function read (prefix, suffix) {\n                var func = scope.def(\n                  '\"', prefix, suffix, '\" in ', value,\n                  '?', value, '.', prefix, suffix,\n                  ':', value, '.', prefix)\n\n                \n\n                return func\n              }\n\n              var srcRGB = read('src', 'RGB')\n              var dstRGB = read('dst', 'RGB')\n\n              \n\n              var SRC_RGB = scope.def(BLEND_FUNCS, '[', srcRGB, ']')\n              var SRC_ALPHA = scope.def(BLEND_FUNCS, '[', read('src', 'Alpha'), ']')\n              var DST_RGB = scope.def(BLEND_FUNCS, '[', dstRGB, ']')\n              var DST_ALPHA = scope.def(BLEND_FUNCS, '[', read('dst', 'Alpha'), ']')\n\n              return [SRC_RGB, DST_RGB, SRC_ALPHA, DST_ALPHA]\n            })\n\n        case S_BLEND_EQUATION:\n          return parseParam(\n            function (value) {\n              if (typeof value === 'string') {\n                \n                return [\n                  blendEquations[value],\n                  blendEquations[value]\n                ]\n              } else if (typeof value === 'object') {\n                \n                \n                return [\n                  blendEquations[value.rgb],\n                  blendEquations[value.alpha]\n                ]\n              } else {\n                \n              }\n            },\n            function (env, scope, value) {\n              var BLEND_EQUATIONS = env.constants.blendEquations\n\n              var RGB = scope.def()\n              var ALPHA = scope.def()\n\n              var ifte = env.cond('typeof ', value, '===\"string\"')\n\n              \n\n              ifte.then(\n                RGB, '=', ALPHA, '=', BLEND_EQUATIONS, '[', value, '];')\n              ifte.else(\n                RGB, '=', BLEND_EQUATIONS, '[', value, '.rgb];',\n                ALPHA, '=', BLEND_EQUATIONS, '[', value, '.alpha];')\n\n              scope(ifte)\n\n              return [RGB, ALPHA]\n            })\n\n        case S_BLEND_COLOR:\n          return parseParam(\n            function (value) {\n              \n              return loop(4, function (i) {\n                return +value[i]\n              })\n            },\n            function (env, scope, value) {\n              \n              return loop(4, function (i) {\n                return scope.def('+', value, '[', i, ']')\n              })\n            })\n\n        case S_STENCIL_MASK:\n          return parseParam(\n            function (value) {\n              \n              return value | 0\n            },\n            function (env, scope, value) {\n              \n              return scope.def(value, '|0')\n            })\n\n        case S_STENCIL_FUNC:\n          return parseParam(\n            function (value) {\n              \n              var cmp = value.cmp || 'keep'\n              var ref = value.ref || 0\n              var mask = 'mask' in value ? value.mask : -1\n              \n              \n              \n              return [\n                compareFuncs[cmp],\n                ref,\n                mask\n              ]\n            },\n            function (env, scope, value) {\n              var COMPARE_FUNCS = env.constants.compareFuncs\n              \n              var cmp = scope.def(\n                '\"cmp\" in ', value,\n                '?', COMPARE_FUNCS, '[', value, '.cmp]',\n                ':', GL_KEEP)\n              var ref = scope.def(value, '.ref|0')\n              var mask = scope.def(\n                '\"mask\" in ', value,\n                '?', value, '.mask|0:-1')\n              return [cmp, ref, mask]\n            })\n\n        case S_STENCIL_OPFRONT:\n        case S_STENCIL_OPBACK:\n          return parseParam(\n            function (value) {\n              \n              var fail = value.fail || 'keep'\n              var zfail = value.zfail || 'keep'\n              var zpass = value.zpass || 'keep'\n              \n              \n              \n              return [\n                prop === S_STENCIL_OPBACK ? GL_BACK : GL_FRONT,\n                stencilOps[fail],\n                stencilOps[zfail],\n                stencilOps[zpass]\n              ]\n            },\n            function (env, scope, value) {\n              var STENCIL_OPS = env.constants.stencilOps\n\n              \n\n              function read (name) {\n                \n\n                return scope.def(\n                  '\"', name, '\" in ', value,\n                  '?', STENCIL_OPS, '[', value, '.', name, ']:',\n                  GL_KEEP)\n              }\n\n              return [\n                prop === S_STENCIL_OPBACK ? GL_BACK : GL_FRONT,\n                read('fail'),\n                read('zfail'),\n                read('zpass')\n              ]\n            })\n\n        case S_POLYGON_OFFSET_OFFSET:\n          return parseParam(\n            function (value) {\n              \n              var factor = value.factor | 0\n              var units = value.units | 0\n              \n              \n              return [factor, units]\n            },\n            function (env, scope, value) {\n              \n\n              var FACTOR = scope.def(value, '.factor|0')\n              var UNITS = scope.def(value, '.units|0')\n\n              return [FACTOR, UNITS]\n            })\n\n        case S_CULL_FACE:\n          return parseParam(\n            function (value) {\n              var face = 0\n              if (value === 'front') {\n                face = GL_FRONT\n              } else if (value === 'back') {\n                face = GL_BACK\n              }\n              \n              return face\n            },\n            function (env, scope, value) {\n              \n              return scope.def(value, '===\"front\"?', GL_FRONT, ':', GL_BACK)\n            })\n\n        case S_LINE_WIDTH:\n          return parseParam(\n            function (value) {\n              \n              return value\n            },\n            function (env, scope, value) {\n              \n\n              return value\n            })\n\n        case S_FRONT_FACE:\n          return parseParam(\n            function (value) {\n              \n              return orientationType[value]\n            },\n            function (env, scope, value) {\n              \n              return scope.def(value + '===\"cw\"?' + GL_CW + ':' + GL_CCW)\n            })\n\n        case S_COLOR_MASK:\n          return parseParam(\n            function (value) {\n              \n              return value.map(function (v) { return !!v })\n            },\n            function (env, scope, value) {\n              \n              return loop(4, function (i) {\n                return '!!' + value + '[' + i + ']'\n              })\n            })\n\n        case S_SAMPLE_COVERAGE:\n          return parseParam(\n            function (value) {\n              \n              var sampleValue = 'value' in value ? value.value : 1\n              var sampleInvert = !!value.invert\n              \n              return [sampleValue, sampleInvert]\n            },\n            function (env, scope, value) {\n              \n              var VALUE = scope.def(\n                '\"value\" in ', value, '?+', value, '.value:1')\n              var INVERT = scope.def('!!', value, '.invert')\n              return [VALUE, INVERT]\n            })\n      }\n    })\n\n    return STATE\n  }\n\n  function parseUniforms (uniforms, env) {\n    var staticUniforms = uniforms.static\n    var dynamicUniforms = uniforms.dynamic\n\n    var UNIFORMS = {}\n\n    Object.keys(staticUniforms).forEach(function (name) {\n      var value = staticUniforms[name]\n      var result\n      if (typeof value === 'number' ||\n          typeof value === 'boolean') {\n        result = createStaticDecl(function () {\n          return value\n        })\n      } else if (typeof value === 'function') {\n        var reglType = value._reglType\n        if (reglType === 'texture2d' ||\n            reglType === 'textureCube') {\n          result = createStaticDecl(function (env) {\n            return env.link(value)\n          })\n        } else if (reglType === 'framebuffer' ||\n                   reglType === 'framebufferCube') {\n          \n          result = createStaticDecl(function (env) {\n            return env.link(value.color[0])\n          })\n        } else {\n          \n        }\n      } else if (isArrayLike(value)) {\n        result = createStaticDecl(function (env) {\n          var ITEM = env.global.def('[',\n            loop(value.length, function (i) {\n              \n              return value[i]\n            }), ']')\n          return ITEM\n        })\n      } else {\n        \n      }\n      result.value = value\n      UNIFORMS[name] = result\n    })\n\n    Object.keys(dynamicUniforms).forEach(function (key) {\n      var dyn = dynamicUniforms[key]\n      UNIFORMS[key] = createDynamicDecl(dyn, function (env, scope) {\n        return env.invoke(scope, dyn)\n      })\n    })\n\n    return UNIFORMS\n  }\n\n  function parseAttributes (attributes, env) {\n    var staticAttributes = attributes.static\n    var dynamicAttributes = attributes.dynamic\n\n    var attributeDefs = {}\n\n    Object.keys(staticAttributes).forEach(function (attribute) {\n      var value = staticAttributes[attribute]\n      var id = stringStore.id(attribute)\n\n      var record = new AttributeRecord()\n      if (isBufferArgs(value)) {\n        record.state = ATTRIB_STATE_POINTER\n        record.buffer = bufferState.getBuffer(\n          bufferState.create(value, GL_ARRAY_BUFFER$2, false, true))\n        record.type = 0\n      } else {\n        var buffer = bufferState.getBuffer(value)\n        if (buffer) {\n          record.state = ATTRIB_STATE_POINTER\n          record.buffer = buffer\n          record.type = 0\n        } else {\n          \n          if ('constant' in value) {\n            var constant = value.constant\n            record.buffer = 'null'\n            record.state = ATTRIB_STATE_CONSTANT\n            if (typeof constant === 'number') {\n              record.x = constant\n            } else {\n              \n              CUTE_COMPONENTS.forEach(function (c, i) {\n                if (i < constant.length) {\n                  record[c] = constant[i]\n                }\n              })\n            }\n          } else {\n            if (isBufferArgs(value.buffer)) {\n              buffer = bufferState.getBuffer(\n                bufferState.create(value.buffer, GL_ARRAY_BUFFER$2, false, true))\n            } else {\n              buffer = bufferState.getBuffer(value.buffer)\n            }\n            \n\n            var offset = value.offset | 0\n            \n\n            var stride = value.stride | 0\n            \n\n            var size = value.size | 0\n            \n\n            var normalized = !!value.normalized\n\n            var type = 0\n            if ('type' in value) {\n              \n              type = glTypes[value.type]\n            }\n\n            var divisor = value.divisor | 0\n            if ('divisor' in value) {\n              \n              \n            }\n\n            \n\n            record.buffer = buffer\n            record.state = ATTRIB_STATE_POINTER\n            record.size = size\n            record.normalized = normalized\n            record.type = type || buffer.dtype\n            record.offset = offset\n            record.stride = stride\n            record.divisor = divisor\n          }\n        }\n      }\n\n      attributeDefs[attribute] = createStaticDecl(function (env, scope) {\n        var cache = env.attribCache\n        if (id in cache) {\n          return cache[id]\n        }\n        var result = {\n          isStream: false\n        }\n        Object.keys(record).forEach(function (key) {\n          result[key] = record[key]\n        })\n        if (record.buffer) {\n          result.buffer = env.link(record.buffer)\n          result.type = result.type || (result.buffer + '.dtype')\n        }\n        cache[id] = result\n        return result\n      })\n    })\n\n    Object.keys(dynamicAttributes).forEach(function (attribute) {\n      var dyn = dynamicAttributes[attribute]\n\n      function appendAttributeCode (env, block) {\n        var VALUE = env.invoke(block, dyn)\n\n        var shared = env.shared\n        var constants = env.constants\n\n        var IS_BUFFER_ARGS = shared.isBufferArgs\n        var BUFFER_STATE = shared.buffer\n\n        // Perform validation on attribute\n        \n\n        // allocate names for result\n        var result = {\n          isStream: block.def(false)\n        }\n        var defaultRecord = new AttributeRecord()\n        defaultRecord.state = ATTRIB_STATE_POINTER\n        Object.keys(defaultRecord).forEach(function (key) {\n          result[key] = block.def('' + defaultRecord[key])\n        })\n\n        var BUFFER = result.buffer\n        var TYPE = result.type\n        block(\n          'if(', IS_BUFFER_ARGS, '(', VALUE, ')){',\n          result.isStream, '=true;',\n          BUFFER, '=', BUFFER_STATE, '.createStream(', GL_ARRAY_BUFFER$2, ',', VALUE, ');',\n          TYPE, '=', BUFFER, '.dtype;',\n          '}else{',\n          BUFFER, '=', BUFFER_STATE, '.getBuffer(', VALUE, ');',\n          'if(', BUFFER, '){',\n          TYPE, '=', BUFFER, '.dtype;',\n          '}else if(\"constant\" in ', VALUE, '){',\n          result.state, '=', ATTRIB_STATE_CONSTANT, ';',\n          'if(typeof ' + VALUE + '.constant === \"number\"){',\n          result[CUTE_COMPONENTS[0]], '=', VALUE, '.constant;',\n          CUTE_COMPONENTS.slice(1).map(function (n) {\n            return result[n]\n          }).join('='), '=0;',\n          '}else{',\n          CUTE_COMPONENTS.map(function (name, i) {\n            return (\n              result[name] + '=' + VALUE + '.constant.length>' + i +\n              '?' + VALUE + '.constant[' + i + ']:0;'\n            )\n          }).join(''),\n          '}}else{',\n          'if(', IS_BUFFER_ARGS, '(', VALUE, '.buffer)){',\n          BUFFER, '=', BUFFER_STATE, '.createStream(', GL_ARRAY_BUFFER$2, ',', VALUE, '.buffer);',\n          '}else{',\n          BUFFER, '=', BUFFER_STATE, '.getBuffer(', VALUE, '.buffer);',\n          '}',\n          TYPE, '=\"type\" in ', VALUE, '?',\n          constants.glTypes, '[', VALUE, '.type]:', BUFFER, '.dtype;',\n          result.normalized, '=!!', VALUE, '.normalized;')\n        function emitReadRecord (name) {\n          block(result[name], '=', VALUE, '.', name, '|0;')\n        }\n        emitReadRecord('size')\n        emitReadRecord('offset')\n        emitReadRecord('stride')\n        emitReadRecord('divisor')\n\n        block('}}')\n\n        block.exit(\n          'if(', result.isStream, '){',\n          BUFFER_STATE, '.destroyStream(', BUFFER, ');',\n          '}')\n\n        return result\n      }\n\n      attributeDefs[attribute] = createDynamicDecl(dyn, appendAttributeCode)\n    })\n\n    return attributeDefs\n  }\n\n  function parseVAO (options, env) {\n    var staticOptions = options.static\n    var dynamicOptions = options.dynamic\n    if (S_VAO in staticOptions) {\n      var vao = staticOptions[S_VAO]\n      if (vao !== null && attributeState.getVAO(vao) === null) {\n        vao = attributeState.createVAO(vao)\n      }\n      return createStaticDecl(function (env) {\n        return env.link(attributeState.getVAO(vao))\n      })\n    } else if (S_VAO in dynamicOptions) {\n      var dyn = dynamicOptions[S_VAO]\n      return createDynamicDecl(dyn, function (env, scope) {\n        var vaoRef = env.invoke(scope, dyn)\n        return scope.def(env.shared.vao + '.getVAO(' + vaoRef + ')')\n      })\n    }\n    return null\n  }\n\n  function parseContext (context) {\n    var staticContext = context.static\n    var dynamicContext = context.dynamic\n    var result = {}\n\n    Object.keys(staticContext).forEach(function (name) {\n      var value = staticContext[name]\n      result[name] = createStaticDecl(function (env, scope) {\n        if (typeof value === 'number' || typeof value === 'boolean') {\n          return '' + value\n        } else {\n          return env.link(value)\n        }\n      })\n    })\n\n    Object.keys(dynamicContext).forEach(function (name) {\n      var dyn = dynamicContext[name]\n      result[name] = createDynamicDecl(dyn, function (env, scope) {\n        return env.invoke(scope, dyn)\n      })\n    })\n\n    return result\n  }\n\n  function parseArguments (options, attributes, uniforms, context, env) {\n    var staticOptions = options.static\n    var dynamicOptions = options.dynamic\n\n    \n\n    var attribLocations = parseAttribLocations(options, attributes)\n\n    var framebuffer = parseFramebuffer(options, env)\n    var viewportAndScissor = parseViewportScissor(options, framebuffer, env)\n    var draw = parseDraw(options, env)\n    var state = parseGLState(options, env)\n    var shader = parseProgram(options, env, attribLocations)\n\n    function copyBox (name) {\n      var defn = viewportAndScissor[name]\n      if (defn) {\n        state[name] = defn\n      }\n    }\n    copyBox(S_VIEWPORT)\n    copyBox(propName(S_SCISSOR_BOX))\n\n    var dirty = Object.keys(state).length > 0\n\n    var result = {\n      framebuffer: framebuffer,\n      draw: draw,\n      shader: shader,\n      state: state,\n      dirty: dirty,\n      scopeVAO: null,\n      drawVAO: null,\n      useVAO: false,\n      attributes: {}\n    }\n\n    result.profile = parseProfile(options, env)\n    result.uniforms = parseUniforms(uniforms, env)\n    result.drawVAO = result.scopeVAO = parseVAO(options, env)\n    // special case: check if we can statically allocate a vertex array object for this program\n    if (!result.drawVAO && shader.program && !attribLocations && extensions.angle_instanced_arrays) {\n      var useVAO = true\n      var staticBindings = shader.program.attributes.map(function (attr) {\n        var binding = attributes.static[attr]\n        useVAO = useVAO && !!binding\n        return binding\n      })\n      if (useVAO && staticBindings.length > 0) {\n        var vao = attributeState.getVAO(attributeState.createVAO(staticBindings))\n        result.drawVAO = new Declaration(null, null, null, function (env, scope) {\n          return env.link(vao)\n        })\n        result.useVAO = true\n      }\n    }\n    if (attribLocations) {\n      result.useVAO = true\n    } else {\n      result.attributes = parseAttributes(attributes, env)\n    }\n    result.context = parseContext(context, env)\n    return result\n  }\n\n  // ===================================================\n  // ===================================================\n  // COMMON UPDATE FUNCTIONS\n  // ===================================================\n  // ===================================================\n  function emitContext (env, scope, context) {\n    var shared = env.shared\n    var CONTEXT = shared.context\n\n    var contextEnter = env.scope()\n\n    Object.keys(context).forEach(function (name) {\n      scope.save(CONTEXT, '.' + name)\n      var defn = context[name]\n      var value = defn.append(env, scope)\n      if (Array.isArray(value)) {\n        contextEnter(CONTEXT, '.', name, '=[', value.join(), '];')\n      } else {\n        contextEnter(CONTEXT, '.', name, '=', value, ';')\n      }\n    })\n\n    scope(contextEnter)\n  }\n\n  // ===================================================\n  // ===================================================\n  // COMMON DRAWING FUNCTIONS\n  // ===================================================\n  // ===================================================\n  function emitPollFramebuffer (env, scope, framebuffer, skipCheck) {\n    var shared = env.shared\n\n    var GL = shared.gl\n    var FRAMEBUFFER_STATE = shared.framebuffer\n    var EXT_DRAW_BUFFERS\n    if (extDrawBuffers) {\n      EXT_DRAW_BUFFERS = scope.def(shared.extensions, '.webgl_draw_buffers')\n    }\n\n    var constants = env.constants\n\n    var DRAW_BUFFERS = constants.drawBuffer\n    var BACK_BUFFER = constants.backBuffer\n\n    var NEXT\n    if (framebuffer) {\n      NEXT = framebuffer.append(env, scope)\n    } else {\n      NEXT = scope.def(FRAMEBUFFER_STATE, '.next')\n    }\n\n    if (!skipCheck) {\n      scope('if(', NEXT, '!==', FRAMEBUFFER_STATE, '.cur){')\n    }\n    scope(\n      'if(', NEXT, '){',\n      GL, '.bindFramebuffer(', GL_FRAMEBUFFER$2, ',', NEXT, '.framebuffer);')\n    if (extDrawBuffers) {\n      scope(EXT_DRAW_BUFFERS, '.drawBuffersWEBGL(',\n        DRAW_BUFFERS, '[', NEXT, '.colorAttachments.length]);')\n    }\n    scope('}else{',\n      GL, '.bindFramebuffer(', GL_FRAMEBUFFER$2, ',null);')\n    if (extDrawBuffers) {\n      scope(EXT_DRAW_BUFFERS, '.drawBuffersWEBGL(', BACK_BUFFER, ');')\n    }\n    scope(\n      '}',\n      FRAMEBUFFER_STATE, '.cur=', NEXT, ';')\n    if (!skipCheck) {\n      scope('}')\n    }\n  }\n\n  function emitPollState (env, scope, args) {\n    var shared = env.shared\n\n    var GL = shared.gl\n\n    var CURRENT_VARS = env.current\n    var NEXT_VARS = env.next\n    var CURRENT_STATE = shared.current\n    var NEXT_STATE = shared.next\n\n    var block = env.cond(CURRENT_STATE, '.dirty')\n\n    GL_STATE_NAMES.forEach(function (prop) {\n      var param = propName(prop)\n      if (param in args.state) {\n        return\n      }\n\n      var NEXT, CURRENT\n      if (param in NEXT_VARS) {\n        NEXT = NEXT_VARS[param]\n        CURRENT = CURRENT_VARS[param]\n        var parts = loop(currentState[param].length, function (i) {\n          return block.def(NEXT, '[', i, ']')\n        })\n        block(env.cond(parts.map(function (p, i) {\n          return p + '!==' + CURRENT + '[' + i + ']'\n        }).join('||'))\n          .then(\n            GL, '.', GL_VARIABLES[param], '(', parts, ');',\n            parts.map(function (p, i) {\n              return CURRENT + '[' + i + ']=' + p\n            }).join(';'), ';'))\n      } else {\n        NEXT = block.def(NEXT_STATE, '.', param)\n        var ifte = env.cond(NEXT, '!==', CURRENT_STATE, '.', param)\n        block(ifte)\n        if (param in GL_FLAGS) {\n          ifte(\n            env.cond(NEXT)\n              .then(GL, '.enable(', GL_FLAGS[param], ');')\n              .else(GL, '.disable(', GL_FLAGS[param], ');'),\n            CURRENT_STATE, '.', param, '=', NEXT, ';')\n        } else {\n          ifte(\n            GL, '.', GL_VARIABLES[param], '(', NEXT, ');',\n            CURRENT_STATE, '.', param, '=', NEXT, ';')\n        }\n      }\n    })\n    if (Object.keys(args.state).length === 0) {\n      block(CURRENT_STATE, '.dirty=false;')\n    }\n    scope(block)\n  }\n\n  function emitSetOptions (env, scope, options, filter) {\n    var shared = env.shared\n    var CURRENT_VARS = env.current\n    var CURRENT_STATE = shared.current\n    var GL = shared.gl\n    sortState(Object.keys(options)).forEach(function (param) {\n      var defn = options[param]\n      if (filter && !filter(defn)) {\n        return\n      }\n      var variable = defn.append(env, scope)\n      if (GL_FLAGS[param]) {\n        var flag = GL_FLAGS[param]\n        if (isStatic(defn)) {\n          if (variable) {\n            scope(GL, '.enable(', flag, ');')\n          } else {\n            scope(GL, '.disable(', flag, ');')\n          }\n        } else {\n          scope(env.cond(variable)\n            .then(GL, '.enable(', flag, ');')\n            .else(GL, '.disable(', flag, ');'))\n        }\n        scope(CURRENT_STATE, '.', param, '=', variable, ';')\n      } else if (isArrayLike(variable)) {\n        var CURRENT = CURRENT_VARS[param]\n        scope(\n          GL, '.', GL_VARIABLES[param], '(', variable, ');',\n          variable.map(function (v, i) {\n            return CURRENT + '[' + i + ']=' + v\n          }).join(';'), ';')\n      } else {\n        scope(\n          GL, '.', GL_VARIABLES[param], '(', variable, ');',\n          CURRENT_STATE, '.', param, '=', variable, ';')\n      }\n    })\n  }\n\n  function injectExtensions (env, scope) {\n    if (extInstancing) {\n      env.instancing = scope.def(\n        env.shared.extensions, '.angle_instanced_arrays')\n    }\n  }\n\n  function emitProfile (env, scope, args, useScope, incrementCounter) {\n    var shared = env.shared\n    var STATS = env.stats\n    var CURRENT_STATE = shared.current\n    var TIMER = shared.timer\n    var profileArg = args.profile\n\n    function perfCounter () {\n      if (typeof performance === 'undefined') {\n        return 'Date.now()'\n      } else {\n        return 'performance.now()'\n      }\n    }\n\n    var CPU_START, QUERY_COUNTER\n    function emitProfileStart (block) {\n      CPU_START = scope.def()\n      block(CPU_START, '=', perfCounter(), ';')\n      if (typeof incrementCounter === 'string') {\n        block(STATS, '.count+=', incrementCounter, ';')\n      } else {\n        block(STATS, '.count++;')\n      }\n      if (timer) {\n        if (useScope) {\n          QUERY_COUNTER = scope.def()\n          block(QUERY_COUNTER, '=', TIMER, '.getNumPendingQueries();')\n        } else {\n          block(TIMER, '.beginQuery(', STATS, ');')\n        }\n      }\n    }\n\n    function emitProfileEnd (block) {\n      block(STATS, '.cpuTime+=', perfCounter(), '-', CPU_START, ';')\n      if (timer) {\n        if (useScope) {\n          block(TIMER, '.pushScopeStats(',\n            QUERY_COUNTER, ',',\n            TIMER, '.getNumPendingQueries(),',\n            STATS, ');')\n        } else {\n          block(TIMER, '.endQuery();')\n        }\n      }\n    }\n\n    function scopeProfile (value) {\n      var prev = scope.def(CURRENT_STATE, '.profile')\n      scope(CURRENT_STATE, '.profile=', value, ';')\n      scope.exit(CURRENT_STATE, '.profile=', prev, ';')\n    }\n\n    var USE_PROFILE\n    if (profileArg) {\n      if (isStatic(profileArg)) {\n        if (profileArg.enable) {\n          emitProfileStart(scope)\n          emitProfileEnd(scope.exit)\n          scopeProfile('true')\n        } else {\n          scopeProfile('false')\n        }\n        return\n      }\n      USE_PROFILE = profileArg.append(env, scope)\n      scopeProfile(USE_PROFILE)\n    } else {\n      USE_PROFILE = scope.def(CURRENT_STATE, '.profile')\n    }\n\n    var start = env.block()\n    emitProfileStart(start)\n    scope('if(', USE_PROFILE, '){', start, '}')\n    var end = env.block()\n    emitProfileEnd(end)\n    scope.exit('if(', USE_PROFILE, '){', end, '}')\n  }\n\n  function emitAttributes (env, scope, args, attributes, filter) {\n    var shared = env.shared\n\n    function typeLength (x) {\n      switch (x) {\n        case GL_FLOAT_VEC2:\n        case GL_INT_VEC2:\n        case GL_BOOL_VEC2:\n          return 2\n        case GL_FLOAT_VEC3:\n        case GL_INT_VEC3:\n        case GL_BOOL_VEC3:\n          return 3\n        case GL_FLOAT_VEC4:\n        case GL_INT_VEC4:\n        case GL_BOOL_VEC4:\n          return 4\n        default:\n          return 1\n      }\n    }\n\n    function emitBindAttribute (ATTRIBUTE, size, record) {\n      var GL = shared.gl\n\n      var LOCATION = scope.def(ATTRIBUTE, '.location')\n      var BINDING = scope.def(shared.attributes, '[', LOCATION, ']')\n\n      var STATE = record.state\n      var BUFFER = record.buffer\n      var CONST_COMPONENTS = [\n        record.x,\n        record.y,\n        record.z,\n        record.w\n      ]\n\n      var COMMON_KEYS = [\n        'buffer',\n        'normalized',\n        'offset',\n        'stride'\n      ]\n\n      function emitBuffer () {\n        scope(\n          'if(!', BINDING, '.buffer){',\n          GL, '.enableVertexAttribArray(', LOCATION, ');}')\n\n        var TYPE = record.type\n        var SIZE\n        if (!record.size) {\n          SIZE = size\n        } else {\n          SIZE = scope.def(record.size, '||', size)\n        }\n\n        scope('if(',\n          BINDING, '.type!==', TYPE, '||',\n          BINDING, '.size!==', SIZE, '||',\n          COMMON_KEYS.map(function (key) {\n            return BINDING + '.' + key + '!==' + record[key]\n          }).join('||'),\n          '){',\n          GL, '.bindBuffer(', GL_ARRAY_BUFFER$2, ',', BUFFER, '.buffer);',\n          GL, '.vertexAttribPointer(', [\n            LOCATION,\n            SIZE,\n            TYPE,\n            record.normalized,\n            record.stride,\n            record.offset\n          ], ');',\n          BINDING, '.type=', TYPE, ';',\n          BINDING, '.size=', SIZE, ';',\n          COMMON_KEYS.map(function (key) {\n            return BINDING + '.' + key + '=' + record[key] + ';'\n          }).join(''),\n          '}')\n\n        if (extInstancing) {\n          var DIVISOR = record.divisor\n          scope(\n            'if(', BINDING, '.divisor!==', DIVISOR, '){',\n            env.instancing, '.vertexAttribDivisorANGLE(', [LOCATION, DIVISOR], ');',\n            BINDING, '.divisor=', DIVISOR, ';}')\n        }\n      }\n\n      function emitConstant () {\n        scope(\n          'if(', BINDING, '.buffer){',\n          GL, '.disableVertexAttribArray(', LOCATION, ');',\n          BINDING, '.buffer=null;',\n          '}if(', CUTE_COMPONENTS.map(function (c, i) {\n            return BINDING + '.' + c + '!==' + CONST_COMPONENTS[i]\n          }).join('||'), '){',\n          GL, '.vertexAttrib4f(', LOCATION, ',', CONST_COMPONENTS, ');',\n          CUTE_COMPONENTS.map(function (c, i) {\n            return BINDING + '.' + c + '=' + CONST_COMPONENTS[i] + ';'\n          }).join(''),\n          '}')\n      }\n\n      if (STATE === ATTRIB_STATE_POINTER) {\n        emitBuffer()\n      } else if (STATE === ATTRIB_STATE_CONSTANT) {\n        emitConstant()\n      } else {\n        scope('if(', STATE, '===', ATTRIB_STATE_POINTER, '){')\n        emitBuffer()\n        scope('}else{')\n        emitConstant()\n        scope('}')\n      }\n    }\n\n    attributes.forEach(function (attribute) {\n      var name = attribute.name\n      var arg = args.attributes[name]\n      var record\n      if (arg) {\n        if (!filter(arg)) {\n          return\n        }\n        record = arg.append(env, scope)\n      } else {\n        if (!filter(SCOPE_DECL)) {\n          return\n        }\n        var scopeAttrib = env.scopeAttrib(name)\n        \n        record = {}\n        Object.keys(new AttributeRecord()).forEach(function (key) {\n          record[key] = scope.def(scopeAttrib, '.', key)\n        })\n      }\n      emitBindAttribute(\n        env.link(attribute), typeLength(attribute.info.type), record)\n    })\n  }\n\n  function emitUniforms (env, scope, args, uniforms, filter) {\n    var shared = env.shared\n    var GL = shared.gl\n\n    var infix\n    for (var i = 0; i < uniforms.length; ++i) {\n      var uniform = uniforms[i]\n      var name = uniform.name\n      var type = uniform.info.type\n      var arg = args.uniforms[name]\n      var UNIFORM = env.link(uniform)\n      var LOCATION = UNIFORM + '.location'\n\n      var VALUE\n      if (arg) {\n        if (!filter(arg)) {\n          continue\n        }\n        if (isStatic(arg)) {\n          var value = arg.value\n          \n          if (type === GL_SAMPLER_2D || type === GL_SAMPLER_CUBE) {\n            \n            var TEX_VALUE = env.link(value._texture || value.color[0]._texture)\n            scope(GL, '.uniform1i(', LOCATION, ',', TEX_VALUE + '.bind());')\n            scope.exit(TEX_VALUE, '.unbind();')\n          } else if (\n            type === GL_FLOAT_MAT2 ||\n            type === GL_FLOAT_MAT3 ||\n            type === GL_FLOAT_MAT4) {\n            \n            var MAT_VALUE = env.global.def('new Float32Array([' +\n              Array.prototype.slice.call(value) + '])')\n            var dim = 2\n            if (type === GL_FLOAT_MAT3) {\n              dim = 3\n            } else if (type === GL_FLOAT_MAT4) {\n              dim = 4\n            }\n            scope(\n              GL, '.uniformMatrix', dim, 'fv(',\n              LOCATION, ',false,', MAT_VALUE, ');')\n          } else {\n            switch (type) {\n              case GL_FLOAT$7:\n                \n                infix = '1f'\n                break\n              case GL_FLOAT_VEC2:\n                \n                infix = '2f'\n                break\n              case GL_FLOAT_VEC3:\n                \n                infix = '3f'\n                break\n              case GL_FLOAT_VEC4:\n                \n                infix = '4f'\n                break\n              case GL_BOOL:\n                \n                infix = '1i'\n                break\n              case GL_INT$2:\n                \n                infix = '1i'\n                break\n              case GL_BOOL_VEC2:\n                \n                infix = '2i'\n                break\n              case GL_INT_VEC2:\n                \n                infix = '2i'\n                break\n              case GL_BOOL_VEC3:\n                \n                infix = '3i'\n                break\n              case GL_INT_VEC3:\n                \n                infix = '3i'\n                break\n              case GL_BOOL_VEC4:\n                \n                infix = '4i'\n                break\n              case GL_INT_VEC4:\n                \n                infix = '4i'\n                break\n            }\n            scope(GL, '.uniform', infix, '(', LOCATION, ',',\n              isArrayLike(value) ? Array.prototype.slice.call(value) : value,\n              ');')\n          }\n          continue\n        } else {\n          VALUE = arg.append(env, scope)\n        }\n      } else {\n        if (!filter(SCOPE_DECL)) {\n          continue\n        }\n        VALUE = scope.def(shared.uniforms, '[', stringStore.id(name), ']')\n      }\n\n      if (type === GL_SAMPLER_2D) {\n        \n        scope(\n          'if(', VALUE, '&&', VALUE, '._reglType===\"framebuffer\"){',\n          VALUE, '=', VALUE, '.color[0];',\n          '}')\n      } else if (type === GL_SAMPLER_CUBE) {\n        \n        scope(\n          'if(', VALUE, '&&', VALUE, '._reglType===\"framebufferCube\"){',\n          VALUE, '=', VALUE, '.color[0];',\n          '}')\n      }\n\n      // perform type validation\n      \n\n      var unroll = 1\n      switch (type) {\n        case GL_SAMPLER_2D:\n        case GL_SAMPLER_CUBE:\n          var TEX = scope.def(VALUE, '._texture')\n          scope(GL, '.uniform1i(', LOCATION, ',', TEX, '.bind());')\n          scope.exit(TEX, '.unbind();')\n          continue\n\n        case GL_INT$2:\n        case GL_BOOL:\n          infix = '1i'\n          break\n\n        case GL_INT_VEC2:\n        case GL_BOOL_VEC2:\n          infix = '2i'\n          unroll = 2\n          break\n\n        case GL_INT_VEC3:\n        case GL_BOOL_VEC3:\n          infix = '3i'\n          unroll = 3\n          break\n\n        case GL_INT_VEC4:\n        case GL_BOOL_VEC4:\n          infix = '4i'\n          unroll = 4\n          break\n\n        case GL_FLOAT$7:\n          infix = '1f'\n          break\n\n        case GL_FLOAT_VEC2:\n          infix = '2f'\n          unroll = 2\n          break\n\n        case GL_FLOAT_VEC3:\n          infix = '3f'\n          unroll = 3\n          break\n\n        case GL_FLOAT_VEC4:\n          infix = '4f'\n          unroll = 4\n          break\n\n        case GL_FLOAT_MAT2:\n          infix = 'Matrix2fv'\n          break\n\n        case GL_FLOAT_MAT3:\n          infix = 'Matrix3fv'\n          break\n\n        case GL_FLOAT_MAT4:\n          infix = 'Matrix4fv'\n          break\n      }\n\n      scope(GL, '.uniform', infix, '(', LOCATION, ',')\n      if (infix.charAt(0) === 'M') {\n        var matSize = Math.pow(type - GL_FLOAT_MAT2 + 2, 2)\n        var STORAGE = env.global.def('new Float32Array(', matSize, ')')\n        if (Array.isArray(VALUE)) {\n          scope(\n            'false,(',\n            loop(matSize, function (i) {\n              return STORAGE + '[' + i + ']=' + VALUE[i]\n            }), ',', STORAGE, ')')\n        } else {\n          scope(\n            'false,(Array.isArray(', VALUE, ')||', VALUE, ' instanceof Float32Array)?', VALUE, ':(',\n            loop(matSize, function (i) {\n              return STORAGE + '[' + i + ']=' + VALUE + '[' + i + ']'\n            }), ',', STORAGE, ')')\n        }\n      } else if (unroll > 1) {\n        scope(loop(unroll, function (i) {\n          return Array.isArray(VALUE) ? VALUE[i] : VALUE + '[' + i + ']'\n        }))\n      } else {\n        \n        scope(VALUE)\n      }\n      scope(');')\n    }\n  }\n\n  function emitDraw (env, outer, inner, args) {\n    var shared = env.shared\n    var GL = shared.gl\n    var DRAW_STATE = shared.draw\n\n    var drawOptions = args.draw\n\n    function emitElements () {\n      var defn = drawOptions.elements\n      var ELEMENTS\n      var scope = outer\n      if (defn) {\n        if ((defn.contextDep && args.contextDynamic) || defn.propDep) {\n          scope = inner\n        }\n        ELEMENTS = defn.append(env, scope)\n      } else {\n        ELEMENTS = scope.def(DRAW_STATE, '.', S_ELEMENTS)\n      }\n      if (ELEMENTS) {\n        scope(\n          'if(' + ELEMENTS + ')' +\n          GL + '.bindBuffer(' + GL_ELEMENT_ARRAY_BUFFER$1 + ',' + ELEMENTS + '.buffer.buffer);')\n      }\n      return ELEMENTS\n    }\n\n    function emitCount () {\n      var defn = drawOptions.count\n      var COUNT\n      var scope = outer\n      if (defn) {\n        if ((defn.contextDep && args.contextDynamic) || defn.propDep) {\n          scope = inner\n        }\n        COUNT = defn.append(env, scope)\n        \n      } else {\n        COUNT = scope.def(DRAW_STATE, '.', S_COUNT)\n        \n      }\n      return COUNT\n    }\n\n    var ELEMENTS = emitElements()\n    function emitValue (name) {\n      var defn = drawOptions[name]\n      if (defn) {\n        if ((defn.contextDep && args.contextDynamic) || defn.propDep) {\n          return defn.append(env, inner)\n        } else {\n          return defn.append(env, outer)\n        }\n      } else {\n        return outer.def(DRAW_STATE, '.', name)\n      }\n    }\n\n    var PRIMITIVE = emitValue(S_PRIMITIVE)\n    var OFFSET = emitValue(S_OFFSET)\n\n    var COUNT = emitCount()\n    if (typeof COUNT === 'number') {\n      if (COUNT === 0) {\n        return\n      }\n    } else {\n      inner('if(', COUNT, '){')\n      inner.exit('}')\n    }\n\n    var INSTANCES, EXT_INSTANCING\n    if (extInstancing) {\n      INSTANCES = emitValue(S_INSTANCES)\n      EXT_INSTANCING = env.instancing\n    }\n\n    var ELEMENT_TYPE = ELEMENTS + '.type'\n\n    var elementsStatic = drawOptions.elements && isStatic(drawOptions.elements)\n\n    function emitInstancing () {\n      function drawElements () {\n        inner(EXT_INSTANCING, '.drawElementsInstancedANGLE(', [\n          PRIMITIVE,\n          COUNT,\n          ELEMENT_TYPE,\n          OFFSET + '<<((' + ELEMENT_TYPE + '-' + GL_UNSIGNED_BYTE$7 + ')>>1)',\n          INSTANCES\n        ], ');')\n      }\n\n      function drawArrays () {\n        inner(EXT_INSTANCING, '.drawArraysInstancedANGLE(',\n          [PRIMITIVE, OFFSET, COUNT, INSTANCES], ');')\n      }\n\n      if (ELEMENTS) {\n        if (!elementsStatic) {\n          inner('if(', ELEMENTS, '){')\n          drawElements()\n          inner('}else{')\n          drawArrays()\n          inner('}')\n        } else {\n          drawElements()\n        }\n      } else {\n        drawArrays()\n      }\n    }\n\n    function emitRegular () {\n      function drawElements () {\n        inner(GL + '.drawElements(' + [\n          PRIMITIVE,\n          COUNT,\n          ELEMENT_TYPE,\n          OFFSET + '<<((' + ELEMENT_TYPE + '-' + GL_UNSIGNED_BYTE$7 + ')>>1)'\n        ] + ');')\n      }\n\n      function drawArrays () {\n        inner(GL + '.drawArrays(' + [PRIMITIVE, OFFSET, COUNT] + ');')\n      }\n\n      if (ELEMENTS) {\n        if (!elementsStatic) {\n          inner('if(', ELEMENTS, '){')\n          drawElements()\n          inner('}else{')\n          drawArrays()\n          inner('}')\n        } else {\n          drawElements()\n        }\n      } else {\n        drawArrays()\n      }\n    }\n\n    if (extInstancing && (typeof INSTANCES !== 'number' || INSTANCES >= 0)) {\n      if (typeof INSTANCES === 'string') {\n        inner('if(', INSTANCES, '>0){')\n        emitInstancing()\n        inner('}else if(', INSTANCES, '<0){')\n        emitRegular()\n        inner('}')\n      } else {\n        emitInstancing()\n      }\n    } else {\n      emitRegular()\n    }\n  }\n\n  function createBody (emitBody, parentEnv, args, program, count) {\n    var env = createREGLEnvironment()\n    var scope = env.proc('body', count)\n    \n    if (extInstancing) {\n      env.instancing = scope.def(\n        env.shared.extensions, '.angle_instanced_arrays')\n    }\n    emitBody(env, scope, args, program)\n    return env.compile().body\n  }\n\n  // ===================================================\n  // ===================================================\n  // DRAW PROC\n  // ===================================================\n  // ===================================================\n  function emitDrawBody (env, draw, args, program) {\n    injectExtensions(env, draw)\n    if (args.useVAO) {\n      if (args.drawVAO) {\n        draw(env.shared.vao, '.setVAO(', args.drawVAO.append(env, draw), ');')\n      } else {\n        draw(env.shared.vao, '.setVAO(', env.shared.vao, '.targetVAO);')\n      }\n    } else {\n      draw(env.shared.vao, '.setVAO(null);')\n      emitAttributes(env, draw, args, program.attributes, function () {\n        return true\n      })\n    }\n    emitUniforms(env, draw, args, program.uniforms, function () {\n      return true\n    })\n    emitDraw(env, draw, draw, args)\n  }\n\n  function emitDrawProc (env, args) {\n    var draw = env.proc('draw', 1)\n\n    injectExtensions(env, draw)\n\n    emitContext(env, draw, args.context)\n    emitPollFramebuffer(env, draw, args.framebuffer)\n\n    emitPollState(env, draw, args)\n    emitSetOptions(env, draw, args.state)\n\n    emitProfile(env, draw, args, false, true)\n\n    var program = args.shader.progVar.append(env, draw)\n    draw(env.shared.gl, '.useProgram(', program, '.program);')\n\n    if (args.shader.program) {\n      emitDrawBody(env, draw, args, args.shader.program)\n    } else {\n      draw(env.shared.vao, '.setVAO(null);')\n      var drawCache = env.global.def('{}')\n      var PROG_ID = draw.def(program, '.id')\n      var CACHED_PROC = draw.def(drawCache, '[', PROG_ID, ']')\n      draw(\n        env.cond(CACHED_PROC)\n          .then(CACHED_PROC, '.call(this,a0);')\n          .else(\n            CACHED_PROC, '=', drawCache, '[', PROG_ID, ']=',\n            env.link(function (program) {\n              return createBody(emitDrawBody, env, args, program, 1)\n            }), '(', program, ');',\n            CACHED_PROC, '.call(this,a0);'))\n    }\n\n    if (Object.keys(args.state).length > 0) {\n      draw(env.shared.current, '.dirty=true;')\n    }\n  }\n\n  // ===================================================\n  // ===================================================\n  // BATCH PROC\n  // ===================================================\n  // ===================================================\n\n  function emitBatchDynamicShaderBody (env, scope, args, program) {\n    env.batchId = 'a1'\n\n    injectExtensions(env, scope)\n\n    function all () {\n      return true\n    }\n\n    emitAttributes(env, scope, args, program.attributes, all)\n    emitUniforms(env, scope, args, program.uniforms, all)\n    emitDraw(env, scope, scope, args)\n  }\n\n  function emitBatchBody (env, scope, args, program) {\n    injectExtensions(env, scope)\n\n    var contextDynamic = args.contextDep\n\n    var BATCH_ID = scope.def()\n    var PROP_LIST = 'a0'\n    var NUM_PROPS = 'a1'\n    var PROPS = scope.def()\n    env.shared.props = PROPS\n    env.batchId = BATCH_ID\n\n    var outer = env.scope()\n    var inner = env.scope()\n\n    scope(\n      outer.entry,\n      'for(', BATCH_ID, '=0;', BATCH_ID, '<', NUM_PROPS, ';++', BATCH_ID, '){',\n      PROPS, '=', PROP_LIST, '[', BATCH_ID, '];',\n      inner,\n      '}',\n      outer.exit)\n\n    function isInnerDefn (defn) {\n      return ((defn.contextDep && contextDynamic) || defn.propDep)\n    }\n\n    function isOuterDefn (defn) {\n      return !isInnerDefn(defn)\n    }\n\n    if (args.needsContext) {\n      emitContext(env, inner, args.context)\n    }\n    if (args.needsFramebuffer) {\n      emitPollFramebuffer(env, inner, args.framebuffer)\n    }\n    emitSetOptions(env, inner, args.state, isInnerDefn)\n\n    if (args.profile && isInnerDefn(args.profile)) {\n      emitProfile(env, inner, args, false, true)\n    }\n\n    if (!program) {\n      var progCache = env.global.def('{}')\n      var PROGRAM = args.shader.progVar.append(env, inner)\n      var PROG_ID = inner.def(PROGRAM, '.id')\n      var CACHED_PROC = inner.def(progCache, '[', PROG_ID, ']')\n      inner(\n        env.shared.gl, '.useProgram(', PROGRAM, '.program);',\n        'if(!', CACHED_PROC, '){',\n        CACHED_PROC, '=', progCache, '[', PROG_ID, ']=',\n        env.link(function (program) {\n          return createBody(\n            emitBatchDynamicShaderBody, env, args, program, 2)\n        }), '(', PROGRAM, ');}',\n        CACHED_PROC, '.call(this,a0[', BATCH_ID, '],', BATCH_ID, ');')\n    } else {\n      if (args.useVAO) {\n        if (args.drawVAO) {\n          if (isInnerDefn(args.drawVAO)) {\n            // vao is a prop\n            inner(env.shared.vao, '.setVAO(', args.drawVAO.append(env, inner), ');')\n          } else {\n            // vao is invariant\n            outer(env.shared.vao, '.setVAO(', args.drawVAO.append(env, outer), ');')\n          }\n        } else {\n          // scoped vao binding\n          outer(env.shared.vao, '.setVAO(', env.shared.vao, '.targetVAO);')\n        }\n      } else {\n        outer(env.shared.vao, '.setVAO(null);')\n        emitAttributes(env, outer, args, program.attributes, isOuterDefn)\n        emitAttributes(env, inner, args, program.attributes, isInnerDefn)\n      }\n      emitUniforms(env, outer, args, program.uniforms, isOuterDefn)\n      emitUniforms(env, inner, args, program.uniforms, isInnerDefn)\n      emitDraw(env, outer, inner, args)\n    }\n  }\n\n  function emitBatchProc (env, args) {\n    var batch = env.proc('batch', 2)\n    env.batchId = '0'\n\n    injectExtensions(env, batch)\n\n    // Check if any context variables depend on props\n    var contextDynamic = false\n    var needsContext = true\n    Object.keys(args.context).forEach(function (name) {\n      contextDynamic = contextDynamic || args.context[name].propDep\n    })\n    if (!contextDynamic) {\n      emitContext(env, batch, args.context)\n      needsContext = false\n    }\n\n    // framebuffer state affects framebufferWidth/height context vars\n    var framebuffer = args.framebuffer\n    var needsFramebuffer = false\n    if (framebuffer) {\n      if (framebuffer.propDep) {\n        contextDynamic = needsFramebuffer = true\n      } else if (framebuffer.contextDep && contextDynamic) {\n        needsFramebuffer = true\n      }\n      if (!needsFramebuffer) {\n        emitPollFramebuffer(env, batch, framebuffer)\n      }\n    } else {\n      emitPollFramebuffer(env, batch, null)\n    }\n\n    // viewport is weird because it can affect context vars\n    if (args.state.viewport && args.state.viewport.propDep) {\n      contextDynamic = true\n    }\n\n    function isInnerDefn (defn) {\n      return (defn.contextDep && contextDynamic) || defn.propDep\n    }\n\n    // set webgl options\n    emitPollState(env, batch, args)\n    emitSetOptions(env, batch, args.state, function (defn) {\n      return !isInnerDefn(defn)\n    })\n\n    if (!args.profile || !isInnerDefn(args.profile)) {\n      emitProfile(env, batch, args, false, 'a1')\n    }\n\n    // Save these values to args so that the batch body routine can use them\n    args.contextDep = contextDynamic\n    args.needsContext = needsContext\n    args.needsFramebuffer = needsFramebuffer\n\n    // determine if shader is dynamic\n    var progDefn = args.shader.progVar\n    if ((progDefn.contextDep && contextDynamic) || progDefn.propDep) {\n      emitBatchBody(\n        env,\n        batch,\n        args,\n        null)\n    } else {\n      var PROGRAM = progDefn.append(env, batch)\n      batch(env.shared.gl, '.useProgram(', PROGRAM, '.program);')\n      if (args.shader.program) {\n        emitBatchBody(\n          env,\n          batch,\n          args,\n          args.shader.program)\n      } else {\n        batch(env.shared.vao, '.setVAO(null);')\n        var batchCache = env.global.def('{}')\n        var PROG_ID = batch.def(PROGRAM, '.id')\n        var CACHED_PROC = batch.def(batchCache, '[', PROG_ID, ']')\n        batch(\n          env.cond(CACHED_PROC)\n            .then(CACHED_PROC, '.call(this,a0,a1);')\n            .else(\n              CACHED_PROC, '=', batchCache, '[', PROG_ID, ']=',\n              env.link(function (program) {\n                return createBody(emitBatchBody, env, args, program, 2)\n              }), '(', PROGRAM, ');',\n              CACHED_PROC, '.call(this,a0,a1);'))\n      }\n    }\n\n    if (Object.keys(args.state).length > 0) {\n      batch(env.shared.current, '.dirty=true;')\n    }\n  }\n\n  // ===================================================\n  // ===================================================\n  // SCOPE COMMAND\n  // ===================================================\n  // ===================================================\n  function emitScopeProc (env, args) {\n    var scope = env.proc('scope', 3)\n    env.batchId = 'a2'\n\n    var shared = env.shared\n    var CURRENT_STATE = shared.current\n\n    emitContext(env, scope, args.context)\n\n    if (args.framebuffer) {\n      args.framebuffer.append(env, scope)\n    }\n\n    sortState(Object.keys(args.state)).forEach(function (name) {\n      var defn = args.state[name]\n      var value = defn.append(env, scope)\n      if (isArrayLike(value)) {\n        value.forEach(function (v, i) {\n          scope.set(env.next[name], '[' + i + ']', v)\n        })\n      } else {\n        scope.set(shared.next, '.' + name, value)\n      }\n    })\n\n    emitProfile(env, scope, args, true, true)\n\n    ;[S_ELEMENTS, S_OFFSET, S_COUNT, S_INSTANCES, S_PRIMITIVE].forEach(\n      function (opt) {\n        var variable = args.draw[opt]\n        if (!variable) {\n          return\n        }\n        scope.set(shared.draw, '.' + opt, '' + variable.append(env, scope))\n      })\n\n    Object.keys(args.uniforms).forEach(function (opt) {\n      var value = args.uniforms[opt].append(env, scope)\n      if (Array.isArray(value)) {\n        value = '[' + value.join() + ']'\n      }\n      scope.set(\n        shared.uniforms,\n        '[' + stringStore.id(opt) + ']',\n        value)\n    })\n\n    Object.keys(args.attributes).forEach(function (name) {\n      var record = args.attributes[name].append(env, scope)\n      var scopeAttrib = env.scopeAttrib(name)\n      Object.keys(new AttributeRecord()).forEach(function (prop) {\n        scope.set(scopeAttrib, '.' + prop, record[prop])\n      })\n    })\n\n    if (args.scopeVAO) {\n      scope.set(shared.vao, '.targetVAO', args.scopeVAO.append(env, scope))\n    }\n\n    function saveShader (name) {\n      var shader = args.shader[name]\n      if (shader) {\n        scope.set(shared.shader, '.' + name, shader.append(env, scope))\n      }\n    }\n    saveShader(S_VERT)\n    saveShader(S_FRAG)\n\n    if (Object.keys(args.state).length > 0) {\n      scope(CURRENT_STATE, '.dirty=true;')\n      scope.exit(CURRENT_STATE, '.dirty=true;')\n    }\n\n    scope('a1(', env.shared.context, ',a0,', env.batchId, ');')\n  }\n\n  function isDynamicObject (object) {\n    if (typeof object !== 'object' || isArrayLike(object)) {\n      return\n    }\n    var props = Object.keys(object)\n    for (var i = 0; i < props.length; ++i) {\n      if (dynamic.isDynamic(object[props[i]])) {\n        return true\n      }\n    }\n    return false\n  }\n\n  function splatObject (env, options, name) {\n    var object = options.static[name]\n    if (!object || !isDynamicObject(object)) {\n      return\n    }\n\n    var globals = env.global\n    var keys = Object.keys(object)\n    var thisDep = false\n    var contextDep = false\n    var propDep = false\n    var objectRef = env.global.def('{}')\n    keys.forEach(function (key) {\n      var value = object[key]\n      if (dynamic.isDynamic(value)) {\n        if (typeof value === 'function') {\n          value = object[key] = dynamic.unbox(value)\n        }\n        var deps = createDynamicDecl(value, null)\n        thisDep = thisDep || deps.thisDep\n        propDep = propDep || deps.propDep\n        contextDep = contextDep || deps.contextDep\n      } else {\n        globals(objectRef, '.', key, '=')\n        switch (typeof value) {\n          case 'number':\n            globals(value)\n            break\n          case 'string':\n            globals('\"', value, '\"')\n            break\n          case 'object':\n            if (Array.isArray(value)) {\n              globals('[', value.join(), ']')\n            }\n            break\n          default:\n            globals(env.link(value))\n            break\n        }\n        globals(';')\n      }\n    })\n\n    function appendBlock (env, block) {\n      keys.forEach(function (key) {\n        var value = object[key]\n        if (!dynamic.isDynamic(value)) {\n          return\n        }\n        var ref = env.invoke(block, value)\n        block(objectRef, '.', key, '=', ref, ';')\n      })\n    }\n\n    options.dynamic[name] = new dynamic.DynamicVariable(DYN_THUNK, {\n      thisDep: thisDep,\n      contextDep: contextDep,\n      propDep: propDep,\n      ref: objectRef,\n      append: appendBlock\n    })\n    delete options.static[name]\n  }\n\n  // ===========================================================================\n  // ===========================================================================\n  // MAIN DRAW COMMAND\n  // ===========================================================================\n  // ===========================================================================\n  function compileCommand (options, attributes, uniforms, context, stats) {\n    var env = createREGLEnvironment()\n\n    // link stats, so that we can easily access it in the program.\n    env.stats = env.link(stats)\n\n    // splat options and attributes to allow for dynamic nested properties\n    Object.keys(attributes.static).forEach(function (key) {\n      splatObject(env, attributes, key)\n    })\n    NESTED_OPTIONS.forEach(function (name) {\n      splatObject(env, options, name)\n    })\n\n    var args = parseArguments(options, attributes, uniforms, context, env)\n\n    emitDrawProc(env, args)\n    emitScopeProc(env, args)\n    emitBatchProc(env, args)\n\n    return extend(env.compile(), {\n      destroy: function () {\n        args.shader.program.destroy()\n      }\n    })\n  }\n\n  // ===========================================================================\n  // ===========================================================================\n  // POLL / REFRESH\n  // ===========================================================================\n  // ===========================================================================\n  return {\n    next: nextState,\n    current: currentState,\n    procs: (function () {\n      var env = createREGLEnvironment()\n      var poll = env.proc('poll')\n      var refresh = env.proc('refresh')\n      var common = env.block()\n      poll(common)\n      refresh(common)\n\n      var shared = env.shared\n      var GL = shared.gl\n      var NEXT_STATE = shared.next\n      var CURRENT_STATE = shared.current\n\n      common(CURRENT_STATE, '.dirty=false;')\n\n      emitPollFramebuffer(env, poll)\n      emitPollFramebuffer(env, refresh, null, true)\n\n      // Refresh updates all attribute state changes\n      var INSTANCING\n      if (extInstancing) {\n        INSTANCING = env.link(extInstancing)\n      }\n\n      // update vertex array bindings\n      if (extensions.oes_vertex_array_object) {\n        refresh(env.link(extensions.oes_vertex_array_object), '.bindVertexArrayOES(null);')\n      }\n      for (var i = 0; i < limits.maxAttributes; ++i) {\n        var BINDING = refresh.def(shared.attributes, '[', i, ']')\n        var ifte = env.cond(BINDING, '.buffer')\n        ifte.then(\n          GL, '.enableVertexAttribArray(', i, ');',\n          GL, '.bindBuffer(',\n          GL_ARRAY_BUFFER$2, ',',\n          BINDING, '.buffer.buffer);',\n          GL, '.vertexAttribPointer(',\n          i, ',',\n          BINDING, '.size,',\n          BINDING, '.type,',\n          BINDING, '.normalized,',\n          BINDING, '.stride,',\n          BINDING, '.offset);'\n        ).else(\n          GL, '.disableVertexAttribArray(', i, ');',\n          GL, '.vertexAttrib4f(',\n          i, ',',\n          BINDING, '.x,',\n          BINDING, '.y,',\n          BINDING, '.z,',\n          BINDING, '.w);',\n          BINDING, '.buffer=null;')\n        refresh(ifte)\n        if (extInstancing) {\n          refresh(\n            INSTANCING, '.vertexAttribDivisorANGLE(',\n            i, ',',\n            BINDING, '.divisor);')\n        }\n      }\n      refresh(\n        env.shared.vao, '.currentVAO=null;',\n        env.shared.vao, '.setVAO(', env.shared.vao, '.targetVAO);')\n\n      Object.keys(GL_FLAGS).forEach(function (flag) {\n        var cap = GL_FLAGS[flag]\n        var NEXT = common.def(NEXT_STATE, '.', flag)\n        var block = env.block()\n        block('if(', NEXT, '){',\n          GL, '.enable(', cap, ')}else{',\n          GL, '.disable(', cap, ')}',\n          CURRENT_STATE, '.', flag, '=', NEXT, ';')\n        refresh(block)\n        poll(\n          'if(', NEXT, '!==', CURRENT_STATE, '.', flag, '){',\n          block,\n          '}')\n      })\n\n      Object.keys(GL_VARIABLES).forEach(function (name) {\n        var func = GL_VARIABLES[name]\n        var init = currentState[name]\n        var NEXT, CURRENT\n        var block = env.block()\n        block(GL, '.', func, '(')\n        if (isArrayLike(init)) {\n          var n = init.length\n          NEXT = env.global.def(NEXT_STATE, '.', name)\n          CURRENT = env.global.def(CURRENT_STATE, '.', name)\n          block(\n            loop(n, function (i) {\n              return NEXT + '[' + i + ']'\n            }), ');',\n            loop(n, function (i) {\n              return CURRENT + '[' + i + ']=' + NEXT + '[' + i + '];'\n            }).join(''))\n          poll(\n            'if(', loop(n, function (i) {\n              return NEXT + '[' + i + ']!==' + CURRENT + '[' + i + ']'\n            }).join('||'), '){',\n            block,\n            '}')\n        } else {\n          NEXT = common.def(NEXT_STATE, '.', name)\n          CURRENT = common.def(CURRENT_STATE, '.', name)\n          block(\n            NEXT, ');',\n            CURRENT_STATE, '.', name, '=', NEXT, ';')\n          poll(\n            'if(', NEXT, '!==', CURRENT, '){',\n            block,\n            '}')\n        }\n        refresh(block)\n      })\n\n      return env.compile()\n    })(),\n    compile: compileCommand\n  }\n}\n\nfunction stats () {\n  return {\n    vaoCount: 0,\n    bufferCount: 0,\n    elementsCount: 0,\n    framebufferCount: 0,\n    shaderCount: 0,\n    textureCount: 0,\n    cubeCount: 0,\n    renderbufferCount: 0,\n    maxTextureUnits: 0\n  }\n}\n\nvar GL_QUERY_RESULT_EXT = 0x8866\nvar GL_QUERY_RESULT_AVAILABLE_EXT = 0x8867\nvar GL_TIME_ELAPSED_EXT = 0x88BF\n\nvar createTimer = function (gl, extensions) {\n  if (!extensions.ext_disjoint_timer_query) {\n    return null\n  }\n\n  // QUERY POOL BEGIN\n  var queryPool = []\n  function allocQuery () {\n    return queryPool.pop() || extensions.ext_disjoint_timer_query.createQueryEXT()\n  }\n  function freeQuery (query) {\n    queryPool.push(query)\n  }\n  // QUERY POOL END\n\n  var pendingQueries = []\n  function beginQuery (stats) {\n    var query = allocQuery()\n    extensions.ext_disjoint_timer_query.beginQueryEXT(GL_TIME_ELAPSED_EXT, query)\n    pendingQueries.push(query)\n    pushScopeStats(pendingQueries.length - 1, pendingQueries.length, stats)\n  }\n\n  function endQuery () {\n    extensions.ext_disjoint_timer_query.endQueryEXT(GL_TIME_ELAPSED_EXT)\n  }\n\n  //\n  // Pending stats pool.\n  //\n  function PendingStats () {\n    this.startQueryIndex = -1\n    this.endQueryIndex = -1\n    this.sum = 0\n    this.stats = null\n  }\n  var pendingStatsPool = []\n  function allocPendingStats () {\n    return pendingStatsPool.pop() || new PendingStats()\n  }\n  function freePendingStats (pendingStats) {\n    pendingStatsPool.push(pendingStats)\n  }\n  // Pending stats pool end\n\n  var pendingStats = []\n  function pushScopeStats (start, end, stats) {\n    var ps = allocPendingStats()\n    ps.startQueryIndex = start\n    ps.endQueryIndex = end\n    ps.sum = 0\n    ps.stats = stats\n    pendingStats.push(ps)\n  }\n\n  // we should call this at the beginning of the frame,\n  // in order to update gpuTime\n  var timeSum = []\n  var queryPtr = []\n  function update () {\n    var ptr, i\n\n    var n = pendingQueries.length\n    if (n === 0) {\n      return\n    }\n\n    // Reserve space\n    queryPtr.length = Math.max(queryPtr.length, n + 1)\n    timeSum.length = Math.max(timeSum.length, n + 1)\n    timeSum[0] = 0\n    queryPtr[0] = 0\n\n    // Update all pending timer queries\n    var queryTime = 0\n    ptr = 0\n    for (i = 0; i < pendingQueries.length; ++i) {\n      var query = pendingQueries[i]\n      if (extensions.ext_disjoint_timer_query.getQueryObjectEXT(query, GL_QUERY_RESULT_AVAILABLE_EXT)) {\n        queryTime += extensions.ext_disjoint_timer_query.getQueryObjectEXT(query, GL_QUERY_RESULT_EXT)\n        freeQuery(query)\n      } else {\n        pendingQueries[ptr++] = query\n      }\n      timeSum[i + 1] = queryTime\n      queryPtr[i + 1] = ptr\n    }\n    pendingQueries.length = ptr\n\n    // Update all pending stat queries\n    ptr = 0\n    for (i = 0; i < pendingStats.length; ++i) {\n      var stats = pendingStats[i]\n      var start = stats.startQueryIndex\n      var end = stats.endQueryIndex\n      stats.sum += timeSum[end] - timeSum[start]\n      var startPtr = queryPtr[start]\n      var endPtr = queryPtr[end]\n      if (endPtr === startPtr) {\n        stats.stats.gpuTime += stats.sum / 1e6\n        freePendingStats(stats)\n      } else {\n        stats.startQueryIndex = startPtr\n        stats.endQueryIndex = endPtr\n        pendingStats[ptr++] = stats\n      }\n    }\n    pendingStats.length = ptr\n  }\n\n  return {\n    beginQuery: beginQuery,\n    endQuery: endQuery,\n    pushScopeStats: pushScopeStats,\n    update: update,\n    getNumPendingQueries: function () {\n      return pendingQueries.length\n    },\n    clear: function () {\n      queryPool.push.apply(queryPool, pendingQueries)\n      for (var i = 0; i < queryPool.length; i++) {\n        extensions.ext_disjoint_timer_query.deleteQueryEXT(queryPool[i])\n      }\n      pendingQueries.length = 0\n      queryPool.length = 0\n    },\n    restore: function () {\n      pendingQueries.length = 0\n      queryPool.length = 0\n    }\n  }\n}\n\nvar GL_COLOR_BUFFER_BIT = 16384\nvar GL_DEPTH_BUFFER_BIT = 256\nvar GL_STENCIL_BUFFER_BIT = 1024\n\nvar GL_ARRAY_BUFFER = 34962\n\nvar CONTEXT_LOST_EVENT = 'webglcontextlost'\nvar CONTEXT_RESTORED_EVENT = 'webglcontextrestored'\n\nvar DYN_PROP = 1\nvar DYN_CONTEXT = 2\nvar DYN_STATE = 3\n\nfunction find (haystack, needle) {\n  for (var i = 0; i < haystack.length; ++i) {\n    if (haystack[i] === needle) {\n      return i\n    }\n  }\n  return -1\n}\n\nfunction wrapREGL (args) {\n  var config = parseArgs(args)\n  if (!config) {\n    return null\n  }\n\n  var gl = config.gl\n  var glAttributes = gl.getContextAttributes()\n  var contextLost = gl.isContextLost()\n\n  var extensionState = createExtensionCache(gl, config)\n  if (!extensionState) {\n    return null\n  }\n\n  var stringStore = createStringStore()\n  var stats$$1 = stats()\n  var extensions = extensionState.extensions\n  var timer = createTimer(gl, extensions)\n\n  var START_TIME = clock()\n  var WIDTH = gl.drawingBufferWidth\n  var HEIGHT = gl.drawingBufferHeight\n\n  var contextState = {\n    tick: 0,\n    time: 0,\n    viewportWidth: WIDTH,\n    viewportHeight: HEIGHT,\n    framebufferWidth: WIDTH,\n    framebufferHeight: HEIGHT,\n    drawingBufferWidth: WIDTH,\n    drawingBufferHeight: HEIGHT,\n    pixelRatio: config.pixelRatio\n  }\n  var uniformState = {}\n  var drawState = {\n    elements: null,\n    primitive: 4, // GL_TRIANGLES\n    count: -1,\n    offset: 0,\n    instances: -1\n  }\n\n  var limits = wrapLimits(gl, extensions)\n  var bufferState = wrapBufferState(\n    gl,\n    stats$$1,\n    config,\n    destroyBuffer)\n  var attributeState = wrapAttributeState(\n    gl,\n    extensions,\n    limits,\n    stats$$1,\n    bufferState)\n  function destroyBuffer (buffer) {\n    return attributeState.destroyBuffer(buffer)\n  }\n  var elementState = wrapElementsState(gl, extensions, bufferState, stats$$1)\n  var shaderState = wrapShaderState(gl, stringStore, stats$$1, config)\n  var textureState = createTextureSet(\n    gl,\n    extensions,\n    limits,\n    function () { core.procs.poll() },\n    contextState,\n    stats$$1,\n    config)\n  var renderbufferState = wrapRenderbuffers(gl, extensions, limits, stats$$1, config)\n  var framebufferState = wrapFBOState(\n    gl,\n    extensions,\n    limits,\n    textureState,\n    renderbufferState,\n    stats$$1)\n  var core = reglCore(\n    gl,\n    stringStore,\n    extensions,\n    limits,\n    bufferState,\n    elementState,\n    textureState,\n    framebufferState,\n    uniformState,\n    attributeState,\n    shaderState,\n    drawState,\n    contextState,\n    timer,\n    config)\n  var readPixels = wrapReadPixels(\n    gl,\n    framebufferState,\n    core.procs.poll,\n    contextState,\n    glAttributes, extensions, limits)\n\n  var nextState = core.next\n  var canvas = gl.canvas\n\n  var rafCallbacks = []\n  var lossCallbacks = []\n  var restoreCallbacks = []\n  var destroyCallbacks = [config.onDestroy]\n\n  var activeRAF = null\n  function handleRAF () {\n    if (rafCallbacks.length === 0) {\n      if (timer) {\n        timer.update()\n      }\n      activeRAF = null\n      return\n    }\n\n    // schedule next animation frame\n    activeRAF = raf.next(handleRAF)\n\n    // poll for changes\n    poll()\n\n    // fire a callback for all pending rafs\n    for (var i = rafCallbacks.length - 1; i >= 0; --i) {\n      var cb = rafCallbacks[i]\n      if (cb) {\n        cb(contextState, null, 0)\n      }\n    }\n\n    // flush all pending webgl calls\n    gl.flush()\n\n    // poll GPU timers *after* gl.flush so we don't delay command dispatch\n    if (timer) {\n      timer.update()\n    }\n  }\n\n  function startRAF () {\n    if (!activeRAF && rafCallbacks.length > 0) {\n      activeRAF = raf.next(handleRAF)\n    }\n  }\n\n  function stopRAF () {\n    if (activeRAF) {\n      raf.cancel(handleRAF)\n      activeRAF = null\n    }\n  }\n\n  function handleContextLoss (event) {\n    event.preventDefault()\n\n    // set context lost flag\n    contextLost = true\n\n    // pause request animation frame\n    stopRAF()\n\n    // lose context\n    lossCallbacks.forEach(function (cb) {\n      cb()\n    })\n  }\n\n  function handleContextRestored (event) {\n    // clear error code\n    gl.getError()\n\n    // clear context lost flag\n    contextLost = false\n\n    // refresh state\n    extensionState.restore()\n    shaderState.restore()\n    bufferState.restore()\n    textureState.restore()\n    renderbufferState.restore()\n    framebufferState.restore()\n    attributeState.restore()\n    if (timer) {\n      timer.restore()\n    }\n\n    // refresh state\n    core.procs.refresh()\n\n    // restart RAF\n    startRAF()\n\n    // restore context\n    restoreCallbacks.forEach(function (cb) {\n      cb()\n    })\n  }\n\n  if (canvas) {\n    canvas.addEventListener(CONTEXT_LOST_EVENT, handleContextLoss, false)\n    canvas.addEventListener(CONTEXT_RESTORED_EVENT, handleContextRestored, false)\n  }\n\n  function destroy () {\n    rafCallbacks.length = 0\n    stopRAF()\n\n    if (canvas) {\n      canvas.removeEventListener(CONTEXT_LOST_EVENT, handleContextLoss)\n      canvas.removeEventListener(CONTEXT_RESTORED_EVENT, handleContextRestored)\n    }\n\n    shaderState.clear()\n    framebufferState.clear()\n    renderbufferState.clear()\n    textureState.clear()\n    elementState.clear()\n    bufferState.clear()\n    attributeState.clear()\n\n    if (timer) {\n      timer.clear()\n    }\n\n    destroyCallbacks.forEach(function (cb) {\n      cb()\n    })\n  }\n\n  function compileProcedure (options) {\n    \n    \n\n    function flattenNestedOptions (options) {\n      var result = extend({}, options)\n      delete result.uniforms\n      delete result.attributes\n      delete result.context\n      delete result.vao\n\n      if ('stencil' in result && result.stencil.op) {\n        result.stencil.opBack = result.stencil.opFront = result.stencil.op\n        delete result.stencil.op\n      }\n\n      function merge (name) {\n        if (name in result) {\n          var child = result[name]\n          delete result[name]\n          Object.keys(child).forEach(function (prop) {\n            result[name + '.' + prop] = child[prop]\n          })\n        }\n      }\n      merge('blend')\n      merge('depth')\n      merge('cull')\n      merge('stencil')\n      merge('polygonOffset')\n      merge('scissor')\n      merge('sample')\n\n      if ('vao' in options) {\n        result.vao = options.vao\n      }\n\n      return result\n    }\n\n    function separateDynamic (object, useArrays) {\n      var staticItems = {}\n      var dynamicItems = {}\n      Object.keys(object).forEach(function (option) {\n        var value = object[option]\n        if (dynamic.isDynamic(value)) {\n          dynamicItems[option] = dynamic.unbox(value, option)\n          return\n        } else if (useArrays && Array.isArray(value)) {\n          for (var i = 0; i < value.length; ++i) {\n            if (dynamic.isDynamic(value[i])) {\n              dynamicItems[option] = dynamic.unbox(value, option)\n              return\n            }\n          }\n        }\n        staticItems[option] = value\n      })\n      return {\n        dynamic: dynamicItems,\n        static: staticItems\n      }\n    }\n\n    // Treat context variables separate from other dynamic variables\n    var context = separateDynamic(options.context || {}, true)\n    var uniforms = separateDynamic(options.uniforms || {}, true)\n    var attributes = separateDynamic(options.attributes || {}, false)\n    var opts = separateDynamic(flattenNestedOptions(options), false)\n\n    var stats$$1 = {\n      gpuTime: 0.0,\n      cpuTime: 0.0,\n      count: 0\n    }\n\n    var compiled = core.compile(opts, attributes, uniforms, context, stats$$1)\n\n    var draw = compiled.draw\n    var batch = compiled.batch\n    var scope = compiled.scope\n\n    // FIXME: we should modify code generation for batch commands so this\n    // isn't necessary\n    var EMPTY_ARRAY = []\n    function reserve (count) {\n      while (EMPTY_ARRAY.length < count) {\n        EMPTY_ARRAY.push(null)\n      }\n      return EMPTY_ARRAY\n    }\n\n    function REGLCommand (args, body) {\n      var i\n      if (contextLost) {\n        \n      }\n      if (typeof args === 'function') {\n        return scope.call(this, null, args, 0)\n      } else if (typeof body === 'function') {\n        if (typeof args === 'number') {\n          for (i = 0; i < args; ++i) {\n            scope.call(this, null, body, i)\n          }\n        } else if (Array.isArray(args)) {\n          for (i = 0; i < args.length; ++i) {\n            scope.call(this, args[i], body, i)\n          }\n        } else {\n          return scope.call(this, args, body, 0)\n        }\n      } else if (typeof args === 'number') {\n        if (args > 0) {\n          return batch.call(this, reserve(args | 0), args | 0)\n        }\n      } else if (Array.isArray(args)) {\n        if (args.length) {\n          return batch.call(this, args, args.length)\n        }\n      } else {\n        return draw.call(this, args)\n      }\n    }\n\n    return extend(REGLCommand, {\n      stats: stats$$1,\n      destroy: function () {\n        compiled.destroy()\n      }\n    })\n  }\n\n  var setFBO = framebufferState.setFBO = compileProcedure({\n    framebuffer: dynamic.define.call(null, DYN_PROP, 'framebuffer')\n  })\n\n  function clearImpl (_, options) {\n    var clearFlags = 0\n    core.procs.poll()\n\n    var c = options.color\n    if (c) {\n      gl.clearColor(+c[0] || 0, +c[1] || 0, +c[2] || 0, +c[3] || 0)\n      clearFlags |= GL_COLOR_BUFFER_BIT\n    }\n    if ('depth' in options) {\n      gl.clearDepth(+options.depth)\n      clearFlags |= GL_DEPTH_BUFFER_BIT\n    }\n    if ('stencil' in options) {\n      gl.clearStencil(options.stencil | 0)\n      clearFlags |= GL_STENCIL_BUFFER_BIT\n    }\n\n    \n    gl.clear(clearFlags)\n  }\n\n  function clear (options) {\n    \n    if ('framebuffer' in options) {\n      if (options.framebuffer &&\n          options.framebuffer_reglType === 'framebufferCube') {\n        for (var i = 0; i < 6; ++i) {\n          setFBO(extend({\n            framebuffer: options.framebuffer.faces[i]\n          }, options), clearImpl)\n        }\n      } else {\n        setFBO(options, clearImpl)\n      }\n    } else {\n      clearImpl(null, options)\n    }\n  }\n\n  function frame (cb) {\n    \n    rafCallbacks.push(cb)\n\n    function cancel () {\n      // FIXME:  should we check something other than equals cb here?\n      // what if a user calls frame twice with the same callback...\n      //\n      var i = find(rafCallbacks, cb)\n      \n      function pendingCancel () {\n        var index = find(rafCallbacks, pendingCancel)\n        rafCallbacks[index] = rafCallbacks[rafCallbacks.length - 1]\n        rafCallbacks.length -= 1\n        if (rafCallbacks.length <= 0) {\n          stopRAF()\n        }\n      }\n      rafCallbacks[i] = pendingCancel\n    }\n\n    startRAF()\n\n    return {\n      cancel: cancel\n    }\n  }\n\n  // poll viewport\n  function pollViewport () {\n    var viewport = nextState.viewport\n    var scissorBox = nextState.scissor_box\n    viewport[0] = viewport[1] = scissorBox[0] = scissorBox[1] = 0\n    contextState.viewportWidth =\n      contextState.framebufferWidth =\n      contextState.drawingBufferWidth =\n      viewport[2] =\n      scissorBox[2] = gl.drawingBufferWidth\n    contextState.viewportHeight =\n      contextState.framebufferHeight =\n      contextState.drawingBufferHeight =\n      viewport[3] =\n      scissorBox[3] = gl.drawingBufferHeight\n  }\n\n  function poll () {\n    contextState.tick += 1\n    contextState.time = now()\n    pollViewport()\n    core.procs.poll()\n  }\n\n  function refresh () {\n    textureState.refresh()\n    pollViewport()\n    core.procs.refresh()\n    if (timer) {\n      timer.update()\n    }\n  }\n\n  function now () {\n    return (clock() - START_TIME) / 1000.0\n  }\n\n  refresh()\n\n  function addListener (event, callback) {\n    \n\n    var callbacks\n    switch (event) {\n      case 'frame':\n        return frame(callback)\n      case 'lost':\n        callbacks = lossCallbacks\n        break\n      case 'restore':\n        callbacks = restoreCallbacks\n        break\n      case 'destroy':\n        callbacks = destroyCallbacks\n        break\n      default:\n        \n    }\n\n    callbacks.push(callback)\n    return {\n      cancel: function () {\n        for (var i = 0; i < callbacks.length; ++i) {\n          if (callbacks[i] === callback) {\n            callbacks[i] = callbacks[callbacks.length - 1]\n            callbacks.pop()\n            return\n          }\n        }\n      }\n    }\n  }\n\n  var regl = extend(compileProcedure, {\n    // Clear current FBO\n    clear: clear,\n\n    // Short cuts for dynamic variables\n    prop: dynamic.define.bind(null, DYN_PROP),\n    context: dynamic.define.bind(null, DYN_CONTEXT),\n    this: dynamic.define.bind(null, DYN_STATE),\n\n    // executes an empty draw command\n    draw: compileProcedure({}),\n\n    // Resources\n    buffer: function (options) {\n      return bufferState.create(options, GL_ARRAY_BUFFER, false, false)\n    },\n    elements: function (options) {\n      return elementState.create(options, false)\n    },\n    texture: textureState.create2D,\n    cube: textureState.createCube,\n    renderbuffer: renderbufferState.create,\n    framebuffer: framebufferState.create,\n    framebufferCube: framebufferState.createCube,\n    vao: attributeState.createVAO,\n\n    // Expose context attributes\n    attributes: glAttributes,\n\n    // Frame rendering\n    frame: frame,\n    on: addListener,\n\n    // System limits\n    limits: limits,\n    hasExtension: function (name) {\n      return limits.extensions.indexOf(name.toLowerCase()) >= 0\n    },\n\n    // Read pixels\n    read: readPixels,\n\n    // Destroy regl and all associated resources\n    destroy: destroy,\n\n    // Direct GL state manipulation\n    _gl: gl,\n    _refresh: refresh,\n\n    poll: function () {\n      poll()\n      if (timer) {\n        timer.update()\n      }\n    },\n\n    // Current time\n    now: now,\n\n    // regl Statistics Information\n    stats: stats$$1\n  })\n\n  config.onDone(null, regl)\n\n  return regl\n}\n\nreturn wrapREGL;\n\n})));\n"],"sourceRoot":""}