{"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":""}