{"version":3,"sources":["node_modules/browserify/node_modules/browser-pack/_prelude.js","node_modules/mapbox-gl-style-spec/reference/v7.json","js/mapbox-gl.js","node_modules/point-geometry/index.js","js/ui/map.js","js/ui/popup.js","js/source/geojson_source.js","js/source/video_source.js","js/style/style.js","js/geo/lat_lng.js","js/geo/lat_lng_bounds.js","js/util/evented.js","js/util/util.js","js/util/config.js","js/ui/control/control.js","js/ui/control/navigation.js","js/ui/control/attribution.js","js/util/browser/browser.js","js/util/browser/ajax.js","js/style/animation_loop.js","js/render/painter.js","js/geo/transform.js","js/ui/hash.js","js/ui/interaction.js","js/ui/camera.js","js/source/tile_pyramid.js","js/source/source.js","js/source/tile.js","js/geo/coordinate.js","js/style/style_batch.js","js/style/style_layer.js","js/style/image_sprite.js","js/symbol/glyph_source.js","js/symbol/glyph_atlas.js","js/symbol/sprite_atlas.js","js/render/line_atlas.js","js/util/mapbox.js","js/util/browser/canvas.js","js/util/browser/dom.js","js/util/browser/dispatcher.js","node_modules/resolve-url/resolve-url.js","node_modules/unitbezier/index.js","js/render/gl_util.js","js/render/frame_history.js","js/render/draw_symbol.js","js/render/draw_line.js","js/render/draw_fill.js","js/render/draw_background.js","js/render/draw_raster.js","js/render/draw_debug.js","js/render/draw_vertices.js","js/util/interpolate.js","js/source/tile_coord.js","js/util/mru_cache.js","js/source/vector_tile_source.js","js/source/raster_tile_source.js","js/style/style_constant.js","js/style/style_transition.js","js/style/style_declaration_set.js","js/style/layout_properties.js","js/style/paint_properties.js","js/util/glyphs.js","js/symbol/bin_pack.js","js/ui/handler/scroll_zoom.js","js/ui/handler/box_zoom.js","js/ui/handler/drag_rotate.js","js/ui/handler/drag_pan.js","js/ui/handler/keyboard.js","js/ui/handler/dblclick_zoom.js","js/ui/handler/pinch.js","js/data/buffer/buffer_set.js","node_modules/gl-matrix/src/gl-matrix.js","node_modules/pbf/index.js","js/source/worker.js","js/util/actor.js","node_modules/mapbox-gl-style-spec/lib/validate/latest.js","node_modules/gl-matrix/src/gl-matrix/common.js","node_modules/gl-matrix/src/gl-matrix/mat2.js","node_modules/gl-matrix/src/gl-matrix/mat2d.js","node_modules/gl-matrix/src/gl-matrix/mat3.js","node_modules/gl-matrix/src/gl-matrix/mat4.js","node_modules/gl-matrix/src/gl-matrix/quat.js","node_modules/gl-matrix/src/gl-matrix/vec2.js","node_modules/gl-matrix/src/gl-matrix/vec3.js","node_modules/gl-matrix/src/gl-matrix/vec4.js","node_modules/pbf/buffer.js","node_modules/mapbox-gl-style-spec/reference/latest.js","node_modules/mapbox-gl-style-spec/lib/validate/parsed.js","node_modules/webworkify/index.js","js/render/shaders.js","js/render/draw_collision_debug.js","js/lib/debugtext.js","js/style/reference.js","js/style/style_declaration.js","node_modules/pbf/node_modules/ieee754/index.js","node_modules/csscolorparser/csscolorparser.js","js/source/worker_tile.js","js/source/geojson_wrapper.js","node_modules/browserify/node_modules/util/util.js","js/data/buffer/line_vertex_buffer.js","js/data/buffer/line_element_buffer.js","js/data/buffer/fill_vertex_buffer.js","js/data/buffer/triangle_element_buffer.js","js/data/buffer/outline_element_buffer.js","js/data/buffer/glyph_vertex_buffer.js","js/data/buffer/icon_vertex_buffer.js","js/data/buffer/collision_box_vertex_buffer.js","node_modules/vector-tile/index.js","node_modules/geojson-vt/src/index.js","node_modules/browserify/node_modules/util/support/isBufferBrowser.js","node_modules/browserify/node_modules/process/browser.js","node_modules/vector-tile/lib/vectortile.js","node_modules/vector-tile/lib/vectortilefeature.js","node_modules/vector-tile/lib/vectortilelayer.js","node_modules/geojson-vt/src/convert.js","node_modules/geojson-vt/src/clip.js","node_modules/geojson-vt/src/wrap.js","node_modules/geojson-vt/src/tile.js","node_modules/browserify/node_modules/inherits/inherits_browser.js","node_modules/geojson-vt/src/simplify.js","js/data/feature_tree.js","js/symbol/collision_tile.js","js/data/create_bucket.js","node_modules/mapbox-gl-function/index.js","js/data/buffer/buffer.js","js/data/line_bucket.js","js/data/fill_bucket.js","js/data/symbol_bucket.js","node_modules/rbush/rbush.js","node_modules/feature-filter/index.js","js/data/element_groups.js","js/symbol/anchor.js","js/symbol/get_anchors.js","js/util/token.js","js/symbol/quads.js","js/symbol/shaping.js","js/symbol/resolve_text.js","js/symbol/resolve_icons.js","js/symbol/mergelines.js","js/symbol/clip_line.js","js/symbol/collision_feature.js","js/symbol/check_max_angle.js","js/symbol/collision_box.js"],"names":["mapboxgl","module","exports","Map","require","Control","Navigation","Attribution","Popup","GeoJSONSource","VideoSource","Style","LatLng","LatLngBounds","Point","Evented","util","supported","ajax","getJSON","getArrayBuffer","config","Object","defineProperty","get","ACCESS_TOKEN","set","token","x","y","this","prototype","clone","add","p","_add","sub","_sub","mult","k","_mult","div","_div","rotate","a","_rotate","matMult","m","_matMult","unit","_unit","perp","_perp","round","_round","mag","Math","sqrt","equals","dist","distSqr","dx","dy","angle","atan2","angleTo","b","angleWith","angleWithSep","cos","sin","convert","Array","isArray","Canvas","browser","DOM","AnimationLoop","Painter","Transform","Hash","Interaction","Camera","options","inherit","animationLoop","transform","minZoom","maxZoom","maxBounds","latRange","getSouth","getNorth","lngRange","getWest","getEast","bindAll","_setupContainer","_setupPainter","on","update","bind","_rerender","window","addEventListener","stop","resize","interaction","interactive","enable","_hash","hash","addTo","_onHashChange","jumpTo","sources","stacks","_classes","classes","setClasses","style","setStyle","attributionControl","addControl","extend","center","zoom","bearing","pitch","scrollZoom","boxZoom","dragRotate","dragPan","keyboard","doubleClickZoom","pinch","bearingSnap","failIfMajorPerformanceCaveat","preserveDrawingBuffer","control","addClass","klass","_cascade","removeClass","klasses","i","length","hasClass","getClasses","keys","width","height","_container","offsetWidth","offsetHeight","_canvas","_constrain","painter","fire","getBounds","pointLocation","size","project","latlng","locationPoint","unproject","point","featuresAt","params","callback","location","wrap","coord","locationCoordinate","batch","work","off","_onStyleLoad","_forwardStyleEvent","_onStyleChange","_onSourceAdd","_onSourceRemove","_onSourceUpdate","_forwardSourceEvent","_forwardLayerEvent","_forwardTileEvent","_remove","_redoPlacement","addSource","id","source","removeSource","getSource","addLayer","layer","before","removeLayer","setFilter","filter","setLayerZoomRange","layerId","minzoom","maxzoom","getFilter","setPaintProperty","name","value","getPaintProperty","setLayoutProperty","getLayoutProperty","getContainer","getCanvasContainer","_canvasContainer","getCanvas","getElement","container","document","getElementById","classList","canvasContainer","create","controlContainer","corners","_controlCorners","forEach","pos","gl","getWebGLContext","console","error","_contextLost","event","preventDefault","_frameId","cancelFrame","_contextRestored","loaded","_styleDirty","_sourcesDirty","updateStyle","render","_recalculate","_sourcesDirtyTimeout","setTimeout","_updateSources","debug","vertices","rotating","zooming","_loaded","stopped","_repaint","remove","clearTimeout","frame","e","type","target","transition","onAdd","onRemove","extendAll","_debug",{"end":{"file":"?","comments_before":[],"nlb":false,"endpos":23775,"endcol":13,"endline":768,"pos":23770,"col":8,"line":768,"value":"debug","type":"name"},"start":{"file":"?","comments_before":[],"nlb":false,"endpos":23775,"endcol":13,"endline":768,"pos":23770,"col":8,"line":768,"value":"debug","type":"name"},"name":"debug"},"_collisionDebug","collisionDebug","reload","repaint","_vertices","setOptions","closeButton","closeOnClick","map","_map","_updatePosition","_onClickClose","_update","parentNode","removeChild","getLatLng","_latLng","setLatLng","setText","text","_content","createTextNode","_updateContent","setHTML","html","createDocumentFragment","child","temp","createElement","innerHTML","firstChild","appendChild","_tip","_wrapper","_closeButton","node","hasChildNodes","anchor","push","join","anchorTranslate","top","top-left","top-right","bottom","bottom-left","bottom-right","left","right","key","setTransform","_data","data","undefined","geojsonVtOptions","buffer","tolerance","_pyramid","TilePyramid","tileSize","cacheSize","load","_loadTile","abort","_abortTile","unload","_unloadTile","_addTile","_removeTile","Source","urlResolve","_dirty","setData","_updateData","used","_renderTiles","_vectorFeaturesAt","href","workerID","dispatcher","send","err","tile","overscaling","z","pow","uid","unloadVectorData","aborted","loadVectorData","glyphAtlas","removeGlyphs","coordinates","getVideo","url","video","loop","loopID","Infinity","cancel","play","createTile","Tile","Coordinate","roundZoom","coords","loc","zoomTo","minX","minY","maxX","maxY","min","column","row","max","dMax","floor","log","LN2","tileExtent","tileCoords","zoomedCoord","maxInt16","array","Int16Array","buckets","boundsBuffer","createBuffer","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","readyState","layers","c","calculateMatrices","texture","bindTexture","TEXTURE_2D","texSubImage2D","RGBA","UNSIGNED_BYTE","createTexture","texParameteri","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","TEXTURE_MIN_FILTER","LINEAR","TEXTURE_MAG_FILTER","texImage2D","drawLayers","posMatrix","stylesheet","Dispatcher","hardwareConcurrency","GlyphAtlas","spriteAtlas","SpriteAtlas","devicePixelRatio","lineAtlas","LineAtlas","_layers","_order","_groups","zoomHistory","valid","validate","Error","message","sprite","ImageSprite","glyphSource","GlyphSource","glyphs","_resolve","normalizeURL","styleBatch","StyleLayer","normalizeStyleURL","constants","resolveLayout","resolveReference","resolvePaint","_groupLayers","_broadcastLayers","group","ordered","json","broadcast","cascade","_updateZoomHistory","rasterFadeDuration","recalculate","maxZoomTransitionDuration","zh","lastIntegerZoom","lastIntegerZoomTime","lastZoom","Date","now","getLayer","getReferentLayer","ref","features","asyncEach","result","concat","feature","_reloadSource","redoPlacement","get sprite json","retina","get icons","setSprite","addIcons","icons","get glyphs","getSimpleGlyphs","fontstack","codepoints","lat","lng","isNaN","input","sw","ne","latlngs","len","obj","sw2","ne2","_sw","_ne","getCenter","getSouthWest","getNorthEast","getNorthWest","getSouthEast","fn","_events","listens","idx","indexOf","splice","once","wrapper","call","listeners","slice","UnitBezier","easeCubicInOut","t","t2","t3","bezier","p1x","p1y","p2x","p2y","solve","ease","premultiply","clamp","n","d","coalesce","arguments","arg","check","remaining","keysDifference","other","difference","dest","src","getOwnPropertyDescriptor","parent","props","parentProto","proto","pick","properties","uniqueId","throttle","time","context","lock","args","wrapperFn","later","apply","debounce","timer","fns","bindHandlers","hasOwnProperty","HTTP_URL","HTTPS_URL","FORCE_HTTPS","REQUIRE_ACCESS_TOKEN","position","corner","className","insertBefore","_zoomInButton","_createButton","zoomIn","_zoomOutButton","zoomOut","_compass","resetNorth","compassCanvas","_compassCanvas","cssText","_onCompassDown","_onCompassMove","_onCompassUp","_compassCtx","getContext","_drawNorth","disableDrag","_prevX","screenX","stopPropagation","screen","setBearing","getBearing","_moved","removeEventListener","enableDrag","suppressClick","snapToNorth","rad","PI","ctx","translate","beginPath","fillStyle","lineTo","fill","moveTo","strokeStyle","lineWidth","stroke","_updateEditLink","attributions","attribution","_editLink","getElementsByClassName","getZoom","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","cancelAnimationFrame","mozCancelAnimationFrame","webkitCancelAnimationFrame","msCancelAnimationFrame","timed","dur","tick","performance","start","supports","every","lastIndexOf","some","reduce","reduceRight","Function","getPrototypeOf","getOwnPropertyNames","isSealed","isFrozen","isExtensible","defineProperties","seal","freeze","preventExtensions","JSON","supportsWebGLContext","navigator","sameOrigin","protocol","host","xhr","XMLHttpRequest","open","onerror","onload","status","response","parse","statusText","responseType","getImage","img","Image","crossOrigin","getData","canvas","drawImage","getImageData","urls","onloadstart","s","times","getTime","glutil","reusableTextures","preFbos","frameHistory","FrameHistory","setup","mat4","viewport","verbose","BLEND","blendFunc","ONE_MINUS_DST_ALPHA","ONE","STENCIL_TEST","debugShader","initializeShader","gaussianShader","rasterShader","lineShader","linepatternShader","linesdfpatternShader","dotShader","sdfShader","iconShader","outlineShader","patternShader","fillShader","collisionBoxShader","identityMatrix","backgroundBuffer","itemSize","itemCount","setExtent","debugTextBuffer","newExtent","tileExtentBuffer","debugBuffer","clearColor","clear","COLOR_BUFFER_BIT","clearStencil","stencilMask","STENCIL_BUFFER_BIT","drawClippingMask","switchShader","colorMask","stencilFunc","EQUAL","stencilOp","REPLACE","KEEP","disableVertexAttribArray","a_color","vertexAttribPointer","a_pos","SHORT","drawArrays","TRIANGLE_STRIP","enableVertexAttribArray","prepareBuffers","bindDefaultFramebuffer","bindFramebuffer","FRAMEBUFFER","draw","symbol","line","raster","background","record","drawTile","matrix","hidden","drawStencilBuffer","ONE_MINUS_SRC_ALPHA","vertexAttrib4fv","translateMatrix","sinA","cosA","tilePixelRatio","scale","translation","translatedMatrix","Float32Array","saveTexture","textures","getTexture","pop","_minZoom","_maxZoom","_altitude","_pitch","interp","vec4","worldSize","centerPoint","altitude","_zoom","zoomScale","tileZoom","zoomFraction","scaleZoom","lngX","latY","yLat","xLng","lon","tan","y2","atan","exp","panBy","offset","setLocationAtPoint","coordAtPoint","pointCoordinate","coordCenter","coordinateLocation","setZoomAround","setBearingAround","coordinatePoint","targetZ","coordinatePointMatrix","inverted","invert","Float64Array","coord0","transformMat4","coord1","w0","w1","x0","x1","y0","y1","z0","z1","proj","getProjMatrix","multiply","getPixelMatrix","sy","sx","x2","h2","w2","halfFov","topHalfSurfaceDistance","farZ","perspective","rotateX","rotateZ","_updateHash","replace","split","precision","ceil","toFixed","history","replaceState","_el","handlers","el","_onMouseDown","_onTouchStart","_onClick","_onMouseMove","_onDblClick","disable","_startPos","mousePos","touches","_tapped","_fireEvent","_onTimeout","active","toElement","latLng","originalEvent","interpolate","setCenter","panTo","duration","easing","tr","from","to","noMoveStart","_ease","setZoom","_updateEasing","around","startZoom","animate","_onZoomEnd","rotateTo","_normalizeBearing","abs","getPitch","setPitch","fitBounds","bounds","padding","nw","se","scaleX","scaleY","linear","easeTo","flyTo","zoomChanged","bearingChanged","pitchChanged","startBearing","startPitch","r","rho2","u1","sinh","cosh","tanh","speed","curve","startWorldSize","rho","V","r0","w","u","S","us","isEasing","_abortFn","_finishEase","finish","_finishFn","currentBearing","diff","reparseOverscaled","_load","_abort","_unload","_tiles","_cache","Cache","TileCoord","orderedIDs","sort","renderedIDs","_coveredTiles","reset","getTile","coveringZoomLevel","coveringTiles","actualZ","tileCenter","_zoomTo","cover","findLoadedChildren","maxCoveringZoom","retain","complete","children","findLoadedParent","minCoveringZoom","fadeDuration","required","addTile","fromID","timeAdded","removeTile","wrapped","uses","clearTiles","tileAt","ids","positionAt","normalizeSourceURL","_loadTileJSON","tileJSON","_redoTilePlacement","vector","geojson","glmatrix","mat2","BufferSet","tileScale","identity","exMatrix","ortho","rotationMatrix","sourceMaxZoom","buffers","elementGroups","extent","reloadSymbolData","glyphVertex","destroy","glyphElement","iconVertex","iconElement","collisionBoxVertex","_style","_reloadSources","_change","sourceId","_layer","_constants","_resolved","_cascaded","assign","premultiplyLayer","colorProp","haloProp","outlineProp","color","haloColor","outlineColor","opacity","colorOpacity","haloOpacity","outlineOpacity","StyleConstant","StyleTransition","StyleDeclarationSet","LayoutProperties","PaintProperties","layout","resolveAll","resolve","match","declarations","globalTrans","values","newDeclaration","oldTransition","declaration","newStyleTrans","newTransition","instant","endTime","calculated","paint","at","visibility","dashArray","fromScale","toScale","base","newdata","Uint8Array","alpha","SpritePosition","toJSON","newSprite","pixelRatio","sdf","getSpritePosition","loading","SimpleGlyph","glyph","rect","advance","glyphUrl","range","subdomains","normalizeGlyphsURL","Glyphs","Protobuf","glyphIDs","stack","missing","glyphID","addGlyph","onRangeLoaded","loadRange","rangeName","bin","BinPack","index","body","getGlyphs","getRects","rects","h","dirty","release","updateTexture","bitmap","bufferedWidth","bufferedHeight","packWidth","packHeight","allocate","warn","ALPHA","j","putImageData","free","strokeRect","images","copyBitmap","srcStride","srcX","srcY","dst","dstStride","dstX","dstY","srcI","dstI","AtlasImage","newRatio","oldRatio","oldData","oldWidth","oldHeight","newWidth","newHeight","newImage","oldImage","oldYOffset","newYOffset","oldX","allocateImage","pixelWidth","pixelHeight","originalWidth","originalHeight","image","copy","getPosition","repeating","tl","br","Uint32Array","srcImg","dstImg","first","filterVal","NEAREST","Uint8ClampedArray","nextRow","bytes","positions","getDash","dasharray","addDash","stretch","halfWidth","oddLength","partIndex","signedDistance","distLeft","distRight","inside","distMiddle","distEdge","REPEAT","pathPrefix","accessToken","https","user","normalizeTileURL","sourceUrl","setAttribute","requiredContextAttributes","antialias","stencil","depth","attributes","probablySupportsContext","supportsContext","WebGLRenderingContext","testProp","docStyle","tagName","documentElement","selectProp","userSelect","transformProp","getBoundingClientRect","clientX","clientLeft","clientY","clientTop","actors","currentActor","worker","WebWorkify","actor","Actor","targetID","terminate","root","factory","define","amd","resolveUrl","numUrls","head","getElementsByTagName","resolved","cx","bx","ax","cy","by","ay","sampleCurveX","sampleCurveY","sampleCurveDerivativeX","solveCurveX","epsilon","t0","t1","d2","shaders","origLineWidth","lineWidthRange","getParameter","ALIASED_LINE_WIDTH_RANGE","getShader","kind","FRAGMENT_SHADER","shader","createShader","shaderSource","orientation","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","uniforms","program","createProgram","fragment","vertex","VERTEX_SHADER","attachShader","bindAttribLocation","linkProgram","getProgramParameter","LINK_STATUS","getAttribLocation","getUniformLocation","getProgramInfoLog","trace","currentShader","useProgram","previous","next","uniformMatrix4fv","u_matrix","u_exmatrix","vertexAttrib2fv","attribute","vertexAttrib2f","vertexAttrib3fv","vertexAttrib3f","vertexAttrib4f","getFadeProperties","currentTime","shift","frameLen","startingZ","lastFrame","endingZ","lowZ","highZ","zoomDiff","timeDiff","fadedist","bump","minfadezoom","maxfadezoom","drawSymbols","drawAcrossEdges","groups","drawSymbol","icon","sdfIcons","drawCollisionDebug","prefix","gammaScale","alignedWithMap","skewed","fontSize","fontScale","defaultSizes","elements","texsize","topedgelength","extra","activeTexture","TEXTURE0","uniform1i","u_texture","uniform2fv","u_texsize","u_skewed","uniform1f","u_extra","zoomAdjust","u_zoom","f","u_fadedist","u_minfadezoom","u_maxfadezoom","u_fadezoom","count","elementOffset","sdfPx","blurOffset","haloOffset","gamma","a_gamma","vertexAttrib1f","a_buffer","vertexStartIndex","elementLength","elementStartIndex","drawElements","TRIANGLES","UNSIGNED_SHORT","a_opacity","antialiasing","blur","edgeWidth","inset","outset","ratio","vtxMatrix","antialiasingMatrix","u_ratio","posA","posB","patternratio","scaleA","gammaA","scaleB","gammaB","u_patternscale_a","u_tex_y_a","u_patternscale_b","u_tex_y_b","u_image","u_sdfgamma","u_mix","imagePosA","imagePosB","factor","u_pattern_size_a","u_pattern_size_b","u_pattern_tl_a","u_pattern_br_a","u_pattern_tl_b","u_pattern_br_b","u_fade","uniformMatrix2fv","u_antialiasingmatrix","a_linewidth","a_blur","lineVertex","element","lineElement","vtxOffset","a_data","BYTE","drawFill","translatedPosMatrix","NOTEQUAL","stencilOpSeparate","FRONT","INCR_WRAP","BACK","DECR_WRAP","fillVertex","fillElement","strokeColor","uniform2f","u_world","drawingBufferWidth","drawingBufferHeight","outlineElement","secondElementLength","secondElementStartIndex","LINES","u_opacity","matrixA","mat3","matrixB","uniformMatrix3fv","u_patternmatrix_a","u_patternmatrix_b","drawBackground","sizeA","sizeB","drawRaster","u_brightness_low","u_brightness_high","u_saturation_factor","saturationFactor","u_contrast_factor","contrastFactor","uniform3fv","u_spin_weights","spinWeights","parentScaleBy","parentTL","parentTile","opacities","getOpacities","TEXTURE1","u_tl_parent","u_scale_parent","u_buffer_scale","u_opacity0","u_opacity1","u_image0","u_image1","a_texture_pos","contrast","saturation","sinceTile","sinceParent","idealZ","parentFurther","op","drawDebug","uniform4f","u_color","LINE_STRIP","textVertices","toString","STREAM_DRAW","drawVertices","drawPoints","stride","u_size","u_blur","uniform4fv","begin","vertexLength","POINTS","newPosMatrix","number","vec2","dim","edge","scanSpans","e0","e1","ymin","ymax","scanLine","m0","m1","d0","d1","scanTriangle","ab","bc","ca","xy","wx","tiles","MRUCache","list","order","removedData","has","VectorTileSource","_tileLoaded","redoWhenDone","done","_","redoingPlacement","RasterTileSource","LINEAR_MIPMAP_NEAREST","generateMipmap","stops","startTime","transitionable","interpZoomTransitioned","delay","calculate","oldValue","eased","makeConstructor","reference","_values","_transitions","property","v","StyleDeclaration","global","lookup","renderType","layerType","Properties","prop","parseCSSColor","Calculated","pbf","end","readFields","readFontstacks","tag","readMessage","readFontstack","readString","readGlyph","readVarint","readBytes","readSVarint","smallest","ScrollZoom","ua","userAgent","toLowerCase","firefox","safari","_onWheel","deltaY","deltaMode","WheelEvent","DOM_DELTA_PIXEL","DOM_DELTA_LINE","wheelDeltaY","timeDelta","_time","_pos","_type","_lastValue","_timeout","shiftKey","delta","targetZoom","BoxZoom","which","button","_onKeyDown","_onMouseUp","p0","p1","_box","_finish","boxZoomBounds","keyCode","DragRotate","_onContextMenu","p2","startToCenter","startToCenterDist","bearingDiff","DragPan","inertiaLinearity","inertiaEasing","inertiaMaxSpeed","inertiaDeceleration","_onDown","_inertia","_onMove","_onTouchEnd","inertia","_onUp","last","flingOffset","flingDuration","velocity","Keyboard","panDelta","rotateDelta","altKey","ctrlKey","metaKey","DoubleClickZoom","Pinch","_onStart","_startVec","_startScale","_startBearing","_onEnd","vec","LineVertexBuffer","LineElementBuffer","FillVertexBuffer","FillElementBuffer","OutlineElementBuffer","GlyphVertexBuffer","GlyphElementBuffer","IconVertexBuffer","IconElementBuffer","CollisionBoxVertexBuffer","bufferset","glMatrix","mat2d","quat","vec3","Pbf","buf","Buffer","isBuffer","writePackedVarint","arr","writeVarint","writePackedSVarint","writeSVarint","writePackedFloat","writeFloat","writePackedDouble","writeDouble","writePackedBoolean","writeBoolean","writePackedFixed32","writeFixed32","writePackedSFixed32","writeSFixed32","writePackedFixed64","writeFixed64","writePackedSFixed64","writeSFixed64","Varint","Fixed64","Bytes","Fixed32","SHIFT_LEFT_32","SHIFT_RIGHT_32","POW_2_63","readField","val","startPos","skip","readFixed32","readUInt32LE","readSFixed32","readInt32LE","readFixed64","readSFixed64","readFloat","readFloatLE","readDouble","readDoubleLE","b0","b1","b2","b3","readVarint64","num","readBoolean","Boolean","str","readPackedVarint","readPackedSVarint","readPackedBoolean","readPackedFloat","readPackedDouble","readPackedFixed32","readPackedSFixed32","readPackedFixed64","readPackedSFixed64","writeTag","realloc","writeUInt32LE","writeInt32LE","writeString","String","byteLength","write","writeFloatLE","writeDoubleLE","writeBytes","writeMessage","varintLen","writeBytesField","writeFixed32Field","writeSFixed32Field","writeFixed64Field","writeSFixed64Field","writeVarintField","writeSVarintField","writeStringField","writeFloatField","writeDoubleField","writeBooleanField","Worker","self","geoJSONIndexes","WorkerTile","vt","geojsonvt","GeoJSONWrapper","set layers","load tile","VectorTile","reload tile","abort tile","remove tile","redo placement","transferables","parse geojson","indexData","load geojson tile","geoJSONTile","query features","featureTree","query","callbacks","callbackID","receive","postMessage","transferList","EPSILON","ARRAY_TYPE","RANDOM","random","setMatrixArrayType","GLMAT_ARRAY_TYPE","degree","toRadian","out","transpose","a1","a0","a2","a3","det","adjoint","determinant","mul","v0","v1","fromRotation","fromScaling","frob","LDU","L","D","U","aa","ac","ad","atx","aty","a4","a5","b4","b5","fromTranslation","fromMat4","a01","a02","a12","a00","a10","a11","a20","a21","a22","b01","b11","b21","b00","b02","b10","b12","b20","b22","fromMat2d","fromQuat","q","z2","xx","yx","yy","zx","zy","zz","wy","wz","normalFromMat4","a03","a13","a23","a30","a31","a32","a33","b03","b04","b05","b06","b07","b08","b09","axis","rotateY","fromXRotation","fromYRotation","fromZRotation","fromRotationTranslation","xz","yz","fromRotationTranslationScale","sz","fromRotationTranslationScaleOrigin","o","ox","oy","oz","frustum","near","far","rl","tb","nf","fovy","aspect","perspectiveFromFieldOfView","fov","upTan","upDegrees","downTan","downDegrees","leftTan","leftDegrees","rightTan","rightDegrees","xScale","yScale","lr","bt","lookAt","eye","up","eyex","eyey","eyez","upx","upy","upz","centerx","centery","centerz","rotationTo","tmpvec3","xUnitVec3","fromValues","yUnitVec3","dot","cross","normalize","setAxisAngle","setAxes","matr","view","fromMat3","az","aw","bz","bw","calculateW","lerp","slerp","omega","cosom","sinom","scale0","scale1","acos","sqlerp","temp1","temp2","invDot","conjugate","squaredLength","sqrLen","fRoot","fTrace","subtract","divide","scaleAndAdd","distance","squaredDistance","sqrDist","negate","inverse","transformMat2","transformMat2d","transformMat3","l","hermite","factorTimes2","factor1","factor2","factor3","factor4","inverseFactor","inverseFactorTimesTwo","zScale","transformQuat","qx","qy","qz","qw","ix","iy","iz","iw","tempA","tempB","cosine","BufferMethods","_isBuffer","encodeString","lead","charCodeAt","ieee754","lastStr","lastStrEncoded","read","encoding","tmp","ch","decodeURIComponent","fromCharCode","subarray","typeof_","Number","unbundle","valueOf","format","__line__","errors","spec","validator","object","typeValidator","expected","actual","minimum","maximum","source_tile","source_geojson","source_video","validators","speckey","def","version","filter_operator","geometry_type","arraySpec","lastStop","string","$root","bundleFn","cache","stringify","wkey","cacheKeys","wcache","skey","scache","URL","webkitURL","mozURL","msURL","createObjectURL","Blob","glify","gaussian","linepattern","linesdfpattern","outline","pattern","collisionbox","drawPlacementDebug","collisionBox","a_extrude","u_scale","u_maxzoom","simplexFont"," ","!","\"","#","$","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","E","F","G","H","I","J","K","M","N","O","P","Q","R","T","W","X","Y","Z","[","\\","]","^","`","g","{","|","}","~","baseline","len2","prev","strokes","prepareColorFunction","parseColor","mapboxGLFunction","interpolated","transitioned","mix","fraction","colorCache","prepareColor","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","NaN","rt","clamp_css_byte","clamp_css_float","parse_css_int","parseFloat","parseInt","parse_css_float","css_hue_to_rgb","m2","css_str","kCSSColorTable","iv","substr","ep","fname","transparent","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","FeatureTree","CollisionTile","createBucket","sortLayerIntoBuckets","bucket","dependenciesDone","dependenciesLoaded","parseBucket","getDependencies","needsPlacement","previousPlaced","addFeatures","collisionTile","insert","bbox","bucketStats","_total","redoPlacementAfterDone","bucketsInOrder","bucketsBySourceLayer","sourceLayer","prevPlacementBucket","placeFeatures","FeatureWrapper","rawGeometry","geometry","tags","VectorTileFeature","loadGeometry","rings","ring","newRing","toGeoJSON","inspect","opts","seen","stylize","stylizeNoColor","colors","isBoolean","showHidden","_extend","isUndefined","customInspect","stylizeWithColor","formatValue","styleType","styles","arrayToHash","recurseTimes","isFunction","constructor","ret","isString","primitive","formatPrimitive","visibleKeys","isError","formatError","isRegExp","RegExp","isDate","braces","toUTCString","output","formatArray","formatProperty","reduceToSingleString","simple","isNumber","isNull","desc","numLinesEst","cur","ar","isNullOrUndefined","isSymbol","re","isObject","objectToString","isPrimitive","pad","timestamp","getHours","getMinutes","getSeconds","getDate","months","getMonth","formatRegExp","objects","deprecate","msg","deprecated","warned","process","throwDeprecation","traceDeprecation","noDeprecation","debugs","debugEnviron","debuglog","env","NODE_DEBUG","toUpperCase","test","pid","bold","italic","underline","special","boolean","null","date","regexp","inherits","origin","extrudeScale","defaultLength","extrude","tx","ty","linesofar","pos2","shorts","arrayType","ushorts","TriangleElementBuffer","labelminzoom","ubytes","a_offset","a_data1","a_data2","placementZoom","VectorTileLayer","GeoJSONVT","timeEnd","indexMaxZoom","indexMaxPoints","stats","total","intersectX","splitTile","numFeatures","numPoints","transformTile","transformed","geom","transformPoint","isClippedSquare","toID","intersectY","clip","cz","tileTolerance","numSimplified","bl","k1","k2","k3","k4","readUInt8","cleanUpNextTick","draining","currentQueue","queue","queueIndex","drainQueue","timeout","run","Item","fun","noop","nextTick","title","argv","versions","addListener","removeListener","removeAllListeners","emit","binding","cwd","chdir","dir","umask","readTile","_pbf","_geometry","_keys","readFeature","_id","readTag","types","cmd","lines","cmdLen","_features","readLayer","readValueMessage","convertFeature","projectPoint","geometries","calcBBox","lonlats","projected","simplify","calcSize","points","area","calcRingBBox","intersect","minAll","maxAll","clipped","slices","clipPoints","clipGeometry","ak","closed","bk","newSlice","merged","shiftFeatureCoords","newFeatures","newGeometry","shiftCoords","newPoints","noSimplify","addFeature","simplified","sqTolerance","simplifiedRing","ctor","superCtor","super_","enumerable","writable","configurable","TempCtor","maxSqDist","sqDist","getSqSegDist","px","py","rtree","rbush","toBeInserted","geometryContainsPoint","radius","pointContainsPoint","lineContainsPoint","polyContainsPoint","distToSegmentSquared","l2","matching","search","$type","geoJSON","includeGeometry","tree","yStretch","minScale","maxScale","placeCollisionFeature","collisionFeature","minPlacementScale","boxes","box","anchorPoint","blockingBoxes","blocking","blockingAnchorPoint","s1","s2","s3","s4","collisionFreeScale","placementScale","insertCollisionFeature","fakeZoomHistory","BucketClass","LineBucket","FillBucket","SymbolBucket","featureFilter","constant","interpolateNumber","interpolateArray","low","high","zoomProgress","ArrayBuffer","setupViews","Int8Array","Uint16Array","deleteBuffer","layoutProperties","ElementGroups","addLine","cap","miterLimit","roundLimit","firstVertex","lastVertex","makeRoomFor","currentVertex","prevVertex","nextVertex","prevNormal","nextNormal","offsetA","offsetB","beginCap","endCap","flip","startOfLine","e2","e3","joinNormal","cosHalfAngle","miterLength","middleVertex","currentJoin","addCurrentVertex","direction","bevelLength","lineTurnsLeft","approxFractionalJoinNormal","addPieSliceVertex","normal","endLeft","endRight","elementGroup","current","addFill","prevIndex","currentIndex","firstIndex","compareText","symbolInstances","SymbolInstance","shapedText","shapedIcon","addToBuffers","textBoxScale","textPadding","textAlongLine","iconBoxScale","iconPadding","iconAlongLine","hasText","hasIcon","glyphQuads","getGlyphQuads","textCollisionFeature","CollisionFeature","iconQuads","getIconQuads","iconCollisionFeature","Anchor","getAnchors","resolveTokens","Quads","Shaping","resolveText","resolveIcons","mergeLines","shapeText","shapeIcon","clipLine","textFeatures","horizontalAlign","verticalAlign","justify","oneEm","lineHeight","maxWidth","spacing","textOffset","iconName","glyphSize","symbolMinDistance","avoidEdges","textMaxAngle","mayOverlap","isLine","textRepeatDistance","anchors","anchorIsTooClose","repeatDistance","otherAnchors","aRotated","bRotated","symbolInstance","iconWithoutText","textWithoutIcon","glyphScale","iconScale","addSymbols","addToDebugBuffers","quads","keepUpright","alongLine","placementAngle","tex","triangleIndex","firstdone","getTextDependencies","getIconDependencies","setIcons","newicons","newstack","codepoint","maxEntries","_maxEntries","_minEntries","_initFormat","toBBox","distBBox","empty","leaf","compareNodeMinX","compareNodeMinY","bboxArea","bboxMargin","enlargedArea","intersectionArea","contains","intersects","multiSelect","compare","mid","select","sd","newLeft","newRight","swap","all","_all","childBBox","nodesToSearch","collides","_build","_splitRoot","tmpNode","_insert","item","goingUp","path","indexes","_condense","compareMinX","compareMinY","fromJSON","items","right2","right3","N2","N1","_chooseSubtree","level","targetNode","enlargement","minArea","minEnlargement","isNode","insertPath","_split","_adjustParentBBoxes","_chooseSplitAxis","newNode","_chooseSplitIndex","bbox1","bbox2","overlap","minOverlap","xMargin","_allDistMargin","yMargin","leftBBox","rightBBox","margin","siblings","compareArr","infix","operator","VectorTileFeatureTypes","strictInfix","nonstrictInfix","compile","operators","truth","==","!=","<=",">=","in","!in","any","none","filterStr","vertexBuffer","elementBuffer","secondElementBuffer","ElementGroup","numVertices","segment","maxAngle","boxScale","angleWindowSize","labelLength","continuedLine","fixedExtraOffset","resample","placeAtMiddle","markedDistance","segmentDist","checkMaxAngle","SymbolQuad","border","shaping","textRotate","positionedGlyphs","positionedGlyph","glyphInstances","centerX","labelMinScale","getSegmentGlyphs","otl","otr","obl","obr","instance","glyphMinScale","glyphAngle","forward","upsideDown","newAnchorPoint","prevScale","PositionedGlyph","codePoint","yOffset","linewrap","lastSafeBreak","lengthBeforeCurrentLine","lineStartIndex","maxLineLength","lineLength","justifyLine","breakable","lastPositionedGlyph","lastLineLength","align","lastAdvance","lineIndent","shiftX","shiftY","PositionedIcon",32,"fl","toLocaleUpperCase","toLocaleLowerCase","jl","uniq","alreadyHave","sortNumbers","mergedFeatures","mergedGeom","mergedTexts","mergedIndex","mergeFromRight","leftKey","rightKey","rightIndex","mergeFromLeft","leftIndex","getKey","onRight","clippedLines","clippedLine","shaped","alignLine","_addLineCollisionBoxes","CollisionBox","boxSize","step","nBoxes","firstBoxOffset","bboxes","anchorDistance","segmentLength","boxDistanceToAnchor","segmentBoxDistance","boxAnchorPoint","distanceToInnerEdge","windowSize","recentCorners","recentAngleDelta","angleDelta"],"mappings":"AAAA;A4HAA,YAMA,SAASuiD,QAAOxuC,GACPA,GAQDjS,KAAKsW,MAAQrE,EAAOqE,MACpBtW,KAAKmM,IAAM8F,EAAO9F,MARlBnM,KAAKsW,MAAQ,GAAI2jE,aAAYj6E,KAAKmvE,eAClCnvE,KAAKoH,OAASpH,KAAKmvE,cACnBnvE,KAAKk6E,cANb/7E,OAAOC,QAAUqiD,OAgBjBA,OAAOxgD,WACHkM,IAAK,EACL+d,SAAU,EACVilD,cAAe,KACfO,UAAW,eAEXjhE,GAAIqxB,SACA,MAAO9/B,MAAKmM,IAAMnM,KAAKkqB,UAG3BgwD,WAAY,WAERl6E,KAAK8vE,OAAS,GAAI7xC,YAAWj+B,KAAKsW,OAClCtW,KAAK8jC,MAAQ,GAAIq2C,WAAUn6E,KAAKsW,OAChCtW,KAAK2vE,QAAU,GAAIyK,aAAYp6E,KAAKsW,OACpCtW,KAAKyvE,OAAS,GAAIl5D,YAAWvW,KAAKsW,QAItC/R,KAAM,SAAS6H,GACX,GAAI8B,GAAO9B,EAAGpM,KAAK0vE,UACd1vE,MAAKiS,OAQN7F,EAAGuK,WAAWzI,EAAMlO,KAAKiS,SAPzBjS,KAAKiS,OAAS7F,EAAGsK,eACjBtK,EAAGuK,WAAWzI,EAAMlO,KAAKiS,QACzB7F,EAAGyK,WAAW3I,EAAMlO,KAAKsW,MAAM8H,MAAM,EAAGpe,KAAKmM,KAAMC,EAAG0K,aAGtD9W,KAAKsW,MAAQ,OAMrBskB,QAAS,SAASxuB,GACVpM,KAAKiS,QACL7F,EAAGiuE,aAAar6E,KAAKiS,SAK7BrN,OAAQ,WACJ,GAAI5E,KAAKoH,OAASpH,KAAKmM,IAAMnM,KAAKkqB,SAAU,CAExC,KAAOlqB,KAAKoH,OAASpH,KAAKmM,IAAMnM,KAAKkqB,UAEjClqB,KAAKoH,OAA6C,EAApC1F,KAAKH,MAAoB,IAAdvB,KAAKoH,OAAe,EAIjDpH,MAAKsW,MAAQ,GAAI2jE,aAAYj6E,KAAKoH,OAElC,IAAI0oE,GAAS,GAAI7xC,YAAWj+B,KAAKsW,MACjCw5D,GAAOlwE,IAAII,KAAK8vE,QAEhB9vE,KAAKk6E;;AtD1EjB,YAEA,IAAI16B,kBAAmBlhD,QAAQ,wBAC3BmhD,kBAAoBnhD,QAAQ,yBAC5BohD,iBAAmBphD,QAAQ,wBAC3BqhD,kBAAoBrhD,QAAQ,6BAC5BshD,qBAAuBthD,QAAQ,4BAC/BuhD,kBAAoBvhD,QAAQ,yBAC5BwhD,mBAAqBxhD,QAAQ,6BAC7ByhD,iBAAmBzhD,QAAQ,wBAC3B0hD,kBAAoB1hD,QAAQ,6BAC5B2hD,yBAA2B3hD,QAAQ,gCAEvCH,QAAOC,QAAU,SAAS8hD,GAEtB,MADAA,GAAYA,OAERvlB,YAAa,GAAIklB,mBAAkBK,EAAUvlB,aAC7CE,aAAc,GAAIilB,oBAAmBI,EAAUrlB,cAC/CC,WAAY,GAAIilB,kBAAiBG,EAAUplB,YAC3CC,YAAa,GAAIilB,mBAAkBE,EAAUnlB,aAC7CyX,WAAY,GAAIkN,kBAAiBQ,EAAU1N,YAC3CC,YAAa,GAAIkN,mBAAkBO,EAAUzN,aAC7CM,eAAgB,GAAI6M,sBAAqBM,EAAUnN,gBACnDrB,WAAY,GAAI8N,kBAAiBU,EAAUxO,YAC3CE,YAAa,GAAI6N,mBAAkBS,EAAUtO,aAC7C5W,mBAAoB,GAAIilB,0BAAyBC,EAAUllB;;AoCzBnE,YAOA,SAASilB,0BAAyBhuC,GAC9BwuC,OAAOviC,KAAKle,KAAMiS,GANtB,GAAI/S,MAAOZ,QAAQ,mBACfmiD,OAASniD,QAAQ,WAErBH,QAAOC,QAAU6hD,yBAMjBA,yBAAyBhgD,UAAYf,KAAKoE,QAAQm9C,QAC9Cv2B,SAAU,GACVilD,cAAe,MAKfhvE,IAAK,SAASqI,EAAO4mE,EAAS1rE,EAASwsE,GACnC,GAAI/jE,GAAMnM,KAAKmM,IACXqjE,EAAOrjE,EAAM,EACb2zB,EAAQ9/B,KAAK8/B,KAajB,OAXA9/B,MAAK4E,SAEL5E,KAAKyvE,OAAOD,EAAO,GAAKhnE,EAAM1I,EAC9BE,KAAKyvE,OAAOD,EAAO,GAAKhnE,EAAMzI,EAE9BC,KAAKyvE,OAAOD,EAAO,GAAK9tE,KAAKH,MAAM6tE,EAAQtvE,GAC3CE,KAAKyvE,OAAOD,EAAO,GAAK9tE,KAAKH,MAAM6tE,EAAQrvE,GAC3CC,KAAK8vE,OAAO3jE,EAAM,GAAKzK,KAAKqU,MAAgB,GAAVrS,GAClC1D,KAAK8vE,OAAO3jE,EAAM,GAAKzK,KAAKqU,MAAsB,GAAhBm6D,GAElClwE,KAAKmM,KAAOnM,KAAKkqB,SACV4V;;ALlCf,YAOA,SAAS4f,kBAAiBztC,GACtBwuC,OAAOviC,KAAKle,KAAMiS,GANtB,GAAI/S,MAAOZ,QAAQ,mBACfmiD,OAASniD,QAAQ,WAErBH,QAAOC,QAAUshD,iBAMjBA,iBAAiBz/C,UAAYf,KAAKoE,QAAQm9C,QACtCv2B,SAAU,EAEV/pB,IAAK,SAASL,EAAGC,GACb,GAAIyvE,GAAOxvE,KAAKmM,IAAM,CAEtBnM,MAAK4E,SAEL5E,KAAKyvE,OAAOD,EAAO,GAAK1vE,EACxBE,KAAKyvE,OAAOD,EAAO,GAAKzvE,EAExBC,KAAKmM,KAAOnM,KAAKkqB;;AGtBzB,YAOA,SAAS21B,mBAAkB5tC,GACvBwuC,OAAOviC,KAAKle,KAAMiS,GANtB,GAAI/S,MAAOZ,QAAQ,mBACfmiD,OAASniD,QAAQ,WAErBH,QAAOC,QAAUyhD,kBAOjBA,kBAAkB5/C,UAAYf,KAAKoE,QAAQm9C,QACvC0uB,cAAe,MACfjlD,SAAU,GAEV/pB,IAAK,SAASL,EAAGC,EAAGwtD,EAAIC,EAAI6hB,EAAIC,EAAI3kE,EAASC,EAASilE,GAClD,GAAI1jE,GAAMnM,KAAKmM,IACXqjE,EAAOrjE,EAAM,CAEjBnM,MAAK4E,SAEL5E,KAAKyvE,OAAOD,EAAO,GAAK1vE,EACxBE,KAAKyvE,OAAOD,EAAO,GAAKzvE,EACxBC,KAAKyvE,OAAOD,EAAO,GAAK9tE,KAAKH,MAAW,GAALgsD,GACnCvtD,KAAKyvE,OAAOD,EAAO,GAAK9tE,KAAKH,MAAW,GAALisD,GAGnCxtD,KAAK8vE,OAAO3jE,EAAM,GAAezK,KAAKqU,MAAMs5D,EAAK,GACjDrvE,KAAK8vE,OAAO3jE,EAAM,GAAezK,KAAKqU,MAAMu5D,EAAK,GACjDtvE,KAAK8vE,OAAO3jE,EAAM,IAAyBzK,KAAKqU,MAAuB,GAAjB,GAGtD/V,KAAK8vE,OAAO3jE,EAAM,IAAoBzK,KAAKqU,MAAkB,GAAZ,GACjD/V,KAAK8vE,OAAO3jE,EAAM,IAAoBzK,KAAKqU,MAA8B,GAAxBrU,KAAKgU,IAAI9K,EAAS,KAEnE5K,KAAKmM,KAAOnM,KAAKkqB,UAGrB3lB,KAAM,SAAS6H,EAAI48B,EAAQ7Z,GACvBsxB,OAAOxgD,UAAUsE,KAAK2Z,KAAKle,KAAMoM,EAEjC,IAAIiqC,GAASr2C,KAAKkqB,QAElB9d,GAAGqf,oBAAoBud,EAAOtd,MAAO,EAAGtf,EAAGuf,OAAO,EAAO0qB,EAAQlnB,EAAS,GAC1E/iB,EAAGqf,oBAAoBud,EAAO+mC,SAAU,EAAG3jE,EAAGuf,OAAO,EAAO0qB,EAAQlnB,EAAS,GAE7E/iB,EAAGqf,oBAAoBud,EAAOgnC,QAAS,EAAG5jE,EAAGoL,eAAe,EAAO6+B,EAAQlnB,EAAS,GACpF/iB,EAAGqf,oBAAoBud,EAAOinC,QAAS,EAAG7jE,EAAGoL,eAAe,EAAO6+B,EAAQlnB,EAAS;;AChD5F,YAOA,SAAS4wB,kBAAiB9tC,GACtBwuC,OAAOviC,KAAKle,KAAMiS,GANtB,GAAI/S,MAAOZ,QAAQ,mBACfmiD,OAASniD,QAAQ,WAErBH,QAAOC,QAAU2hD,iBAMjBA,iBAAiB9/C,UAAYf,KAAKoE,QAAQm9C,QACtC0uB,cAAe,MACfjlD,SAAU,GAEV/pB,IAAK,SAASL,EAAGC,EAAGwtD,EAAIC,EAAI6hB,EAAIC,EAAI3kE,EAASC,EAASilE,GAClD,GAAI1jE,GAAMnM,KAAKmM,IACXqjE,EAAOrjE,EAAM,CAEjBnM,MAAK4E,SAEL5E,KAAKyvE,OAAOD,EAAO,GAAK1vE,EACxBE,KAAKyvE,OAAOD,EAAO,GAAKzvE,EACxBC,KAAKyvE,OAAOD,EAAO,GAAK9tE,KAAKH,MAAW,GAALgsD,GACnCvtD,KAAKyvE,OAAOD,EAAO,GAAK9tE,KAAKH,MAAW,GAALisD,GAGnCxtD,KAAK8vE,OAAO3jE,EAAM,GAAekjE,EAAK,EACtCrvE,KAAK8vE,OAAO3jE,EAAM,GAAemjE,EAAK,EACtCtvE,KAAK8vE,OAAO3jE,EAAM,IAAyBzK,KAAKqU,MAA4B,IAArB85D,GAAgB,IAGvE7vE,KAAK8vE,OAAO3jE,EAAM,IAAoBzK,KAAKqU,MAAuB,IAAhBpL,GAAW,IAC7D3K,KAAK8vE,OAAO3jE,EAAM,IAAoBzK,KAAKqU,MAAoC,GAA9BrU,KAAKgU,IAAI9K,GAAW,GAAI,KAEzE5K,KAAKmM,KAAOnM,KAAKkqB,UAGrB3lB,KAAM,SAAS6H,EAAI48B,EAAQ7Z,GACvBsxB,OAAOxgD,UAAUsE,KAAK2Z,KAAKle,KAAMoM,EAEjC,IAAIiqC,GAASr2C,KAAKkqB,QAElB9d,GAAGqf,oBAAoBud,EAAOtd,MAAO,EAAGtf,EAAGuf,OAAO,EAAO0qB,EAAQlnB,EAAS,GAC1E/iB,EAAGqf,oBAAoBud,EAAO+mC,SAAU,EAAG3jE,EAAGuf,OAAO,EAAO0qB,EAAQlnB,EAAS,GAC7E/iB,EAAGqf,oBAAoBud,EAAOgnC,QAAS,EAAG5jE,EAAGoL,eAAe,EAAO6+B,EAAQlnB,EAAS,GACpF/iB,EAAGqf,oBAAoBud,EAAOinC,QAAS,EAAG7jE,EAAGoL,eAAe,EAAO6+B,EAAQlnB,EAAS;;AL9C5F,YAOA,SAASswB,mBAAkBxtC,GACvBwuC,OAAOviC,KAAKle,KAAMiS,GANtB,GAAI/S,MAAOZ,QAAQ,mBACfmiD,OAASniD,QAAQ,WAErBH,QAAOC,QAAUqhD,kBAMjBA,kBAAkBx/C,UAAYf,KAAKoE,QAAQm9C,QACvCv2B,SAAU,EACVwlD,UAAW,uBAEXvvE,IAAK,SAASW,EAAGsB,EAAG6U,GAChB,GAAIu4D,GAAOxvE,KAAKmM,IAAM,CAEtBnM,MAAK4E,SAEL5E,KAAK2vE,QAAQH,EAAO,GAAK1uE,EACzBd,KAAK2vE,QAAQH,EAAO,GAAKptE,EACzBpC,KAAK2vE,QAAQH,EAAO,GAAKv4D,EAEzBjX,KAAKmM,KAAOnM,KAAKkqB;;ADxBzB,YAOA,SAASs1B,kBAAiBvtC,GACtBwuC,OAAOviC,KAAKle,KAAMiS,GANtB,GAAI/S,MAAOZ,QAAQ,mBACfmiD,OAASniD,QAAQ,WAErBH,QAAOC,QAAUohD,iBAWjBA,iBAAiB0vB,aAAe,GAEhC1vB,iBAAiBv/C,UAAYf,KAAKoE,QAAQm9C,QACtCv2B,SAAU,EACVilD,cAAe,MAMfhvE,IAAK,SAASqI,EAAO4mE,EAASC,EAAIC,EAAIC,GAClC,GAAIpjE,GAAMnM,KAAKmM,IACXqjE,EAAOrjE,EAAM,EACb2zB,EAAQ9/B,KAAK8/B,MACbovC,EAAe1vB,iBAAiB0vB,YAapC,OAXAlvE,MAAK4E,SAEL5E,KAAKyvE,OAAOD,EAAO,GAA4B,EAAtB9tE,KAAKqU,MAAMvN,EAAM1I,GAAUuvE,EACpDrvE,KAAKyvE,OAAOD,EAAO,GAA4B,EAAtB9tE,KAAKqU,MAAMvN,EAAMzI,GAAUuvE,EAEpDtvE,KAAK8jC,MAAM33B,EAAM,GAAKzK,KAAKH,MAAM2tE,EAAeE,EAAQtvE,GACxDE,KAAK8jC,MAAM33B,EAAM,GAAKzK,KAAKH,MAAM2tE,EAAeE,EAAQrvE,GACxDC,KAAK8jC,MAAM33B,EAAM,IAAMojE,GAAa,GAAK,IACzCvvE,KAAK8jC,MAAM33B,EAAM,IAAMojE,GAAa,GAAK,IAEzCvvE,KAAKmM,KAAOnM,KAAKkqB,SACV4V;;AI3Cf,YAOA,SAAS8f,sBAAqB3tC,GAC1BwuC,OAAOviC,KAAKle,KAAMiS,GANtB,GAAI/S,MAAOZ,QAAQ,mBACfmiD,OAASniD,QAAQ,WAErBH,QAAOC,QAAUwhD,qBAMjBA,qBAAqB3/C,UAAYf,KAAKoE,QAAQm9C,QAC1Cv2B,SAAU,EACVwlD,UAAW,uBAEXvvE,IAAK,SAASW,EAAGsB,GACb,GAAIotE,GAAOxvE,KAAKmM,IAAM,CAEtBnM,MAAK4E,SAEL5E,KAAK2vE,QAAQH,EAAO,GAAK1uE,EACzBd,KAAK2vE,QAAQH,EAAO,GAAKptE,EAEzBpC,KAAKmM,KAAOnM,KAAKkqB;;ADvBzB,YAOA,SAAS0lD,uBAAsB39D,GAC3BwuC,OAAOviC,KAAKle,KAAMiS,GANtB,GAAI/S,MAAOZ,QAAQ,mBACfmiD,OAASniD,QAAQ,WAErBH,QAAOC,QAAUwxE,sBAMjBA,sBAAsB3vE,UAAYf,KAAKoE,QAAQm9C,QAC3Cv2B,SAAU,EACVwlD,UAAW,uBAEXvvE,IAAK,SAASW,EAAGsB,EAAG6U,GAChB,GAAIu4D,GAAOxvE,KAAKmM,IAAM,CAEtBnM,MAAK4E,SAEL5E,KAAK2vE,QAAQH,EAAO,GAAK1uE,EACzBd,KAAK2vE,QAAQH,EAAO,GAAKptE,EACzBpC,KAAK2vE,QAAQH,EAAO,GAAKv4D,EAEzBjX,KAAKmM,KAAOnM,KAAKkqB;;AoBxBzB,YAWA,SAAS69C,cAAa39D,EAAOmwB,EAASzmB,EAAGD,EAAalF,GAClD,GAAIquB,GAAS,GAAIT,qBAAoB,SAAUnyB,EAAM8D,KAAM9D,EAAMsyB,WAAYM,SACzEq8C,GAAoBt+D,gBAAiBnG,EAAAA,EAAUoG,oBAAqB,EAAGC,SAAU,GACjFyhB,IAEJ,KAAK,GAAIj8B,KAAKu8B,GACVN,EAAOj8B,GAAKu8B,EAAOv8B,GAAG44C,UAAUvlC,EAAGulE,EAGvC,IAAIC,GACe,SAAflvE,EAAM8D,KAAkBqrE,WACT,SAAfnvE,EAAM8D,KAAkBsrE,WACT,WAAfpvE,EAAM8D,KAAoBurE,aAAe,KAEzCxR,EAAS,GAAIqR,GAAY/+C,EAAS,GAAIiC,kBAAiBpyB,EAAM8D,MAAMwuB,GAAS7oB,EAAaC,EAAGnF,EAWhG,OATAs5D,GAAOl+D,GAAKK,EAAML,GAClBk+D,EAAO/5D,KAAO9D,EAAM8D,KACpB+5D,EAAO,gBAAkB79D,EAAM,gBAC/B69D,EAAOnjE,YAAcsF,EAAMtF,YAC3BmjE,EAAOxkE,QAAU2G,EAAMO,QACvBs9D,EAAOvkE,QAAU0G,EAAMQ,QACvBq9D,EAAOz9D,OAASkvE,cAActvE,EAAMI,QACpCy9D,EAAO1sD,YAEA0sD,EAlCX9pE,OAAOC,QAAU2pE,YAEjB,IAAIwR,YAAaj7E,QAAQ,iBACrBk7E,WAAal7E,QAAQ,iBACrBm7E,aAAen7E,QAAQ,mBACvBk+B,iBAAmBl+B,QAAQ,8BAC3Bo7E,cAAgBp7E,QAAQ,kBACxBi+B,oBAAsBj+B,QAAQ;;AQTlC,YAIA,SAASi8E,eAAc4M,EAAcC,EAAeC,GAEhDrnF,KAAKmnF,aAAeA,EACpBnnF,KAAKonF,cAAgBA,EACrBpnF,KAAKqnF,oBAAsBA,EAC3BrnF,KAAKqsC,UAYT,QAASi7C,cAAax4C,EAAkBE,EAAmBiE,GAEvDjzC,KAAK8uC,iBAAmBA,EACxB9uC,KAAKgvC,kBAAoBA,EACzBhvC,KAAKizC,wBAA0BA,EAC/BjzC,KAAK+uC,cAAgB,EACrB/uC,KAAK02C,aAAe,EACpB12C,KAAKgzC,oBAAsB,EA1B/B70C,OAAOC,QAAUm8E,cAUjBA,cAAct6E,UAAU66E,YAAc,SAASyM,KACtCvnF,KAAK28E,SAAW38E,KAAK28E,QAAQjmC,aAAe6wC,EAAc,SAC3DvnF,KAAK28E,QAAU,GAAI2K,cAAatnF,KAAKmnF,aAAarnD,MAC1C9/B,KAAKonF,eAAiBpnF,KAAKonF,cAActnD,MACzC9/B,KAAKqnF,qBAAuBrnF,KAAKqnF,oBAAoBvnD,OAC7D9/B,KAAKqsC,OAAOr7B,KAAKhR,KAAK28E;;AVjB9B,YASA,SAAS9U,aAAY/+D,EAAO+K,GACxB7T,KAAKF,EAAIgJ,EAAMhJ,EACfE,KAAKD,EAAI+I,EAAM/I,EACfC,KAAK8T,EAAIhL,EAAMgL,EAAIpS,KAAKsU,IAAInC,GAAenS,KAAKuU,IAChDjW,KAAKk3E,MAAQC,MAAM,GACnBn3E,KAAKo3E,gBAuDT,QAASC,uBAAsB3N,EAAOx7D,EAAM9N,EAAGk3E,GAC3C,MAAgB,UAATppE,EAAmBqpE,mBAAmB7N,EAAOtpE,EAAGk3E,GACvC,eAATppE,EAAwBspE,kBAAkB9N,EAAOtpE,EAAGk3E,GAC3C,YAATppE,EAAqBupE,kBAAkB/N,EAAOtpE,IAAMo3E,kBAAkB9N,EAAOtpE,EAAGk3E,IAAU,EAIrG,QAASI,sBAAqBt3E,EAAGy5C,EAAGvjB,GAChC,GAAIqhD,GAAK99B,EAAE/3C,QAAQw0B,EACnB,IAAW,IAAPqhD,EAAU,MAAOv3E,GAAE0B,QAAQ+3C,EAC/B,IAAIt7B,KAAMne,EAAEN,EAAI+5C,EAAE/5C,IAAMw2B,EAAEx2B,EAAI+5C,EAAE/5C,IAAMM,EAAEL,EAAI85C,EAAE95C,IAAMu2B,EAAEv2B,EAAI85C,EAAE95C,IAAM43E,CAClE,OAAQ,GAAJp5D,EAAcne,EAAE0B,QAAQ+3C,GACxBt7B,EAAI,EAAUne,EAAE0B,QAAQw0B,GACrBl2B,EAAE0B,QAAQw0B,EAAEh2B,IAAIu5C,GAAGn5C,MAAM6d,GAAGle,KAAKw5C,IAG5C,QAAS29B,mBAAkB9N,EAAOtpE,EAAGk3E,GAGjC,IAAK,GAFD5hD,GAAI4hD,EAASA,EAERnwE,EAAI,EAAGA,EAAIuiE,EAAMtiE,OAAQD,IAE9B,IAAK,GADDwiE,GAAOD,EAAMviE,GACR45B,EAAI,EAAGA,EAAI4oC,EAAKviE,OAAQ25B,IAAK,CAGlC,GAAI8Y,GAAI8vB,EAAK5oC,EAAI,GAAIzK,EAAIqzC,EAAK5oC,EAC9B,IAAI22C,qBAAqBt3E,EAAGy5C,EAAGvjB,GAAKZ,EAAG,OAAO,EAGtD,OAAO,EAIX,QAAS+hD,mBAAkB/N,EAAOtpE,GAI9B,IAAK,GAFDupE,GAAM3sB,EAAIO,EADVtmC,GAAI,EAGCxW,EAAI,EAAGA,EAAIipE,EAAMtiE,OAAQ3G,IAAK,CACnCkpE,EAAOD,EAAMjpE,EACb,KAAK,GAAI0G,GAAI,EAAG45B,EAAI4oC,EAAKviE,OAAS,EAAGD,EAAIwiE,EAAKviE,OAAQ25B,EAAI55B,IACtD61C,EAAK2sB,EAAKxiE,GACVo2C,EAAKosB,EAAK5oC,GACJic,EAAGj9C,EAAIK,EAAEL,GAAQw9C,EAAGx9C,EAAIK,EAAEL,GAAQK,EAAEN,GAAKy9C,EAAGz9C,EAAIk9C,EAAGl9C,IAAMM,EAAEL,EAAIi9C,EAAGj9C,IAAMw9C,EAAGx9C,EAAIi9C,EAAGj9C,GAAKi9C,EAAGl9C,IAC5FmX,GAAKA,GAIjB,MAAOA,GAGX,QAASsgE,oBAAmB7N,EAAOtpE,EAAGk3E,GAGlC,IAAK,GAFD5hD,GAAI4hD,EAASA,EAERnwE,EAAI,EAAGA,EAAIuiE,EAAMtiE,OAAQD,IAE9B,IAAK,GADDwiE,GAAOD,EAAMviE,GACR45B,EAAI,EAAGA,EAAI4oC,EAAKviE,OAAQ25B,IAC7B,GAAI4oC,EAAK5oC,GAAGj/B,QAAQ1B,IAAMs1B,EAAG,OAAO,CAG5C,QAAO,EA7HX,GAAIyhD,OAAQ74E,QAAQ,SAChBU,MAAQV,QAAQ,kBAChB2nD,GAAK3nD,QAAQ,eACbY,KAAOZ,QAAQ,eAEnBH,QAAOC,QAAUypE,YAUjBA,YAAY5nE,UAAUyoE,OAAS,SAASC,EAAM3xD,EAAQ2E,GAClDgtD,EAAK3xD,OAASA,EACd2xD,EAAKhtD,QAAUA,EACf3b,KAAKo3E,aAAapmE,KAAK23D,IAI3Bd,YAAY5nE,UAAUi3B,MAAQ,WAC1Bl3B,KAAKk3E,MAAM3kE,KAAKvS,KAAKo3E,cACrBp3E,KAAKo3E,iBAITvP,YAAY5nE,UAAUinD,MAAQ,SAASvmC,EAAMhY,GACrC3I,KAAKo3E,aAAahwE,QAAQpH,KAAKk3B,OASnC,KAAK,GAPDxuB,GAASiY,EAAKjY,WACd4uE,EAAgC,MAAtB5uE,EAAO4uE,QAAU,GAAY32D,EAAKwM,MAC5CrtB,EAAI6gB,EAAK7gB,EACTC,EAAI4gB,EAAK5gB,EACT0b,KAEAm8D,EAAW53E,KAAKk3E,MAAMW,QAAS/3E,EAAIw3E,EAAQv3E,EAAIu3E,EAAQx3E,EAAIw3E,EAAQv3E,EAAIu3E,IAClEnwE,EAAI,EAAGA,EAAIywE,EAASxwE,OAAQD,IAAK,CACtC,GAAIwU,GAAUi8D,EAASzwE,GAAGwU,QACtB3E,EAAS4gE,EAASzwE,GAAG6P,OACrB9I,EAAO+3C,GAAGujB,kBAAkBsK,MAAMn4D,EAAQzN,KAE9C,MAAIxF,EAAOovE,OAAS5pE,IAASxF,EAAOovE,QAE/BT,sBAAsB17D,EAAQ8tD,eAAgBv7D,EAAM,GAAIlP,OAAMc,EAAGC,GAAIu3E,GAA1E,CAGA,GAAIS,GAAUp8D,EAAQkuD,UAAU7pE,KAAKF,EAAGE,KAAKD,EAAGC,KAAK8T,EAEhDpL,GAAOsvE,kBACRD,EAAQzO,SAAW,KAGvB,KAAK,GAAI5W,GAAI,EAAGA,EAAI17C,EAAO5P,OAAQsrD,IAAK,CACpC,GAAItoD,GAAQ4M,EAAO07C,EAEfhqD,GAAO0B,OAASA,IAAU1B,EAAO0B,MAAML,IAG3C0R,EAAOzK,KAAK9R,KAAK4G,QAAQsE,MAAOA,GAAQ2tE,MAIhDpvE,EAAS,KAAM8S;;AMlEnB,YAMA,SAAS+9D,YAAWj/C,GAChBv6B,KAAKu6B,QAAUA,EACfv6B,KAAKw6B,cAAgB,GAAI+/C,eAAchgD,EAAQiY,WAAYjY,EAAQkY,YAAalY,EAAQwY,gBAN5F,GAAIwnC,eAAgBj8E,QAAQ,mBAE5BH,QAAOC,QAAUo7E,WAOjBA,WAAWv5E,UAAUuoE,YAAc,WAE/B,IAAK,GADDjtD,GAAWvb,KAAKub,SACXpU,EAAI,EAAGA,EAAIoU,EAASnU,OAAQD,IAAK,CACtC,GAAIwU,GAAUJ,EAASpU,EACvBnH,MAAKk2E,WAAWv6D,EAAQ8tD,kBAIhC+P,WAAWv5E,UAAUi2E,WAAa,SAASlC,GACvC,IAAK,GAAI7sE,GAAI,EAAGA,EAAI6sE,EAAM5sE,OAAQD,IAC9BnH,KAAK48E,QAAQ5I,EAAM7sE,KAI3BqyE,WAAWv5E,UAAU28E,QAAU,SAASpvE,GACpC,KAAIA,EAASpG,OAAS,GAAtB,CAYA,GAAI2V,GAAMvP,EAASpG,MAGnBpH,MAAKw6B,cAAcsgD,YAAY/9D,EAAM,EAWrC,KAAK,GAFD8/D,GAAWC,EAAc/B,EARzB2B,EAAe18E,KAAKw6B,cAAcmiD,QAElCnqC,EAAaxyC,KAAKu6B,QAAQiY,WAC1BC,EAAczyC,KAAKu6B,QAAQkY,YAC3BM,EAAiB/yC,KAAKu6B,QAAQwY,eAG9BgqC,EAAavqC,EAAW1S,MAAQ48C,EAAa5tC,iBAGxC3nC,EAAI,EAAGA,EAAIqG,EAASpG,OAAQD,IACjC21E,EAAetqC,EAAW1S,MAAQ48C,EAAa5tC,iBAC/CisC,EAAgBvtE,EAASrG,GAEzBqrC,EAAWryC,IAAI46E,EAAcj7E,EAAGi7E,EAAch7E,GAC9C28E,EAAahmC,eAGTvvC,GAAK,IAAM4zE,EAAcj7E,IAAM0N,EAAS,GAAG1N,GAAKi7E,EAAch7E,IAAMyN,EAAS,GAAGzN,KAChF0yC,EAAYtyC,IAAI48E,EAAYF,EAAWC,GACvCJ,EAAa3tC,iBAGb5nC,GAAK,IACL4rC,EAAe5yC,IAAI08E,EAAWC,GAC9BJ,EAAa1pC,uBAGjB6pC,EAAYC;;ADtEpB,YAUA,SAASvD,YAAWh/C,EAAS+/C,GACzBt6E,KAAKu6B,QAAUA,EACfv6B,KAAKw6B,cAAgB,GAAI+/C,eAAchgD,EAAQmX,WAAYnX,EAAQqX,aACnE5xC,KAAKs6E,iBAAmBA,EAX5B,GAAIC,eAAgBj8E,QAAQ,mBAE5BH,QAAOC,QAAUm7E,WAYjBA,WAAWt5E,UAAUuoE,YAAc,WAE/B,IAAK,GADDjtD,GAAWvb,KAAKub,SACXpU,EAAI,EAAGA,EAAIoU,EAASnU,OAAQD,IAAK,CACtC,GAAIwU,GAAUJ,EAASpU,EACvBnH,MAAKk2E,WAAWv6D,EAAQ8tD,kBAIhC8P,WAAWt5E,UAAUi2E,WAAa,SAASlC,GAEvC,IAAK,GADDsG,GAAmBt6E,KAAKs6E,iBACnBnzE,EAAI,EAAGA,EAAI6sE,EAAM5sE,OAAQD,IAC9BnH,KAAKw6E,QAAQxG,EAAM7sE,GACfmzE,EAAiB,aACjBA,EAAiB,YACjBA,EAAiB,oBACjBA,EAAiB,sBAI7Bf,WAAWt5E,UAAUu6E,QAAU,SAAShtE,EAAUyD,EAAMwpE,EAAKC,EAAYC,GAIrE,IAFA,GAAI59D,GAAMvP,EAASpG,OAEZ2V,EAAM,GAAKvP,EAASuP,EAAM,GAAGnb,OAAO4L,EAASuP,EAAM,KACtDA,GAGJ,MAAIvP,EAASpG,OAAS,GAAtB,CAKa,UAAT6J,IAAkBypE,EAAa,KAEnC,IAAIE,GAAcptE,EAAS,GACvBqtE,EAAartE,EAASuP,EAAM,GAC5By4D,EAASoF,EAAYh5E,OAAOi5E,EAKhC,IAFA76E,KAAKw6B,cAAcsgD,YAAkB,GAAN/9D,GAEnB,IAARA,IAAay4D,EAAjB,CAKA,GAKIuF,GAAeC,EAAYC,EAAYC,EAAYC,EAAYC,EAASC,EALxEC,EAAWb,EACXc,EAAS/F,EAAS,OAASiF,EAC3Be,EAAO,EACPtpB,EAAW,EACXupB,GAAc,CAIlBz7E,MAAKm3C,GAAKn3C,KAAK07E,GAAK17E,KAAK27E,GAAK,GAE1BnG,IACAuF,EAAgBvtE,EAASuP,EAAM,GAC/Bo+D,EAAaP,EAAYt6E,IAAIy6E,GAAe35E,QAAQE,QAGxD,KAAK,GAAI6F,GAAI,EAAO4V,EAAJ5V,EAASA,IAOrB,GALA8zE,EAAazF,GAAUruE,IAAM4V,EAAM,EAC/BvP,EAAS,GACTA,EAASrG,EAAI,IAGb8zE,IAAcztE,EAASrG,GAAGvF,OAAOq5E,GAArC,CAEIE,IAAYD,EAAaC,GACzBJ,IAAeC,EAAaD,GAEhCA,EAAgBvtE,EAASrG,GAGrB6zE,IAAY9oB,GAAY6oB,EAAcl5E,KAAKm5E,IAK/CG,EAAaF,EAAaA,EAAW36E,IAAIy6E,GAAe35E,QAAQE,QAAU45E,EAI1EA,EAAaA,GAAcC,CAI3B,IAAIS,GAAaV,EAAW/6E,IAAIg7E,GAAY/5E,QAexCy6E,EAAeD,EAAW97E,EAAIq7E,EAAWr7E,EAAI87E,EAAW77E,EAAIo7E,EAAWp7E,EACvE+7E,EAAc,EAAID,EAGlBE,EAAef,GAAcC,EAC7Be,EAAcD,EAAe9qE,EAAOgqE,EAAaK,EAAWC,CAwBhE,IAtBIQ,GAAgC,UAAhBC,IACErB,EAAdmB,EACAE,EAAc,QACQ,GAAfF,IACPE,EAAc,cAIF,UAAhBA,GAA2BF,EAAcpB,IACzCsB,EAAc,SAGE,UAAhBA,IAGIF,EAAc,IAAGE,EAAc,aAIjBtB,EAAdoB,IAA0BE,EAAc,UAG5B,UAAhBA,EACAJ,EAAWl7E,MAAMo7E,GACjB97E,KAAKi8E,iBAAiBlB,EAAeS,EAAMtpB,EAAU0pB,EAAY,EAAG,GAAG,OAEpE,IAAoB,cAAhBI,EAA6B,CAGpC,GAAIF,EAAc,IAEdF,EAAaT,EAAWj7E,YAErB,CACH,GAAIg8E,GAAYhB,EAAWp7E,EAAIq7E,EAAWp7E,EAAIm7E,EAAWn7E,EAAIo7E,EAAWr7E,EAAI,EAAI,GAAK,EACjFq8E,EAAcL,EAAcZ,EAAW/6E,IAAIg7E,GAAY15E,MAAQy5E,EAAW56E,IAAI66E,GAAY15E,KAC9Fm6E,GAAWt6E,QAAQZ,MAAMy7E,EAAcD,GAE3Cl8E,KAAKi8E,iBAAiBlB,EAAeS,EAAMtpB,EAAU0pB,EAAY,EAAG,GAAG,GACvEJ,GAAQA,MAEL,IAAoB,UAAhBQ,GAA2C,cAAhBA,EAA6B,CAC/D,GAAII,GAAgBZ,GAAQN,EAAWp7E,EAAIq7E,EAAWp7E,EAAIm7E,EAAWn7E,EAAIo7E,EAAWr7E,GAAK,EACrFqvB,GAAUztB,KAAKC,KAAKm6E,EAAcA,EAAc,EAcpD,IAbIM,GACAf,EAAU,EACVD,EAAUjsD,IAEVisD,EAAU,EACVC,EAAUlsD,GAITssD,GACDz7E,KAAKi8E,iBAAiBlB,EAAeS,EAAMtpB,EAAUgpB,EAAYE,EAASC,GAAS,GAGnE,cAAhBW,EAA6B,CAW7B,IAAK,GAFDK,GADAl9D,EAAIzd,KAAKqU,MAAqC,GAA9B,IAAO8lE,EAAe,MAGjC56E,EAAI,EAAOke,EAAJle,EAAOA,IACnBo7E,EAA6BlB,EAAW36E,MAAMS,EAAI,IAAMke,EAAI,IAAI9e,KAAK66E,GAAY95E,QACjFpB,KAAKs8E,kBAAkBvB,EAAeS,EAAMtpB,EAAUmqB,EAA4BD,EAGtFp8E,MAAKs8E,kBAAkBvB,EAAeS,EAAMtpB,EAAU0pB,EAAYQ,EAElE,KAAK,GAAI37E,GAAI0e,EAAI,EAAG1e,GAAK,EAAGA,IACxB47E,EAA6BnB,EAAW16E,MAAMC,EAAI,IAAM0e,EAAI,IAAI9e,KAAK86E,GAAY/5E,QACjFpB,KAAKs8E,kBAAkBvB,EAAeS,EAAMtpB,EAAUmqB,EAA4BD,GAKtFnB,GACAj7E,KAAKi8E,iBAAiBlB,EAAeS,EAAMtpB,EAAUipB,GAAaC,GAAUC,GAAS,OAGlE,SAAhBW,GACFP,GAEDz7E,KAAKi8E,iBAAiBlB,EAAeS,EAAMtpB,EAAUgpB,EAAY,EAAG,GAAG,GAIvED,GACAj7E,KAAKi8E,iBAAiBlB,EAAeS,EAAMtpB,EAAUipB,EAAY,EAAG,GAAG,IAGpD,WAAhBa,GAEFP,IAEDz7E,KAAKi8E,iBAAiBlB,EAAeS,EAAMtpB,EAAUgpB,EAAY,EAAG,GAAG,GAGvEl7E,KAAKm3C,GAAKn3C,KAAK07E,GAAK,GACpBF,EAAO,GAIPP,GACAj7E,KAAKi8E,iBAAiBlB,EAAeS,EAAMtpB,EAAUipB,EAAY,GAAI,IAAI,IAGtD,UAAhBa,IAEFP,IAEDz7E,KAAKi8E,iBAAiBlB,EAAeS,EAAMtpB,EAAUgpB,EAAY,EAAG,GAAG,GAGvEl7E,KAAKi8E,iBAAiBlB,EAAeS,EAAMtpB,EAAUgpB,EAAY,EAAG,GAAG,GAGvEl7E,KAAKm3C,GAAKn3C,KAAK07E,GAAK,GACpBF,EAAO,GAKPP,IAEAj7E,KAAKi8E,iBAAiBlB,EAAeS,EAAMtpB,EAAUipB,EAAY,GAAI,IAAI,GAEzEn7E,KAAKi8E,iBAAiBlB,EAAeS,EAAMtpB,EAAUipB,EAAY,EAAG,GAAG,IAI/EM,IAAc,MAiBtBlC,WAAWt5E,UAAUg8E,iBAAmB,SAASlB,EAAeS,EAAMtpB,EAAUqqB,EAAQC,EAASC,EAAUl7E,GACvG,GACI6tE,GADAC,EAAK9tE,EAAQ,EAAI,EAGjBmwC,EAAa1xC,KAAKu6B,QAAQmX,WAC1BE,EAAc5xC,KAAKu6B,QAAQqX,YAC3B8qC,EAAe18E,KAAKw6B,cAAcmiD,QAClC7tC,EAAmB9uC,KAAKw6B,cAAcmiD,QAAQ7tC,gBAElDsgC,GAAUmN,EAAO/7E,KAAKg7E,GAClBgB,GAASpN,EAAQ7uE,KAAKg8E,EAAOl7E,OAAOX,MAAM87E,IAC9Cx8E,KAAK27E,GAAKjqC,EAAWvxC,IAAI46E,EAAe3L,EAASC,EAAI,EAAGnd,GAAYpjB,EAChE9uC,KAAKm3C,IAAM,GAAKn3C,KAAK07E,IAAM,IAC3B9pC,EAAYzxC,IAAIH,KAAKm3C,GAAIn3C,KAAK07E,GAAI17E,KAAK27E,IACvCe,EAAa3tC,iBAEjB/uC,KAAKm3C,GAAKn3C,KAAK07E,GACf17E,KAAK07E,GAAK17E,KAAK27E,GAEfvM,EAAUmN,EAAO/7E,MAAMg7E,GACnBiB,GAAUrN,EAAQ7uE,KAAKg8E,EAAOl7E,OAAOX,MAAM+7E,IAC/Cz8E,KAAK27E,GAAKjqC,EAAWvxC,IAAI46E,EAAe3L,EAASC,EAAI,EAAGnd,GAAYpjB,EAChE9uC,KAAKm3C,IAAM,GAAKn3C,KAAK07E,IAAM,IAC3B9pC,EAAYzxC,IAAIH,KAAKm3C,GAAIn3C,KAAK07E,GAAI17E,KAAK27E,IACvCe,EAAa3tC,iBAEjB/uC,KAAKm3C,GAAKn3C,KAAK07E,GACf17E,KAAK07E,GAAK17E,KAAK27E,GAEfe,EAAahmC,cAAgB,GAcjC6iC,WAAWt5E,UAAUq8E,kBAAoB,SAASvB,EAAeS,EAAMtpB,EAAUkd,EAASgN,GACtF,GAAI1qC,GAAa1xC,KAAKu6B,QAAQmX,WAC1BE,EAAc5xC,KAAKu6B,QAAQqX,YAC3B8qC,EAAe18E,KAAKw6B,cAAcmiD,QAClC7tC,EAAmB9uC,KAAKw6B,cAAcmiD,QAAQ7tC,iBAE9CwgC,EAAK8M,CACThN,GAAUA,EAAQ5uE,KAAKg7E,GAAQY,EAAgB,GAAK,IAEpDp8E,KAAK27E,GAAKjqC,EAAWvxC,IAAI46E,EAAe3L,EAAS,EAAGE,EAAIpd,GAAYpjB,EACpE4tC,EAAahmC,cAAgB,EAEzB12C,KAAKm3C,IAAM,GAAKn3C,KAAK07E,IAAM,IAC3B9pC,EAAYzxC,IAAIH,KAAKm3C,GAAIn3C,KAAK07E,GAAI17E,KAAK27E,IACvCe,EAAa3tC,iBAIbqtC,EACAp8E,KAAK07E,GAAK17E,KAAK27E,GAEf37E,KAAKm3C,GAAKn3C,KAAK27E;;AEzVvB,YAsBA,SAASlC,cAAal/C,EAAS+/C,EAAkBzmE,EAAa7N,EAAM2I,GAChE3O,KAAKu6B,QAAUA,EACfv6B,KAAKs6E,iBAAmBA,EACxBt6E,KAAK6T,YAAcA,EACnB7T,KAAKgG,KAAOA,EACZhG,KAAK2O,eAAiBA,CACtB,IAAI0D,GAAW,IAAMwB,EACjBqC,EAAa,IACjBlW,MAAKktB,eAAiBhX,EAAa7D,EACnCrS,KAAKg9E,eACLh9E,KAAKi9E,mBA8aT,QAASC,gBAAensE,EAAQsb,EAAM8wD,EAAYC,EAAY1gD,EAAQ2gD,EAC9CC,EAAcC,EAAaC,EAC3BC,EAAcC,EAAaC,GAE/C39E,KAAKF,EAAIiR,EAAOjR,EAChBE,KAAKD,EAAIgR,EAAOhR,EAChBC,KAAK49E,UAAYT,EACjBn9E,KAAK69E,UAAYT,EAEbp9E,KAAK49E,UACL59E,KAAK89E,WAAaT,EAAeU,cAAchtE,EAAQosE,EAAYG,EAAcjxD,EAAMqQ,EAAQ8gD,MAC/Fx9E,KAAKg+E,qBAAuB,GAAIC,kBAAiB5xD,EAAMtb,EAAQosE,EAAYG,EAAcC,EAAaC,IAGtGx9E,KAAK69E,UACL79E,KAAKk+E,UAAYb,EAAec,aAAaptE,EAAQqsE,EAAYK,EAAcpxD,EAAMqQ,EAAQihD,MAC7F39E,KAAKo+E,qBAAuB,GAAIH,kBAAiB5xD,EAAMtb,EAAQqsE,EAAYK,EAAcC,EAAaC,IA5d9G,GAAIpD,eAAgBj8E,QAAQ,oBACxB+/E,OAAS//E,QAAQ,oBACjBggF,WAAahgF,QAAQ,yBACrBigF,cAAgBjgF,QAAQ,iBACxBkgF,MAAQlgF,QAAQ,mBAChBmgF,QAAUngF,QAAQ,qBAClBogF,YAAcpgF,QAAQ,0BACtBqgF,aAAergF,QAAQ,2BACvBsgF,WAAatgF,QAAQ,wBACrBugF,UAAYJ,QAAQI,UACpBC,UAAYL,QAAQK,UACpBf,cAAgBS,MAAMT,cACtBI,aAAeK,MAAML,aACrBY,SAAWzgF,QAAQ,uBACnBU,MAAQV,QAAQ,kBAEhB2/E,iBAAmB3/E,QAAQ,8BAE/BH,QAAOC,QAAUq7E,aAgBjBA,aAAax5E,UAAUqoE,gBAAiB,EAExCmR,aAAax5E,UAAUuoE,YAAc,SAASC,GAC1C,GAAI/rC,GAAS18B,KAAKs6E,iBACd/+D,EAAWvb,KAAKub,SAChByjE,EAAeh/E,KAAKg/E,aAEpBC,EAAkB,GAClBC,EAAgB,EAEpB,QAAQxiD,EAAO,gBACX,IAAK,QACL,IAAK,YACL,IAAK,eACDuiD,EAAkB,CAClB,MACJ,KAAK,OACL,IAAK,WACL,IAAK,cACDA,EAAkB,EAI1B,OAAQviD,EAAO,gBACX,IAAK,SACL,IAAK,eACL,IAAK,cACDwiD,EAAgB,CAChB,MACJ,KAAK,MACL,IAAK,YACL,IAAK,WACDA,EAAgB,EAgBxB,IAAK,GAZDC,GAAqC,UAA3BziD,EAAO,gBAA8B,EACpB,SAA3BA,EAAO,gBAA6B,EACpC,GAEA0iD,EAAQ,GACRC,EAAa3iD,EAAO,oBAAsB0iD,EAC1CE,EAA0C,SAA/B5iD,EAAO,oBAAiCA,EAAO,kBAAoB0iD,EAAQ,EACtFG,EAAU7iD,EAAO,uBAAyB0iD,EAC1CI,GAAc9iD,EAAO,eAAe,GAAK0iD,EAAO1iD,EAAO,eAAe,GAAK0iD,GAC3E9iE,EAAYogB,EAAO,aAEnB63C,KACKtY,EAAI,EAAGA,EAAI1gD,EAASnU,OAAQ60D,IACjCsY,EAAWvjE,KAAKuK,EAAS0gD,GAAGwN,eAGhC,IAAmC,SAA/B/sC,EAAO,oBAAgC,CAGvC,GAAIi5C,GAASiJ,WAAWrjE,EAAUyjE,EAAczK,EAEhDA,GAAaoB,EAAOpB,WACpBh5D,EAAWo6D,EAAOp6D,SAClByjE,EAAerJ,EAAOqJ,aAK1B,IAAK,GAFD7B,GAAYC,EAEP38E,EAAI,EAAGA,EAAI8a,EAASnU,OAAQ3G,IACjC,GAAK8zE,EAAW9zE,GAAhB,CASA,GANI08E,EADA6B,EAAav+E,GACAo+E,UAAUG,EAAav+E,GAAIT,KAAKsF,OAAOgX,GAAYgjE,EACxDD,EAAYJ,EAAiBC,EAAeC,EAASI,EAASC,GAEzD,KAGb9iD,EAAO,cAAe,CACtB,GAAI+iD,GAAWlB,cAAchjE,EAAS9a,GAAG4f,WAAYqc,EAAO,eACxDsG,EAAQhjC,KAAKmc,MAAMsjE,EACvBrC,GAAa0B,UAAU97C,EAAOtG,GAE1BsG,IACsBjxB,SAAlB/R,KAAKwsC,SACLxsC,KAAKwsC,SAAWxJ,EAAMzE,IACfv+B,KAAKwsC,WAAaxJ,EAAMzE,KAC/BjyB,QAAQu0B,KAAK,4EAIrBu8C,GAAa,MAGbD,GAAcC,IACdp9E,KAAKk2E,WAAW3B,EAAW9zE,GAAI08E,EAAYC,GAInDp9E,KAAKmpE,cAAcV,EAAezoE,KAAKu6B,QAASv6B,KAAK2O,iBAGzD8qE,aAAax5E,UAAUi2E,WAAa,SAASlC,EAAOmJ,EAAYC,GAC5D,GAAI1gD,GAAS18B,KAAKs6E,iBAEdoF,EAAY,GAEZ3yC,EAAYrQ,EAAO,iBAAmBgjD,EACtCpC,EAAet9E,KAAKktB,eAAiB6f,EACrC0wC,EAAez9E,KAAKktB,eAAiBwP,EAAO,iBAC5CijD,EAAoB3/E,KAAKktB,eAAiBwP,EAAO,uBACjDkjD,EAAaljD,EAAO,sBACpB6gD,EAAc7gD,EAAO,gBAAkB18B,KAAKktB,eAC5CwwD,EAAchhD,EAAO,gBAAkB18B,KAAKktB,eAC5C2yD,EAAenjD,EAAO,kBAAoB,IAAMh7B,KAAK+hB,GACrD+5D,EAAsD,QAAtC9gD,EAAO,4BAAuE,SAA/BA,EAAO,oBACtEihD,EAAsD,QAAtCjhD,EAAO,4BAAuE,SAA/BA,EAAO,oBACtEojD,EAAapjD,EAAO,uBAAyBA,EAAO,uBAChDA,EAAO,0BAA4BA,EAAO,yBAC9CqjD,EAAwC,SAA/BrjD,EAAO,oBAChBsjD,EAAqBL,EAAoB,CAEzCI,KACA/L,EAAQ+K,SAAS/K,EAAO,EAAG,EAAG,KAAM,MAGxC,KAAK,GAAI7sE,GAAI,EAAGA,EAAI6sE,EAAM5sE,OAAQD,IAS9B,IAAK,GARDklB,GAAO2nD,EAAM7sE,GAGb84E,EAAUF,EACVzB,WAAWjyD,EAAMszD,EAAmBE,EAAc1C,EAAYC,EAAYsC,EAAWpC,EAAct9E,KAAK6T,cACtG,GAAIwqE,QAAOhyD,EAAK,GAAGvsB,EAAGusB,EAAK,GAAGtsB,EAAG,IAG9BghC,EAAI,EAAGhkB,EAAMkjE,EAAQ74E,OAAY2V,EAAJgkB,EAASA,IAAK,CAChD,GAAIhwB,GAASkvE,EAAQl/C,EAErB,MAAIo8C,GAAc4C,GACV//E,KAAKkgF,iBAAiB/C,EAAWttE,KAAMmwE,EAAoBjvE,IADnE,CAMA,GAAI2zB,KAAW3zB,EAAOjR,EAAI,GAAKiR,EAAOjR,EAAI,MAAQiR,EAAOhR,EAAI,GAAKgR,EAAOhR,EAAI,KAE7E,KAAI6/E,GAAel7C,EAAnB,CAWA,GAAI24C,GAAe34C,GAAUo7C,CAE7B9/E,MAAKi9E,gBAAgBjsE,KAAK,GAAIksE,gBAAensE,EAAQsb,EAAM8wD,EAAYC,EAAY1gD,EAAQ2gD,EAC/EC,EAAcC,EAAaC,EAC3BC,EAAcC,EAAaC,QAMnDlE,aAAax5E,UAAUigF,iBAAmB,SAASrwE,EAAMswE,EAAgBpvE,GACrE,GAAIisE,GAAch9E,KAAKg9E,WACvB,IAAMntE,IAAQmtE,IAIV,IAAK,GADDoD,GAAepD,EAAYntE,GACtBpP,EAAI2/E,EAAah5E,OAAS,EAAG3G,GAAK,EAAGA,IAC1C,GAAIsQ,EAAOlP,KAAKu+E,EAAa3/E,IAAM0/E,EAE/B,OAAO,MANfnD,GAAYntE,KAYhB,OADAmtE,GAAYntE,GAAMmB,KAAKD,IAChB,GAGX0oE,aAAax5E,UAAUkpE,cAAgB,SAASV,EAAeluC,EAAS5rB,GAKpE3O,KAAKu6B,QAAUA,CAEf,IAAIC,GAAgBx6B,KAAKw6B,eACrB3qB,KAAM,GAAI0qE,eAAchgD,EAAQI,YAAaJ,EAAQM,cACrD0R,KAAM,GAAIguC,eAAchgD,EAAQO,WAAYP,EAAQQ,aACpDyR,SAAUxsC,KAAKwsC,UAGf9P,EAAS18B,KAAKs6E,iBACdlC,EAAW3P,EAAc2P,SAEzBoF,EAAsD,QAAtC9gD,EAAO,4BAAuE,SAA/BA,EAAO,oBACtEihD,EAAsD,QAAtCjhD,EAAO,4BAAuE,SAA/BA,EAAO,oBAEtEojD,EAAapjD,EAAO,uBAAyBA,EAAO,uBACpDA,EAAO,0BAA4BA,EAAO,wBAM9C,IAAIojD,EAAY,CACZ,GAAI79E,GAAQwmE,EAAcxmE,MACtBO,EAAMd,KAAKc,IAAIP,GACfM,EAAMb,KAAKa,IAAIN,EAEnBjC,MAAKi9E,gBAAgBvlD,KAAK,SAAS52B,EAAGsB,GAClC,GAAIi+E,GAAW79E,EAAM1B,EAAEhB,EAAIyC,EAAMzB,EAAEf,EAC/BugF,EAAW99E,EAAMJ,EAAEtC,EAAIyC,EAAMH,EAAErC,CACnC,OAAOugF,GAAWD,IAI1B,IAAK,GAAIjgF,GAAI,EAAGA,EAAIJ,KAAKi9E,gBAAgB71E,OAAQhH,IAAK,CAClD,GAAImgF,GAAiBvgF,KAAKi9E,gBAAgB78E,GACtCw9E,EAAU2C,EAAe3C,QACzBC,EAAU0C,EAAe1C,QAEzB2C,EAAkB9jD,EAAO,mBAAqBkhD,EAC9C6C,EAAkB/jD,EAAO,mBAAqBmhD,EAK9C6C,EAAa9C,IAAYlhD,EAAO,sBAChC+rC,EAAc4P,sBAAsBkI,EAAevC,sBACnDvV,EAAc0P,SAEdwI,EAAY9C,IAAYnhD,EAAO,sBAC/B+rC,EAAc4P,sBAAsBkI,EAAenC,sBACnD3V,EAAc0P,QAKbqI,IAAoBC,GAEbA,GAAmBC,EAC3BA,EAAah/E,KAAKmU,IAAI8qE,EAAWD,IACzBF,GAAmBG,IAC3BA,EAAYj/E,KAAKmU,IAAI8qE,EAAWD,IAJhCC,EAAYD,EAAah/E,KAAKmU,IAAI8qE,EAAWD,GAU7C9C,IACKlhD,EAAO,0BACR+rC,EAAc2Q,uBAAuBmH,EAAevC,qBAAsB0C,GAE5DtI,GAAdsI,GACA1gF,KAAK4gF,WAAWrmD,EAAQI,YAAaJ,EAAQM,aAAcL,EAAc3qB,KACjE0wE,EAAezC,WAAY4C,EAAYhkD,EAAO,qBAAsB8gD,EACpE/U,EAAcxmE,QAI1B47E,IACKnhD,EAAO,0BACR+rC,EAAc2Q,uBAAuBmH,EAAenC,qBAAsBuC,GAE7DvI,GAAbuI,GACA3gF,KAAK4gF,WAAWrmD,EAAQO,WAAYP,EAAQQ,YAAaP,EAAc+R,KAC/Dg0C,EAAerC,UAAWyC,EAAWjkD,EAAO,qBAAsBihD,EAClElV,EAAcxmE,QAM9B0M,GAAgB3O,KAAK6gF,kBAAkBpY,IAG/CgR,aAAax5E,UAAU2gF,WAAa,SAASh3C,EAAQ+H,EAASnX,EAAesmD,EAAO3zD,EAAO4zD,EAAaC,EAAWC,GAE/GzmD,EAAcsgD,YAAY,EAAIgG,EAAM15E,OAMpC,KAAK,GALDs1E,GAAeliD,EAAcmiD,QAE7B32E,EAAOhG,KAAKgG,KACZkqE,EAAgBxuE,KAAKmU,IAAInU,KAAKsU,IAAImX,GAASzrB,KAAKuU,IAAMjQ,EAAM,GAEvDvF,EAAI,EAAGA,EAAIqgF,EAAM15E,OAAQ3G,IAAK,CAEnC,GAAI2rB,GAAS00D,EAAMrgF,GACfwB,EAAQmqB,EAAOnqB,MAGfnB,GAAKmB,EAAQg/E,EAAiBv/E,KAAK+hB,KAAiB,EAAV/hB,KAAK+hB,GACnD,MAAIs9D,GAAeC,IAAclgF,GAAKY,KAAK+hB,GAAK,GAAK3iB,EAAc,EAAVY,KAAK+hB,GAAS,IAAvE,CAEA,GAAI2f,GAAKhX,EAAOgX,GACZzP,EAAKvH,EAAOuH,GACZ89C,EAAKrlD,EAAOqlD,GACZpuC,EAAKjX,EAAOiX,GACZ69C,EAAM90D,EAAO80D,IACbxI,EAActsD,EAAOssD,YAErBj1E,EAAU/B,KAAKmU,IAAI7P,EAAOtE,KAAKsU,IAAIoW,EAAO+rD,UAAYz2E,KAAKuU,IAAKi6D,GAChExsE,EAAUhC,KAAKgU,IAAI1P,EAAOtE,KAAKsU,IAAIoW,EAAOgsD,UAAY12E,KAAKuU,IAAK,GAEpE,MAAexS,GAAXC,GAAJ,CAGID,IAAYysE,IAAezsE,EAAU,EAEzC,IAAI09E,GAAgBv3C,EAAO9J,MAAQ48C,EAAa5tC,gBAEhDlF,GAAOzpC,IAAIu4E,EAAY54E,EAAG44E,EAAY34E,EAAGqjC,EAAGtjC,EAAGsjC,EAAGrjC,EAAGmhF,EAAIphF,EAAGohF,EAAInhF,EAAG0D,EAASC,EAASwsE,GACrFtmC,EAAOzpC,IAAIu4E,EAAY54E,EAAG44E,EAAY34E,EAAG4zB,EAAG7zB,EAAG6zB,EAAG5zB,EAAGmhF,EAAIphF,EAAIohF,EAAI5qD,EAAG4qD,EAAInhF,EAAG0D,EAASC,EAASwsE,GAC7FtmC,EAAOzpC,IAAIu4E,EAAY54E,EAAG44E,EAAY34E,EAAG0xE,EAAG3xE,EAAG2xE,EAAG1xE,EAAGmhF,EAAIphF,EAAGohF,EAAInhF,EAAImhF,EAAI/gD,EAAG18B,EAASC,EAASwsE,GAC7FtmC,EAAOzpC,IAAIu4E,EAAY54E,EAAG44E,EAAY34E,EAAGsjC,EAAGvjC,EAAGujC,EAAGtjC,EAAGmhF,EAAIphF,EAAIohF,EAAI5qD,EAAG4qD,EAAInhF,EAAImhF,EAAI/gD,EAAG18B,EAASC,EAASwsE,GACrGwM,EAAahmC,cAAgB,EAE7B/E,EAAQxxC,IAAIghF,EAAeA,EAAgB,EAAGA,EAAgB,GAC9DxvC,EAAQxxC,IAAIghF,EAAgB,EAAGA,EAAgB,EAAGA,EAAgB,GAClEzE,EAAa3tC,eAAiB,MAKtC0qC,aAAax5E,UAAUooE,gBAAkB,SAASz0D,EAAMizB,EAAOl+B,GAI3D,QAAS+vC,GAAK/kC,GACV,MAAIA,IAAOytE,EAAkBz4E,EAASgL,QACtCytE,GAAY,GALhB,GAAIA,IAAY,CAChBphF,MAAKqhF,oBAAoBztE,EAAMizB,EAAO6R,GACtC14C,KAAKshF,oBAAoB1tE,EAAMizB,EAAO6R,IAO1C+gC,aAAax5E,UAAUqhF,oBAAsB,SAAS1tE,EAAMizB,EAAOl+B,GAc/D,QAAS44E,GAAS5tE,EAAK6tE,GACnB,MAAI7tE,GAAYhL,EAASgL,IACzB3T,KAAKmc,MAAQqlE,MACb74E,MAhBJ,GAAI3I,KAAKs6E,iBAAiB,cAAe,CACrC,GAAI/+D,GAAWvb,KAAKub,SAChBY,EAAQwiE,aAAapjE,EAAUvb,KAAKs6E,iBAEpCn+D,GAAM/U,OACNy/B,EAAMnzB,KAAK,aAAeyI,MAAOA,GAASolE,EAASh9E,KAAKvE,OAExD2I,QAGJA,MAUR8wE,aAAax5E,UAAUohF,oBAAsB,SAASztE,EAAMizB,EAAOl+B,GAC/D,GAAI4S,GAAWvb,KAAKub,SAChBe,EAAYtc,KAAKs6E,iBAAiB,aAElCh1E,EAAStF,KAAKsF,OAASsO,EAAKtO,MACNyM,UAAtBzM,EAAOgX,KACPhX,EAAOgX,MAEX,IAAI+iB,GAAQ/5B,EAAOgX,GAEfxK,EAAO4sE,YAAYnjE,EAAUvb,KAAKs6E,iBAAkBj7C,EACxDr/B,MAAKg/E,aAAeltE,EAAKktE,aAEzBn4C,EAAMnzB,KAAK,cACPM,IAAKJ,EAAKI,IACVsI,UAAWA,EACXC,WAAYzK,EAAKyK,YAClB,SAAS5I,EAAK8tE,GACb,GAAI9tE,EAAK,MAAOhL,GAASgL,EAEzB,KAAK,GAAI+tE,KAAaD,GAClBpiD,EAAMqiD,GAAaD,EAASC,EAGhC/4E,QAIR8wE,aAAax5E,UAAU4gF,kBAAoB,SAASpY,GAEhDzoE,KAAKw6B,cAAcy9B,aAAe,GAAIsiB,eAAcv6E,KAAKu6B,QAAQS,oBACjEh7B,KAAKw6B,cAAcy9B,aAAa6iB,YAAY,EAK5C,KAAK,GAJD7oE,GAASjS,KAAKu6B,QAAQS,mBACtB/4B,GAASwmE,EAAcxmE,MACvBi2E,EAAWzP,EAAcyP,SAEpBn3C,EAAI,EAAGA,EAAI/gC,KAAKi9E,gBAAgB71E,OAAQ25B,IAC7C,IAAK,GAAI55B,GAAI,EAAO,EAAJA,EAAOA,IAAK,CACxB,GAAIwU,GAAU3b,KAAKi9E,gBAAgBl8C,GAAS,IAAN55B,EAAU,uBAAyB,uBACzE,IAAKwU,EAGL,IAAK,GAFD68D,GAAQ78D,EAAQ68D,MAEXp2E,EAAI,EAAGA,EAAIo2E,EAAMpxE,OAAQhF,IAAK,CACnC,GAAIq2E,GAAMD,EAAMp2E,GACZs2E,EAAcD,EAAIC,YAElBt1C,EAAK,GAAIpkC,OAAMy5E,EAAIloD,GAAIkoD,EAAIhoD,GAAKynD,GAAUn3E,QAAQkB,GAClD0xB,EAAK,GAAI30B,OAAMy5E,EAAIvnD,GAAIunD,EAAIhoD,GAAKynD,GAAUn3E,QAAQkB,GAClDwvE,EAAK,GAAIzyE,OAAMy5E,EAAIloD,GAAIkoD,EAAI1pD,GAAKmpD,GAAUn3E,QAAQkB,GAClDohC,EAAK,GAAIrkC,OAAMy5E,EAAIvnD,GAAIunD,EAAI1pD,GAAKmpD,GAAUn3E,QAAQkB,GAElDyB,EAAUhC,KAAKmU,IAAI,EAAGnU,KAAKgU,IAAI,GAAI1V,KAAKgG,KAAOtE,KAAKsU,IAAIyiE,EAAIL,UAAY12E,KAAKuU,MAC7Ei6D,EAAgBxuE,KAAKmU,IAAI,EAAGnU,KAAKgU,IAAI,GAAI1V,KAAKgG,KAAOtE,KAAKsU,IAAIyiE,EAAIU,gBAAkBz3E,KAAKuU,KAE7FhE,GAAO9R,IAAIu4E,EAAat1C,EAAI1/B,EAASwsE,GACrCj+D,EAAO9R,IAAIu4E,EAAa/kD,EAAIjwB,EAASwsE,GACrCj+D,EAAO9R,IAAIu4E,EAAa/kD,EAAIjwB,EAASwsE,GACrCj+D,EAAO9R,IAAIu4E,EAAar1C,EAAI3/B,EAASwsE,GACrCj+D,EAAO9R,IAAIu4E,EAAar1C,EAAI3/B,EAASwsE,GACrCj+D,EAAO9R,IAAIu4E,EAAajH,EAAI/tE,EAASwsE,GACrCj+D,EAAO9R,IAAIu4E,EAAajH,EAAI/tE,EAASwsE,GACrCj+D,EAAO9R,IAAIu4E,EAAat1C,EAAI1/B,EAASwsE,GAErClwE,KAAKw6B,cAAcy9B,aAAa0kB,QAAQjmC,cAAgB;;AnGxcxE,YAaA,SAASzhC,YAAWU,EAAQC,EAAK5P,GAC7BhG,KAAK2V,OAASA,EACd3V,KAAK4V,IAAMA,EACX5V,KAAKgG,KAAOA,EAdhB7H,OAAOC,QAAU6W,WAiBjBA,WAAWhV,WAcPC,MAAO,WACH,MAAO,IAAI+U,YAAWjV,KAAK2V,OAAQ3V,KAAK4V,IAAK5V,KAAKgG,OAetDqP,OAAQ,SAASrP,GAAQ,MAAOhG,MAAKE,QAAQi4B,QAAQnyB,IAWrD1F,IAAK,SAAS2W,GAAK,MAAOjX,MAAKE,QAAQK,KAAK0W,IAE5CkhB,QAAS,SAASnyB,GACd,GAAImnB,GAAQzrB,KAAKqS,IAAI,EAAG/N,EAAOhG,KAAKgG,KAIpC,OAHAhG,MAAK2V,QAAUwX,EACfntB,KAAK4V,KAAOuX,EACZntB,KAAKgG,KAAOA,EACLhG,MAGXO,KAAM,SAAS0W,GAIX,MAHAA,GAAIA,EAAE5B,OAAOrV,KAAKgG,MAClBhG,KAAK2V,QAAUsB,EAAEtB,OACjB3V,KAAK4V,KAAOqB,EAAErB,IACP5V;;AnB1Ef,YAgBA,SAASlB,QAAO0d,EAAKC,GACjB,GAAIC,MAAMF,IAAQE,MAAMD,GACpB,KAAM,IAAItD,OAAM,2BAA6BqD,EAAM,KAAOC,EAAM,IAEpEzc,MAAKwc,KAAOA,EACZxc,KAAKyc,KAAOA,EAnBhBte,OAAOC,QAAUU,MAEjB,IAAI+J,MAAOvK,QAAQ,gBAAgBuK,IA6BnC/J,QAAOmB,UAAU4I,KAAO,WACpB,MAAO,IAAI/J,QAAOkB,KAAKwc,IAAK3T,KAAK7I,KAAKyc,IAAK,KAAM,OAcrD3d,OAAO2D,QAAU,SAAUka,GACvB,MAAIA,aAAiB7d,QACV6d,EAEPja,MAAMC,QAAQga,GACP,GAAI7d,QAAO6d,EAAM,GAAIA,EAAM,IAE/BA;;ACvDX,YAmBA,SAAS5d,cAAa6d,EAAIC,GACtB,GAAKD,EAIL,IAAK,GAFDE,GAAUD,GAAMD,EAAIC,GAAMD,EAErBzV,EAAI,EAAG4V,EAAMD,EAAQ1V,OAAY2V,EAAJ5V,EAASA,IAC3CnH,KAAK8F,OAAOgX,EAAQ3V,IAvB5BhJ,OAAOC,QAAUW,YAEjB,IAAID,QAASR,QAAQ,YAyBrBS,cAAakB,WAQT6F,OAAQ,SAASkX,GACb,GAEIC,GAAKC,EAFLN,EAAK5c,KAAKmd,IACVN,EAAK7c,KAAKod,GAGd,IAAIJ,YAAele,QACfme,EAAMD,EACNE,EAAMF,MAEH,CAAA,KAAIA,YAAeje,eAOtB,MAAOie,GAAMhd,KAAK8F,OAAOhH,OAAO2D,QAAQua,IAAQje,aAAa0D,QAAQua,IAAQhd,IAH7E,IAHAid,EAAMD,EAAIG,IACVD,EAAMF,EAAII,KAELH,IAAQC,EAAK,MAAOld,MAiB7B,MAXK4c,IAAOC,GAKRD,EAAGJ,IAAM9a,KAAKgU,IAAIuH,EAAIT,IAAKI,EAAGJ,KAC9BI,EAAGH,IAAM/a,KAAKgU,IAAIuH,EAAIR,IAAKG,EAAGH,KAC9BI,EAAGL,IAAM9a,KAAKmU,IAAIqH,EAAIV,IAAKK,EAAGL,KAC9BK,EAAGJ,IAAM/a,KAAKmU,IAAIqH,EAAIT,IAAKI,EAAGJ,OAP9Bzc,KAAKmd,IAAM,GAAIre,QAAOme,EAAIT,IAAKS,EAAIR,KACnCzc,KAAKod,IAAM,GAAIte,QAAOoe,EAAIV,IAAKU,EAAIT,MAShCzc,MAYXqd,UAAW,WACP,MAAO,IAAIve,SAAQkB,KAAKmd,IAAIX,IAAMxc,KAAKod,IAAIZ,KAAO,GAAIxc,KAAKmd,IAAIV,IAAMzc,KAAKod,IAAIX,KAAO,IAOzFa,aAAc,WAAa,MAAOtd,MAAKmd,KAMvCI,aAAc,WAAa,MAAOvd,MAAKod,KAMvCI,aAAc,WAAa,MAAO,IAAI1e,QAAOkB,KAAK8D,WAAY9D,KAAKgE,YAMnEyZ,aAAc,WAAa,MAAO,IAAI3e,QAAOkB,KAAK6D,WAAY7D,KAAKiE,YAMnED,QAAU,WAAa,MAAOhE,MAAKmd,IAAIV,KAMvC5Y,SAAU,WAAa,MAAO7D,MAAKmd,IAAIX,KAMvCvY,QAAU,WAAa,MAAOjE,MAAKod,IAAIX,KAMvC3Y,SAAU,WAAa,MAAO9D,MAAKod,IAAIZ,MAY3Czd,aAAa0D,QAAU,SAAU3B,GAC7B,OAAKA,GAAKA,YAAa/B,cAAqB+B,EACrC,GAAI/B,cAAa+B;;AW/I5B,YAoBA,SAASmC,WAAUQ,EAASC,GACxB1D,KAAKqS,SAAW,IAEhBrS,KAAK2tB,SAAWlqB,GAAW,EAC3BzD,KAAK4tB,SAAWlqB,GAAW,GAE3B1D,KAAK4D,UAAY,UAAW,UAE5B5D,KAAKwH,MAAQ,EACbxH,KAAKyH,OAAS,EACdzH,KAAKgG,KAAO,EACZhG,KAAK+F,OAAS,GAAIjH,QAAO,EAAG,GAC5BkB,KAAKiC,MAAQ,EACbjC,KAAK6tB,UAAY,IACjB7tB,KAAK8tB,OAAS,EAhClB,GAAIhvB,QAASR,QAAQ,aACjBU,MAAQV,QAAQ,kBAChB2W,WAAa3W,QAAQ,gBACrBuK,KAAOvK,QAAQ,gBAAgBuK,KAC/BklB,OAASzvB,QAAQ,uBACjB0vB,KAAO1vB,QAAQ,aAAa0vB,KAC5BtF,KAAOpqB,QAAQ,aAAaoqB,IAEhCvqB,QAAOC,QAAU6E,UA2BjBA,UAAUhD,WACNwO,GAAIhL,WAAY,MAAOzD,MAAK2tB,UAC5Blf,GAAIhL,SAAQuC,GACRhG,KAAK2tB,SAAW3nB,EAChBhG,KAAKgG,KAAOtE,KAAKmU,IAAI7V,KAAKgG,KAAMA,IAGpCyI,GAAI/K,WAAY,MAAO1D,MAAK4tB,UAC5Bnf,GAAI/K,SAAQsC,GACRhG,KAAK4tB,SAAW5nB,EAChBhG,KAAKgG,KAAOtE,KAAKgU,IAAI1V,KAAKgG,KAAMA,IAGpCyI,GAAIwf,aACA,MAAOjuB,MAAKqS,SAAWrS,KAAKmtB,OAGhC1e,GAAIyf,eACA,MAAOluB,MAAKmI,KAAKvH,KAAK,IAG1B6N,GAAItG,QACA,MAAO,IAAInJ,OAAMgB,KAAKwH,MAAOxH,KAAKyH,SAGtCgH,GAAIxI,WACA,OAAQjG,KAAKiC,MAAQP,KAAK+hB,GAAK,KAEnChV,GAAIxI,SAAQA,GACRjG,KAAKiC,OAAS4G,KAAK5C,EAAS,KAAM,KAAOvE,KAAK+hB,GAAK,KAGvDhV,GAAIvI,SACA,MAAOlG,MAAK8tB,OAASpsB,KAAK+hB,GAAK,KAEnChV,GAAIvI,OAAMA,GACNlG,KAAK8tB,OAASpsB,KAAKgU,IAAI,GAAIxP,GAAS,IAAMxE,KAAK+hB,IAGnDhV,GAAI0f,YACA,MAAOnuB,MAAK6tB,WAEhBpf,GAAI0f,UAASA,GACTnuB,KAAK6tB,UAAYnsB,KAAKmU,IAAI,IAAMsY,IAGpC1f,GAAIzI,QAAS,MAAOhG,MAAKouB,OACzB3f,GAAIzI,MAAKA,GACLA,EAAOtE,KAAKgU,IAAIhU,KAAKmU,IAAI7P,EAAMhG,KAAKyD,SAAUzD,KAAK0D,SACnD1D,KAAKouB,MAAQpoB,EACbhG,KAAKmtB,MAAQntB,KAAKquB,UAAUroB,GAC5BhG,KAAKsuB,SAAW5sB,KAAKqU,MAAM/P,GAC3BhG,KAAKuuB,aAAevoB,EAAOhG,KAAKsuB,SAChCtuB,KAAK8H,cAGTumB,UAAW,SAASroB,GAAQ,MAAOtE,MAAKqS,IAAI,EAAG/N,IAC/CwoB,UAAW,SAASrB,GAAS,MAAOzrB,MAAKsU,IAAImX,GAASzrB,KAAKuU,KAE3D7N,QAAS,SAASC,EAAQ4lB,GACtB,MAAO,IAAIjvB,OACPgB,KAAKyuB,KAAKpmB,EAAOoU,IAAKwR,GACtBjuB,KAAK0uB,KAAKrmB,EAAOmU,IAAKyR,KAG9B1lB,UAAW,SAASC,EAAOylB,GACvB,MAAO,IAAInvB,QACPkB,KAAK2uB,KAAKnmB,EAAMzI,EAAGkuB,GACnBjuB,KAAK4uB,KAAKpmB,EAAM1I,EAAGmuB,KAG3Bxf,GAAI3O,KAAM,MAAOE,MAAKyuB,KAAKzuB,KAAK+F,OAAO0W,MACvChO,GAAI1O,KAAM,MAAOC,MAAK0uB,KAAK1uB,KAAK+F,OAAOyW,MAEvC/N,GAAIjG,SAAU,MAAO,IAAIxJ,OAAMgB,KAAKF,EAAGE,KAAKD,IAS5C0uB,KAAM,SAASI,EAAKZ,GAChB,OAAQ,IAAMY,IAAQZ,GAAajuB,KAAKiuB,WAAa,KAUzDS,KAAM,SAASlS,EAAKyR,GAChB,GAAIluB,GAAI,IAAM2B,KAAK+hB,GAAK/hB,KAAKsU,IAAItU,KAAKotB,IAAIptB,KAAK+hB,GAAK,EAAIjH,EAAM9a,KAAK+hB,GAAK,KACxE,QAAQ,IAAM1jB,IAAMkuB,GAAajuB,KAAKiuB,WAAa,KAGvDW,KAAM,SAAS9uB,EAAGmuB,GACd,MAAW,KAAJnuB,GAAWmuB,GAAajuB,KAAKiuB,WAAa,KAErDU,KAAM,SAAS5uB,EAAGkuB,GACd,GAAIc,GAAK,IAAU,IAAJhvB,GAAWkuB,GAAajuB,KAAKiuB,UAC5C,OAAO,KAAMvsB,KAAK+hB,GAAK/hB,KAAKstB,KAAKttB,KAAKutB,IAAIF,EAAKrtB,KAAK+hB,GAAK,MAAQ,IAGrEyL,MAAO,SAASC,GACZ,GAAI3mB,GAAQxI,KAAKkuB,YAAY7tB,KAAK8uB,EAClCnvB,MAAK+F,OAAS/F,KAAKkI,cAAcM,GACjCxI,KAAK8H,cAGTsnB,mBAAoB,SAAS/mB,EAAQG,GACjC,GAAIyO,GAAIjX,KAAK+I,mBAAmBV,GAC5BgnB,EAAervB,KAAKsvB,gBAAgB9mB,GACpC+mB,EAAcvvB,KAAKsvB,gBAAgBtvB,KAAKkuB,aAExCvK,EAAY0L,EAAa9uB,KAAK0W,EAClCjX,MAAK+F,OAAS/F,KAAKwvB,mBAAmBD,EAAYhvB,KAAKojB,IAEvD3jB,KAAK8H,cAGT2nB,cAAe,SAASzpB,EAAMD,GAC1B,GAAI3F,EACA2F,KAAQ3F,EAAIJ,KAAKsI,cAAcvC,IACnC/F,KAAKgG,KAAOA,EACRD,GAAQ/F,KAAKovB,mBAAmBrpB,EAAQ3F,IAGhDsvB,iBAAkB,SAASzpB,EAASF,GAChC,GAAI3F,EACA2F,KAAQ3F,EAAIJ,KAAKsI,cAAcvC,IACnC/F,KAAKiG,QAAUA,EACXF,GAAQ/F,KAAKovB,mBAAmBrpB,EAAQ3F,IAShDkI,cAAe,SAASD,GACpB,MAAOrI,MAAK2vB,gBAAgB3vB,KAAK+I,mBAAmBV,KASxDH,cAAe,SAAS9H,GACpB,MAAOJ,MAAKwvB,mBAAmBxvB,KAAKsvB,gBAAgBlvB,KAWxD2I,mBAAoB,SAASV,GACzB,GAAI5H,GAAIT,KAAKquB,UAAUruB,KAAKsuB,UAAYtuB,KAAKiuB,SAC7C,OAAO,IAAIhZ,YACPjV,KAAKyuB,KAAKpmB,EAAOoU,KAAOhc,EACxBT,KAAK0uB,KAAKrmB,EAAOmU,KAAO/b,EACxBT,KAAKsuB,WASbkB,mBAAoB,SAAS1mB,GACzB,GAAImlB,GAAYjuB,KAAKquB,UAAUvlB,EAAM9C,KACrC,OAAO,IAAIlH,QACPkB,KAAK2uB,KAAK7lB,EAAM8M,IAAKqY,GACrBjuB,KAAK4uB,KAAK9lB,EAAM6M,OAAQsY,KAGhCqB,gBAAiB,SAASlvB,EAAGwvB,GAET7d,SAAZ6d,IAAuBA,EAAU,EAErC,IAAIlD,GAAS1sB,KAAK6vB,sBAAsB7vB,KAAKsuB,UACzCwB,EAAWpH,KAAKqH,OAAO,GAAIC,cAAa,IAAKtD,EAEjD,KAAKoD,EAAU,KAAM,yBAMrB,IAAIG,GAASjC,KAAKkC,kBAAmB9vB,EAAEN,EAAGM,EAAEL,EAAG,EAAG,GAAI+vB,GAClDK,EAASnC,KAAKkC,kBAAmB9vB,EAAEN,EAAGM,EAAEL,EAAG,EAAG,GAAI+vB,GAElDM,EAAKH,EAAO,GACZI,EAAKF,EAAO,GACZG,EAAKL,EAAO,GAAKG,EACjBG,EAAKJ,EAAO,GAAKE,EACjBG,EAAKP,EAAO,GAAKG,EACjBK,EAAKN,EAAO,GAAKE,EACjBK,EAAKT,EAAO,GAAKG,EACjBO,EAAKR,EAAO,GAAKE,EAGjB9R,EAAImS,IAAOC,EAAK,GAAKf,EAAUc,IAAOC,EAAKD,EAE/C,OAAO,IAAIzb,YACP8Y,OAAOuC,EAAIC,EAAIhS,GACfwP,OAAOyC,EAAIC,EAAIlS,GACfve,KAAKsuB,WASbqB,gBAAiB,SAAS7mB,GACtB,GAAI4jB,GAAS1sB,KAAK6vB,sBAAsB/mB,EAAM9C,MAC1C5F,EAAI4tB,KAAKkC,kBAAmBpnB,EAAM6M,OAAQ7M,EAAM8M,IAAK,EAAG,GAAI8W,EAChE,OAAO,IAAI1tB,OAAMoB,EAAE,GAAKA,EAAE,GAAIA,EAAE,GAAKA,EAAE,KAG3CyvB,sBAAuB,SAAS/b,GAC5B,GAAI8c,GAAO5wB,KAAK6wB,gBACZ1D,EAAQntB,KAAKiuB,UAAYjuB,KAAKquB,UAAUva,EAG5C,OAFA4U,MAAKyE,MAAMyD,EAAMA,GAAOzD,EAAOA,EAAO,IACtCzE,KAAKoI,SAASF,EAAM5wB,KAAK+wB,iBAAkBH,GACpCA,GAQXG,eAAgB,WACZ,GAAI9vB,GAAIynB,KAAK5c,QAGb,OAFA4c,MAAKyE,MAAMlsB,EAAGA,GAAIjB,KAAKwH,MAAQ,GAAIxH,KAAKyH,OAAS,EAAG,IACpDihB,KAAK/E,UAAU1iB,EAAGA,GAAI,EAAG,GAAI,IACtBA,GAGX6G,WAAY,WACR,GAAK9H,KAAK+F,OAAV,CAEA,GAAIwP,GAAME,EAAMH,EAAME,EAAMwb,EAAIC,EAAIC,EAAInC,EACpC5mB,EAAOnI,KAAKmI,IAEZnI,MAAK4D,WACL2R,EAAOvV,KAAK0uB,KAAK1uB,KAAK4D,SAAS,IAC/B6R,EAAOzV,KAAK0uB,KAAK1uB,KAAK4D,SAAS,IAC/BotB,EAAKvb,EAAOF,EAAOpN,EAAKpI,EAAIoI,EAAKpI,GAAK0V,EAAOF,GAAQ,GAGrDvV,KAAK+D,WACLuR,EAAOtV,KAAKyuB,KAAKzuB,KAAK+D,SAAS,IAC/ByR,EAAOxV,KAAKyuB,KAAKzuB,KAAK+D,SAAS,IAC/BktB,EAAKzb,EAAOF,EAAOnN,EAAKrI,EAAIqI,EAAKrI,GAAK0V,EAAOF,GAAQ,EAIzD,IAAI2S,GAAIvmB,KAAKmU,IAAIob,GAAM,EAAGD,GAAM,EAEhC,IAAI/I,EAKA,MAJAjoB,MAAK+F,OAAS/F,KAAKuI,UAAU,GAAIvJ,OAC7BiyB,GAAMzb,EAAOF,GAAQ,EAAItV,KAAKF,EAC9BkxB,GAAMvb,EAAOF,GAAQ,EAAIvV,KAAKD,SAClCC,KAAKgG,MAAQhG,KAAKwuB,UAAUvG,GAIhC,IAAIjoB,KAAK4D,SAAU,CACf,GAAI7D,GAAIC,KAAKD,EACToxB,EAAKhpB,EAAKpI,EAAI,CAELwV,GAATxV,EAAIoxB,IAAWpC,EAAKxZ,EAAO4b,GAC3BpxB,EAAIoxB,EAAK1b,IAAMsZ,EAAKtZ,EAAO0b,GAGnC,GAAInxB,KAAK+D,SAAU,CACf,GAAIjE,GAAIE,KAAKF,EACTsxB,EAAKjpB,EAAKrI,EAAI,CAELwV,GAATxV,EAAIsxB,IAAWF,EAAK5b,EAAO8b,GAC3BtxB,EAAIsxB,EAAK5b,IAAM0b,EAAK1b,EAAO4b,IAIxBrf,SAAPmf,GAA2Bnf,SAAPgd,KACpB/uB,KAAK+F,OAAS/F,KAAKuI,UAAU,GAAIvJ,OACtB+S,SAAPmf,EAAmBA,EAAKlxB,KAAKF,EACtBiS,SAAPgd,EAAmBA,EAAK/uB,KAAKD,OAIzC8wB,cAAe,WACX,GAAI5vB,GAAI,GAAI+uB,cAAa,IAGrBqB,EAAU3vB,KAAKstB,KAAK,GAAMhvB,KAAKmuB,UAC/BmD,EAAyB5vB,KAAKc,IAAI6uB,GAAWrxB,KAAKmuB,SAAWzsB,KAAKc,IAAId,KAAK+hB,GAAK,EAAIzjB,KAAK8tB,OAASuD,GAElGE,EAAO7vB,KAAKa,IAAIb,KAAK+hB,GAAK,EAAIzjB,KAAK8tB,QAAUwD,EAAyBtxB,KAAKmuB,QAa/E,OAXAzF,MAAK8I,YAAYvwB,EAAG,EAAIS,KAAKstB,KAAMhvB,KAAKyH,OAAS,EAAKzH,KAAKmuB,UAAWnuB,KAAKwH,MAAQxH,KAAKyH,OAAQ,GAAK8pB,GAErG7I,KAAK/E,UAAU1iB,EAAGA,GAAI,EAAG,GAAIjB,KAAKmuB,WAIlCzF,KAAKyE,MAAMlsB,EAAGA,GAAI,EAAG,GAAI,EAAIjB,KAAKyH,SAElCihB,KAAK+I,QAAQxwB,EAAGA,EAAGjB,KAAK8tB,QACxBpF,KAAKgJ,QAAQzwB,EAAGA,EAAGjB,KAAKiC,OACxBymB,KAAK/E,UAAU1iB,EAAGA,IAAKjB,KAAKF,GAAIE,KAAKD,EAAG,IACjCkB;;AsE3Wf,YAIA,IAAIo3D,cACAC,KAAM,OACNC,KAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC3DC,KAAO,IAAK,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,KAC9CC,KAAM,IAAK,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,IAC3FC,GAAM,IAAK,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IACnMC,KAAM,IAAK,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,IAC1OC,KAAM,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,IAC5PC,KAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,KACxDC,KAAM,IAAK,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,KAC7EC,KAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,KAC7EC,KAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,KAClEC,KAAM,IAAK,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,IAC5CC,KAAM,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,KAC1DC,KAAM,IAAK,EAAG,EAAG,GAAI,IACrBC,KAAM,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IACtCC,KAAM,IAAK,GAAI,GAAI,EAAG,KACtBC,GAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,KAC9HC,GAAM,IAAK,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,IACrCC,GAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,IAChHC,GAAM,IAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAClHC,GAAM,IAAK,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,IACpDC,GAAM,IAAK,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC/HC,GAAM,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,IAC7KC,GAAM,IAAK,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,KAC5CC,GAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,KACpNC,GAAM,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC1KC,KAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IACjFC,KAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,KACrGC,KAAM,IAAK,GAAI,GAAI,EAAG,EAAG,GAAI,IAC7BC,KAAM,IAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,IAC5CC,KAAM,IAAK,EAAG,GAAI,GAAI,EAAG,EAAG,IAC5BC,KAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,IACvJC,KAAM,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,IACrZC,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,IAChEC,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,IACnLC,GAAM,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,IACrIxR,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,IACrHyR,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,IACxFC,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,KAClEC,GAAM,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,IAClKC,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,KAClEC,GAAM,GAAI,EAAG,GAAI,EAAG,IACpBC,GAAM,IAAK,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IACzEC,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,IACjEhS,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,IAC1CiS,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,IACzFC,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,IAClEC,GAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,KAC1JC,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,KAC1GC,GAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,KACjLC,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAClI9kC,GAAM,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IACrJ+kC,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,KAC3CrS,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,KAC3E9yB,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,IAC3ColC,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,IACzFC,GAAM,IAAK,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,IAC5CC,GAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,KAClDC,GAAM,IAAK,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,IAClEC,KAAM,IAAK,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,KACzFC,MAAO,IAAK,EAAG,GAAI,GAAI,KACvBC,KAAM,IAAK,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,KAC3FC,KAAM,IAAK,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,IACjFpjB,GAAM,IAAK,EAAG,GAAI,GAAI,KACtBqjB,KAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,KACxDl7D,GAAM,IAAK,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,IAC/HsB,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC/H6U,GAAM,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,IACxGmI,GAAM,IAAK,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,IAC/HnR,GAAM,IAAK,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,IAC7H+/B,GAAM,IAAK,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,KAChEiuB,GAAM,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,IACtK97B,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IACjFh5B,GAAM,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,IAC/D45B,GAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,KACrFtgC,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,IAChEiyD,GAAM,GAAI,EAAG,GAAI,EAAG,IACpBzxD,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAChJke,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IACjFmuC,GAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,KAC5HltD,GAAM,IAAK,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAChI8qD,GAAM,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,IAChIx1B,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,KAC/DzN,GAAM,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC7H1J,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,KAC7DgY,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,IAC7EsjB,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,IAC3CvjB,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,IACzFx2B,GAAM,IAAK,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,IAC5CC,GAAM,IAAK,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,KACtE+T,GAAM,IAAK,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,IAClEooD,KAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,KAC/QC,KAAM,GAAI,EAAG,GAAI,EAAG,KACpBC,KAAM,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,KAChRC,KAAM,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,KAG/Kl+D,QAAOC,QAAU,SAAsByR,EAAM4B,EAAM6qD,EAAUnvC,GACzDA,EAAQA,GAAS,CAEjB,IACIhmB,GAAG4V,EAAKgkB,EAAGw7B,EAAM59B,EAAO7+B,EAAGC,EAAGy8D,EAD9BC,IAGJ,KAAKt1D,EAAI,EAAG4V,EAAMlN,EAAKzI,OAAY2V,EAAJ5V,EAASA,IAEpC,GADAw3B,EAAQ05B,YAAYxoD,EAAK1I,IACzB,CAGA,IAFAq1D,EAAO,KAEFz7B,EAAI,EAAGw7B,EAAO59B,EAAM,GAAGv3B,OAAYm1D,EAAJx7B,EAAUA,GAAK,EAC3B,KAAhBpC,EAAM,GAAGoC,IAAiC,KAApBpC,EAAM,GAAGoC,EAAI,GACnCy7B,EAAO,MAGP18D,EAAI2R,EAAOktB,EAAM,GAAGoC,GAAK5T,EACzBptB,EAAIu8D,EAAW39B,EAAM,GAAGoC,EAAI,GAAK5T,EAC7BqvC,GACAC,EAAQzrD,KAAKwrD,EAAK18D,EAAG08D,EAAKz8D,EAAGD,EAAGC,GAEpCy8D,GAAQ18D,EAAGA,EAAGC,EAAGA,GAGzB0R,IAAQktB,EAAM,GAAKxR,EAGvB,MAAOsvC;;AzFjIX,YAWA,IAAIv+D,UAAWC,OAAOC,UAEtBF,UAASG,IAAMC,QAAQ,YACvBJ,SAASK,QAAUD,QAAQ,wBAC3BJ,SAASM,WAAaF,QAAQ,2BAC9BJ,SAASO,YAAcH,QAAQ,4BAC/BJ,SAASQ,MAAQJ,QAAQ,cAEzBJ,SAASS,cAAgBL,QAAQ,2BACjCJ,SAASU,YAAcN,QAAQ,yBAE/BJ,SAASW,MAAQP,QAAQ,iBAEzBJ,SAASY,OAASR,QAAQ,iBAC1BJ,SAASa,aAAeT,QAAQ,wBAChCJ,SAASc,MAAQV,QAAQ,kBAEzBJ,SAASe,QAAUX,QAAQ,kBAC3BJ,SAASgB,KAAOZ,QAAQ,eAExBJ,SAASiB,UAAYb,QAAQ,kBAAkBa,SAE/C,IAAIC,MAAOd,QAAQ,cACnBJ,UAASgB,KAAKG,QAAUD,KAAKC,QAC7BnB,SAASgB,KAAKI,eAAiBF,KAAKE,cAEpC,IAAIC,QAASjB,QAAQ,gBACrBJ,UAASqB,OAASA,OAElBC,OAAOC,eAAevB,SAAU,eAC5BwB,IAAK,WAAa,MAAOH,QAAOI,cAChCC,IAAK,SAASC,GAASN,OAAOI,aAAeE;;A6C1CjD,YAMA,SAAS6zC,gBAAe3rC,EAASqC,EAAO+N,GACpC,GAII6wB,GAJA58B,EAAKrE,EAAQqE,GACb0vB,EAAQ1xB,EAAMqzB,MAAM,oBACpBuF,EAAQ54B,EAAMqzB,MAAM,oBACpBxB,EAAU7xB,EAAMqzB,MAAM,sBAGtBmT,EAAY5N,EAAQj7B,EAAQyQ,YAAY0qB,YAAYF,EAAMpP,MAAM,GAAQ,KACxEid,EAAY7N,EAAQj7B,EAAQyQ,YAAY0qB,YAAYF,EAAMnP,IAAI,GAAQ,IAE1E,IAAI+c,GAAaC,EAAW,CAExB7H,EAASjhC,EAAQ8hB,cACjBzd,EAAG4e,aAAage,EAAQ7wB,GACxB/L,EAAGmhC,UAAUvE,EAAOyH,QAAS,GAC7BrkC,EAAGqhC,WAAWzE,EAAOiI,eAAgBL,EAAUxN,IAC/Ch3B,EAAGqhC,WAAWzE,EAAOkI,eAAgBN,EAAUvN,IAC/Cj3B,EAAGqhC,WAAWzE,EAAOmI,eAAgBN,EAAUzN,IAC/Ch3B,EAAGqhC,WAAWzE,EAAOoI,eAAgBP,EAAUxN,IAC/Cj3B,EAAGwhC,UAAU5E,EAAOmK,UAAWlX,EAE/B,IAAIz4B,GAAYuE,EAAQvE,UACpBmwC,EAAQ/C,EAAUzoC,KAClByrC,EAAQ/C,EAAU1oC,KAClBpC,EAASvC,EAAUuF,mBAAmBvF,EAAUuC,QAChDonB,EAAQ,EAAIzrB,KAAKqS,IAAI,EAAGvQ,EAAU+qB,aAEtCniB,GAAGwhC,UAAU5E,EAAO2H,MAAO3N,EAAMzkB,EAEjC,IAAI60B,GAAUC,KAAKvnC,QACnBunC,MAAKlmB,MAAMimB,EAASA,GAChB,GAAKO,EAAM,GAAK3Q,EAAMnF,WACtB,GAAK8V,EAAM,GAAK3Q,EAAMnF,aAE1BwV,KAAK1vB,UAAUyvB,EAASA,GACnBrtC,EAAO4P,OAASnS,EAAU6O,UAAashC,EAAM,GAAK3Q,EAAMnF,WACxD93B,EAAO6P,IAASpS,EAAU6O,UAAashC,EAAM,GAAK3Q,EAAMnF,aAE7DwV,KAAKxyC,OAAOuyC,EAASA,GAAU5vC,EAAUvB,OACzCoxC,KAAKlmB,MAAMimB,EAASA,GAChBjmB,EAAQ3pB,EAAUgE,MAAS,GAC3B2lB,EAAQ3pB,EAAUiE,OAAS,GAG/B,IAAI6rC,GAAUD,KAAKvnC,QACnBunC,MAAKlmB,MAAMmmB,EAASA,GAChB,GAAKM,EAAM,GAAK5Q,EAAMlF,SACtB,GAAK8V,EAAM,GAAK5Q,EAAMlF,WAE1BuV,KAAK1vB,UAAU2vB,EAASA,GACnBvtC,EAAO4P,OAASnS,EAAU6O,UAAauhC,EAAM,GAAK5Q,EAAMlF,SACxD/3B,EAAO6P,IAASpS,EAAU6O,UAAauhC,EAAM,GAAK5Q,EAAMlF,WAE7DuV,KAAKxyC,OAAOyyC,EAASA,GAAU9vC,EAAUvB,OACzCoxC,KAAKlmB,MAAMmmB,EAASA,GAChBnmB,EAAQ3pB,EAAUgE,MAAS,GAC3B2lB,EAAQ3pB,EAAUiE,OAAS,IAG/B2E,EAAGmnC,iBAAiBvK,EAAOwK,mBAAmB,EAAOJ,GACrDhnC,EAAGmnC,iBAAiBvK,EAAOyK,mBAAmB,EAAOH,GAErDvrC,EAAQyQ,YAAYjU,KAAK6H,GAAI,OAI7B48B,GAASjhC,EAAQ+hB,WACjB1d,EAAG4e,aAAage,EAAQ7wB,GACxB/L,EAAGmf,yBAAyByd,EAAOxd,SACnCpf,EAAG0gB,gBAAgBkc,EAAOxd,QAASsQ,EAGvC1vB,GAAGumB,QAAQvmB,EAAG6c,cACd7c,EAAGuK,WAAWvK,EAAGwK,aAAc7O,EAAQkiB,kBACvC7d,EAAGqf,oBAAoBud,EAAOtd,MAAO3jB,EAAQkiB,iBAAiBC,SAAU9d,EAAGuf,OAAO,EAAO,EAAG,GAC5Fvf,EAAGwf,WAAWxf,EAAGyf,eAAgB,EAAG9jB,EAAQkiB,iBAAiBE,WAC7D/d,EAAGrH,OAAOqH,EAAG6c,cAEb7c,EAAGye,YAAY,GACfze,EAAG8e,YAAY9e,EAAG+e,MAAO,IAAM,KAnFnC,GAAIkoB,MAAO/0C,QAAQ,aAAa+0C,IAEhCl1C,QAAOC,QAAUs1C;;A2CJjB,YAIA,SAASskB,oBAAmBjwD,EAASqC,EAAO+N,EAAWvE,GAEnD,GAAI4mB,GAAgB5mB,EAAK4mB,cAAcpwB,EAAMkR,KAAOlR,EAAML,IAAIkuD,YAC9D,IAAKz9B,EAAL,CAEA,GAAIpuB,GAAKrE,EAAQqE,GACb6F,EAAS2B,EAAK2mB,QAAQS,mBACtBgO,EAASjhC,EAAQgiB,kBAErB3d,GAAGrH,OAAOqH,EAAG6c,cAEb7c,EAAG4e,aAAage,EAAQ7wB,GACxBlG,EAAO1N,KAAK6H,EAAI48B,GAChB58B,EAAG8X,UAAU,EAEb,IAAImyB,GAAS,EACbjqC,GAAGqf,oBAAoBud,EAAOtd,MAAO,EAAGtf,EAAGuf,OAAO,EAAO0qB,EAAQ,GACjEjqC,EAAGqf,oBAAoBud,EAAOkvB,UAAW,EAAG9rD,EAAGuf,OAAO,EAAO0qB,EAAQ,GACrEjqC,EAAGqf,oBAAoBud,EAAO8I,OAAQ,EAAG1lC,EAAGoL,eAAe,EAAO6+B,EAAQ,GAE1EjqC,EAAGwhC,UAAU5E,EAAOmvB,QAASz2D,KAAKqS,IAAI,EAAGhM,EAAQvE,UAAUwC,KAAO4N,EAAK9K,MAAMgL,IAC7E1H,EAAGwhC,UAAU5E,EAAO+E,OAAiC,GAAzBhmC,EAAQvE,UAAUwC,MAC9CoG,EAAGwhC,UAAU5E,EAAOovB,UAAgC,IAApBxkD,EAAK9K,MAAMgL,EAAI,GAE/C,IAAI2iC,GAAQjc,EAAc6R,OAAO,GAAGyC,iBAChC/xB,EAAMyd,EAAc6R,OAAO,GAAGqK,YAClCtqC,GAAGwf,WAAWxf,EAAG8mC,MAAOuD,EAAO15B,GAE/B3Q,EAAGumB,QAAQvmB,EAAG6c,eA9BlB9qB,OAAOC,QAAU45D;;AzCFjB,YAOA,SAASpiB,WAAU7tC,EAAS6L,GACxB,GAAIxH,GAAKrE,EAAQqE,EAGjBA,GAAG0c,UAAU1c,EAAG4c,IAAK5c,EAAGygB,qBAExBzgB,EAAG4e,aAAajjB,EAAQmhB,YAAatV,EAAKuE,WAG1C/L,EAAGuK,WAAWvK,EAAGwK,aAAc7O,EAAQyiB,aACvCpe,EAAGqf,oBAAoB1jB,EAAQmhB,YAAYwC,MAAO3jB,EAAQyiB,YAAYN,SAAU9d,EAAGuf,OAAO,EAAO,EAAG,GACpGvf,EAAGypC,UAAU9tC,EAAQmhB,YAAY4sB,QAAS,EAAG,EAAG,EAAG,GACnD1pC,EAAG8X,UAAU,GACb9X,EAAGwf,WAAWxf,EAAG2pC,WAAY,EAAGhuC,EAAQyiB,YAAYL,UAEpD,IAAI3c,GAAWwoC,aAAapiC,EAAK9K,MAAMmtC,WAAY,GAAI,IAAK,EAE5D7pC,GAAGuK,WAAWvK,EAAGwK,aAAc7O,EAAQsiB,iBACvCje,EAAGyK,WAAWzK,EAAGwK,aAAc,GAAIL,YAAW/I,GAAWpB,EAAG8pC,aAC5D9pC,EAAGqf,oBAAoB1jB,EAAQmhB,YAAYwC,MAAO3jB,EAAQsiB,gBAAgBH,SAAU9d,EAAGuf,OAAO,EAAO,EAAG,GACxGvf,EAAG8X,UAAU,EAAIrhB,QAAQ6V,kBACzBtM,EAAGypC,UAAU9tC,EAAQmhB,YAAY4sB,QAAS,EAAG,EAAG,EAAG,GACnD1pC,EAAGwf,WAAWxf,EAAG8mC,MAAO,EAAG1lC,EAASpG,OAASW,EAAQsiB,gBAAgBH,UACrE9d,EAAG8X,UAAU,EAAIrhB,QAAQ6V,kBACzBtM,EAAGypC,UAAU9tC,EAAQmhB,YAAY4sB,QAAS,EAAG,EAAG,EAAG,GACnD1pC,EAAGwf,WAAWxf,EAAG8mC,MAAO,EAAG1lC,EAASpG,OAASW,EAAQsiB,gBAAgBH,UAGrE9d,EAAG0c,UAAU1c,EAAG2c,oBAAqB3c,EAAG4c,KAjC5C,GAAIgtB,cAAe13C,QAAQ,oBACvBuE,QAAUvE,QAAQ,kBAEtBH,QAAOC,QAAUw3C;;AHLjB,YAOA,SAAS5D,UAASjqC,EAASqC,EAAO+N,EAAWvE,GAEzC,GAAKA,EAAK2mB,QAAV,CACA,GAAIC,GAAgB5mB,EAAK4mB,cAAcpwB,EAAMkR,KAAOlR,EAAML,GAC1D,IAAKywB,EAAL,CAEA,GAKIoP,GAAQqD,EAAU5yB,EAAOg0B,EALzBjiC,EAAKrE,EAAQqE,GACb6lC,EAAsBlqC,EAAQglB,gBAAgB5U,EAAWvE,EAAMxJ,EAAMqzB,MAAM,kBAAmBrzB,EAAMqzB,MAAM,0BAE1G3B,EAAQ1xB,EAAMqzB,MAAM,aAQxBrxB,GAAGye,YAAY,IACfze,EAAGse,MAAMte,EAAG0e,oBAMZ1e,EAAG8e,YAAY9e,EAAG8lC,SAAU,IAAM,KAKlC9lC,EAAG+lC,kBAAkB/lC,EAAGgmC,MAAOhmC,EAAGimC,UAAWjmC,EAAGkf,KAAMlf,EAAGkf,MACzDlf,EAAG+lC,kBAAkB/lC,EAAGkmC,KAAMlmC,EAAGmmC,UAAWnmC,EAAGkf,KAAMlf,EAAGkf,MAIxDlf,EAAG6e,WAAU,GAAO,GAAO,GAAO,GAGlC7e,EAAG4e,aAAajjB,EAAQ+hB,WAAYmoB,GAGpCrI,EAASh2B,EAAK2mB,QAAQiY,WACtB5I,EAAOrlC,KAAK6H,GACZ6gC,EAAWr5B,EAAK2mB,QAAQkY,YACxBxF,EAAS1oC,KAAK6H,EAEd,IAAI+iB,GAAQmf,CAEZliC,GAAGmf,yBAAyBxjB,EAAQ+hB,WAAW0B,QAE/C,KAAK,GAAIrkB,GAAI,EAAGA,EAAIqzB,EAAc6R,OAAOjlC,OAAQD,IAC7CkT,EAAQmgB,EAAc6R,OAAOllC,GAC7BgoB,EAAS9U,EAAMy0B,iBAAmBlF,EAAO1f,SACzC9d,EAAGqf,oBAAoB1jB,EAAQ+hB,WAAW4B,MAAO,EAAGtf,EAAGuf,OAAO,EAAO,EAAGwD,EAAS,GAEjFkf,EAA8B,EAAtBh0B,EAAM00B,cACdT,EAAgBj0B,EAAM20B,kBAAoB/B,EAAS/iB,SACnD9d,EAAG6iC,aAAa7iC,EAAG8iC,UAAWb,EAAOjiC,EAAG+iC,eAAgBb,EAK5DliC,GAAG6e,WAAU,GAAM,GAAM,GAAM,GAG/B7e,EAAGgf,UAAUhf,EAAGkf,KAAMlf,EAAGkf,KAAMlf,EAAGkf,MAClClf,EAAGye,YAAY,EAEf,IAAI6nB,GAActoC,EAAMqzB,MAAM,qBAI9B,IAAIrzB,EAAMqzB,MAAM,qBAAsB,KAAUrzB,EAAMqzB,MAAM,eAAkBiV,GAAc,CACxFtmC,EAAG4e,aAAajjB,EAAQ6hB,cAAeqoB,GACvC7lC,EAAG8X,UAAU,EAAIrhB,QAAQ6V,kBAErBg6B,EAIAtmC,EAAG8e,YAAY9e,EAAG+e,MAAO,IAAM,KAO/B/e,EAAG8e,YAAY9e,EAAG+e,MAAO,IAAM,KAGnC/e,EAAGumC,UAAU5qC,EAAQ6hB,cAAcgpB,QAASxmC,EAAGymC,mBAAoBzmC,EAAG0mC,qBAGtElJ,EAASh2B,EAAK2mB,QAAQiY,WACtBvF,EAAWr5B,EAAK2mB,QAAQwY,eACxB9F,EAAS1oC,KAAK6H,GAEdA,EAAGmf,yBAAyBxjB,EAAQ6hB,cAAc4B,SAClDpf,EAAG0gB,gBAAgB/kB,EAAQ6hB,cAAc4B,QAASknB,EAAcA,EAAc5W,EAE9E,KAAK,GAAIr7B,GAAI,EAAGA,EAAI+5B,EAAc6R,OAAOjlC,OAAQ3G,IAC7C4Z,EAAQmgB,EAAc6R,OAAO5rC,GAC7B0uB,EAAS9U,EAAMy0B,iBAAmBlF,EAAO1f,SACzC9d,EAAGqf,oBAAoB1jB,EAAQ6hB,cAAc8B,MAAO,EAAGtf,EAAGuf,OAAO,EAAO,EAAGwD,EAAS,GAEpFkf,EAAoC,EAA5Bh0B,EAAM24B,oBACd1E,EAAgBj0B,EAAM44B,wBAA0BhG,EAAS/iB,SACzD9d,EAAG6iC,aAAa7iC,EAAG8mC,MAAO7E,EAAOjiC,EAAG+iC,eAAgBb,GAI5D,GAEItF,GAFAhG,EAAQ54B,EAAMqzB,MAAM,cACpBxB,EAAU7xB,EAAMqzB,MAAM,iBAAmB,CAG7C,IAAIuF,EAAO,CAEP,GAAI4N,GAAY7oC,EAAQyQ,YAAY0qB,YAAYF,EAAMpP,MAAM,GACxDid,EAAY9oC,EAAQyQ,YAAY0qB,YAAYF,EAAMnP,IAAI,EAC1D,KAAK+c,IAAcC,EAAW,MAE9B7H,GAASjhC,EAAQ8hB,cACjBzd,EAAG4e,aAAage,EAAQ7wB,GACxB/L,EAAGmhC,UAAUvE,EAAOyH,QAAS,GAC7BrkC,EAAGqhC,WAAWzE,EAAOiI,eAAgBL,EAAUxN,IAC/Ch3B,EAAGqhC,WAAWzE,EAAOkI,eAAgBN,EAAUvN,IAC/Cj3B,EAAGqhC,WAAWzE,EAAOmI,eAAgBN,EAAUzN,IAC/Ch3B,EAAGqhC,WAAWzE,EAAOoI,eAAgBP,EAAUxN,IAC/Cj3B,EAAGwhC,UAAU5E,EAAOmK,UAAWlX,GAC/B7vB,EAAGwhC,UAAU5E,EAAO2H,MAAO3N,EAAMzkB,EAEjC,IAAIuyB,GAAUl9B,EAAKsC,WAAatC,EAAKvB,SAAY3Q,KAAKqS,IAAI,EAAGhM,EAAQvE,UAAU8qB,SAAW1a,EAAK9K,MAAMgL,GAEjGs/B,EAAUC,KAAKvnC,QACnBunC,MAAKlmB,MAAMimB,EAASA,GAChB,GAAKxC,EAAUzoC,KAAK,GAAK2oC,EAAS9N,EAAMnF,WACxC,GAAK+S,EAAUzoC,KAAK,GAAK2oC,EAAS9N,EAAMnF,YAG5C,IAAIyV,GAAUD,KAAKvnC,QACnBunC,MAAKlmB,MAAMmmB,EAASA,GAChB,GAAKzC,EAAU1oC,KAAK,GAAK2oC,EAAS9N,EAAMlF,SACxC,GAAK+S,EAAU1oC,KAAK,GAAK2oC,EAAS9N,EAAMlF,WAG5C1xB,EAAGmnC,iBAAiBvK,EAAOwK,mBAAmB,EAAOJ,GACrDhnC,EAAGmnC,iBAAiBvK,EAAOyK,mBAAmB,EAAOH,GAErDvrC,EAAQyQ,YAAYjU,KAAK6H,GAAI,OAI7B48B,GAASjhC,EAAQ+hB,WACjB1d,EAAG4e,aAAage,EAAQ7wB,GACxB/L,EAAGmf,yBAAyByd,EAAOxd,SACnCpf,EAAG0gB,gBAAgBkc,EAAOxd,QAASsQ,EAIvC1vB,GAAG8e,YAAY9e,EAAG8lC,SAAU,EAAK,IACjC9lC,EAAGuK,WAAWvK,EAAGwK,aAAc7O,EAAQwiB,kBACvCne,EAAGqf,oBAAoBud,EAAOtd,MAAO3jB,EAAQwiB,iBAAiBL,SAAU9d,EAAGuf,OAAO,EAAO,EAAG,GAC5Fvf,EAAGwf,WAAWxf,EAAGyf,eAAgB,EAAG9jB,EAAQwiB,iBAAiBJ,WAE7D/d,EAAGye,YAAY,GACfze,EAAG8e,YAAY9e,EAAG+e,MAAO,IAAM,OAzKnC,GAAItoB,SAAUvE,QAAQ,mBAClB+0C,KAAO/0C,QAAQ,aAAa+0C,IAEhCl1C,QAAOC,QAAU4zC;;ADLjB,YAEA,IAAInvC,SAAUvE,QAAQ,mBAClBy7B,KAAOz7B,QAAQ,aAAay7B,IAYhC57B,QAAOC,QAAU,SAAkB2J,EAASqC,EAAO+N,EAAWvE,GAE1D,GAAKA,EAAK2mB,QAAV,CACA,GAAIC,GAAgB5mB,EAAK4mB,cAAcpwB,EAAMkR,KAAOlR,EAAML,GAC1D,IAAKywB,EAAL,CAEA,GAAIpuB,GAAKrE,EAAQqE,EAGjB,MAAIhC,EAAMqzB,MAAM,eAAiB,GAAjC,CAIA,GAAI4R,GAAe,EAAIxsC,QAAQ6V,iBAE3B42B,EAAOllC,EAAMqzB,MAAM,aAAe4R,EAClCE,EAAYnlC,EAAMqzB,MAAM,cAAgB,EACxC+R,EAAQ,GACRrgB,EAAS,EACTmc,EAAQ,CAERlhC,GAAMqzB,MAAM,kBAAoB,IAChC+R,EAAQplC,EAAMqzB,MAAM,kBAAoB,EAAmB,GAAf4R,EAC5CE,EAAYnlC,EAAMqzB,MAAM,cAGxBtO,EAASqgB,EAAQH,EAAe,EAGpC,IAAII,GAAStgB,EAASogB,EAAYF,EAAe,EAAI/D,EAEjDxP,EAAQ1xB,EAAMqzB,MAAM,cACpBiS,EAAQ3nC,EAAQvE,UAAU2pB,OAAS,GAAKvZ,EAAK9K,MAAMgL,IAAMF,EAAKsC,WAAatC,EAAKvB,UAChFs9B,EAAY5nC,EAAQglB,gBAAgB5U,EAAWvE,EAAMxJ,EAAMqzB,MAAM,kBAAmBrzB,EAAMqzB,MAAM,0BAEhG9J,EAAK5rB,EAAQvE,UAGbosC,EAAqB7V,KAAKjuB,QAC9BiuB,MAAK5M,MAAMyiB,EAAoBA,GAAqB,EAAGluC,KAAKa,IAAIoxB,EAAG7F,UACnEiM,KAAKl5B,OAAO+uC,EAAoBA,EAAoB7nC,EAAQvE,UAAUvB,MAItE,IAOI+mC,GAPAmE,EAAgBzrC,KAAKC,KAAKgyB,EAAGlsB,OAASksB,EAAGlsB,OAAS,GAAM,EAAIksB,EAAGxF,SAAWwF,EAAGxF,WAC7EruB,EAAI6zB,EAAGlsB,OAAS,EAAI/F,KAAKotB,IAAI6E,EAAG7F,QAChCsf,GAASD,EAAgBrtC,GAAKqtC,EAAgB,EAG9Ct5B,EAAcD,EAAKvB,SAAWtK,EAAQvE,UAAU6O,SAKhD4xB,EAAY75B,EAAMqzB,MAAM,kBACxBuF,EAAQ54B,EAAMqzB,MAAM,aAExB,IAAIwG,EAAW,CAEX+E,EAASjhC,EAAQyhB,qBACjBpd,EAAG4e,aAAage,EAAQ2G,EAAW/7B,EAAKumB,UAExC/tB,EAAGwhC,UAAU5E,EAAO6G,QAASH,EAE7B,IAAII,GAAO/nC,EAAQ4Q,UAAUqrB,QAAQC,EAAUrQ,KAAmC,UAA7BxpB,EAAMsyB,OAAO,aAC9DqT,EAAOhoC,EAAQ4Q,UAAUqrB,QAAQC,EAAUpQ,GAAiC,UAA7BzpB,EAAMsyB,OAAO,YAChE30B,GAAQ4Q,UAAUpU,KAAK6H,EAEvB,IAAI4jC,GAAetuC,KAAKqS,IAAI,EAAGrS,KAAKqU,MAAMrU,KAAKsU,IAAIjO,EAAQvE,UAAU2pB,OAASzrB,KAAKuU,KAAOrC,EAAK9K,MAAMgL,GAAK,EAAID,EAC1Go8B,GAAUD,EAAeF,EAAKtoC,MAAQy8B,EAAUpG,WAAYiS,EAAKroC,OAAS,GAC1EyoC,EAASnoC,EAAQ4Q,UAAUnR,OAASy8B,EAAUpG,UAAYiS,EAAKtoC,MAAQ,IAAM3E,QAAQ6V,kBAAoB,EACzGy3B,GAAUH,EAAeD,EAAKvoC,MAAQy8B,EAAUnG,SAAUiS,EAAKtoC,OAAS,GACxE2oC,EAASroC,EAAQ4Q,UAAUnR,OAASy8B,EAAUnG,QAAUiS,EAAKvoC,MAAQ,IAAM3E,QAAQ6V,kBAAoB,CAE3GtM,GAAGqhC,WAAWzE,EAAOqH,iBAAkBJ,GACvC7jC,EAAGwhC,UAAU5E,EAAOsH,UAAWR,EAAK/vC,GACpCqM,EAAGqhC,WAAWzE,EAAOuH,iBAAkBJ,GACvC/jC,EAAGwhC,UAAU5E,EAAOwH,UAAWT,EAAKhwC,GAEpCqM,EAAGmhC,UAAUvE,EAAOyH,QAAS,GAC7BrkC,EAAGwhC,UAAU5E,EAAO0H,WAAYhvC,KAAKmU,IAAIq6B,EAAQE,IACjDhkC,EAAGwhC,UAAU5E,EAAO2H,MAAO1M,EAAU1lB,OAElC,IAAIykB,EAAO,CACd,GAAI4N,GAAY7oC,EAAQyQ,YAAY0qB,YAAYF,EAAMpP,MAAM,GACxDid,EAAY9oC,EAAQyQ,YAAY0qB,YAAYF,EAAMnP,IAAI,EAC1D,KAAK+c,IAAcC,EAAW,MAC9B,IAAIC,GAASl9B,EAAKsC,WAAatC,EAAKvB,SAAW3Q,KAAKqS,IAAI,EAAGhM,EAAQvE,UAAU8qB,SAAW1a,EAAK9K,MAAMgL,GAAKD,CAExG9L,GAAQyQ,YAAYjU,KAAK6H,GAAI,GAE7B48B,EAASjhC,EAAQwhB,kBACjBnd,EAAG4e,aAAage,EAAQ2G,EAAW/7B,EAAKumB,UAExC/tB,EAAGwhC,UAAU5E,EAAO6G,QAASH,GAE7BtjC,EAAGqhC,WAAWzE,EAAO+H,kBAAmBH,EAAUzoC,KAAK,GAAK2oC,EAAS9N,EAAMnF,UAAWgT,EAAU1oC,KAAK,KACrGiE,EAAGqhC,WAAWzE,EAAOgI,kBAAmBH,EAAU1oC,KAAK,GAAK2oC,EAAS9N,EAAMlF,QAAS+S,EAAU1oC,KAAK,KACnGiE,EAAGqhC,WAAWzE,EAAOiI,eAAgBL,EAAUxN,IAC/Ch3B,EAAGqhC,WAAWzE,EAAOkI,eAAgBN,EAAUvN,IAC/Cj3B,EAAGqhC,WAAWzE,EAAOmI,eAAgBN,EAAUzN,IAC/Ch3B,EAAGqhC,WAAWzE,EAAOoI,eAAgBP,EAAUxN,IAC/Cj3B,EAAGwhC,UAAU5E,EAAOqI,OAAQrO,EAAMzkB,GAElCnS,EAAGmf,yBAAyByd,EAAOoG,WACnChjC,EAAGwiC,eAAe5F,EAAOoG,UAAWhlC,EAAMqzB,MAAM,qBAGhDuL,GAASjhC,EAAQuhB,WACjBld,EAAG4e,aAAage,EAAQ2G,EAAW/7B,EAAKumB,UAExC/tB,EAAGwhC,UAAU5E,EAAO6G,QAASH,GAC7BtjC,EAAGwhC,UAAU5E,EAAO6E,QAAST,GAC7BhhC,EAAGklC,iBAAiBtI,EAAOuI,sBAAsB,EAAO3B,EAIrC79B,UAAnBi3B,EAAOxd,UACPpf,EAAGmf,yBAAyByd,EAAOxd,SACnCpf,EAAG0gB,gBAAgBkc,EAAOxd,QAASsQ,IAGvC1vB,EAAGmf,yBAAyByd,EAAOwI,aACnCplC,EAAG4+B,eAAehC,EAAOwI,YAAa/B,EAAQD,GAE9CpjC,EAAGmf,yBAAyByd,EAAOyI,QACnCrlC,EAAGwiC,eAAe5F,EAAOyI,OAAQnC,EAEjC,IAAI1F,GAASh2B,EAAK2mB,QAAQmX,UAC1B9H,GAAOrlC,KAAK6H,EACZ,IAAIulC,GAAU/9B,EAAK2mB,QAAQqX,WAC3BD,GAAQptC,KAAK6H,EAEb,KAAK,GAAIjF,GAAI,EAAGA,EAAIqzB,EAAc6R,OAAOjlC,OAAQD,IAAK,CAClD,GAAIkT,GAAQmgB,EAAc6R,OAAOllC,GAC7B0qC,EAAYx3B,EAAMy0B,iBAAmBlF,EAAO1f,QAChD9d,GAAGqf,oBAAoBud,EAAOtd,MAAO,EAAGtf,EAAGuf,OAAO,EAAO,EAAGkmB,EAAY,GACxEzlC,EAAGqf,oBAAoBud,EAAO8I,OAAQ,EAAG1lC,EAAG2lC,MAAM,EAAO,EAAGF,EAAY,EAExE,IAAIxD,GAA8B,EAAtBh0B,EAAM00B,cACdT,EAAgBj0B,EAAM20B,kBAAoB2C,EAAQznB,QACtD9d,GAAG6iC,aAAa7iC,EAAG8iC,UAAWb,EAAOjiC,EAAG+iC,eAAgBb;;AG5JhE,YAMA,SAASuF,YAAW9rC,EAASqC,EAAO+N,EAAWvE,GAC3C,GAAIxH,GAAKrE,EAAQqE,EAEjBA,GAAGumB,QAAQvmB,EAAG6c,aAEd,IAAI+f,GAASjhC,EAAQshB,YACrBjd,GAAG4e,aAAage,EAAQ7wB,GAGxB/L,EAAGwhC,UAAU5E,EAAO8K,iBAAkB1pC,EAAMqzB,MAAM,0BAClDrxB,EAAGwhC,UAAU5E,EAAO+K,kBAAmB3pC,EAAMqzB,MAAM,0BACnDrxB,EAAGwhC,UAAU5E,EAAOgL,oBAAqBC,iBAAiB7pC,EAAMqzB,MAAM,uBACtErxB,EAAGwhC,UAAU5E,EAAOkL,kBAAmBC,eAAe/pC,EAAMqzB,MAAM,qBAClErxB,EAAGgoC,WAAWpL,EAAOqL,eAAgBC,YAAYlqC,EAAMqzB,MAAM,sBAE7D,IAGI8W,GAAeC,EAHfC,EAAa7gC,EAAK5J,QAAU4J,EAAK5J,OAAOmI,SAASumB,iBAAiB9kB,EAAK9K,MAAO,MAC9E4rC,EAAYC,aAAa/gC,EAAM6gC,EAAYrqC,EAAOrC,EAAQvE,UAI9D4I,GAAGihC,cAAcjhC,EAAGkhC,UACpBlhC,EAAGgL,YAAYhL,EAAGiL,WAAYzD,EAAKuD,SAE/Bs9B,GACAroC,EAAGihC,cAAcjhC,EAAGwoC,UACpBxoC,EAAGgL,YAAYhL,EAAGiL,WAAYo9B,EAAWt9B,SAEzCo9B,EAAgB7yC,KAAKqS,IAAI,EAAG0gC,EAAW3rC,MAAMgL,EAAIF,EAAK9K,MAAMgL,GAC5D0gC,GAAY5gC,EAAK9K,MAAMhJ,EAAIy0C,EAAgB,EAAG3gC,EAAK9K,MAAM/I,EAAIw0C,EAAgB,IAE7EG,EAAU,GAAK,EAInBtoC,EAAGqhC,WAAWzE,EAAO6L,YAAaL,IAAa,EAAG,IAClDpoC,EAAGwhC,UAAU5E,EAAO8L,eAAgBP,GAAiB,GACrDnoC,EAAGwhC,UAAU5E,EAAO+L,eAAgB,GACpC3oC,EAAGwhC,UAAU5E,EAAOgM,WAAYN,EAAU,IAC1CtoC,EAAGwhC,UAAU5E,EAAOiM,WAAYP,EAAU,IAC1CtoC,EAAGmhC,UAAUvE,EAAOkM,SAAU,GAC9B9oC,EAAGmhC,UAAUvE,EAAOmM,SAAU,GAE9B/oC,EAAGuK,WAAWvK,EAAGwK,aAAchD,EAAK6C,cAAgB1O,EAAQwiB,kBAE5Dne,EAAGqf,oBAAoBud,EAAOtd,MAAe,EAAGtf,EAAGuf,OAAO,EAAO,EAAG,GACpEvf,EAAGqf,oBAAoBud,EAAOoM,cAAe,EAAGhpC,EAAGuf,OAAO,EAAO,EAAG,GACpEvf,EAAGwf,WAAWxf,EAAGyf,eAAgB,EAAG,GAEpCzf,EAAGrH,OAAOqH,EAAG6c,cAGjB,QAASqrB,aAAYryC,GACjBA,GAASP,KAAK+hB,GAAK,GACnB,IAAIwE,GAAIvmB,KAAKc,IAAIP,GACbgV,EAAIvV,KAAKa,IAAIN,EACjB,SACK,EAAIgV,EAAI,GAAK,IACZvV,KAAKC,KAAK,GAAKsmB,EAAIhR,EAAI,GAAK,GAC7BvV,KAAKC,KAAK,GAAKsmB,EAAIhR,EAAI,GAAK,GAIrC,QAASk9B,gBAAekB,GACpB,MAAOA,GAAW,EACd,GAAK,EAAIA,GACT,EAAIA,EAGZ,QAASpB,kBAAiBqB,GACtB,MAAOA,GAAa,EAChB,EAAI,GAAK,MAAQA,IAChBA,EAGT,QAASX,cAAa/gC,EAAM6gC,EAAYrqC,EAAO5G,GAC3C,IAAKoQ,EAAK5J,OAAQ,OAAQ,EAAG,EAE7B,IAAImR,IAAM,GAAID,OAAOiN,UAEjByQ,EAAexuB,EAAMqzB,MAAM,wBAC3B8X,GAAap6B,EAAMvH,EAAKolB,WAAaJ,EACrC4c,EAAcf,GAAct5B,EAAMs5B,EAAWzb,WAAaJ,EAAe,GAEzE6c,EAAS7hC,EAAK5J,OAAOmI,SAAS4lB,kBAAkBv0B,GAChDkyC,EAAgBjB,EAAa/yC,KAAK8yB,IAAIigB,EAAW3rC,MAAMgL,EAAI2hC,GAAU/zC,KAAK8yB,IAAI5gB,EAAK9K,MAAMgL,EAAI2hC,IAAU,EAEvGxZ,MACCwY,GAAciB,GAEfzZ,EAAQ,GAAK/8B,KAAKggB,MAAMq2B,EAAW,EAAG,GACtCtZ,EAAQ,GAAK,EAAIA,EAAQ,KAGzBA,EAAQ,GAAK/8B,KAAKggB,MAAM,EAAIs2B,EAAa,EAAG,GAC5CvZ,EAAQ,GAAK,EAAIA,EAAQ,GAG7B,IAAI0Z,GAAKvrC,EAAMqzB,MAAM,iBAIrB,OAHAxB,GAAQ,IAAM0Z,EACd1Z,EAAQ,IAAM0Z,EAEP1Z,EAzGX,GAAI/8B,MAAOZ,QAAQ,eAEnBH,QAAOC,QAAUy1C;;AJJjB,YASA,SAAS1H,aAAYpkC,EAASqC,EAAO+N,EAAWvE,GAE5C,GAAKA,EAAK2mB,QAAV,CACA,GAAIC,GAAgB5mB,EAAK4mB,cAAcpwB,EAAMkR,KAAOlR,EAAML,GAC1D,IAAKywB,EAAL,CAEA,GAAI4R,KAAoBhiC,EAAMsyB,OAAO,uBAAyBtyB,EAAMsyB,OAAO,uBACvEtyB,EAAMsyB,OAAO,0BAA4BtyB,EAAMsyB,OAAO,0BAEtDtwB,EAAKrE,EAAQqE,EAEbggC,IAMAhgC,EAAGumB,QAAQvmB,EAAG6c,cAGduR,EAAc3qB,KAAKw8B,OAAOjlC,QAC1BklC,WAAWvkC,EAASqC,EAAO+N,EAAWvE,EAAM4mB,EAAc3qB,KAAM,QAAQ,GAExE2qB,EAAc+R,KAAKF,OAAOjlC,QAC1BklC,WAAWvkC,EAASqC,EAAO+N,EAAWvE,EAAM4mB,EAAc+R,KAAM,OAAQ/R,EAAcgS,UAG1FC,mBAAmB1kC,EAASqC,EAAO+N,EAAWvE,GAE1Cw4B,GACAhgC,EAAGrH,OAAOqH,EAAG6c,gBASrB,QAASqjB,YAAWvkC,EAASqC,EAAO+N,EAAWvE,EAAM4mB,EAAekS,EAAQnO,GACxE,GAAInyB,GAAKrE,EAAQqE,EAEjB+L,GAAYpQ,EAAQglB,gBAAgB5U,EAAWvE,EAAMxJ,EAAMqzB,MAAMiP,EAAS,cAAetiC,EAAMqzB,MAAMiP,EAAS,qBAE9G,IAGIvS,GAAUlS,EAAG0kB,EAHbhZ,EAAK5rB,EAAQvE,UACbopC,EAAkE,QAAjDxiC,EAAMsyB,OAAOgQ,EAAS,uBACvCG,EAASD,CAGTC,IACA1S,EAAWzR,KAAK5c,SAChBmc,EAAIrU,EAAKsC,WAAatC,EAAKvB,SAAW3Q,KAAKqS,IAAI,EAAGhM,EAAQvE,UAAUwC,KAAO4N,EAAK9K,MAAMgL,GACtF64B,EAAa,EAAIjrC,KAAKa,IAAIoxB,EAAG7F,UAE7BqM,EAAWzR,KAAKxoB,MAAM0T,EAAKumB,UAC3BlS,EAAIlgB,EAAQvE,UAAU2qB,SACtBwe,EAAa,GAEjBjkB,KAAKyE,MAAMgN,EAAUA,GAAWlS,EAAGA,EAAG,GAGtC,IAAI6kB,GAAW1iC,EAAMqzB,MAAMiP,EAAS,SAChCK,EAAYD,EAAWE,aAAaN,EACxChkB,MAAKyE,MAAMgN,EAAUA,GAAY4S,EAAWA,EAAW,GAIvD,IAKI/D,GAAQY,EAAQqD,EAAUC,EAL1BC,EAAgBzrC,KAAKC,KAAKgyB,EAAGlsB,OAASksB,EAAGlsB,OAAS,GAAM,EAAIksB,EAAGxF,SAAWwF,EAAGxF,WAC7EruB,EAAI6zB,EAAGlsB,OAAS,EAAI/F,KAAKotB,IAAI6E,EAAG7F,QAChCsf,GAASD,EAAgBrtC,GAAKqtC,EAAgB,EAE9Ct9B,EAAkB,SAAX68B,CAGX,IAAK78B,GAAS9H,EAAQrC,MAAM2T,OAAOvM,SAAnC,CAGAV,EAAGihC,cAAcjhC,EAAGkhC,UAGhBtE,EADAzK,EACSx2B,EAAQ2hB,UAER3hB,EAAQ4hB,WAGjB9Z,GACA9H,EAAQqM,WAAWksB,cAAcl0B,GACjCw9B,EAASh2B,EAAK2mB,QAAQI,YACtBsS,EAAWr5B,EAAK2mB,QAAQM,aACxBqS,GAAWnlC,EAAQqM,WAAW5M,MAAQ,EAAGO,EAAQqM,WAAW3M,OAAS,KAErEM,EAAQyQ,YAAYjU,KAAK6H,EAAIwgC,GAAkB7kC,EAAQ1E,QAAQoK,UAC3D1F,EAAQ1E,QAAQqK,SAAyB,IAAdq/B,GAAmBxO,GAAOx2B,EAAQvE,UAAU0C,OAC3E0jC,EAASh2B,EAAK2mB,QAAQO,WACtBmS,EAAWr5B,EAAK2mB,QAAQQ,YACxBmS,GAAWnlC,EAAQyQ,YAAYhR,MAAQ,EAAGO,EAAQyQ,YAAY/Q,OAAS,IAG3E2E,EAAG4e,aAAage,EAAQ7wB,EAAWgiB,GACnC/tB,EAAGmhC,UAAUvE,EAAOwE,UAAW,GAC/BphC,EAAGqhC,WAAWzE,EAAO0E,UAAWR,GAChC9gC,EAAGmhC,UAAUvE,EAAO2E,SAAUd,GAC9BzgC,EAAGwhC,UAAU5E,EAAO6E,QAAST,EAG7B,IAAIU,GAAapsC,KAAKsU,IAAI82B,EAAW1iC,EAAMsyB,OAAOgQ,EAAS,cAAgBhrC,KAAKuU,KAAO,CAEvF7J,GAAGwhC,UAAU5E,EAAO+E,OAAgD,IAAvChmC,EAAQvE,UAAUwC,KAAO8nC,GAEtD,IAAIE,GAAIjmC,EAAQwgB,aAAa6iB,kBAAkB,IAC/Ch/B,GAAGwhC,UAAU5E,EAAOiF,WAAyB,GAAbD,EAAEjC,UAClC3/B,EAAGwhC,UAAU5E,EAAOkF,cAAexsC,KAAKqU,MAAsB,GAAhBi4B,EAAE/B,cAChD7/B,EAAGwhC,UAAU5E,EAAOmF,cAAezsC,KAAKqU,MAAsB,GAAhBi4B,EAAE9B,cAChD9/B,EAAGwhC,UAAU5E,EAAOoF,WAAgD,IAAnCrmC,EAAQvE,UAAUwC,KAAOgoC,EAAEhC,MAE5D,IAAI3xB,GAAO8U,EAAQkf,EAAOC,CAI1B,IAFArB,EAAS1oC,KAAK6H,GAEVmyB,EAAK,CACL,GAAIgQ,GAAQ,EACRC,EAAa,KACbC,EAAa,EACbC,EAAQ,KAAQ1B,aAAaN,GAAUI,EAAWjqC,QAAQ6V,gBAE9DtM,GAAGmf,yBAAyByd,EAAO2F,SACnCviC,EAAGwiC,eAAe5F,EAAO2F,QAASD,EAAQ/B,GAE1CvgC,EAAGmf,yBAAyByd,EAAOxd,SACnCpf,EAAG0gB,gBAAgBkc,EAAOxd,QAASphB,EAAMqzB,MAAMiP,EAAS,WAExDtgC,EAAGmf,yBAAyByd,EAAO6F,UACnCziC,EAAGwiC,eAAe5F,EAAO6F,SAAU,IAEnC,KAAK,GAAI1nC,GAAI,EAAGA,EAAIqzB,EAAc6R,OAAOjlC,OAAQD,IAC7CkT,EAAQmgB,EAAc6R,OAAOllC,GAC7BgoB,EAAS9U,EAAMy0B,iBAAmBlF,EAAO1f,SACzC0f,EAAOrlC,KAAK6H,EAAI48B,EAAQ7Z,GAExBkf,EAA8B,EAAtBh0B,EAAM00B,cACdT,EAAgBj0B,EAAM20B,kBAAoB/B,EAAS/iB,SACnD9d,EAAG6iC,aAAa7iC,EAAG8iC,UAAWb,EAAOjiC,EAAG+iC,eAAgBb,EAG5D,IAAIlkC,EAAMqzB,MAAMiP,EAAS,eAAgB,CAGrCtgC,EAAG0gB,gBAAgBkc,EAAOxd,QAASphB,EAAMqzB,MAAMiP,EAAS,gBACxDtgC,EAAGwiC,eAAe5F,EAAO6F,UAAWJ,EAAarkC,EAAMqzB,MAAMiP,EAAS,eAAiBK,GAAawB,GACpGniC,EAAGwiC,eAAe5F,EAAO2F,SAAUvkC,EAAMqzB,MAAMiP,EAAS,cAAgB8B,EAAazB,EAAYwB,EAAQG,GAAS/B,EAElH,KAAK,GAAI5L,GAAI,EAAGA,EAAIvG,EAAc6R,OAAOjlC,OAAQ25B,IAC7C1mB,EAAQmgB,EAAc6R,OAAOtL,GAC7B5R,EAAS9U,EAAMy0B,iBAAmBlF,EAAO1f,SACzC0f,EAAOrlC,KAAK6H,EAAI48B,EAAQ7Z,GAExBkf,EAA8B,EAAtBh0B,EAAM00B,cACdT,EAAgBj0B,EAAM20B,kBAAoB/B,EAAS/iB,SACnD9d,EAAG6iC,aAAa7iC,EAAG8iC,UAAWb,EAAOjiC,EAAG+iC,eAAgBb,QAG7D,CACHliC,EAAGmf,yBAAyByd,EAAOoG,WACnChjC,EAAGwiC,eAAe5F,EAAOoG,UAAWhlC,EAAMqzB,MAAM,gBAEhD,KAAK,GAAIh9B,GAAI,EAAGA,EAAI+5B,EAAc6R,OAAOjlC,OAAQ3G,IAC7C4Z,EAAQmgB,EAAc6R,OAAO5rC,GAC7B0uB,EAAS9U,EAAMy0B,iBAAmBlF,EAAO1f,SACzC0f,EAAOrlC,KAAK6H,EAAI48B,EAAQ7Z,GAExBkf,EAA8B,EAAtBh0B,EAAM00B,cACdT,EAAgBj0B,EAAM20B,kBAAoB/B,EAAS/iB,SACnD9d,EAAG6iC,aAAa7iC,EAAG8iC,UAAWb,EAAOjiC,EAAG+iC,eAAgBb,KAnLpE,GAAIzrC,SAAUvE,QAAQ,mBAClBoqB,KAAOpqB,QAAQ,aAAaoqB,KAE5B+jB,mBAAqBnuC,QAAQ,yBAEjCH,QAAOC,QAAU+tC,WAoCjB,IAAIa,eACAT,KAAM,EACN18B,KAAM;;AM7CV,YAOA,SAASsmC,cAAapuC,EAASqC,EAAO+N,EAAWvE,GAsB7C,QAASwiC,GAAWxM,EAAQyC,EAAQ3f,EAAQ2pB,GACxCjqC,EAAG4e,aAAajjB,EAAQ0hB,UAAWiD,GAEnCtgB,EAAGwhC,UAAU7lC,EAAQ0hB,UAAU6sB,OAAQ,EAAIzzC,QAAQ6V,kBACnDtM,EAAGwhC,UAAU7lC,EAAQ0hB,UAAU8sB,OAAQ,KACvCnqC,EAAGoqC,WAAWzuC,EAAQ0hB,UAAUqsB,SAAU,GAAK,EAAG,EAAG,KAErDlM,EAAOrlC,KAAK6H,EAAIrE,EAAQ0hB,UAAW,EACnC,KAAK,GAAItiB,GAAI,EAAGA,EAAIklC,EAAOjlC,OAAQD,IAAK,CACpC,GAAIkT,GAAQgyB,EAAOllC,GACfsvC,EAAQp8B,EAAMy0B,iBACdT,EAAQh0B,EAAMq8B,YAClBtqC,GAAGqf,oBAAoB1jB,EAAQ0hB,UAAUiC,MAAO,EAAGtf,EAAGuf,OAAO,EAAO0qB,EAAQ,GAC5EjqC,EAAGwf,WAAWxf,EAAGuqC,OAAQF,EAAOpI,IAlCxC,GAAIjiC,GAAKrE,EAAQqE,EAEjB,IAAKwH,GAASA,EAAK2mB,QAAnB,CACA,GAAIC,GAAgB5mB,EAAK4mB,cAAcpwB,EAAMkR,KAAOlR,EAAML,GAC1D,IAAKywB,EAAL,CAMA,GAHApuB,EAAG0c,UAAU1c,EAAG4c,IAAK5c,EAAGygB,qBAGL,SAAfziB,EAAM8D,KACNkoC,EAAWxiC,EAAK2mB,QAAQiY,WAAYhY,EAAc6R,OAAQl0B,EAAW,OAClE,IAAmB,WAAf/N,EAAM8D,KACbkoC,EAAWxiC,EAAK2mB,QAAQO,WAAYN,EAAc+R,KAAKF,OAAQl0B,EAAW,IAC1Ei+B,EAAWxiC,EAAK2mB,QAAQI,YAAaH,EAAc3qB,KAAKw8B,OAAQl0B,EAAW,QACxE,IAAmB,SAAf/N,EAAM8D,KAAiB,CAC9B,GAAI0oC,GAAeluB,KAAKxoB,MAAMiY,EAC9BuQ,MAAKyE,MAAMypB,EAAcA,GAAe,GAAK,GAAK,IAClDR,EAAWxiC,EAAK2mB,QAAQmX,WAAYlX,EAAc6R,OAAQuK,EAAc,GAqB5ExqC,EAAG0c,UAAU1c,EAAG2c,oBAAqB3c,EAAG4c,OA7C5C,GAAInmB,SAAUvE,QAAQ,mBAClBoqB,KAAOpqB,QAAQ,aAAaoqB,IAEhCvqB,QAAOC,QAAU+3C;;APLjB,YAIA,SAAS3tB,gBACLxoB,KAAKuoB,gBAHTpqB,OAAOC,QAAUoqB,aAMjBA,aAAavoB,UAAUmrC,kBAAoB,SAAS3X,GAC/B1hB,SAAb0hB,IAAwBA,EAAW,IAIvC,KAHA,GAAI4X,IAAc,GAAKnwB,OAAQiN,UAGxBnoB,KAAKuoB,aAAanhB,OAAS,GAAKpH,KAAKuoB,aAAa,GAAG/H,KAAOiT,EAAW4X,GAC1ErrC,KAAKuoB,aAAa+iB,OAGlBtrC,MAAKuoB,aAAa,GAAG/H,KAAOiT,EAAW4X,IACvCrrC,KAAKuoB,aAAa,GAAGzU,EAAI9T,KAAKuoB,aAAa,GAAGzU,EAGlD,IAAIy3B,GAAWvrC,KAAKuoB,aAAanhB,MAClB,GAAXmkC,GAAcj/B,QAAQu0B,KAAK,8DAG/B,IAAI2K,GAAYxrC,KAAKuoB,aAAa,GAAGzU,EACjC23B,EAAYzrC,KAAKuoB,aAAagjB,EAAW,GACzCG,EAAUD,EAAU33B,EACpB63B,EAAOjqC,KAAKgU,IAAI81B,EAAWE,GAC3BE,EAAQlqC,KAAKmU,IAAI21B,EAAWE,GAG5BG,EAAWJ,EAAU33B,EAAI9T,KAAKuoB,aAAa,GAAGzU,EAC9Cg4B,EAAWL,EAAUjrB,KAAOxgB,KAAKuoB,aAAa,GAAG/H,KACjDurB,EAAWF,GAAYC,EAAWrY,EAElC/W,OAAMqvB,IAAWz/B,QAAQu0B,KAAK,+BAIlC,IAAImL,IAAQX,EAAcI,EAAUjrB,MAAQiT,EAAWsY,CAEvD,QACIA,SAAUA,EACVE,YAAaN,EACbO,YAAaN,EACbI,KAAMA,IAKdxjB,aAAavoB,UAAUusB,OAAS,SAASxmB,GACrC,GAAIqlC,IAAc,GAAKnwB,OAAQiN,SAG1BnoB,MAAKuoB,aAAanhB,QACnBpH,KAAKuoB,aAAavX,MAAMwP,KAAM,EAAG1M,EAAG9N,IAASwa,KAAM,EAAG1M,EAAG9N,KAG5B,IAA7BhG,KAAKuoB,aAAanhB,QAAgBpH,KAAKuoB,aAAavoB,KAAKuoB,aAAanhB,OAAS,GAAG0M,IAAM9N,IACxFhG,KAAKuoB,aAAavX,MACdwP,KAAM6qB,EACNv3B,EAAG9N;;AD9Df,YAEA,IAAIwiC,SAAUlqC,QAAQ,aAClBY,KAAOZ,QAAQ,eAEnBF,SAAQ0H,OAAS,SAAS2a,GACtB,GAAIgoB,GAAgBhoB,EAAQyD,UACxBwkB,EAAiBjoB,EAAQkoB,aAAaloB,EAAQmoB,yBAkHlD,OAhHAnoB,GAAQyD,UAAY,SAAS1c,GACzBihC,EAAcvqB,KAAKuC,EAASvhB,KAAKggB,MAAM1X,EAAOkhC,EAAe,GAAIA,EAAe,MAGpFjoB,EAAQooB,UAAY,SAAS99B,EAAMmD,GAC/B,GAAI46B,GAAO56B,IAASlO,KAAK+oC,gBAAkB,WAAa,QACxD,KAAKP,QAAQz9B,KAAUy9B,QAAQz9B,GAAM+9B,GACjC,KAAM,IAAI3vB,OAAM,yBAA2BpO,EAG/C,IAAIi+B,GAAShpC,KAAKipC,aAAa/6B,GAC3Bg7B,EAAeV,QAAQz9B,GAAM+9B,EASjC,IAP2B,mBAAhBK,eAEPD,EAAeA,EAAatX,QAAQ,WAAY,MAGpD5xB,KAAKkpC,aAAaF,EAAQE,GAC1BlpC,KAAKopC,cAAcJ,IACdhpC,KAAKqpC,mBAAmBL,EAAQhpC,KAAKspC,gBACtC,KAAM,IAAInwB,OAAMnZ,KAAKupC,iBAAiBP,GAE1C,OAAOA,IAGXvoB,EAAQ0I,iBAAmB,SAASpe,EAAM06B,EAAY+D,GAClD,GAAIR,IACAS,QAASzpC,KAAK0pC,gBACdC,SAAU3pC,KAAK6oC,UAAU99B,EAAM/K,KAAK+oC,iBACpCa,OAAQ5pC,KAAK6oC,UAAU99B,EAAM/K,KAAK6pC,eAClCpE,cAgBJ,IAdAzlC,KAAK8pC,aAAad,EAAOS,QAAST,EAAOY,QACzC5pC,KAAK8pC,aAAad,EAAOS,QAAST,EAAOW,UASzC3pC,KAAK+pC,mBAAmBf,EAAOS,QAAS,EAAG,SAE3CzpC,KAAKgqC,YAAYhB,EAAOS,SAEnBzpC,KAAKiqC,oBAAoBjB,EAAOS,QAASzpC,KAAKkqC,aAE5C,CACH,IAAK,GAAI/iC,GAAI,EAAGA,EAAIs+B,EAAWr+B,OAAQD,IACnC6hC,EAAOvD,EAAWt+B,IAAMnH,KAAKmqC,kBAAkBnB,EAAOS,QAAShE,EAAWt+B,IAC1E6hC,EAAOvD,WAAWz0B,KAAKg4B,EAAOvD,EAAWt+B,IAE7C,KAAK,GAAI1G,GAAI,EAAGA,EAAI+oC,EAASpiC,OAAQ3G,IACjCuoC,EAAOQ,EAAS/oC,IAAMT,KAAKoqC,mBAAmBpB,EAAOS,QAASD,EAAS/oC,QAP3E6L,SAAQC,MAAMvM,KAAKqqC,kBAAkBrB,EAAOS,SAWhD,OAAOT,IAIXvoB,EAAQuK,aAAe,SAASge,EAAQ7wB,EAAWgiB,GAK/C,GAJKhiB,GACD7L,QAAQg+B,MAAM,6CAGdtqC,KAAKuqC,gBAAkBvB,EAAQ,CAC/BhpC,KAAKwqC,WAAWxB,EAAOS,QAOvB,KAAK,GADDgB,GAAWzqC,KAAKuqC,cAAgBvqC,KAAKuqC,cAAc9E,cAC9Ct+B,EAAI,EAAGA,EAAIsjC,EAASrjC,OAAQD,IACjCnH,KAAKurB,yBAAyBkf,EAAStjC,GAG3C,KAAK,GADDujC,GAAO1B,EAAOvD,WACT1E,EAAI,EAAGA,EAAI2J,EAAKtjC,OAAQ25B,IAC7B/gC,KAAK8rB,wBAAwB4e,EAAK3J,GAGtC/gC,MAAKuqC,cAAgBvB,EAMrBA,EAAO7wB,YAAcA,IACrBnY,KAAK2qC,iBAAiB3B,EAAO4B,UAAU,EAAOzyB,GAC9C6wB,EAAO7wB,UAAYA,GAEnBgiB,GAAY6O,EAAO7O,WAAaA,GAAY6O,EAAO6B,aACnD7qC,KAAK2qC,iBAAiB3B,EAAO6B,YAAY,EAAO1Q,GAChD6O,EAAO7O,SAAWA,IAI1B1Z,EAAQqqB,gBAAkB,SAASC,EAAW/N,GAC1Cvc,EAAQuqB,eAAeD,EAAW/N,EAAO,GAAIA,EAAO,KAGxDvc,EAAQwqB,gBAAkB,SAASF,EAAW/N,GAC1Cvc,EAAQyqB,eAAeH,EAAW/N,EAAO,GAAIA,EAAO,GAAIA,EAAO,KAGnEvc,EAAQqM,gBAAkB,SAASie,EAAW/N,GAC1Cvc,EAAQ0qB,eAAeJ,EAAW/N,EAAO,GAAIA,EAAO,GAAIA,EAAO,GAAIA,EAAO,KAGvEvc;;APzHX,YAaA,SAAS7H,WAAUpR,EAAOC,GACtBzH,KAAKwH,MAAQA,EACbxH,KAAKyH,OAASA,EACdzH,KAAK6jC,QAAU,EAEf7jC,KAAK8jC,MAAQ,EACb9jC,KAAK8R,KAAO,GAAImsB,YAAWj+B,KAAKwH,MAAQxH,KAAKyH,OAASzH,KAAK8jC,OAE3D9jC,KAAK+jC,aAnBT5lC,OAAOC,QAAUwa,UAsBjBA,UAAU3Y,UAAUgc,UAAY,SAAS5C,GACrCrZ,KAAKqZ,OAASA,GAWlBT,UAAU3Y,UAAU+jC,QAAU,SAASC,EAAW1iC,GAC9C,GAAIoQ,GAAMsyB,EAAUhzB,KAAK,KAAO1P,CAKhC,OAHKvB,MAAK+jC,UAAUpyB,KAChB3R,KAAK+jC,UAAUpyB,GAAO3R,KAAKkkC,QAAQD,EAAW1iC,IAE3CvB,KAAK+jC,UAAUpyB,IAG1BiH,UAAU3Y,UAAUikC,QAAU,SAASD,EAAW1iC,GAE9C,GAAI4d,GAAI5d,EAAQ,EAAI,EAChBkG,EAAS,EAAI0X,EAAI,EACjBgQ,EAAS,GAEb,IAAInvB,KAAK6jC,QAAUp8B,EAASzH,KAAKyH,OAE7B,MADA6E,SAAQu0B,KAAK,0BACN,IAIX,KAAK,GADDz5B,GAAS,EACJD,EAAI,EAAGA,EAAI88B,EAAU78B,OAAQD,IAClCC,GAAU68B,EAAU98B,EAUxB,KAAK,GAPDg9B,GAAUnkC,KAAKwH,MAAQJ,EACvBg9B,EAAYD,EAAU,EAItBE,EAAYJ,EAAU78B,OAAS,IAAM,EAEhCrH,GAAKof,EAAQA,GAALpf,EAAQA,IAQrB,IAAK,GAPD6V,GAAM5V,KAAK6jC,QAAU1kB,EAAIpf,EACzB+/B,EAAQ9/B,KAAKwH,MAAQoO,EAErBnE,EAAO4yB,GAAaJ,EAAUA,EAAU78B,OAAS,GAAK,EACtDsK,EAAQuyB,EAAU,GAClBK,EAAY,EAEPxkC,EAAI,EAAGA,EAAIE,KAAKwH,MAAO1H,IAAK,CAEjC,KAAeA,EAAIqkC,EAAZzyB,GACHD,EAAOC,EACPA,GAAgBuyB,EAAUK,GAEtBD,GAAaC,IAAcL,EAAU78B,OAAS,IAC9CsK,GAASuyB,EAAU,IAGvBK,GAGJ,IAIIC,GAJAC,EAAW9iC,KAAK8yB,IAAI10B,EAAI2R,EAAO0yB,GAC/BM,EAAY/iC,KAAK8yB,IAAI10B,EAAI4R,EAAQyyB,GACjCtiC,EAAOH,KAAKgU,IAAI8uB,EAAUC,GAC1BC,EAAUJ,EAAY,IAAO,CAGjC,IAAI/iC,EAAO,CAEP,GAAIojC,GAAaxlB,EAAIpf,EAAIof,GAAKilB,EAAY,GAAK,CAC/C,IAAIM,EAAQ,CACR,GAAIE,GAAWR,EAAY1iC,KAAK8yB,IAAImQ,EACpCJ,GAAiB7iC,KAAKC,KAAKE,EAAOA,EAAO+iC,EAAWA,OAEpDL,GAAiBH,EAAY1iC,KAAKC,KAAKE,EAAOA,EAAO8iC,EAAaA,OAGtEJ,IAAkBG,EAAS,EAAI,IAAM7iC,CAGzC7B,MAAK8R,KAAK,EAAkB,GAAbguB,EAAQhgC,IAAU4B,KAAKmU,IAAI,EAAGnU,KAAKgU,IAAI,IAAK6uB,EAAiBpV,IAIpF,GAAIhjB,IACApM,GAAIC,KAAK6jC,QAAU1kB,EAAI,IAAOnf,KAAKyH,OACnCA,OAAQ,EAAI0X,EAAInf,KAAKyH,OACrBD,MAAOJ,EAMX,OAHApH,MAAK6jC,SAAWp8B,EAChBzH,KAAKogC,OAAQ,EAENj0B,GAGXyM,UAAU3Y,UAAUsE,KAAO,SAAS6H,GAC3BpM,KAAKmX,SAUN/K,EAAGgL,YAAYhL,EAAGiL,WAAYrX,KAAKmX,SAE/BnX,KAAKogC,QACLpgC,KAAKogC,OAAQ,EACbh0B,EAAGkL,cAAclL,EAAGiL,WAAY,EAAG,EAAG,EAAGrX,KAAKwH,MAAOxH,KAAKyH,OAAQ2E,EAAGmL,KAAMnL,EAAGoL,cAAexX,KAAK8R,SAbtG9R,KAAKmX,QAAU/K,EAAGqL,gBAClBrL,EAAGgL,YAAYhL,EAAGiL,WAAYrX,KAAKmX,SACnC/K,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAGuL,eAAgBvL,EAAGy4B,QACtDz4B,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAGyL,eAAgBzL,EAAGy4B,QACtDz4B,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAG0L,mBAAoB1L,EAAG2L,QAC1D3L,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAG4L,mBAAoB5L,EAAG2L,QAC1D3L,EAAG6L,WAAW7L,EAAGiL,WAAY,EAAGjL,EAAGmL,KAAMvX,KAAKwH,MAAOxH,KAAKyH,OAAQ,EAAG2E,EAAGmL,KAAMnL,EAAGoL,cAAexX,KAAK8R,QAY7G8G,UAAU3Y,UAAUsN,MAAQ,WAExB,GAAIqa,GAASlc,SAAS4E,cAAc,SAEpC5E,UAASq0B,KAAKtvB,YAAYmX,GAC1BA,EAAOliB,MAAM8b,SAAW,WACxBoG,EAAOliB,MAAMyL,IAAM,EACnByW,EAAOliB,MAAM+L,KAAO,EACpBmW,EAAOliB,MAAM6mB,WAAa,OAE1B3E,EAAOpgB,MAAQxH,KAAKwH,MACpBogB,EAAOngB,OAASzH,KAAKyH,MAIrB,KAAK,GAFDic,GAAMkE,EAAOlF,WAAW,MACxB5Q,EAAO4R,EAAIoE,aAAa,EAAG,EAAG9nB,KAAKwH,MAAOxH,KAAKyH,QAC1CN,EAAI,EAAGA,EAAInH,KAAK8R,KAAK1K,OAAQD,IAClC,GAAInH,KAAKu+B,IAAK,CACV,GAAI99B,GAAQ,EAAJ0G,CACR2K,GAAKA,KAAKrR,GAAKqR,EAAKA,KAAKrR,EAAI,GAAKqR,EAAKA,KAAKrR,EAAI,GAAK,EACrDqR,EAAKA,KAAKrR,EAAI,GAAKT,KAAK8R,KAAK3K,OAE7B2K,GAAKA,KAAK3K,GAAKnH,KAAK8R,KAAK3K,EAGjCuc,GAAIsd,aAAalvB,EAAM,EAAG;;AfxK9B,YAaA,SAAS9O,SAAQoJ,EAAI5I,GACjBxD,KAAKoM,GAAKgc,OAAOtiB,OAAOsG,GACxBpM,KAAKwD,UAAYA,EAEjBxD,KAAKqoB,oBACLroB,KAAKsoB,WAELtoB,KAAKuoB,aAAe,GAAIC,cAExBxoB,KAAKyoB,QApBT,GAAIL,QAAS9pB,QAAQ,aACjBuE,QAAUvE,QAAQ,mBAClBoqB,KAAOpqB,QAAQ,aAAaoqB,KAC5BF,aAAelqB,QAAQ,kBAO3BH,QAAOC,QAAU4E,QAiBjBA,QAAQ/C,UAAU2E,OAAS,SAAS4C,EAAOC,GACvC,GAAI2E,GAAKpM,KAAKoM,EAEdpM,MAAKwH,MAAQA,EAAQ3E,QAAQ6V,iBAC7B1Y,KAAKyH,OAASA,EAAS5E,QAAQ6V,iBAC/BtM,EAAGuc,SAAS,EAAG,EAAG3oB,KAAKwH,MAAOxH,KAAKyH,SAKvCzE,QAAQ/C,UAAUwoB,MAAQ,WACtB,GAAIrc,GAAKpM,KAAKoM,EAEdA,GAAGwc,SAAU,EAIbxc,EAAGrH,OAAOqH,EAAGyc,OACbzc,EAAG0c,UAAU1c,EAAG2c,oBAAqB3c,EAAG4c,KAExC5c,EAAGrH,OAAOqH,EAAG6c,cAGbjpB,KAAKkpB,YAAc9c,EAAG+c,iBAAiB,SAClC,UACA,WAAY,cAAe,YAEhCnpB,KAAKopB,eAAiBhd,EAAG+c,iBAAiB,YACrC,UACA,WAAY,UAAW,aAE5BnpB,KAAKqpB,aAAejd,EAAG+c,iBAAiB,UACnC,QAAS,kBACT,WAAY,mBAAoB,oBAAqB,sBAAuB,iBAAkB,oBAAqB,aAAc,aAAc,WAAY,WAAY,cAAe,iBAAkB,mBAE7MnpB,KAAKspB,WAAald,EAAG+c,iBAAiB,QACjC,QAAS,SAAU,UAAW,cAAe,WAC7C,WAAY,UAAW,UAAW,yBAEvCnpB,KAAKupB,kBAAoBnd,EAAG+c,iBAAiB,eACxC,QAAS,SAAU,cAAe,SAAU,cAC5C,WAAY,aAAc,UAAW,mBAAoB,mBAAoB,iBAAkB,iBAAkB,iBAAkB,iBAAkB,WAE1JnpB,KAAKwpB,qBAAuBpd,EAAG+c,iBAAiB,kBAC3C,QAAS,SAAU,UAAW,cAAe,WAC7C,WAAY,aAAc,UAAW,mBAAoB,YAAa,mBAAoB,YAAa,UAAW,aAAc,UAErInpB,KAAKypB,UAAYrd,EAAG+c,iBAAiB,OAChC,UACA,WAAY,SAAU,UAAW,WAEtCnpB,KAAK0pB,UAAYtd,EAAG+c,iBAAiB,OAChC,QAAS,WAAY,UAAW,UAAW,UAAW,WAAY,YAClE,WAAY,aAAc,YAAa,YAAa,SAAU,aAAc,gBAAiB,gBAAiB,aAAc,WAAY,YAE7InpB,KAAK2pB,WAAavd,EAAG+c,iBAAiB,QACjC,QAAS,WAAY,UAAW,UAAW,cAC3C,WAAY,aAAc,YAAa,YAAa,SAAU,aAAc,gBAAiB,gBAAiB,aAAc,WAAY,YAE7InpB,KAAK4pB,cAAgBxd,EAAG+c,iBAAiB,WACpC,QAAS,YACT,WAAY,YAGjBnpB,KAAK6pB,cAAgBzd,EAAG+c,iBAAiB,WACpC,UACA,WAAY,iBAAkB,iBAAkB,iBAAkB,iBAAkB,QAAS,oBAAqB,oBAAqB,YAAa,YAGzJnpB,KAAK8pB,WAAa1d,EAAG+c,iBAAiB,QACjC,QAAS,YACT,aAGLnpB,KAAK+pB,mBAAqB3d,EAAG+c,iBAAiB,gBACzC,QAAS,YAAa,WACtB,WAAY,UAAW,SAAU,cAGtCnpB,KAAKgqB,eAAiBtB,KAAK5c,SAG3B9L,KAAKiqB,iBAAmB7d,EAAGsK,eAC3B1W,KAAKiqB,iBAAiBC,SAAW,EACjClqB,KAAKiqB,iBAAiBE,UAAY,EAClC/d,EAAGuK,WAAWvK,EAAGwK,aAAc5W,KAAKiqB,kBACpC7d,EAAGyK,WAAWzK,EAAGwK,aAAc,GAAIL,aAAY,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,IAAKnK,EAAG0K,aAEhF9W,KAAKoqB,UAAU,MAGfpqB,KAAKqqB,gBAAkBje,EAAGsK,eAC1B1W,KAAKqqB,gBAAgBH,SAAW,GAYpClnB,QAAQ/C,UAAUmqB,UAAY,SAASE,GACnC,GAAKA,GAAaA,IAActqB,KAAKkW,WAArC,CAEAlW,KAAKkW,WAAaoU,CAElB,IAAIle,GAAKpM,KAAKoM,EAGdpM,MAAKuqB,iBAAmBne,EAAGsK,eAC3B1W,KAAKuqB,iBAAiBL,SAAW,EACjClqB,KAAKuqB,iBAAiBJ,UAAY,EAClC/d,EAAGuK,WAAWvK,EAAGwK,aAAc5W,KAAKuqB,kBACpCne,EAAGyK,WACCzK,EAAGwK,aACH,GAAIL,aAEA,EAAG,EAAG,EAAG,EACTvW,KAAKkW,WAAY,EAAG,MAAO,EAC3B,EAAGlW,KAAKkW,WAAY,EAAG,MACvBlW,KAAKkW,WAAYlW,KAAKkW,WAAa,MAAO,QAE9C9J,EAAG0K,aAGP9W,KAAKwqB,YAAcpe,EAAGsK,eACtB1W,KAAKwqB,YAAYN,SAAW,EAC5BlqB,KAAKwqB,YAAYL,UAAY,EAC7B/d,EAAGuK,WAAWvK,EAAGwK,aAAc5W,KAAKwqB,aACpCpe,EAAGyK,WACCzK,EAAGwK,aACH,GAAIL,aACA,EAAG,EAAGvW,KAAKkW,WAAa,EAAG,EAAGlW,KAAKkW,WAAa,EAAGlW,KAAKkW,WAAa,EAAG,EAAGlW,KAAKkW,WAAa,EAAG,EAAG,IACvG9J,EAAG0K,eAMX9T,QAAQ/C,UAAUwqB,WAAa,WAC3B,GAAIre,GAAKpM,KAAKoM,EACdA,GAAGqe,WAAW,EAAG,EAAG,EAAG,GACvBre,EAAGse,MAAMte,EAAGue,mBAOhB3nB,QAAQ/C,UAAU2qB,aAAe,WAC7B,GAAIxe,GAAKpM,KAAKoM,EACdA,GAAGwe,aAAa,GAChBxe,EAAGye,YAAY,KACfze,EAAGse,MAAMte,EAAG0e,qBAGhB9nB,QAAQ/C,UAAU8qB,iBAAmB,SAASnX,GAC1C,GAAIxH,GAAKpM,KAAKoM,EACdA,GAAG4e,aAAahrB,KAAK8pB,WAAYlW,EAAKuE,WACtC/L,EAAG6e,WAAU,GAAO,GAAO,GAAO,GAKlC7e,EAAGwe,aAAa,GAChBxe,EAAGye,YAAY,KACfze,EAAGse,MAAMte,EAAG0e,oBAMZ1e,EAAG8e,YAAY9e,EAAG+e,MAAO,IAAM,IAC/B/e,EAAGye,YAAY,KACfze,EAAGgf,UAAUhf,EAAGif,QAASjf,EAAGkf,KAAMlf,EAAGkf,MAGrClf,EAAGmf,yBAAyBvrB,KAAK8pB,WAAW0B,SAC5Cpf,EAAGuK,WAAWvK,EAAGwK,aAAc5W,KAAKuqB,kBACpCne,EAAGqf,oBAAoBzrB,KAAK8pB,WAAW4B,MAAO1rB,KAAKuqB,iBAAiBL,SAAU9d,EAAGuf,OAAO,EAAO,EAAG,GAClGvf,EAAGwf,WAAWxf,EAAGyf,eAAgB,EAAG7rB,KAAKuqB,iBAAiBJ,WAE1D/d,EAAG8e,YAAY9e,EAAG+e,MAAO,IAAM,KAC/B/e,EAAGgf,UAAUhf,EAAGkf,KAAMlf,EAAGkf,KAAMlf,EAAGif,SAClCjf,EAAGye,YAAY,GACfze,EAAG6e,WAAU,GAAM,GAAM,GAAM,GAC/B7e,EAAG0f,wBAAwB9rB,KAAK8pB,WAAW0B,UAI/CxoB,QAAQ/C,UAAU8rB,eAAiB,aACnC/oB,QAAQ/C,UAAU+rB,uBAAyB,WACvC,GAAI5f,GAAKpM,KAAKoM,EACdA,GAAG6f,gBAAgB7f,EAAG8f,YAAa,MAGvC,IAAIC,OACAC,OAAQ9tB,QAAQ,iBAChB+tB,KAAM/tB,QAAQ,eACdylB,KAAMzlB,QAAQ,eACdguB,OAAQhuB,QAAQ,iBAChBiuB,WAAYjuB,QAAQ,qBACpBiP,MAAOjP,QAAQ,gBACfkP,SAAUlP,QAAQ,mBAGtB0E,SAAQ/C,UAAUiN,OAAS,SAASxH,EAAOrC,GACvCrD,KAAK0F,MAAQA,EACb1F,KAAKqD,QAAUA,EAEfrD,KAAK2Y,UAAYjT,EAAMiT,UAEvB3Y,KAAKwY,YAAc9S,EAAM8S,YACzBxY,KAAKwY,YAAYyD,UAAUvW,EAAM2T,QAEjCrZ,KAAKoU,WAAa1O,EAAM0O,WACxBpU,KAAKoU,WAAW7P,KAAKvE,KAAKoM,IAE1BpM,KAAKuoB,aAAaiE,OAAOxsB,KAAKwD,UAAUwC,MAExChG,KAAK+rB,iBACL/rB,KAAKyqB,YAEL,KAAK,GAAItjB,GAAIzB,EAAMqT,QAAQ3R,OAAS,EAAGD,GAAK,EAAGA,IAAK,CAChD,GAAIkT,GAAQ3U,EAAMqT,QAAQ5R,GACtB6C,EAAStE,EAAML,QAAQgV,EAAMrQ,OAE7BA,IACAhK,KAAK4qB,eACL5gB,EAAOkD,OAAOmN,EAAOra,OAEG+R,SAAjBsI,EAAMrQ,QACbhK,KAAKkY,WAAWmC,EAAOra,KAAKgqB,kBAKxChnB,QAAQ/C,UAAUwsB,SAAW,SAAS7Y,EAAMoD,GACxChX,KAAKoqB,UAAUxW,EAAKsC,YACpBlW,KAAK+qB,iBAAiBnX,GACtB5T,KAAKkY,WAAWlB,EAAQpD,EAAKuE,UAAWvE,GAEpC5T,KAAKqD,QAAQkK,OACb4e,KAAK5e,MAAMvN,KAAM4T,IAIzB5Q,QAAQ/C,UAAUiY,WAAa,SAASlB,EAAQ0V,EAAQ9Y,GACpD,IAAK,GAAIzM,GAAI6P,EAAO5P,OAAS,EAAGD,GAAK,EAAGA,IAAK,CACzC,GAAIiD,GAAQ4M,EAAO7P,EAEfiD,GAAMuiB,SAGVR,KAAK/hB,EAAM8D,MAAMlO,KAAMoK,EAAOsiB,EAAQ9Y,GAElC5T,KAAKqD,QAAQmK,UACb2e,KAAK3e,SAASxN,KAAMoK,EAAOsiB,EAAQ9Y,MAM/C5Q,QAAQ/C,UAAU2sB,kBAAoB,WAClC,GAAIxgB,GAAKpM,KAAKoM,EACdA,GAAG4e,aAAahrB,KAAK8pB,WAAY9pB,KAAKgqB,gBAGtC5d,EAAG0c,UAAU1c,EAAG4c,IAAK5c,EAAGygB,qBACxBzgB,EAAGye,YAAY,GACfze,EAAG8e,YAAY9e,EAAG+e,MAAO,IAAM,KAG/B/e,EAAGuK,WAAWvK,EAAGwK,aAAc5W,KAAKiqB,kBACpC7d,EAAGqf,oBAAoBzrB,KAAK8pB,WAAW4B,MAAO1rB,KAAKiqB,iBAAiBC,SAAU9d,EAAGuf,OAAO,EAAO,EAAG,GAClGvf,EAAGmf,yBAAyBvrB,KAAK8pB,WAAW0B,SAC5Cpf,EAAG0gB,gBAAgB9sB,KAAK8pB,WAAW0B,SAAU,EAAG,EAAG,EAAG,KACtDpf,EAAGwf,WAAWxf,EAAGyf,eAAgB,EAAG7rB,KAAKuqB,iBAAiBJ,WAG1D/d,EAAG0c,UAAU1c,EAAG2c,oBAAqB3c,EAAG4c,MAG5ChmB,QAAQ/C,UAAU8sB,gBAAkB,SAASL,EAAQ9Y,EAAM+P,EAAW5S,GAClE,IAAK4S,EAAU,KAAOA,EAAU,GAAI,MAAO+I,EAE3C,IAAe,aAAX3b,EAAuB,CACvB,GAAIic,GAAOtrB,KAAKc,KAAKxC,KAAKwD,UAAUvB,OAChCgrB,EAAOvrB,KAAKa,KAAKvC,KAAKwD,UAAUvB,MACpC0hB,IACIA,EAAU,GAAKsJ,EAAOtJ,EAAU,GAAKqJ,EACrCrJ,EAAU,GAAKqJ,EAAOrJ,EAAU,GAAKsJ,GAI7C,GAAIC,GAAiBltB,KAAKwD,UAAU2pB,OAAS,GAAKvZ,EAAK9K,MAAMgL,IAAMF,EAAKsC,WAAatC,EAAKvB,UACtF+a,GACAzJ,EAAU,GAAKuJ,EACfvJ,EAAU,GAAKuJ,EACf,GAGAG,EAAmB,GAAIC,cAAa,GAExC,OADA5E,MAAK/E,UAAU0J,EAAkBX,EAAQU,GAClCC,GAGXrqB,QAAQ/C,UAAUstB,YAAc,SAASpW,GACrC,GAAIqW,GAAWxtB,KAAKqoB,iBAAiBlR,EAAQhP,KACxCqlB,GAGDA,EAASxc,KAAKmG,GAFdnX,KAAKqoB,iBAAiBlR,EAAQhP,OAASgP,IAO/CnU,QAAQ/C,UAAUwtB,WAAa,SAAStlB,GACpC,GAAIqlB,GAAWxtB,KAAKqoB,iBAAiBlgB,EACrC,OAAOqlB,IAAYA,EAASpmB,OAAS,EAAIomB,EAASE,MAAQ;;AqE/V9D,YAEA,IAAI+pC,OAAQ1lD,MAEZ5T,QAAOC,SACHmP,OAAUq8B,OAAS,8LAA8LD,SAAW,mFAC5NsmB,KAAQrmB,OAAS,iKAAiKD,SAAW,4KAC7L5lB,MAAS6lB,OAAS,wLAAwLD,SAAW,uEACrN+tB,UAAa9tB,OAAS,yQAAyQD,SAAW,2PAC1Std,MAASud,OAAS,gkBAAgkBD,SAAW,+MAC7lBguB,aAAgB/tB,OAAS,gdAAgdD,SAAW,gnBACpfiuB,gBAAmBhuB,OAAS,6pBAA6pBD,SAAW,6VACpsBkuB,SAAYjuB,OAAS,iQAAiQD,SAAW,oJACjSmuB,SAAYluB,OAAS,wQAAwQD,SAAW,2YACxSrd,QAAWsd,OAAS,ySAAySD,SAAW,glBACxU4C,MAAS3C,OAAS,u0BAAu0BD,SAAW,0IACp2BpL,KAAQqL,OAAS,+6BAA+6BD,SAAW,iNAC38BouB,cAAiBnuB,OAAS,yNAAyND,SAAW;;AnFjBlQ,YAqCA,SAAShrC,eAAc0E,GACnBA,EAAUA,MAEVrD,KAAK6R,MAAQxO,EAAQyO,KAEGC,SAApB1O,EAAQuH,UAAuB5K,KAAK4K,QAAUvH,EAAQuH,SAE1D5K,KAAKgS,kBAAqBtO,QAAS1D,KAAK4K,SACjBmH,SAAnB1O,EAAQ4O,SAAsBjS,KAAKgS,iBAAiBC,OAAS5O,EAAQ4O,QAC/CF,SAAtB1O,EAAQ6O,YAAyBlS,KAAKgS,iBAAiBE,UAAY7O,EAAQ6O,WAE/ElS,KAAKmS,SAAW,GAAIC,cAChBC,SAAU,IACV1H,QAAS3K,KAAK2K,QACdC,QAAS5K,KAAK4K,QACd0H,UAAW,GACXC,KAAMvS,KAAKwS,UAAUjO,KAAKvE,MAC1ByS,MAAOzS,KAAK0S,WAAWnO,KAAKvE,MAC5B2S,OAAQ3S,KAAK4S,YAAYrO,KAAKvE,MAC9BG,IAAKH,KAAK6S,SAAStO,KAAKvE,MACxB8N,OAAQ9N,KAAK8S,YAAYvO,KAAKvE,QAvDtC,GAAId,MAAOZ,QAAQ,gBACfW,QAAUX,QAAQ,mBAClB8T,YAAc9T,QAAQ,kBACtByU,OAASzU,QAAQ,YACjB0U,WAAa1U,QAAQ,cAEzBH,QAAOC,QAAUO,cAqDjBA,cAAcsB,UAAYf,KAAKoE,QAAQrE,SACnC0L,QAAS,EACTC,QAAS,GACTqI,QAAQ,EAQRC,QAAS,SAASpB,GASd,MARA9R,MAAK6R,MAAQC,EACb9R,KAAKiT,QAAS,EAEdjT,KAAKgI,KAAK,UAENhI,KAAKkP,KACLlP,KAAKsE,OAAOtE,KAAKkP,IAAI1L,WAElBxD,MAGXqO,MAAO,SAASa,GACZlP,KAAKkP,IAAMA,GAGfpC,OAAQ,WACJ,MAAO9M,MAAK2N,SAAW3N,KAAKmS,SAASrF,UAGzCxI,OAAQ,SAASd,GACTxD,KAAKiT,QACLjT,KAAKmT,cAGLnT,KAAK2N,SACL3N,KAAKmS,SAAS7N,OAAOtE,KAAKoT,KAAM5P,IAIxCoL,OAAQ,WACA5O,KAAK2N,SACL3N,KAAKmS,SAASvD,UAItB1B,OAAQ6F,OAAOM,aACf5K,WAAYsK,OAAOO,kBAEnBH,YAAa,WACTnT,KAAKiT,QAAS,CACd,IAAInB,GAAO9R,KAAK6R,KACI,iBAATC,KACPA,EAAOkB,WAAWvO,OAAOmE,SAAS2K,KAAMzB,IAE5C9R,KAAKwT,SAAWxT,KAAKyT,WAAWC,KAAK,iBACjC5B,KAAMA,EACNO,SAAU,IACVrI,OAAQhK,KAAK+J,GACbiI,iBAAkBhS,KAAKgS,kBACxB,SAAS2B,GAER,MAAIA,OACA3T,MAAKgI,KAAK,SAAUuE,MAAOoH,KAG/B3T,KAAK2N,SAAU,EACf3N,KAAKmS,SAASvD,aAEd5O,MAAKgI,KAAK,YACZzD,KAAKvE,QAGXwS,UAAW,SAASoB,GAChB,GAAIC,GAAcD,EAAK9K,MAAMgL,EAAI9T,KAAK4K,QAAUlJ,KAAKqS,IAAI,EAAGH,EAAK9K,MAAMgL,EAAI9T,KAAK4K,SAAW,EACvFlC,GACAsL,IAAKJ,EAAKI,IACVlL,MAAO8K,EAAK9K,MACZ9C,KAAM4N,EAAK9K,MAAMgL,EACjBpQ,QAAS1D,KAAK4K,QACdyH,SAAU,IACVrI,OAAQhK,KAAK+J,GACb8J,YAAaA,EACb5R,MAAOjC,KAAKkP,IAAI1L,UAAUvB,MAC1BiE,MAAOlG,KAAKkP,IAAI1L,UAAU0C,MAC1ByI,eAAgB3O,KAAKkP,IAAIP,eAG7BiF,GAAKJ,SAAWxT,KAAKyT,WAAWC,KAAK,oBAAqBhL,EAAQ,SAASiL,EAAK7B,GAI5E,GAFA8B,EAAKK,iBAAiBjU,KAAKkP,IAAInH,UAE3B6L,EAAKM,QAAT,CAGA,GAAIP,EAEA,WADA3T,MAAKgI,KAAK,cAAe4L,KAAMA,GAInCA,GAAKO,eAAerC,GACpB9R,KAAKgI,KAAK,aAAc4L,KAAMA,MAEhCrP,KAAKvE,MAAOA,KAAKwT,WAGvBd,WAAY,SAASkB,GACjBA,EAAKM,SAAU,GAGnBrB,SAAU,SAASe,GACf5T,KAAKgI,KAAK,YAAa4L,KAAMA,KAGjCd,YAAa,SAASc,GAClB5T,KAAKgI,KAAK,eAAgB4L,KAAMA,KAGpChB,YAAa,SAASgB,GAClBA,EAAKK,iBAAiBjU,KAAKkP,IAAInH,SAC/B/H,KAAKoU,WAAWC,aAAaT,EAAKI,KAClChU,KAAKyT,WAAWC,KAAK,eAAiBM,IAAKJ,EAAKI,IAAKhK,OAAQhK,KAAK+J,IAAM,KAAM6J,EAAKJ;;A2FvL3F,YAQA,SAAS2yC,gBAAe5qC,GACpBvb,KAAKub,SAAWA,EAChBvb,KAAKoH,OAASmU,EAASnU,OAO3B,QAASgiE,gBAAeztD,GACpB3b,KAAKkO,KAAOyN,EAAQzN,KACpBlO,KAAKqpE,YAA+B,IAAjB1tD,EAAQzN,MAAcyN,EAAQ2tD,UAAY3tD,EAAQ2tD,SACrEtpE,KAAKqgB,WAAa1E,EAAQ4tD,KAC1BvpE,KAAKy6B,OAAS,KAnBlB,GAAIz7B,OAAQV,QAAQ,kBAChBkrE,kBAAoBlrE,QAAQ,eAAekrE,iBAE/CrrE,QAAOC,QAAU+nD,eAQjBA,eAAelmD,UAAU0b,QAAU,SAASxU,GACxC,MAAO,IAAIiiE,gBAAeppE,KAAKub,SAASpU,KAU5CiiE,eAAenpE,UAAUwpE,aAAe,WACpC,GAAIC,GAAQ1pE,KAAKqpE,WACjBrpE,MAAKspE,WAEL,KAAK,GAAIniE,GAAI,EAAGA,EAAIuiE,EAAMtiE,OAAQD,IAAK,CAGnC,IAAK,GAFDwiE,GAAOD,EAAMviE,GACbyiE,KACK7oC,EAAI,EAAGA,EAAI4oC,EAAKviE,OAAQ25B,IAC7B6oC,EAAQ54D,KAAK,GAAIhS,OAAM2qE,EAAK5oC,GAAG,GAAI4oC,EAAK5oC,GAAG,IAE/C/gC,MAAKspE,SAASt4D,KAAK44D,GAEvB,MAAO5pE,MAAKspE,UAGhBF,eAAenpE,UAAU0oE,KAAO,WACvB3oE,KAAKspE,UAAUtpE,KAAKypE,cAQzB,KAAK,GANDC,GAAQ1pE,KAAKspE,SACb/4C,EAAK3b,EAAAA,EACLsc,IAAMtc,EAAAA,GACN6b,EAAK7b,EAAAA,EACLma,IAAMna,EAAAA,GAEDzN,EAAI,EAAGA,EAAIuiE,EAAMtiE,OAAQD,IAG9B,IAAK,GAFDwiE,GAAOD,EAAMviE,GAER45B,EAAI,EAAGA,EAAI4oC,EAAKviE,OAAQ25B,IAAK,CAClC,GAAIj4B,GAAQ6gE,EAAK5oC,EAEjBxQ,GAAK7uB,KAAKgU,IAAI6a,EAAIznB,EAAMhJ,GACxBoxB,EAAKxvB,KAAKmU,IAAIqb,EAAIpoB,EAAMhJ,GACxB2wB,EAAK/uB,KAAKgU,IAAI+a,EAAI3nB,EAAM/I,GACxBgvB,EAAKrtB,KAAKmU,IAAIkZ,EAAIjmB,EAAM/I,GAIhC,OAAQwwB,EAAIE,EAAIS,EAAInC,IAGxBq6C,eAAenpE,UAAU4pE,UAAYL,kBAAkBvpE,UAAU4pE;;A1ChEjE,YAUA,SAAShxB,kBAAiBx1C,GACtBnE,KAAK4G,OAAO9F,KAAMd,KAAKkhB,KAAK/c,GAAU,MAAO,cAE7C0P,OAAO0mB,cAAcvb,KAAKle,KAAMqD,GAXpC,GAAInE,MAAOZ,QAAQ,gBACfc,KAAOd,QAAQ,gBACfW,QAAUX,QAAQ,mBAClByU,OAASzU,QAAQ,YACjBqb,aAAerb,QAAQ,kBAAkB4mC,gBAE7C/mC,QAAOC,QAAUy6C,iBAQjBA,iBAAiB54C,UAAYf,KAAKoE,QAAQrE,SACtC0L,QAAS,EACTC,QAAS,GACTsK,WAAW,EACX7C,SAAU,IACV1E,SAAS,EAETU,MAAO,SAASa,GACZlP,KAAKkP,IAAMA,GAGfpC,OAAQ,WACJ,MAAO9M,MAAKmS,UAAYnS,KAAKmS,SAASrF,UAG1CxI,OAAQ,SAASd,GACTxD,KAAKmS,UACLnS,KAAKmS,SAAS7N,OAAOtE,KAAKoT,KAAM5P,EAAWxD,KAAKkP,IAAIxJ,MAAMiV,qBAIlE/L,OAAQ,aAIR1B,OAAQ6F,OAAOM,aAEfb,UAAW,SAASoB,GAChBxU,KAAKmoB,SAAS5N,aAAa/F,EAAK9K,MAAM0L,IAAIxU,KAAKi4C,OAAQj4C,KAAKwU,KAAM,SAASb,EAAK6T,GAC5E,IAAI5T,EAAKM,QAAT,CAGA,GAAIP,EAEA,WADA3T,MAAKgI,KAAK,cAAe4L,KAAMA,GAInC,IAAIxH,GAAKpM,KAAKkP,IAAInH,QAAQqE,EAC1BwH,GAAKuD,QAAUnX,KAAKkP,IAAInH,QAAQ0lB,WAAWjG,EAAIhgB,OAC3CoM,EAAKuD,SACL/K,EAAGgL,YAAYhL,EAAGiL,WAAYzD,EAAKuD,SACnC/K,EAAGkL,cAAclL,EAAGiL,WAAY,EAAG,EAAG,EAAGjL,EAAGmL,KAAMnL,EAAGoL,cAAegQ,KAEpE5T,EAAKuD,QAAU/K,EAAGqL,gBAClBrL,EAAGgL,YAAYhL,EAAGiL,WAAYzD,EAAKuD,SACnC/K,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAG0L,mBAAoB1L,EAAG0sC,uBAC1D1sC,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAG4L,mBAAoB5L,EAAG2L,QAC1D3L,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAGuL,eAAgBvL,EAAGwL,eACtDxL,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAGyL,eAAgBzL,EAAGwL,eACtDxL,EAAG6L,WAAW7L,EAAGiL,WAAY,EAAGjL,EAAGmL,KAAMnL,EAAGmL,KAAMnL,EAAGoL,cAAegQ,GACpE5T,EAAKuD,QAAQhP,KAAOqf,EAAIhgB,OAE5B4E,EAAG2sC,eAAe3sC,EAAGiL,YAErBzD,EAAKolB,WAAY,GAAI9d,OAAOiN,UAC5BnoB,KAAKkP,IAAI3L,cAAc3D,IAAII,KAAK0F,MAAMiV,oBAEtC/G,EAAK5J,OAAShK,KACd4T,EAAK9G,QAAS,EAEd9M,KAAKgI,KAAK,aAAc4L,KAAMA,MAChCrP,KAAKvE,QAGX0S,WAAY,SAASkB,GACjBA,EAAKM,SAAU,GAGnBrB,SAAU,SAASe,GACf5T,KAAKgI,KAAK,YAAa4L,KAAMA,KAGjCd,YAAa,SAASc,GAClB5T,KAAKgI,KAAK,eAAgB4L,KAAMA,KAGpChB,YAAa,SAASgB,GACdA,EAAKuD,SAASnX,KAAKkP,IAAInH,QAAQwlB,YAAY3Z,EAAKuD,UAGxD1O,WAAY,SAASD,EAAOE,EAAQC,GAChCA,EAAS;;A7BjGjB,YAEA,IAAIzJ,MAAOZ,QAAQ,gBACfc,KAAOd,QAAQ,gBACfuE,QAAUvE,QAAQ,mBAClB8T,YAAc9T,QAAQ,kBACtBk5B,UAAYl5B,QAAQ,gBACpBqb,aAAerb,QAAQ,kBAAkBk7B,kBAE7Cp7B,SAAQq7B,cAAgB,SAASp2B,GAC7B,GAAIyJ,GAAS,SAAS6G,EAAK+lB,GACvB,MAAI/lB,OACA3T,MAAKgI,KAAK,SAAUuE,MAAOoH,KAI/BzU,KAAK4G,OAAO9F,KAAMd,KAAKkhB,KAAKsZ,GACvB,QAAS,UAAW,UAAW,iBAEpC15B,KAAKmS,SAAW,GAAIC,cAChBC,SAAUrS,KAAKqS,SACfC,UAAW,GACX3H,QAAS3K,KAAK2K,QACdC,QAAS5K,KAAK4K,QACdsK,UAAWlV,KAAKkV,UAChB+hB,kBAAmBj3B,KAAKi3B,kBACxB1kB,KAAMvS,KAAKwS,UAAUjO,KAAKvE,MAC1ByS,MAAOzS,KAAK0S,WAAWnO,KAAKvE,MAC5B2S,OAAQ3S,KAAK4S,YAAYrO,KAAKvE,MAC9BG,IAAKH,KAAK6S,SAAStO,KAAKvE,MACxB8N,OAAQ9N,KAAK8S,YAAYvO,KAAKvE,MAC9B6b,cAAe7b,KAAK25B,mBAAqB35B,KAAK25B,mBAAmBp1B,KAAKvE,MAAQ+R,aAGlF/R,MAAKgI,KAAK,UACZzD,KAAKvE,KAEHqD,GAAQmR,IACRpV,KAAKC,QAAQsa,aAAatW,EAAQmR,KAAM1H,GAExCjK,QAAQmL,MAAMlB,EAAOvI,KAAKvE,KAAM,KAAMqD,KAI9CjF,QAAQiV,aAAe,SAAS2D,EAAQjP,GACpC,GAAK/H,KAAKmS,SAIV,IAAK,GADDmnB,GAAMt5B,KAAKmS,SAASwlB,cACfxwB,EAAI,EAAGA,EAAImyB,EAAIlyB,OAAQD,IAAK,CACjC,GAAIyM,GAAO5T,KAAKmS,SAAS2lB,QAAQwB,EAAInyB,IAGjC2B,EAAQ0uB,UAAUuB,OAAOO,EAAInyB,IAC7B2M,EAAIhL,EAAMgL,EACVhU,EAAIgJ,EAAMhJ,EACVC,EAAI+I,EAAM/I,EACVu2B,EAAIxtB,EAAMwtB,CAIdxiB,GAAIpS,KAAKgU,IAAI5B,EAAG9T,KAAK4K,SAErB9K,GAAKw2B,GAAK,GAAKxiB,GACfF,EAAKsD,kBAAkBpD,EAAGhU,EAAGC,EAAGgI,EAAQvE,UAAWuE,GAEnDA,EAAQ0kB,SAAS7Y,EAAMoD,KAI/B5Y,QAAQkV,kBAAoB,SAASxK,EAAOJ,EAAQC,GAChD,IAAK3I,KAAKmS,SACN,MAAOxJ,GAAS,QAEpB,IAAI8S,GAASzb,KAAKmS,SAASknB,OAAOvwB,EAClC,OAAK2S,OAGLzb,MAAKyT,WAAWC,KAAK,kBACjBM,IAAKyH,EAAO7H,KAAKI,IACjBlU,EAAG2b,EAAO3b,EACVC,EAAG0b,EAAO1b,EACVotB,MAAO1R,EAAO0R,MACdnjB,OAAQhK,KAAK+J,GACbrB,OAAQA,GACTC,EAAU8S,EAAO7H,KAAKJ,UATd7K,EAAS,UA8BxBvK,QAAQ0N,OAAS,SAAS9B,GAEtB,GAAI3E,IACAu0B,OAAQt7B,QAAQ,wBAChBguB,OAAQhuB,QAAQ,wBAChBu7B,QAASv7B,QAAQ,oBACjBmW,MAAOnW,QAAQ,kBAGnB,KAAK,GAAI4P,KAAQ7I,GACb,GAAI2E,YAAkB3E,GAAQ6I,GAC1B,MAAOlE,EAIf,OAAO,IAAI3E,GAAQ2E,EAAOkE,MAAMlE;;ACzHpC,YAkBA,SAASgL,MAAKlM,EAAOX,GACjBnI,KAAK8I,MAAQA,EACb9I,KAAKgU,IAAM9U,KAAKohB,WAChBtgB,KAAK8M,QAAS,EACd9M,KAAKm5B,KAAO,EACZn5B,KAAKqS,SAAWlK,EArBpB,GAAI2xB,UAAWx7B,QAAQ,aACnBy7B,KAAOD,SAASC,KAChBrR,KAAOoR,SAASpR,KAChBxpB,KAAOZ,QAAQ,gBACf07B,UAAY17B,QAAQ,4BAExBH,QAAOC,QAAU4W,KAkBjBA,KAAK/U,WAEDiW,WAAY,KAWZgB,kBAAmB,SAASpD,EAAGhU,EAAGC,EAAGyD,GAIjC,GAAIy2B,GAAYv4B,KAAKqS,IAAI,EAAGD,GACxBqZ,EAAQ3pB,EAAUyqB,UAAYgM,CAGlCj6B,MAAKmtB,MAAQA,EAGbntB,KAAKmY,UAAY,GAAI6X,cAAa,IAClCtH,KAAKwR,SAASl6B,KAAKmY,WACnBuQ,KAAK/E,UAAU3jB,KAAKmY,UAAWnY,KAAKmY,WAAYrY,EAAIqtB,EAAOptB,EAAIotB,EAAO,IAEtEzE,KAAKyE,MAAMntB,KAAKmY,UAAWnY,KAAKmY,WAAagV,EAAQntB,KAAKkW,WAAYiX,EAAQntB,KAAKkW,WAAY,IAC/FwS,KAAKoI,SAAS9wB,KAAKmY,UAAW3U,EAAUqtB,gBAAiB7wB,KAAKmY,WAG9DnY,KAAKm6B,SAAWzR,KAAK5c,SACrB4c,KAAK0R,MAAMp6B,KAAKm6B,SAAU,EAAG32B,EAAUgE,MAAOhE,EAAUiE,OAAQ,EAAG,EAAG,IAItEzH,KAAKq6B,eAAiBN,KAAKjuB,SAC3BiuB,KAAKl5B,OAAOb,KAAKq6B,eAAgBr6B,KAAKq6B,eAAgB72B,EAAUvB,OAEhEjC,KAAKmY,UAAY,GAAImV,cAAattB,KAAKmY,YAU3CohB,WAAY,SAASzwB,EAAOwxB,GAExB,MADAxxB,GAAQA,EAAMuM,OAAO3T,KAAKgU,IAAI1V,KAAK8I,MAAMgL,EAAGwmB,KAExCx6B,EAAmC,MAA/BgJ,EAAM6M,OAAS3V,KAAK8I,MAAMhJ,GAC9BC,EAAgC,MAA5B+I,EAAM8M,IAAM5V,KAAK8I,MAAM/I,GAC3BotB,MAAOntB,KAAKmtB,QAapBhZ,eAAgB,SAASrC,GACrB9R,KAAK8M,QAAS,EAGTgF,IAEL9R,KAAKu6B,QAAU,GAAIP,WAAUloB,EAAKyoB,SAClCv6B,KAAKw6B,cAAgB1oB,EAAK0oB,cAC1Bx6B,KAAKkW,WAAapE,EAAK2oB,SAW3BC,iBAAkB,SAAS5oB,EAAM/J,GAE7B,GAAK/H,KAAKu6B,QAAV,CAKAv6B,KAAKu6B,QAAQI,YAAYC,QAAQ7yB,EAAQqE,IACzCpM,KAAKu6B,QAAQM,aAAaD,QAAQ7yB,EAAQqE,IAC1CpM,KAAKu6B,QAAQO,WAAWF,QAAQ7yB,EAAQqE,IACxCpM,KAAKu6B,QAAQQ,YAAYH,QAAQ7yB,EAAQqE,IACzCpM,KAAKu6B,QAAQS,mBAAmBJ,QAAQ7yB,EAAQqE,GAEhD,IAAImuB,GAAU,GAAIP,WAAUloB,EAAKyoB,QACjCv6B,MAAKu6B,QAAQI,YAAcJ,EAAQI,YACnC36B,KAAKu6B,QAAQM,aAAeN,EAAQM,aACpC76B,KAAKu6B,QAAQO,WAAaP,EAAQO,WAClC96B,KAAKu6B,QAAQQ,YAAcR,EAAQQ,YACnC/6B,KAAKu6B,QAAQS,mBAAqBT,EAAQS,kBAE1C,KAAK,GAAIjxB,KAAM+H,GAAK0oB,cAChBx6B,KAAKw6B,cAAczwB,GAAM+H,EAAK0oB,cAAczwB,KAYpDkK,iBAAkB,SAASlM,GACvB,IAAK,GAAI3F,KAAKpC,MAAKu6B,QACfv6B,KAAKu6B,QAAQn4B,GAAGw4B,QAAQ7yB,EAAQqE,GAEpCpM,MAAKu6B,QAAU;;AyBtJvB,YAIA,SAAS/C,WAAU1jB,EAAGhU,EAAGC,EAAGu2B,GACdvkB,SAANukB,IAAiBA,EAAI,GACzBt2B,KAAK8T,EAAIA,EACT9T,KAAKF,EAAIA,EACTE,KAAKD,EAAIA,EACTC,KAAKs2B,EAAIA,EAGTA,GAAK,EACG,EAAJA,IAAOA,EAAQ,GAAJA,EAAS,EACxB,IAAIygB,GAAM,GAAK/2C,KAAK8T,CACpB9T,MAAK+J,GAAgD,IAAzCgtC,EAAMA,EAAMzgB,EAAIygB,EAAM/2C,KAAKD,EAAIC,KAAKF,GAAWE,KAAK8T,EAiEpE,QAASkjC,MAAKl2C,EAAGsB,GACb,GAAItB,EAAE8U,IAAMxT,EAAEwT,IAAK,CAAE,GAAI2I,GAAIzd,CAAGA,GAAIsB,EAAGA,EAAImc,EAC3C,OACI+R,GAAIxvB,EAAE6U,OACN6a,GAAI1vB,EAAE8U,IACN2a,GAAInuB,EAAEuT,OACN8a,GAAIruB,EAAEwT,IACN7T,GAAIK,EAAEuT,OAAS7U,EAAE6U,OACjB3T,GAAII,EAAEwT,IAAM9U,EAAE8U,KAItB,QAASqhC,WAAUC,EAAIC,EAAIC,EAAMC,EAAMC,GACnC,GAAI9mB,GAAK9uB,KAAKmU,IAAIuhC,EAAM11C,KAAKqU,MAAMohC,EAAG3mB,KAClCC,EAAK/uB,KAAKgU,IAAI2hC,EAAM31C,KAAKqwB,KAAKolB,EAAG1mB,IAGrC,IAAKymB,EAAG5mB,KAAO6mB,EAAG7mB,IAAM4mB,EAAG1mB,KAAO2mB,EAAG3mB,GAC5B0mB,EAAG5mB,GAAK6mB,EAAGn1C,GAAKk1C,EAAGl1C,GAAKk1C,EAAGn1C,GAAKo1C,EAAG5mB,GACnC2mB,EAAG3mB,GAAK4mB,EAAGn1C,GAAKk1C,EAAGl1C,GAAKk1C,EAAGn1C,GAAKo1C,EAAG7mB,GAAK,CAC7C,GAAI/R,GAAI24B,CAAIA,GAAKC,EAAIA,EAAK54B,EAQ9B,IAAK,GAJDg5B,GAAKL,EAAGn1C,GAAKm1C,EAAGl1C,GAChBw1C,EAAKL,EAAGp1C,GAAKo1C,EAAGn1C,GAChBy1C,EAAKP,EAAGn1C,GAAK,EACb21C,EAAKP,EAAGp1C,GAAK,EACRhC,EAAIywB,EAAQC,EAAJ1wB,EAAQA,IAAK,CAC1B,GAAIuwB,GAAKinB,EAAK71C,KAAKmU,IAAI,EAAGnU,KAAKgU,IAAIwhC,EAAGl1C,GAAIjC,EAAI03C,EAAKP,EAAG1mB,KAAO0mB,EAAG5mB,GAC5DC,EAAKinB,EAAK91C,KAAKmU,IAAI,EAAGnU,KAAKgU,IAAIyhC,EAAGn1C,GAAIjC,EAAI23C,EAAKP,EAAG3mB,KAAO2mB,EAAG7mB,EAChEgnB,GAAS51C,KAAKqU,MAAMwa,GAAK7uB,KAAKqwB,KAAKzB,GAAKvwB,IAIhD,QAAS43C,cAAa72C,EAAGsB,EAAG6U,EAAGmgC,EAAMC,EAAMC,GACvC,GAII/4B,GAJAq5B,EAAKZ,KAAKl2C,EAAGsB,GACby1C,EAAKb,KAAK50C,EAAG6U,GACb6gC,EAAKd,KAAK//B,EAAGnW,EAKb82C,GAAG51C,GAAK61C,EAAG71C,KAAMuc,EAAIq5B,EAAIA,EAAKC,EAAIA,EAAKt5B,GACvCq5B,EAAG51C,GAAK81C,EAAG91C,KAAMuc,EAAIq5B,EAAIA,EAAKE,EAAIA,EAAKv5B,GACvCs5B,EAAG71C,GAAK81C,EAAG91C,KAAMuc,EAAIs5B,EAAIA,EAAKC,EAAIA,EAAKv5B,GAGvCq5B,EAAG51C,IAAIi1C,UAAUa,EAAIF,EAAIR,EAAMC,EAAMC,GACrCO,EAAG71C,IAAIi1C,UAAUa,EAAID,EAAIT,EAAMC,EAAMC,GA/H7Cn5C,OAAOC,QAAUo5B,UAgBjBA,UAAUv3B,UAAUg2C,SAAW,WAC3B,MAAOj2C,MAAK8T,EAAI,IAAM9T,KAAKF,EAAI,IAAME,KAAKD,GAI9Cy3B,UAAUuB,OAAS,SAAShvB,GACxB,GAAI+J,GAAI/J,EAAK,GAAIgtC,EAAM,GAAKjjC,EACxBikC,GAAOhuC,EAAK+J,GAAK,GACjBhU,EAAIi4C,EAAKhB,EAAKh3C,GAAMg4C,EAAKj4C,GAAKi3C,EAAOA,EACrCzgB,EAAI50B,KAAKqU,MAAMgiC,GAAMhB,EAAMA,GAG/B,OAFIzgB,GAAI,IAAM,IAAGA,EAAQ,GAAJA,EAAS,GAC9BA,GAAK,EACE,GAAIkB,WAAU1jB,EAAGhU,EAAGC,EAAGu2B,IAIlCkB,UAAUv3B,UAAUuU,IAAM,SAASuT,EAAMuS,GACrC,MAAOvS,IAAM/nB,KAAKF,EAAIE,KAAKD,GAAKgoB,EAAK3gB,QAChCwqB,QAAQ,YAAa5xB,KAAKF,EAAI,IAAIm2C,SAAS,KAAOj2C,KAAKD,EAAI,IAAIk2C,SAAS,KACxErkB,QAAQ,MAAOlwB,KAAKgU,IAAI1V,KAAK8T,EAAGwmB,GAAiBt6B,KAAK8T,IACtD8d,QAAQ,MAAO5xB,KAAKF,GACpB8xB,QAAQ,MAAO5xB,KAAKD,IAI7By3B,UAAUv3B,UAAU+f,OAAS,SAASsa,GAClC,MAAe,KAAXt6B,KAAK8T,EAAgB,KAGrB9T,KAAK8T,EAAIwmB,EACF,GAAI9C,WAAUx3B,KAAK8T,EAAI,EAAG9T,KAAKF,EAAGE,KAAKD,EAAGC,KAAKs2B,GAGnD,GAAIkB,WAAUx3B,KAAK8T,EAAI,EAAGpS,KAAKqU,MAAM/V,KAAKF,EAAI,GAAI4B,KAAKqU,MAAM/V,KAAKD,EAAI,GAAIC,KAAKs2B,IAG1FkB,UAAUv3B,UAAUi5B,QAAU,WAC1B,MAAO,IAAI1B,WAAUx3B,KAAK8T,EAAG9T,KAAKF,EAAGE,KAAKD,EAAG,IAIjDy3B,UAAUv3B,UAAUw4B,SAAW,SAAS6B,GAEpC,GAAIt6B,KAAK8T,GAAKwmB,EAEV,OAAQ,GAAI9C,WAAUx3B,KAAK8T,EAAI,EAAG9T,KAAKF,EAAGE,KAAKD,EAAGC,KAAKs2B,GAG3D,IAAIxiB,GAAI9T,KAAK8T,EAAI,EACbhU,EAAa,EAATE,KAAKF,EACTC,EAAa,EAATC,KAAKD,CACb,QACI,GAAIy3B,WAAU1jB,EAAGhU,EAAGC,EAAGC,KAAKs2B,GAC5B,GAAIkB,WAAU1jB,EAAGhU,EAAI,EAAGC,EAAGC,KAAKs2B,GAChC,GAAIkB,WAAU1jB,EAAGhU,EAAGC,EAAI,EAAGC,KAAKs2B,GAChC,GAAIkB,WAAU1jB,EAAGhU,EAAI,EAAGC,EAAI,EAAGC,KAAKs2B,KA2D5CkB,UAAUY,MAAQ,SAAStkB,EAAG8gB,EAAQqD,GAIlC,QAASqf,GAAShnB,EAAIC,EAAIxwB,GACtB,GAAID,GAAGk4C,CACP,IAAIj4C,GAAK,GAAUk4C,GAALl4C,EACV,IAAKD,EAAIwwB,EAAQC,EAAJzwB,EAAQA,IAAK,CACtBk4C,GAAMl4C,EAAIm4C,GAASA,CACnB,IAAInvC,GAAQ,GAAI0uB,WAAUS,EAAS+f,EAAIj4C,EAAG2B,KAAKqU,MAAMjW,EAAIm4C,GACzD15B,GAAEzV,EAAMiB,IAAMjB,GAT1B,GAAImvC,GAAQ,GAAKnkC,EACbyK,IAoBJ,OAHAo5B,cAAa/iB,EAAO,GAAIA,EAAO,GAAIA,EAAO,GAAI,EAAGqjB,EAAOX,GACxDK,aAAa/iB,EAAO,GAAIA,EAAO,GAAIA,EAAO,GAAI,EAAGqjB,EAAOX,GAEjD93C,OAAO+H,KAAKgX,GAAGrP,IAAI,SAASnF,GAC/B,MAAOwU,GAAExU;;A3B3JjB,YAqBA,SAASqI,aAAY/O,GACjBrD,KAAKqS,SAAWhP,EAAQgP,SACxBrS,KAAK2K,QAAUtH,EAAQsH,QACvB3K,KAAK4K,QAAUvH,EAAQuH,QACvB5K,KAAKkV,UAAY7R,EAAQ6R,UACzBlV,KAAKi3B,kBAAoB5zB,EAAQ4zB,kBAEjCj3B,KAAKk3B,MAAQ7zB,EAAQkP,KACrBvS,KAAKm3B,OAAS9zB,EAAQoP,MACtBzS,KAAKo3B,QAAU/zB,EAAQsP,OACvB3S,KAAKK,KAAOgD,EAAQlD,IACpBH,KAAK4J,QAAUvG,EAAQyK,OACvB9N,KAAK6J,eAAiBxG,EAAQwY,cAE9B7b,KAAKq3B,UACLr3B,KAAKs3B,OAAS,GAAIC,OAAMl0B,EAAQiP,UAAW,SAASsB,GAAQ,MAAO5T,MAAKo3B,QAAQxjB,IAASrP,KAAKvE,OAlClG,GAAIgV,MAAO1W,QAAQ,UACfk5B,UAAYl5B,QAAQ,gBACpBU,MAAQV,QAAQ,kBAChBi5B,MAAQj5B,QAAQ,qBAChBY,KAAOZ,QAAQ,eAEnBH,QAAOC,QAAUgU,YA+BjBA,YAAYnS,WAMR6M,OAAQ,WACJ,IAAK,GAAIyR,KAAKve,MAAKq3B,OACf,IAAKr3B,KAAKq3B,OAAO9Y,GAAGzR,OAChB,OAAO,CAEf,QAAO,GAQX2qB,WAAY,WACR,MAAOj4B,QAAO+H,KAAKvH,KAAKq3B,QACnBK,KAAK,SAAS52B,EAAGsB,GAAK,MAAQA,GAAI,GAAOtB,EAAI,KAC7CoO,IAAI,SAASnF,GAAM,OAAQA,KAGpC4tB,YAAa,WACT,MAAO33B,MAAKy3B,aAAajtB,OAAO,SAAST,GACrC,MAAO/J,MAAKq3B,OAAOttB,GAAI+C,SAAW9M,KAAK43B,cAAc7tB,IACvDxF,KAAKvE,QAGX4O,OAAQ,WACJ5O,KAAKs3B,OAAOO,OACZ,KAAK,GAAI1wB,KAAKnH,MAAKq3B,OACfr3B,KAAKk3B,MAAMl3B,KAAKq3B,OAAOlwB,KAU/B2wB,QAAS,SAAS/tB,GACd,MAAO/J,MAAKq3B,OAAOttB,IASvB0a,QAAS,SAASjhB,GACd,MAAOA,GAAUwC,KAAOtE,KAAKsU,IAAIxS,EAAU6O,SAAWrS,KAAKqS,UAAY3Q,KAAKuU,KAShF8hB,kBAAmB,SAASv0B,GACxB,OAAQxD,KAAKkV,UAAYxT,KAAKH,MAAQG,KAAKqU,OAAO/V,KAAKykB,QAAQjhB,KAUnEw0B,cAAe,SAASx0B,GACpB,GAAIsQ,GAAI9T,KAAK+3B,kBAAkBv0B,GAC3By0B,EAAUnkB,CAEd,IAAIA,EAAI9T,KAAK2K,QAAS,QAClBmJ,GAAI9T,KAAK4K,UAASkJ,EAAI9T,KAAK4K,QAE/B,IAAI+oB,GAAKnwB,EACL00B,EAAavE,EAAG5qB,mBAAmB4qB,EAAG5tB,QAAQoyB,QAAQrkB,GACtDoa,EAAc,GAAIlvB,OAAMk5B,EAAWviB,OAAS,GAAKuiB,EAAWtiB,IAAM,GAEtE,OAAO4hB,WAAUY,MAAMtkB,GACnB6f,EAAGrE,gBAAgB,GAAItwB,OAAM,EAAG,IAAIm5B,QAAQrkB,GAC5C6f,EAAGrE,gBAAgB,GAAItwB,OAAM20B,EAAGnsB,MAAO,IAAI2wB,QAAQrkB,GACnD6f,EAAGrE,gBAAgB,GAAItwB,OAAM20B,EAAGnsB,MAAOmsB,EAAGlsB,SAAS0wB,QAAQrkB,GAC3D6f,EAAGrE,gBAAgB,GAAItwB,OAAM,EAAG20B,EAAGlsB,SAAS0wB,QAAQrkB,IACrD9T,KAAKi3B,kBAAoBgB,EAAUnkB,GAAG4jB,KAAK,SAAS52B,EAAGsB,GACtD,MAAO8rB,GAAYrsB,KAAKf,GAAKotB,EAAYrsB,KAAKO,MActDi2B,mBAAoB,SAASvvB,EAAOwvB,EAAiBC,GAIjD,IAAK,GAHDC,IAAW,EACX1kB,EAAIhL,EAAMgL,EACVqB,EAASrM,EAAM2vB,SAASz4B,KAAK4K,SACxBzD,EAAI,EAAGA,EAAIgO,EAAO/N,OAAQD,IAAK,CACpC,GAAI4C,GAAKoL,EAAOhO,GAAG4C,EACf/J,MAAKq3B,OAAOttB,IAAO/J,KAAKq3B,OAAOttB,GAAI+C,OACnCyrB,EAAOxuB,IAAM,GAEbyuB,GAAW,EACHF,EAAJxkB,GAEA9T,KAAKq4B,mBAAmBljB,EAAOhO,GAAImxB,EAAiBC,IAIhE,MAAOC,IAaXE,iBAAkB,SAAS5vB,EAAO6vB,EAAiBJ,GAC/C,IAAK,GAAIzkB,GAAIhL,EAAMgL,EAAI,EAAGA,GAAK6kB,EAAiB7kB,IAAK,CACjDhL,EAAQA,EAAMkX,OAAOhgB,KAAK4K,QAC1B,IAAIgJ,GAAO5T,KAAKq3B,OAAOvuB,EAAMiB,GAC7B,IAAI6J,GAAQA,EAAK9G,OAEb,MADAyrB,GAAOzvB,EAAMiB,KAAM,EACZ6J,IAUnBtP,OAAQ,SAAS8O,EAAM5P,EAAWo1B,GAC9B,GAAIzxB,GACA2B,EACA8K,EAGA5N,GAAQhG,KAAKkV,UAAYxT,KAAKH,MAAQG,KAAKqU,OAAO/V,KAAKykB,QAAQjhB,IAC/Dm1B,EAAkBz5B,KAAKggB,MAAMlZ,EAAO,GAAIhG,KAAK2K,QAAS3K,KAAK4K,SAC3D0tB,EAAkBp5B,KAAKggB,MAAMlZ,EAAO,EAAIhG,KAAK2K,QAAS3K,KAAK4K,SAK3D2tB,KACApd,GAAM,GAAID,OAAOiN,SAIrBnoB,MAAK43B,gBAEL,IAAIiB,GAAWzlB,EAAOpT,KAAKg4B,cAAcx0B,KACzC,KAAK2D,EAAI,EAAGA,EAAI0xB,EAASzxB,OAAQD,IAC7B2B,EAAQ+vB,EAAS1xB,GACjByM,EAAO5T,KAAK84B,QAAQhwB,GAEpByvB,EAAOzvB,EAAMiB,KAAM,EAEf6J,EAAK9G,QAKJ9M,KAAKq4B,mBAAmBvvB,EAAOwvB,EAAiBC,IACjDv4B,KAAK04B,iBAAiB5vB,EAAO6vB,EAAiBJ,EAItD,KAAK,GAAIxuB,KAAMwuB,GACXzvB,EAAQ0uB,UAAUuB,OAAOhvB,GACzB6J,EAAO5T,KAAKq3B,OAAOttB,GACf6J,GAAQA,EAAKolB,UAAY7d,GAAOyd,GAAgB,KAE5C54B,KAAKq4B,mBAAmBvvB,EAAOwvB,EAAiBC,IAChDv4B,KAAK43B,cAAc7tB,IAAM,EACzBwuB,EAAOxuB,IAAM,GAEb/J,KAAK04B,iBAAiB5vB,EAAO6vB,EAAiBJ,GAM1D,IAAIzqB,GAAS5O,KAAKwgB,eAAe1f,KAAKq3B,OAAQkB,EAC9C,KAAKpxB,EAAI,EAAGA,EAAI2G,EAAO1G,OAAQD,IAC3BnH,KAAKi5B,YAAYnrB,EAAO3G,KAUhC2xB,QAAS,SAAShwB,GACd,GAAI8K,GAAO5T,KAAKq3B,OAAOvuB,EAAMiB,GAC7B,IAAI6J,EACA,MAAOA,EAEX,IAAIslB,GAAUpwB,EAAMowB,SAUpB,IATAtlB,EAAO5T,KAAKq3B,OAAO6B,EAAQnvB,IAEtB6J,IACDA,EAAO5T,KAAKs3B,OAAO53B,IAAIw5B,EAAQnvB,IAC3B6J,GAAQ5T,KAAK6J,gBACb7J,KAAK6J,eAAe+J,KAIvBA,EAAM,CACP,GAAI5N,GAAO8C,EAAMgL,EACbD,EAAc7N,EAAOhG,KAAK4K,QAAUlJ,KAAKqS,IAAI,EAAG/N,EAAOhG,KAAK4K,SAAW,CAC3EgJ,GAAO,GAAIoB,MAAKkkB,EAASl5B,KAAKqS,SAAWwB,GACzC7T,KAAKk3B,MAAMtjB,GAOf,MAJAA,GAAKulB,OACLn5B,KAAKq3B,OAAOvuB,EAAMiB,IAAM6J,EACxB5T,KAAKK,KAAKuT,EAAM9K,GAET8K,GASXqlB,WAAY,SAASlvB,GACjB,GAAI6J,GAAO5T,KAAKq3B,OAAOttB,EAClB6J,KAGLA,EAAKulB,aACEn5B,MAAKq3B,OAAOttB,GACnB/J,KAAK4J,QAAQgK,GAETA,EAAKulB,KAAO,IAGZvlB,EAAK9G,OACL9M,KAAKs3B,OAAOn3B,IAAIyT,EAAK9K,MAAMowB,UAAUnvB,GAAI6J,IAEzC5T,KAAKm3B,OAAOvjB,GACZ5T,KAAKo3B,QAAQxjB,OAQrBwlB,WAAY,WACR,IAAK,GAAIrvB,KAAM/J,MAAKq3B,OAChBr3B,KAAKi5B,WAAWlvB,EACpB/J,MAAKs3B,OAAOO,SAUhBwB,OAAQ,SAASvwB,GAEb,IAAK,GADDwwB,GAAMt5B,KAAKy3B,aACNtwB,EAAI,EAAGA,EAAImyB,EAAIlyB,OAAQD,IAAK,CACjC,GAAIyM,GAAO5T,KAAKq3B,OAAOiC,EAAInyB,IACvBgF,EAAMyH,EAAK2lB,WAAWzwB,EAAO9I,KAAK4K,QACtC,IAAIuB,GAAOA,EAAIrM,GAAK,GAAKqM,EAAIrM,EAAI,MAAQqM,EAAIpM,GAAK,GAAKoM,EAAIpM,EAAI,KAG3D,OACI6T,KAAMA,EACN9T,EAAGqM,EAAIrM,EACPC,EAAGoM,EAAIpM,EACPotB,MAAOhhB,EAAIghB;;A6BlV/B,YAQA,SAASorB,kBAAiBl1C,GAGtB,GAFAnE,KAAK4G,OAAO9F,KAAMd,KAAKkhB,KAAK/c,GAAU,MAAO,cAEvB,MAAlBrD,KAAKqS,SACL,KAAM,IAAI8G,OAAM,kDAGpBpG,QAAO0mB,cAAcvb,KAAKle,KAAMqD,GAbpC,GAAInE,MAAOZ,QAAQ,gBACfW,QAAUX,QAAQ,mBAClByU,OAASzU,QAAQ,WAErBH,QAAOC,QAAUm6C,iBAYjBA,iBAAiBt4C,UAAYf,KAAKoE,QAAQrE,SACtC0L,QAAS,EACTC,QAAS,GACTyH,SAAU,IACV4kB,mBAAmB,EACnBtpB,SAAS,EAETU,MAAO,SAASa,GACZlP,KAAKkP,IAAMA,GAGfpC,OAAQ,WACJ,MAAO9M,MAAKmS,UAAYnS,KAAKmS,SAASrF,UAG1CxI,OAAQ,SAASd,GACTxD,KAAKmS,UACLnS,KAAKmS,SAAS7N,OAAOtE,KAAKoT,KAAM5P,IAIxCoL,OAAQ,WACA5O,KAAKmS,UACLnS,KAAKmS,SAASvD,UAItBiN,cAAe,WACX,GAAK7b,KAAKmS,SAKV,IAAK,GADDmnB,GAAMt5B,KAAKmS,SAASslB,aACftwB,EAAI,EAAGA,EAAImyB,EAAIlyB,OAAQD,IAAK,CACjC,GAAIyM,GAAO5T,KAAKmS,SAAS2lB,QAAQwB,EAAInyB,GACrCnH,MAAK25B,mBAAmB/lB,KAIhC1G,OAAQ6F,OAAOM,aACf5K,WAAYsK,OAAOO,kBAEnBd,UAAW,SAASoB,GAChB,GAAIC,GAAcD,EAAK9K,MAAMgL,EAAI9T,KAAK4K,QAAUlJ,KAAKqS,IAAI,EAAGH,EAAK9K,MAAMgL,EAAI9T,KAAK4K,SAAW,EACvFlC,GACA8L,IAAKZ,EAAK9K,MAAM0L,IAAIxU,KAAKi4C,MAAOj4C,KAAK4K,SACrCoJ,IAAKJ,EAAKI,IACVlL,MAAO8K,EAAK9K,MACZ9C,KAAM4N,EAAK9K,MAAMgL,EACjBpQ,QAAS1D,KAAK4K,QACdyH,SAAUrS,KAAKqS,SAAWwB,EAC1B7J,OAAQhK,KAAK+J,GACb8J,YAAaA,EACb5R,MAAOjC,KAAKkP,IAAI1L,UAAUvB,MAC1BiE,MAAOlG,KAAKkP,IAAI1L,UAAU0C,MAC1ByI,eAAgB3O,KAAKkP,IAAIP,eAGzBiF,GAAKJ,SACLxT,KAAKyT,WAAWC,KAAK,cAAehL,EAAQ1I,KAAKw4C,YAAYj0C,KAAKvE,KAAM4T,GAAOA,EAAKJ,UAEpFI,EAAKJ,SAAWxT,KAAKyT,WAAWC,KAAK,YAAahL,EAAQ1I,KAAKw4C,YAAYj0C,KAAKvE,KAAM4T,KAI9F4kC,YAAa,SAAS5kC,EAAMD,EAAK7B,GAC7B,IAAI8B,EAAKM,QAAT,CAGA,GAAIP,EAEA,WADA3T,MAAKgI,KAAK,cAAe4L,KAAMA,GAInCA,GAAKO,eAAerC,GAEhB8B,EAAK6kC,eACL7kC,EAAK6kC,cAAe,EACpBz4C,KAAK25B,mBAAmB/lB,IAG5B5T,KAAKgI,KAAK,aAAc4L,KAAMA,MAGlClB,WAAY,SAASkB,GACjBA,EAAKM,SAAU,EACflU,KAAKyT,WAAWC,KAAK,cAAgBM,IAAKJ,EAAKI,IAAKhK,OAAQhK,KAAK+J,IAAM,KAAM6J,EAAKJ,WAGtFX,SAAU,SAASe,GACf5T,KAAKgI,KAAK,YAAa4L,KAAMA,KAGjCd,YAAa,SAASc,GAClB5T,KAAKgI,KAAK,eAAgB4L,KAAMA,KAGpChB,YAAa,SAASgB,GAClBA,EAAKK,iBAAiBjU,KAAKkP,IAAInH,SAC/B/H,KAAKoU,WAAWC,aAAaT,EAAKI,KAClChU,KAAKyT,WAAWC,KAAK,eAAiBM,IAAKJ,EAAKI,IAAKhK,OAAQhK,KAAK+J,IAAM,KAAM6J,EAAKJ,WAGvFmmB,mBAAoB,SAAS/lB,GAiBzB,QAAS8kC,GAAKC,EAAG7mC,GACb8B,EAAK8mB,iBAAiB5oB,EAAM9R,KAAKkP,IAAInH,SACrC/H,KAAKgI,KAAK,aAAc4L,KAAMA,IAE9BA,EAAKglC,kBAAmB,EACpBhlC,EAAK6kC,eACLz4C,KAAK25B,mBAAmB/lB,GACxBA,EAAK6kC,cAAe,GAtB5B,OAAK7kC,EAAK9G,QAAU8G,EAAKglC,sBACrBhlC,EAAK6kC,cAAe,IAIxB7kC,EAAKglC,kBAAmB,MAExB54C,MAAKyT,WAAWC,KAAK,kBACjBM,IAAKJ,EAAKI,IACVhK,OAAQhK,KAAK+J,GACb9H,MAAOjC,KAAKkP,IAAI1L,UAAUvB,MAC1BiE,MAAOlG,KAAKkP,IAAI1L,UAAU0C,MAC1ByI,eAAgB3O,KAAKkP,IAAIP,gBAC1B+pC,EAAKn0C,KAAKvE,MAAO4T,EAAKJ;;A/CxIjC,YAkCA,SAAS5U,aAAYyE,GACjBrD,KAAKsU,YAAcjR,EAAQiR,YAE3BlV,KAAKmV,SAASlR,EAAQmR,IAAK,SAASb,EAAKc,GAErC,IAAId,EAAJ,CAEA3T,KAAKyU,MAAQA,EACbzU,KAAKyU,MAAMC,MAAO,CAElB,IAAIC,EAGJ3U,MAAKyU,MAAM/P,iBAAiB,UAAW,WACnCiQ,EAAS3U,KAAKkP,IAAIxJ,MAAMnC,cAAc3D,IAAIgV,EAAAA,GAC1C5U,KAAKkP,IAAI1K,aACXD,KAAKvE,OAGPA,KAAKyU,MAAM/P,iBAAiB,QAAS,WACjC1E,KAAKkP,IAAIxJ,MAAMnC,cAAcsR,OAAOF,IACtCpQ,KAAKvE,OAEPA,KAAK2N,SAAU,EAEX3N,KAAKkP,MACLlP,KAAKyU,MAAMK,OACX9U,KAAK+U,aACL/U,KAAKgI,KAAK,aAEhBzD,KAAKvE,OA9DX,GAAId,MAAOZ,QAAQ,gBACf0W,KAAO1W,QAAQ,UACfQ,OAASR,QAAQ,kBACjBU,MAAQV,QAAQ,kBAChBW,QAAUX,QAAQ,mBAClB2W,WAAa3W,QAAQ,qBACrBc,KAAOd,QAAQ,eAEnBH,QAAOC,QAAUQ,YAyDjBA,YAAYqB,UAAYf,KAAKoE,QAAQrE,SACjCiW,WAAW,EAOXX,SAAU,WACN,MAAOvU,MAAKyU,OAGhBpG,MAAO,SAASa,GACZlP,KAAKkP,IAAMA,EACPlP,KAAKyU,QACLzU,KAAKyU,MAAMK,OACX9U,KAAK+U,eAIbA,WAAY,WAiBR,IAAK,GAXD7F,GAAMlP,KAAKkP,IACXiG,EAASnV,KAAKsU,YAAYpF,IAAI,SAAS7G,GACvC,GAAI+M,GAAMtW,OAAO2D,QAAQ4F,EACzB,OAAO6G,GAAI1L,UAAUuF,mBAAmBqM,GAAKC,OAAO,KAGpDC,EAAOV,EAAAA,EACPW,EAAOX,EAAAA,EACPY,IAAQZ,EAAAA,GACRa,IAAQb,EAAAA,GAEHzN,EAAI,EAAGA,EAAIgO,EAAO/N,OAAQD,IAC/BmO,EAAO5T,KAAKgU,IAAIJ,EAAMH,EAAOhO,GAAGwO,QAChCJ,EAAO7T,KAAKgU,IAAIH,EAAMJ,EAAOhO,GAAGyO,KAChCJ,EAAO9T,KAAKmU,IAAIL,EAAML,EAAOhO,GAAGwO,QAChCF,EAAO/T,KAAKmU,IAAIJ,EAAMN,EAAOhO,GAAGyO,IAGpC,IAAI7T,GAAKyT,EAAOF,EACZtT,EAAKyT,EAAOF,EACZO,EAAOpU,KAAKmU,IAAI9T,EAAIC,GACpB+D,EAAS,GAAIkP,aAAYK,EAAOE,GAAQ,GAAID,EAAOE,GAAQ,EAAG,GAC7DJ,OAAO3T,KAAKqU,OAAOrU,KAAKsU,IAAIF,GAAQpU,KAAKuU,MAE1CC,EAAa,KACbC,EAAahB,EAAOjG,IAAI,SAASpG,GACjC,GAAIsN,GAActN,EAAMuM,OAAOtP,EAAOC,KACtC,OAAO,IAAIhH,OACP0C,KAAKH,OAAO6U,EAAYT,OAAS5P,EAAO4P,QAAUO,GAClDxU,KAAKH,OAAO6U,EAAYR,IAAM7P,EAAO6P,KAAOM,MAGhD9J,EAAK8C,EAAInH,QAAQqE,GACjBiK,EAAW,MACXC,EAAQ,GAAIC,aACZJ,EAAW,GAAGrW,EAAGqW,EAAW,GAAGpW,EAAG,EAAG,EACrCoW,EAAW,GAAGrW,EAAGqW,EAAW,GAAGpW,EAAGsW,EAAU,EAC5CF,EAAW,GAAGrW,EAAGqW,EAAW,GAAGpW,EAAG,EAAGsW,EACrCF,EAAW,GAAGrW,EAAGqW,EAAW,GAAGpW,EAAGsW,EAAUA,GAGhDrW,MAAK4T,KAAO,GAAIoB,MAChBhV,KAAK4T,KAAK4C,WAEVxW,KAAK4T,KAAK6C,aAAerK,EAAGsK,eAC5BtK,EAAGuK,WAAWvK,EAAGwK,aAAc5W,KAAK4T,KAAK6C,cACzCrK,EAAGyK,WAAWzK,EAAGwK,aAAcN,EAAOlK,EAAG0K,aAEzC9W,KAAK+F,OAASA,GAGlB+G,OAAQ,WACJ,MAAO9M,MAAKyU,OAASzU,KAAKyU,MAAMsC,YAAc,GAGlDzS,OAAQ,aAIRsK,OAAQ,aAIR1B,OAAQ,SAAS8J,EAAQjP,GACrB,GAAK/H,KAAK2N,WACN3N,KAAKyU,MAAMsC,WAAa,GAA5B,CAEA,GAAIE,GAAIjX,KAAK+F,MACb/F,MAAK4T,KAAKsD,kBAAkBD,EAAEjR,KAAMiR,EAAEtB,OAAQsB,EAAErB,IAAK5V,KAAKkP,IAAI1L,UAAWuE,EAEzE,IAAIqE,GAAKrE,EAAQqE,EACZpM,MAAK4T,KAAKuD,SASX/K,EAAGgL,YAAYhL,EAAGiL,WAAYrX,KAAK4T,KAAKuD,SACxC/K,EAAGkL,cAAclL,EAAGiL,WAAY,EAAG,EAAG,EAAGjL,EAAGmL,KAAMnL,EAAGoL,cAAexX,KAAKyU,SATzEzU,KAAK4T,KAAKuD,QAAU/K,EAAGqL,gBACvBrL,EAAGgL,YAAYhL,EAAGiL,WAAYrX,KAAK4T,KAAKuD,SACxC/K,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAGuL,eAAgBvL,EAAGwL,eACtDxL,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAGyL,eAAgBzL,EAAGwL,eACtDxL,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAG0L,mBAAoB1L,EAAG2L,QAC1D3L,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAG4L,mBAAoB5L,EAAG2L,QAC1D3L,EAAG6L,WAAW7L,EAAGiL,WAAY,EAAGjL,EAAGmL,KAAMnL,EAAGmL,KAAMnL,EAAGoL,cAAexX,KAAKyU,QAM7E1M,EAAQmQ,WAAWlB,EAAQhX,KAAK4T,KAAKuE,UAAWnY,KAAK4T,QAGzDnL,WAAY,SAASD,EAAOE,EAAQC,GAChC,MAAOA,GAAS;;AkErLxB,YAgBA,SAASk9C,QAAOC,GACZ9lD,KAAK8lD,KAAOA,EACZ9lD,KAAK6mC,MAAQ,GAAIC,OAAMgf,EAAM9lD,MAC7BA,KAAKy+B,WAELz+B,KAAK8M,UACL9M,KAAKgX,UACLhX,KAAK+lD,kBArBT,GAAIjf,OAAQxoC,QAAQ,iBAChB0nD,WAAa1nD,QAAQ,iBACrBY,KAAOZ,QAAQ,gBACfc,KAAOd,QAAQ,gBACf2nD,GAAK3nD,QAAQ,eACb6gC,SAAW7gC,QAAQ,OAEnB4nD,UAAY5nD,QAAQ,cACpB6nD,eAAiB7nD,QAAQ,oBAE7BH,QAAOC,QAAU,SAAS0nD,GACtB,MAAO,IAAID,QAAOC,IAatB5mD,KAAK4G,OAAO+/C,OAAO5lD,WACfmmD,aAAc,SAASpvC,GACnBhX,KAAKgX,OAASA,GAGlBqvC,YAAa,SAAS39C,EAAQC,GAY1B,QAAS+vC,GAAK/kC,EAAK7B,GAGf,aAFO9R,MAAKy+B,QAAQz0B,GAAQgK,GAExBL,EAAYhL,EAASgL,IAEzBC,EAAK9B,KAAO,GAAIm0C,IAAGK,WAAW,GAAInnB,UAAS,GAAIlB,YAAWnsB,KAC1D8B,EAAKwT,MAAMxT,EAAK9B,KAAM9R,KAAKgX,OAAQhX,KAAK6mC,MAAOl+B,GAE/C3I,KAAK8M,OAAO9C,GAAUhK,KAAK8M,OAAO9C,YAClChK,KAAK8M,OAAO9C,GAAQgK,GAAOJ,IApB/B,GAAI5J,GAAStB,EAAOsB,OAChBgK,EAAMtL,EAAOsL,GAEZhU,MAAKy+B,QAAQz0B,KACdhK,KAAKy+B,QAAQz0B,MAGjB,IAAI4J,GAAO5T,KAAKy+B,QAAQz0B,GAAQgK,GAAO,GAAIgyC,YAAWt9C,EAEtDkL,GAAKiT,IAAMznB,KAAKE,eAAeoJ,EAAO8L,IAAKkkC,EAAKn0C,KAAKvE,QAezDumD,cAAe,SAAS79C,EAAQC,GAC5B,GAAImE,GAAS9M,KAAK8M,OAAOpE,EAAOsB,QAC5BgK,EAAMtL,EAAOsL,GACjB,IAAIlH,GAAUA,EAAOkH,GAAM,CACvB,GAAIJ,GAAO9G,EAAOkH,EAClBJ,GAAKwT,MAAMxT,EAAK9B,KAAM9R,KAAKgX,OAAQhX,KAAK6mC,MAAOl+B,KAIvD69C,aAAc,SAAS99C,GACnB,GAAI+1B,GAAUz+B,KAAKy+B,QAAQ/1B,EAAOsB,QAC9BgK,EAAMtL,EAAOsL,GACbyqB,IAAWA,EAAQzqB,KACnByqB,EAAQzqB,GAAK6S,IAAIpU,cACVgsB,GAAQzqB,KAIvByyC,cAAe,SAAS/9C,GACpB,GAAIoE,GAAS9M,KAAK8M,OAAOpE,EAAOsB,QAC5BgK,EAAMtL,EAAOsL,GACblH,IAAUA,EAAOkH,UACVlH,GAAOkH,IAItB0yC,iBAAkB,SAASh+C,EAAQC,GAC/B,GAAImE,GAAS9M,KAAK8M,OAAOpE,EAAOsB,QAC5By0B,EAAUz+B,KAAKy+B,QAAQ/1B,EAAOsB,QAC9BgK,EAAMtL,EAAOsL,GAEjB,IAAIlH,GAAUA,EAAOkH,GAAM,CACvB,GAAIJ,GAAO9G,EAAOkH,GACdyH,EAAS7H,EAAKiI,cAAcnT,EAAOzG,MAAOyG,EAAOxC,MAAOwC,EAAOiG,eAE/D8M,GAAOA,QACP9S,EAAS,KAAM8S,EAAOA,OAAQA,EAAOkrC,mBAGlCloB,IAAWA,EAAQzqB,KAC1ByqB,EAAQzqB,GAAK/R,MAAQyG,EAAOzG,QAIpC2kD,gBAAiB,SAASl+C,EAAQC,GAC9B,GAAIk+C,GAAY,SAASlzC,EAAK7B,GAC1B,MAAI6B,GAAYhL,EAASgL,IACzB3T,KAAK+lD,eAAer9C,EAAOsB,QAAUk8C,UAAUp0C,EAAMpJ,EAAOsJ,sBAC5DrJ,GAAS,QACXpE,KAAKvE,KAQoB,iBAAhB0I,GAAOoJ,KACd1S,KAAKC,QAAQqJ,EAAOoJ,KAAM+0C,GAEzBA,EAAU,KAAMn+C,EAAOoJ,OAGhCg1C,oBAAqB,SAASp+C,EAAQC,GAClC,GAAIqB,GAAStB,EAAOsB,OAChBlB,EAAQJ,EAAOI,MAIfi+C,EAAc/mD,KAAK+lD,eAAe/7C,GAAQ8tB,QAAQhvB,EAAMgL,EAAGhL,EAAMhJ,EAAGgJ,EAAM/I,EAM9E,KAAKgnD,EAAa,MAAOp+C,GAAS,KAAM,KAExC,IAAIiL,GAAO,GAAIoyC,YAAWt9C,EAC1BkL,GAAKwT,MAAM,GAAI++B,gBAAeY,EAAYxrC,UAAWvb,KAAKgX,OAAQhX,KAAK6mC,MAAOl+B,GAE9E3I,KAAK8M,OAAO9C,GAAUhK,KAAK8M,OAAO9C,OAClChK,KAAK8M,OAAO9C,GAAQtB,EAAOsL,KAAOJ,GAGtCozC,iBAAkB,SAASt+C,EAAQC,GAC/B,GAAIiL,GAAO5T,KAAK8M,OAAOpE,EAAOsB,SAAWhK,KAAK8M,OAAOpE,EAAOsB,QAAQtB,EAAOsL,IACvEJ,GACAA,EAAKqzC,YAAYC,MAAMx+C,EAAQC,GAE/BA,EAAS;;AuBjJrB,YASA,SAASq9C,YAAWt9C,GAChB1I,KAAK8I,MAAQJ,EAAOI,MACpB9I,KAAKgU,IAAMtL,EAAOsL,IAClBhU,KAAKgG,KAAO0C,EAAO1C,KACnBhG,KAAK0D,QAAUgF,EAAOhF,QACtB1D,KAAKqS,SAAW3J,EAAO2J,SACvBrS,KAAKgK,OAAStB,EAAOsB,OACrBhK,KAAK6T,YAAcnL,EAAOmL,YAC1B7T,KAAKiC,MAAQyG,EAAOzG,MACpBjC,KAAKkG,MAAQwC,EAAOxC,MACpBlG,KAAK2O,eAAiBjG,EAAOiG,eAE7B3O,KAAKsF,UAnBT,GAAIuiE,aAAcvpE,QAAQ,wBACtBwpE,cAAgBxpE,QAAQ,4BACxB07B,UAAY17B,QAAQ,6BACpBypE,aAAezpE,QAAQ,wBAE3BH,QAAOC,QAAU4nD,WAiBjBA,WAAW/lD,UAAUmnB,MAAQ,SAAStV,EAAMkF,EAAQ6vB,EAAOl+B,GAyFvD,QAASq/D,GAAqB59D,EAAOoM,GACjC,IAAK,GAAIrP,GAAI,EAAGA,EAAIiD,EAAMhD,OAAQD,IAAK,CACnC,GAAIwU,GAAUvR,EAAMuR,QAAQxU,EAC5B,KAAK,GAAIwK,KAAO6E,GAAS,CACrB,GAAIyxD,GAASzxD,EAAQ7E,EACjBs2D,GAAOz9D,OAAOmR,IACdssD,EAAO1sD,SAASvK,KAAK2K,KAyCrC,QAASusD,GAAiBD,GACtB,MAAO,UAASt0D,GACZs0D,EAAOE,oBAAqB,EAC5BC,EAAYx0D,EAAMq0D,EAAQt0D,IAIlC,QAASy0D,GAAYx0D,EAAMq0D,EAAQzlB,GAC/B,KAAIylB,EAAOI,kBAAoBJ,EAAOE,oBAClCF,EAAOK,iBAAmBL,EAAOM,gBAArC,CAEA,IAAK/lB,EAAM,CACP,GAAIrnC,GAAMD,KAAKC,KACX8sD,GAAO1sD,SAASnU,QAAQ6gE,EAAOO,YAAYC,EAC/C,IAAIjoD,GAAOtF,KAAKC,MAAQA,CACxB,IAAI8sD,EAAOnjE,YACP,IAAK,GAAIqC,GAAI,EAAGA,EAAI8gE,EAAO1sD,SAASnU,OAAQD,IAAK,CAC7C,GAAIwU,GAAUssD,EAAO1sD,SAASpU,EAC9ByM,GAAKqzC,YAAYyhB,OAAO/sD,EAAQgtD,OAAQV,EAAOjxD,OAAQ2E,GAG3C,mBAATmqC,QACPA,KAAK8iB,YAAc9iB,KAAK8iB,cAAgBC,OAAQ,GAChD/iB,KAAK8iB,YAAYC,QAAUroD,EAC3BslC,KAAK8iB,YAAYX,EAAOl+D,KAAO+7C,KAAK8iB,YAAYX,EAAOl+D,KAAO,GAAKyW,GAM3E,MAFAf,KAEKA,OAMDwoD,EAAOv9B,OACPu9B,EAAOv9B,KAAK69B,gBAAiB,EAC7BH,EAAYx0D,EAAMq0D,EAAOv9B,YAPzBgO,MAWR,QAASA,KAIL,GAFA9kC,EAAKsT,OAAS,OAEVtT,EAAKk1D,uBAAwB,CAC7B,GAAIrtD,GAAS7H,EAAKiI,cAAcjI,EAAK3R,MAAO2R,EAAK1N,OAAOuV,MACxD8e,GAAQI,YAAclf,EAAO8e,QAAQI,YACrCJ,EAAQO,WAAarf,EAAO8e,QAAQO,WACpCP,EAAQS,mBAAqBvf,EAAO8e,QAAQS,mBAGhD,GAAI2rB,MACAnsB,IAEJ,KAAK/5B,IAAK85B,GACNosB,EAAc31C,KAAKupB,EAAQ95B,GAAG6V,MAGlC,KAAK7V,IAAK+V,GACNgkB,EAAc/5B,GAAK+V,EAAQ/V,GAAG+5B,aAGlC7xB,GAAS,MACL6xB,cAAeA,EACfD,QAASA,EACTE,OAAQA,GACTksB,GA1MP3mD,KAAKknB,OAAS,UAEdlnB,KAAKinD,YAAc,GAAI4gB,aAAY7nE,KAAK8I,MAAO9I,KAAK6T,YAEpD,IAAI1M,GAAG1G,EAEH2J,EACA69D,EAFAr0D,EAAO5T,KAGPu6B,EAAU,GAAIP,WACdyuC,EAAgB,GAAIX,eAAc9nE,KAAKiC,MAAOjC,KAAKkG,OACnDsQ,KACAuyD,EAAiB/oE,KAAK+oE,kBACtBC,IAGJ,KAAK7hE,EAAI,EAAGA,EAAI6P,EAAO5P,OAAQD,IAG3B,GAFAiD,EAAQ4M,EAAO7P,GAEXiD,EAAMJ,SAAWhK,KAAKgK,SAGtBI,EAAMkR,IAAV,CAGA,GAAI3Q,GAAUP,EAAMO,OACpB,MAAIA,GAAW3K,KAAKgG,KAAO2E,GAAWA,EAAU3K,KAAK0D,SAArD,CAGA,GAAIkH,GAAUR,EAAMQ,OACpB,MAAIA,GAAW5K,KAAKgG,MAAQ4E,GAA5B,CAGA,GAAI+yB,GAAavzB,EAAMsyB,OAAOiB,UAC9B,IAAmB,SAAfA,EASJ,GANAsqC,EAASF,aAAa39D,EAAOmwB,EAASv6B,KAAKgG,KAAMhG,KAAK6T,YAAa7T,KAAK2O,gBACxEs5D,EAAOjxD,QAAU5M,EAAML,IAEvByM,EAAQyxD,EAAOl+D,IAAMk+D,EACrBc,EAAe/3D,KAAKi3D,GAEhBn2D,EAAKkF,OAAQ,CAEb,GAAIiyD,GAAc7+D,EAAM,eACnB4+D,GAAqBC,KACtBD,EAAqBC,OACzBD,EAAqBC,GAAahB,EAAOl+D,IAAMk+D,MAG/Ce,GAAqBf,EAAOl+D,IAAMk+D,IAK1C,IAAK9gE,EAAI,EAAGA,EAAI6P,EAAO5P,OAAQD,IAC3BiD,EAAQ4M,EAAO7P,GAEXiD,EAAMJ,SAAWhK,KAAKgK,QAGrBI,EAAMkR,MAGX2sD,EAASzxD,EAAQpM,EAAMkR,KAClB2sD,GAGLA,EAAOjxD,OAAOhG,KAAK5G,EAAML,IAG7B,IAAI0wB,GAAS,IAGb,IAAI3oB,EAAKkF,OAEL,IAAKvW,IAAKuoE,GACN5+D,EAAQ0H,EAAKkF,OAAOvW,GACf2J,IACDA,EAAMqwB,SAAQA,EAASrwB,EAAMqwB,QACjCutC,EAAqB59D,EAAO4+D,EAAqBvoE,SAIrDunE,GAAqBl2D,EAAMk3D,EAe/B,IAAIE,GACAzpD,EAAYspD,EAAe3hE,MAW/B,KAAKD,EAAI,EAAGA,EAAI4hE,EAAe3hE,OAAQD,IACnC8gE,EAASc,EAAe5hE,GAGpB8gE,EAAOK,iBACHY,EACAA,EAAoBx+B,KAAOu9B,EAE3BA,EAAOM,gBAAiB,EAE5BW,EAAsBjB,GAGtBA,EAAOI,iBACPJ,EAAOI,gBAAgBroE,KAAM6mC,EAAOqhC,EAAiBD,IAIpDA,EAAOK,gBAAmBL,EAAOI,iBAClCD,EAAYx0D,EAAMq0D,IA4E9BjiB,WAAW/lD,UAAU4b,cAAgB,SAAS5Z,EAAOiE,EAAOyI,GAExD,GAAoB,SAAhB3O,KAAKknB,OAGL,MAFAlnB,MAAK8oE,wBAAyB,EAC9B9oE,KAAKiC,MAAQA,IAUjB,KAAK,GANDs4B,GAAU,GAAIP,WACd2sB,KACAnsB,KACAiuC,EAAgB,GAAIX,eAAc7lE,EAAOiE,GAEzC6iE,EAAiB/oE,KAAK+oE,eACjB5hE,EAAI,EAAGA,EAAI4hE,EAAe3hE,OAAQD,IAAK,CAC5C,GAAI8gE,GAASc,EAAe5hE,EAER,YAAhB8gE,EAAO/5D,OACP+5D,EAAOkB,cAAcV,EAAeluC,EAAS5rB,GAC7C6rB,EAAcytC,EAAOl+D,IAAMk+D,EAAOztC,eAI1C,IAAK,GAAI/5B,KAAK85B,GACVosB,EAAc31C,KAAKupB,EAAQ95B,GAAG6V,MAGlC,QACImF,QACI+e,cAAeA,EACfD,QAASA,GAEbosB,cAAeA;;A7ExQvB,YAIA,SAAS5jD,iBACL/C,KAAKmf,EAAI,EACTnf,KAAKkoB,SAJT/pB,OAAOC,QAAU2E,cAQjBA,cAAc9C,UAAU2N,QAAU,WAI9B,MAHA5N,MAAKkoB,MAAQloB,KAAKkoB,MAAM1d,OAAO,SAAS+T,GACpC,MAAOA,GAAEiC,OAAQ,GAAKtF,OAAQiN,aAE1BnoB,KAAKkoB,MAAM9gB,QAKvBrE,cAAc9C,UAAUL,IAAM,SAAS2e,GAEnC,MADAve,MAAKkoB,MAAMlX,MAAOjH,GAAI/J,KAAKmf,EAAGqB,KAAMjC,GAAI,GAAKrD,OAAQiN,YAC9CnoB,KAAKmf,KAIhBpc,cAAc9C,UAAU4U,OAAS,SAASsK,GACtCnf,KAAKkoB,MAAQloB,KAAKkoB,MAAM1d,OAAO,SAAS+T,GACpC,MAAOA,GAAExU,KAAOoV;;AY3BxB,YAQA,SAAS7F,aAAYykB,GACjB/9B,KAAK+9B,KAAOA,EACZ/9B,KAAK+b,OAASlZ,QAAQ6V,iBAAmB,EAEzCqlB,EAAO/9B,KAAK+9B,MAAQ/9B,KAAK+b,OAAS,MAAQ,IAE1C3c,KAAKC,QAAQ0+B,EAAO,QAAS,SAASpqB,EAAK7B,GACvC,MAAI6B,OACA3T,MAAKgI,KAAK,SAAUuE,MAAOoH,KAI/B3T,KAAK8R,KAAOA,OACR9R,KAAKwnB,KAAKxnB,KAAKgI,KAAK,WAC1BzD,KAAKvE,OAEPZ,KAAKmoB,SAASwW,EAAO,OAAQ,SAASpqB,EAAK6T,GACvC,GAAI7T,EAEA,WADA3T,MAAKgI,KAAK,SAAUuE,MAAOoH,GAO/B,KAAK,GAFD7B,GAAO0V,EAAIG,UACXqW,EAAUxW,EAAI1V,KAAO,GAAImsB,YAAWnsB,EAAK1K,QACpCD,EAAI,EAAGA,EAAI2K,EAAK1K,OAAQD,GAAK,EAAG,CACrC,GAAI+2B,GAAQpsB,EAAK3K,EAAI,GAAK,GAC1B62B,GAAQ72B,EAAI,GAAK2K,EAAK3K,EAAI,GAAK+2B,EAC/BF,EAAQ72B,EAAI,GAAK2K,EAAK3K,EAAI,GAAK+2B,EAC/BF,EAAQ72B,EAAI,GAAK2K,EAAK3K,EAAI,GAAK+2B,EAC/BF,EAAQ72B,EAAI,GAAK2K,EAAK3K,EAAI,GAG9BnH,KAAKwnB,IAAMA,EACPxnB,KAAK8R,MAAM9R,KAAKgI,KAAK,SAC3BzD,KAAKvE,OAwBX,QAASm+B,mBAjET,GAAIl/B,SAAUX,QAAQ,mBAClBc,KAAOd,QAAQ,gBACfuE,QAAUvE,QAAQ,kBAEtBH,QAAOC,QAAUkb,YAwCjBA,YAAYrZ,UAAYT,OAAOsM,OAAO7M,SAEtCqa,YAAYrZ,UAAUm+B,OAAS,WAC3B,MAAOp+B,MAAK+9B,MAGhBzkB,YAAYrZ,UAAU6M,OAAS,WAC3B,SAAU9M,KAAK8R,OAAQ9R,KAAKwnB,MAGhClO,YAAYrZ,UAAU2E,OAAS,WAC3B,GAAI/B,QAAQ6V,iBAAmB,IAAM1Y,KAAK+b,OAAQ,CAC9C,GAAIsiB,GAAY,GAAI/kB,aAAYtZ,KAAK+9B,KACrCM,GAAUh6B,GAAG,OAAQ,WACjBrE,KAAKwnB,IAAM6W,EAAU7W,IACrBxnB,KAAK8R,KAAOusB,EAAUvsB,KACtB9R,KAAK+b,OAASsiB,EAAUtiB,QAC1BxX,KAAKvE,SAKfm+B,eAAel+B,WAAcH,EAAG,EAAGC,EAAG,EAAGyH,MAAO,EAAGC,OAAQ,EAAG62B,WAAY,EAAGC,KAAK,GAElFjlB,YAAYrZ,UAAUu+B,kBAAoB,SAASzzB,GAC/C,IAAK/K,KAAK8M,SAAU,MAAO,IAAIqxB,eAE/B,IAAIhyB,GAAMnM,KAAK8R,MAAQ9R,KAAK8R,KAAK/G,EACjC,OAAIoB,IAAOnM,KAAKwnB,IAAYrb,EAErB,GAAIgyB;;A4B5Ef,YAEA,IAAIsb,WAAYn7C,QAAQ,cAExBH,QAAOC,WAEPq7C,UAAU/c,OAAOxwB,QAAQ,SAASwV,GAC9B,GAAIy4B,GAAa,SAASl6B,GACtB,IAAK,GAAI7f,KAAK6f,GACVjgB,KAAKI,GAAK6f,EAAM7f,IAIpBigB,EAAao5B,UAAU/3B,EAC3B,KAAK,GAAI04B,KAAQ/5B,GACoBtO,SAA7BsO,EAAW+5B,GAAX/5B,aACJ85B,EAAWl6C,UAAUm6C,GAAQ/5B,EAAW+5B,GAAX/5B,WAEjCliB,QAAOC,QAAQsjB,EAAUkQ,QAAQ,UAAW,KAAOuoB;;AClBvD,YAEA,IAAIV,WAAYn7C,QAAQ,eACpB+7C,cAAgB/7C,QAAQ,kBAAkB+7C,aAE9Cl8C,QAAOC,WAEPq7C,UAAUhc,MAAMvxB,QAAQ,SAASwV,GAC7B,GAAI44B,GAAa,aAEbj6B,EAAao5B,UAAU/3B,EAC3B,KAAK,GAAIthB,KAAKigB,GAAY,CACtB,GAAI+5B,GAAO/5B,EAAWjgB,GAClB4K,EAAQovC,EAAAA,UAEEroC,UAAV/G,IACc,UAAdovC,EAAKlsC,OAAkBlD,EAAQqvC,cAAcrvC,IAEjDsvC,EAAWr6C,UAAUG,GAAK4K,GAG9BsvC,EAAWr6C,UAAU0sB,QAAS,EAC9BxuB,OAAOC,QAAQsjB,EAAUkQ,QAAQ,SAAU,KAAO0oB;;AgCtBtDn8C,OAAOC,QAAUE,QAAQ;;ApFAzB,YAoBA,SAASO,OAAMuZ,EAAY7U,GACvBvD,KAAKuD,cAAgBA,GAAiB,GAAIR,eAC1C/C,KAAKyT,WAAa,GAAI4E,YAAW3W,KAAKmU,IAAIhT,QAAQyV,oBAAsB,EAAG,GAAItY,MAC/EA,KAAKoU,WAAa,GAAImE,YAAW,KAAM,MACvCvY,KAAKwY,YAAc,GAAIC,aAAY,IAAK,KACxCzY,KAAKwY,YAAY5T,OAAO/B,QAAQ6V,kBAChC1Y,KAAK2Y,UAAY,GAAIC,WAAU,IAAK,KAEpC5Y,KAAK6Y,WACL7Y,KAAK8Y,UACL9Y,KAAK+Y,WACL/Y,KAAKqF,WAELrF,KAAKgZ,eAEL9Z,KAAKgF,SACD,sBACA,oBACA,kBACDlE,KAEH,IAAI8M,GAAS,SAAS6G,EAAKyE,GACvB,GAAIzE,EAEA,WADA3T,MAAKgI,KAAK,SAAUuE,MAAOoH,GAI/B,IAAIsF,GAAQC,SAASd,EACjBa,GAAM7R,QACN6R,EAAM/M,QAAQ,SAAS+B,GACnB,KAAM,IAAIkL,OAAMlL,EAAEmL,WAI1BpZ,KAAK2N,SAAU,EACf3N,KAAKoY,WAAaA,CAElB,IAAI/S,GAAU+S,EAAW/S,OACzB,KAAK,GAAI0E,KAAM1E,GACXrF,KAAK8J,UAAUC,EAAI1E,EAAQ0E,GAG3BqO,GAAWiB,SACXrZ,KAAKqZ,OAAS,GAAIC,aAAYlB,EAAWiB,QACzCrZ,KAAKqZ,OAAOhV,GAAG,OAAQrE,KAAKgI,KAAKzD,KAAKvE,KAAM,YAGhDA,KAAKuZ,YAAc,GAAIC,aAAYpB,EAAWqB,OAAQzZ,KAAKoU,YAC3DpU,KAAK0Z,WACL1Z,KAAKgI,KAAK,SACZzD,KAAKvE,KAEmB,iBAAfoY,GACPhZ,KAAKC,QAAQsa,aAAavB,GAAatL,GAEvCjK,QAAQmL,MAAMlB,EAAOvI,KAAKvE,KAAM,KAAMoY,IAzE9C,GAAInZ,SAAUX,QAAQ,mBAClBsb,WAAatb,QAAQ,iBACrBub,WAAavb,QAAQ,iBACrBgb,YAAchb,QAAQ,kBACtBkb,YAAclb,QAAQ,0BACtBia,WAAaja,QAAQ,yBACrBma,YAAcna,QAAQ,0BACtBsa,UAAYta,QAAQ,wBACpBY,KAAOZ,QAAQ,gBACfc,KAAOd,QAAQ,gBACfqb,aAAerb,QAAQ,kBAAkBwb,kBACzCjX,QAAUvE,QAAQ,mBAClB+Z,WAAa/Z,QAAQ,sBACrByE,cAAgBzE,QAAQ,oBACxB4a,SAAW5a,QAAQ,2CAEvBH,QAAOC,QAAUS,MA6DjBA,MAAMoB,UAAYf,KAAKoE,QAAQrE,SAC3B0O,SAAS,EAETb,OAAQ,WACJ,IAAK9M,KAAK2N,QACN,OAAO,CAEX,KAAK,GAAI5D,KAAM/J,MAAKqF,QAChB,IAAKrF,KAAKqF,QAAQ0E,GAAI+C,SAClB,OAAO,CAEf,OAAI9M,MAAKqZ,SAAWrZ,KAAKqZ,OAAOvM,UACrB,GAEJ,GAGX4M,SAAU,WACN,GAAI3P,GAAIK,CAERpK,MAAK6Y,WACL7Y,KAAK8Y,SAEL,KAAK,GAAI3R,GAAI,EAAGA,EAAInH,KAAKoY,WAAWpB,OAAO5P,OAAQD,IAC/CiD,EAAQ,GAAIyP,YAAW7Z,KAAKoY,WAAWpB,OAAO7P,GAAInH,KAAKoY,WAAW2B,eAClE/Z,KAAK6Y,QAAQzO,EAAML,IAAMK,EACzBpK,KAAK8Y,OAAO9H,KAAK5G,EAAML,GAI3B,KAAKA,IAAM/J,MAAK6Y,QACZ7Y,KAAK6Y,QAAQ9O,GAAIiQ,eAIrB,KAAKjQ,IAAM/J,MAAK6Y,QACZ7Y,KAAK6Y,QAAQ9O,GAAIkQ,iBAAiBja,KAAK6Y,SACvC7Y,KAAK6Y,QAAQ9O,GAAImQ,cAGrBla,MAAKma,eACLna,KAAKoa,oBAGTD,aAAc,WACV,GAAIE,EAEJra,MAAK+Y,UAGL,KAAK,GAAI5R,GAAI,EAAGA,EAAInH,KAAK8Y,OAAO1R,SAAUD,EAAG,CACzC,GAAIiD,GAAQpK,KAAK6Y,QAAQ7Y,KAAK8Y,OAAO3R,GAEhCkT,IAASjQ,EAAMJ,SAAWqQ,EAAMrQ,SACjCqQ,KACAA,EAAMrQ,OAASI,EAAMJ,OACrBhK,KAAK+Y,QAAQ/H,KAAKqJ,IAGtBA,EAAMrJ,KAAK5G,KAInBgQ,iBAAkB,WACd,GAAIE,KAEJ,KAAK,GAAIvQ,KAAM/J,MAAK6Y,QAChByB,EAAQtJ,KAAKhR,KAAK6Y,QAAQ9O,GAAIwQ,OAGlCva,MAAKyT,WAAW+G,UAAU,aAAcF,IAG5CtT,SAAU,SAASxB,EAASnC,GACxB,GAAKrD,KAAK2N,QAAV,CAEAtK,EAAUA,IACN+K,YAAY,EAGhB,KAAK,GAAIrE,KAAM/J,MAAK6Y,QAChB7Y,KAAK6Y,QAAQ9O,GAAI0Q,QAAQjV,EAASnC,EAC9BrD,KAAKoY,WAAWhK,eAChBpO,KAAKuD,cAGbvD,MAAKgI,KAAK,YAGdmF,aAAc,SAAS2G,GACnB,IAAK,GAAI/J,KAAM/J,MAAKqF,QAChBrF,KAAKqF,QAAQ0E,GAAIqJ,MAAO,CAE5BpT,MAAK0a,mBAAmB5G,GAExB9T,KAAK2a,mBAAqB,GAC1B,KAAK5Q,IAAM/J,MAAK6Y,QAAS,CACrB,GAAIzO,GAAQpK,KAAK6Y,QAAQ9O,EAErBK,GAAMwQ,YAAY9G,EAAG9T,KAAKgZ,cAAgB5O,EAAMJ,SAChDhK,KAAKqF,QAAQ+E,EAAMJ,QAAQoJ,MAAO,GAI1C,GAAIyH,GAA4B,GAC5BnZ,MAAKqU,MAAM/V,KAAK8T,KAAOpS,KAAKqU,MAAMjC,IAClC9T,KAAKuD,cAAc3D,IAAIib,GAG3B7a,KAAK8T,EAAIA,EACT9T,KAAKgI,KAAK,SAGd0S,mBAAoB,SAAS5G,GAEzB,GAAIgH,GAAK9a,KAAKgZ,WAEajH,UAAvB+I,EAAGC,kBAEHD,EAAGC,gBAAkBrZ,KAAKqU,MAAMjC,GAChCgH,EAAGE,oBAAsB,EACzBF,EAAGG,SAAWnH,GAKdpS,KAAKqU,MAAM+E,EAAGG,UAAYvZ,KAAKqU,MAAMjC,IACrCgH,EAAGC,gBAAkBrZ,KAAKqU,MAAMjC,GAChCgH,EAAGE,oBAAsBE,KAAKC,OAEvBzZ,KAAKqU,MAAM+E,EAAGG,UAAYvZ,KAAKqU,MAAMjC,KAC5CgH,EAAGC,gBAAkBrZ,KAAKqU,MAAMjC,EAAI,GACpCgH,EAAGE,oBAAsBE,KAAKC,OAGlCL,EAAGG,SAAWnH,GAQlB9K,MAAO,SAASC,GACZ2Q,WAAW5Z,KAAMiJ,IAGrBa,UAAW,SAASC,EAAIC,GAKpB,MAJAhK,MAAKgJ,MAAM,SAASA,GAChBA,EAAMc,UAAUC,EAAIC,KAGjBhK,MAUXiK,aAAc,SAASF,GAKnB,MAJA/J,MAAKgJ,MAAM,SAASA,GAChBA,EAAMiB,aAAaF,KAGhB/J,MASXkK,UAAW,SAASH,GAChB,MAAO/J,MAAKqF,QAAQ0E,IAYxBI,SAAU,SAASC,EAAOC,GAKtB,MAJArK,MAAKgJ,MAAM,SAASA,GAChBA,EAAMmB,SAASC,EAAOC,KAGnBrK,MAUXsK,YAAa,SAASP,GAKlB,MAJA/J,MAAKgJ,MAAM,SAASA,GAChBA,EAAMsB,YAAYP,KAGf/J,MASXob,SAAU,SAASrR,GACf,MAAO/J,MAAK6Y,QAAQ9O,IAWxBsR,iBAAkB,SAAStR,GACvB,GAAIK,GAAQpK,KAAKob,SAASrR,EAI1B,OAHIK,GAAMkR,MACNlR,EAAQpK,KAAKob,SAAShR,EAAMkR,MAEzBlR,GAGXG,UAAW,SAASH,EAAOI,GAKvB,MAJAxK,MAAKgJ,MAAM,SAASA,GAChBA,EAAMuB,UAAUH,EAAOI,KAGpBxK,MAGXyK,kBAAmB,SAASC,EAASC,EAASC,GAK1C,MAJA5K,MAAKgJ,MAAM,SAASA,GAChBA,EAAMyB,kBAAkBC,EAASC,EAASC,KAGvC5K,MASX6K,UAAW,SAAST,GAChB,MAAOpK,MAAKqb,iBAAiBjR,GAAOI,QAGxCU,kBAAmB,SAASd,EAAOW,EAAMC,GAKrC,MAJAhL,MAAKgJ,MAAM,SAASA,GAChBA,EAAMkC,kBAAkBd,EAAOW,EAAMC,KAGlChL,MAUXmL,kBAAmB,SAASf,EAAOW,GAC/B,MAAO/K,MAAKqb,iBAAiBjR,GAAOe,kBAAkBJ,IAG1DD,iBAAkB,SAASV,EAAOW,EAAMC,EAAOjE,GAK3C,MAJA/G,MAAKgJ,MAAM,SAASA,GAChBA,EAAM8B,iBAAiBV,EAAOW,EAAMC,EAAOjE,KAGxC/G,MAGXiL,iBAAkB,SAASb,EAAOW,EAAMhE,GACpC,MAAO/G,MAAKob,SAAShR,GAAOa,iBAAiBF,EAAMhE,IAGvD0B,WAAY,SAASK,EAAOJ,EAAQC,GAChC,GAAI4S,MACAhP,EAAQ,IAER7D,GAAO0B,QACP1B,EAAO0B,OAAUL,GAAIrB,EAAO0B,QAGhClL,KAAKsc,UAAUhc,OAAO+H,KAAKvH,KAAKqF,SAAU,SAAS0E,EAAIpB,GACnD,GAAIqB,GAAShK,KAAKqF,QAAQ0E,EAC1BC,GAAOvB,WAAWK,EAAOJ,EAAQ,SAASiL,EAAK8H,GACvCA,IAAQF,EAAWA,EAASG,OAAOD,IACnC9H,IAAKpH,EAAQoH,GACjBhL,OAENpE,KAAKvE,MAAO,WACV,MAAIuM,GAAc5D,EAAS4D,OAE3B5D,GAAS,KAAM4S,EACV/Q,OAAO,SAASmR,GACb,MAAuC5J,UAAhC/R,KAAK6Y,QAAQ8C,EAAQvR,QAC9B7F,KAAKvE,OACNkP,IAAI,SAASyM,GAEV,MADAA,GAAQvR,MAAQpK,KAAK6Y,QAAQ8C,EAAQvR,OAAOmQ,OACrCoB,GACTpX,KAAKvE,SACbuE,KAAKvE,QAGX4J,QAAS,WACL5J,KAAKyT,WAAW3F,UAGpB8N,cAAe,SAAS7R,GACpB/J,KAAKqF,QAAQ0E,GAAI6E,UAGrBtB,eAAgB,SAAS9J,GACrB,IAAK,GAAIuG,KAAM/J,MAAKqF,QAChBrF,KAAKqF,QAAQ0E,GAAIzF,OAAOd,IAIhCqG,eAAgB,WACZ,IAAK,GAAIE,KAAM/J,MAAKqF,QACZrF,KAAKqF,QAAQ0E,GAAI8R,eAAe7b,KAAKqF,QAAQ0E,GAAI8R,iBAI7DpS,oBAAqB,SAASwE,GAC1BjO,KAAKgI,KAAK,UAAYiG,EAAEC,KAAMhP,KAAK4G,QAAQkE,OAAQiE,EAAEE,QAASF,KAGlEtE,kBAAmB,SAASsE,GACxBjO,KAAKgI,KAAKiG,EAAEC,KAAMhP,KAAK4G,QAAQkE,OAAQiE,EAAEE,QAASF,KAKtD6N,kBAAmB,SAASpT,EAAQC,GAChC,GAAI0Q,GAASrZ,KAAKqZ,MACdA,GAAOvM,SACPnE,EAAS,MAAQ0Q,OAAQA,EAAOvH,KAAMiK,OAAQ1C,EAAO0C,SAErD1C,EAAOhV,GAAG,OAAQ,WACdsE,EAAS,MAAQ0Q,OAAQA,EAAOvH,KAAMiK,OAAQ1C,EAAO0C,YAKjEC,YAAa,SAAStT,EAAQC,GAC1B,GAAI0Q,GAASrZ,KAAKqZ,OACdb,EAAcxY,KAAKwY,WACnBa,GAAOvM,UACP0L,EAAYyD,UAAU5C,GACtBb,EAAY0D,SAASxT,EAAOyT,MAAOxT,IAEnC0Q,EAAOhV,GAAG,OAAQ,WACdmU,EAAYyD,UAAU5C,GACtBb,EAAY0D,SAASxT,EAAOyT,MAAOxT,MAK/CyT,aAAc,SAAS1T,EAAQC,GAC3B3I,KAAKuZ,YAAY8C,gBAAgB3T,EAAO4T,UAAW5T,EAAO6T,WAAY7T,EAAOsL,IAAKrL;;AqB3c1F,YAKA,SAASiR,YAAWlU,EAAOuD,GACvB,IAAKvD,EAAMiI,QACP,KAAM,IAAIwL,OAAM,4BAGpB,IAAInQ,GAAQxJ,OAAOsM,OAAO8N,WAAW3Z,UAErC+I,GAAMiyB,OAASv1B,EACfsD,EAAMmR,cAAe,EACrBnR,EAAMoR,kBAAmB,EACzBpR,EAAMkyB,kBACNlyB,EAAM2U,WACN3U,EAAMmyB,SAAU,EAEhBlyB,EAAKD,GAEDA,EAAMmR,cACNnR,EAAMiyB,OAAO9gB,eAGbnR,EAAMoR,kBACNpR,EAAMiyB,OAAO7gB,mBAGjB5a,OAAO+H,KAAKyB,EAAMkyB,gBAAgBhvB,QAAQ,SAASkvB,GAC/CpyB,EAAMiyB,OAAOrf,cAAcwf,KAG/BpyB,EAAM2U,QAAQzR,QAAQ,SAASyU,GAC3B3X,EAAMiyB,OAAOjzB,KAAK8Y,MAAM9X,EAAMiyB,OAAQta,KAGtC3X,EAAMmyB,SACNnyB,EAAMiyB,OAAOjzB,KAAK,UApC1B,GAAI+K,QAASzU,QAAQ,oBACjBub,WAAavb,QAAQ,gBAuCzBsb,YAAW3Z,WAEPkK,SAAU,SAASC,EAAOC,GACtB,GAAsC0H,SAAlC/R,KAAKi7B,OAAOpiB,QAAQzO,EAAML,IAC1B,KAAM,IAAIoP,OAAM,wCAmBpB,OAjBM/O,aAAiByP,cACnBzP,EAAQ,GAAIyP,YAAWzP,EAAOpK,KAAKi7B,OAAO7iB,WAAW2B,gBAEzD/Z,KAAKi7B,OAAOpiB,QAAQzO,EAAML,IAAMK,EAChCpK,KAAKi7B,OAAOniB,OAAOiF,OAAO1T,EAASrK,KAAKi7B,OAAOniB,OAAOgF,QAAQzT,GAAUuK,EAAAA,EAAU,EAAGxK,EAAML,IAC3FK,EAAM4P,gBACN5P,EAAM6P,iBAAiBja,KAAKi7B,OAAOpiB,SACnCzO,EAAM8P,eAENla,KAAKma,cAAe,EACpBna,KAAKoa,kBAAmB,EACpBhQ,EAAMJ,SACNhK,KAAKk7B,eAAe9wB,EAAMJ,SAAU,GAExChK,KAAK2d,QAAQ3M,MAAM,aAAc5G,MAAOA,KACxCpK,KAAKm7B,SAAU,EAERn7B,MAGXsK,YAAa,SAASP,GAClB,GAAIK,GAAQpK,KAAKi7B,OAAOpiB,QAAQ9O,EAChC,IAAcgI,SAAV3H,EACA,KAAM,IAAI+O,OAAM,iCAEpB,KAAK,GAAIhS,KAAKnH,MAAKi7B,OAAOpiB,QAClB7Y,KAAKi7B,OAAOpiB,QAAQ1R,GAAGmU,MAAQvR,GAC/B/J,KAAKsK,YAAYnD,EAWzB,cAROnH,MAAKi7B,OAAOpiB,QAAQ9O,GAC3B/J,KAAKi7B,OAAOniB,OAAOiF,OAAO/d,KAAKi7B,OAAOniB,OAAOgF,QAAQ/T,GAAK,GAE1D/J,KAAKma,cAAe,EACpBna,KAAKoa,kBAAmB,EACxBpa,KAAK2d,QAAQ3M,MAAM,gBAAiB5G,MAAOA,KAC3CpK,KAAKm7B,SAAU,EAERn7B,MAGX8K,iBAAkB,SAASV,EAAOW,EAAMC,EAAOjE,GAI3C,MAHA/G,MAAKi7B,OAAO7f,SAAShR,GAAOU,iBAAiBC,EAAMC,EAAOjE,GAC1D/G,KAAKm7B,SAAU,EAERn7B,MAGXkL,kBAAmB,SAASd,EAAOW,EAAMC,GAUrC,MATAZ,GAAQpK,KAAKi7B,OAAO5f,iBAAiBjR,GACrCA,EAAMc,kBAAkBH,EAAMC,GAE9BhL,KAAKoa,kBAAmB,EACpBhQ,EAAMJ,SACNhK,KAAKk7B,eAAe9wB,EAAMJ,SAAU,GAExChK,KAAKm7B,SAAU,EAERn7B,MAGXuK,UAAW,SAASH,EAAOI,GAUvB,MATAJ,GAAQpK,KAAKi7B,OAAO5f,iBAAiBjR,GACrCA,EAAMI,OAASA,EAEfxK,KAAKoa,kBAAmB,EACpBhQ,EAAMJ,SACNhK,KAAKk7B,eAAe9wB,EAAMJ,SAAU,GAExChK,KAAKm7B,SAAU,EAERn7B,MAGXyK,kBAAmB,SAASC,EAASC,EAASC,GAC1C,GAAIR,GAAQpK,KAAKi7B,OAAO5f,iBAAiB3Q,EAczC,OAbe,OAAXC,IACFP,EAAMO,QAAUA,GAEH,MAAXC,IACFR,EAAMQ,QAAUA,GAGlB5K,KAAKoa,kBAAmB,EACpBhQ,EAAMJ,SACNhK,KAAKk7B,eAAe9wB,EAAMJ,SAAU,GAExChK,KAAKm7B,SAAU,EAERn7B,MAGX8J,UAAW,SAASC,EAAIC,GACpB,IAAKhK,KAAKi7B,OAAOttB,QACb,KAAM,IAAIwL,OAAM,4BAEpB,IAAgCpH,SAA5B/R,KAAKi7B,OAAO51B,QAAQ0E,GACpB,KAAM,IAAIoP,OAAM,yCAoBpB,OAlBAnP,GAAS+I,OAAOjH,OAAO9B,GACvBhK,KAAKi7B,OAAO51B,QAAQ0E,GAAMC,EAC1BA,EAAOD,GAAKA,EACZC,EAAOtE,MAAQ1F,KAAKi7B,OACpBjxB,EAAOyJ,WAAazT,KAAKi7B,OAAOxnB,WAChCzJ,EAAOoK,WAAapU,KAAKi7B,OAAO7mB,WAChCpK,EACK3F,GAAG,OAAQrE,KAAKi7B,OAAOxxB,qBACvBpF,GAAG,QAASrE,KAAKi7B,OAAOxxB,qBACxBpF,GAAG,SAAUrE,KAAKi7B,OAAOxxB,qBACzBpF,GAAG,WAAYrE,KAAKi7B,OAAOtxB,mBAC3BtF,GAAG,YAAarE,KAAKi7B,OAAOtxB,mBAC5BtF,GAAG,aAAcrE,KAAKi7B,OAAOtxB,mBAC7BtF,GAAG,cAAerE,KAAKi7B,OAAOtxB,mBAEnC3J,KAAK2d,QAAQ3M,MAAM,cAAehH,OAAQA,KAC1ChK,KAAKm7B,SAAU,EAERn7B,MAGXiK,aAAc,SAASF,GACnB,GAAgCgI,SAA5B/R,KAAKi7B,OAAO51B,QAAQ0E,GACpB,KAAM,IAAIoP,OAAM,kCAEpB,IAAInP,GAAShK,KAAKi7B,OAAO51B,QAAQ0E,EAcjC,cAbO/J,MAAKi7B,OAAO51B,QAAQ0E,GAC3BC,EACKd,IAAI,OAAQlJ,KAAKi7B,OAAOxxB,qBACxBP,IAAI,QAASlJ,KAAKi7B,OAAOxxB,qBACzBP,IAAI,SAAUlJ,KAAKi7B,OAAOxxB,qBAC1BP,IAAI,WAAYlJ,KAAKi7B,OAAOtxB,mBAC5BT,IAAI,YAAalJ,KAAKi7B,OAAOtxB,mBAC7BT,IAAI,aAAclJ,KAAKi7B,OAAOtxB,mBAC9BT,IAAI,cAAelJ,KAAKi7B,OAAOtxB,mBAEpC3J,KAAK2d,QAAQ3M,MAAM,iBAAkBhH,OAAQA,KAC7ChK,KAAKm7B,SAAU,EAERn7B,OAIf7B,OAAOC,QAAUwb;;A2B9LjB,YAEA,IAAI1a,MAAOZ,QAAQ,eAEnBF,SAAQw+B,QAAU,SAAS5xB,EAAO+O,GAC9B,QAAS6iB,GAAQ5xB,GACb,MAAwB,gBAAVA,IAAmC,MAAbA,EAAM,GAAa+O,EAAU/O,GAASA,EAG9E,GAAI7D,EAIJ,IAFA6D,EAAQ4xB,EAAQ5xB,GAEZtI,MAAMC,QAAQqI,GAGd,IAFAA,EAAQA,EAAMoT,QAETjX,EAAI,EAAGA,EAAI6D,EAAM5D,OAAQD,IACtB6D,EAAM7D,IAAM4S,KACZ/O,EAAM7D,GAAKy1B,EAAQ5xB,EAAM7D,IAKrC,IAAI6D,EAAMguC,MAIN,IAHAhuC,EAAQ9L,KAAK4G,UAAWkF,GACxBA,EAAMguC,MAAQhuC,EAAMguC,MAAM56B,QAErBjX,EAAI,EAAGA,EAAI6D,EAAMguC,MAAM5xC,OAAQD,IAC5B6D,EAAMguC,MAAM7xC,GAAG,IAAM4S,KACrB/O,EAAMguC,MAAM7xC,IACR6D,EAAMguC,MAAM7xC,GAAG,GACfy1B,EAAQ5xB,EAAMguC,MAAM7xC,GAAG,KAMvC,OAAO6D,IAGX5M,QAAQu+B,WAAa,SAAUtc,EAAYtG,GACvC,IAAKA,EACD,MAAOsG,EAEX,IAAI5E,KAEJ,KAAK,GAAI9J,KAAO0O,GACZ5E,EAAO9J,GAAOvT,QAAQw+B,QAAQvc,EAAW1O,GAAMoI,EAGnD,OAAO0B;;AqClDX,YAQA,SAASq+B,kBAAiBL,EAAWzuC,GACjChL,KAAKkO,KAAOurC,EAAUvrC,KACtBlO,KAAKk5C,eAAiBO,EAAUrrC,WAGhCpO,KAAKua,KAAOgM,KAAKswC,UAAU7rD,GAET,UAAdhL,KAAKkO,KACLlO,KAAKgL,MAAQA,EACNA,EAAMguC,MACbh5C,KAAKgL,MAAQ0xD,qBAAqB1xD,GAElChL,KAAKgL,MAAQ2xD,WAAW3xD,GAGD,iBAAvByuC,EAAAA,YACAz5C,KAAKq5C,UAAYujB,iBAAiBC,aAAa78D,KAAKgL,QAEpDhL,KAAKq5C,UAAYujB,iBAAiB,sBAAsB58D,KAAKgL,OACzDyuC,EAAUrrC,aACVpO,KAAKq5C,UAAYyjB,aAAa98D,KAAKq5C,aAK/C,QAASyjB,cAAazjB,GAClB,MAAO,UAASvlC,EAAGgH,EAAI2Y,GACnB,GAIIspC,GAAKnpC,EAAMC,EAJXmpC,EAAWlpD,EAAI,EACfyK,EAAI7c,KAAKgU,KAAKwF,KAAKC,MAAQL,EAAGE,qBAAuByY,EAAU,GAC/DoK,EAAY,EACZC,EAAU,CAed,OAZIhqB,GAAIgH,EAAGC,iBACPgiD,EAAMC,GAAY,EAAIA,GAAYz+C,EAClCsf,GAAa,EACbjK,EAAOylB,EAAUvlC,EAAI,GACrB+f,EAAKwlB,EAAUvlC,KAEfipD,EAAM,GAAK,EAAIx+C,GAAKy+C,EACpBnpC,EAAKwlB,EAAUvlC,GACf8f,EAAOylB,EAAUvlC,EAAI,GACrB+pB,GAAa,IAIbjK,KAAMA,EACNiK,UAAWA,EACXhK,GAAIA,EACJiK,QAASA,EACTvf,EAAGw+C,IAOf,QAASJ,YAAW3xD,GAChB,GAAIiyD,WAAWjyD,GAAQ,MAAOiyD,YAAWjyD,EACzC,IAAI8wB,GAAQohC,aAAa7iB,cAAcrvC,GAEvC,OADAiyD,YAAWjyD,GAAS8wB,EACbA,EAGX,QAASohC,cAAajmD,GAClB,OAAQA,EAAE,GAAK,IAAKA,EAAE,GAAK,IAAKA,EAAE,GAAK,IAAKA,EAAE,GAAK,GAGvD,QAASylD,sBAAqB1uB,GAC1B,MAAO9uC,MAAK4G,UAAWkoC,GAAIgL,MAAOhL,EAAEgL,MAAM9pC,IAAI,SAASvK,GACnD,OAAQA,EAAK,GAAIg4D,WAAWh4D,EAAK,SA5EzC,GAAI01C,eAAgB/7C,QAAQ,kBAAkB+7C,cAC1CuiB,iBAAmBt+D,QAAQ,sBAC3BY,KAAOZ,QAAQ,eAEnBH,QAAOC,QAAU07C,gBAyDjB,IAAImjB;;AnC/DJ,YAiBA,SAASzjB,iBAAgBC,GACrB,QAASld,GAAoBlc,EAAYtG,GACrC/Z,KAAK05C,WACL15C,KAAK25C,gBAEL35C,KAAKs7B,WAAavhB,CAElB,KAAK,GAAItZ,KAAK4f,GACVrgB,KAAKS,GAAK47B,cAAcO,QAAQvc,EAAW5f,GAAIT,KAAKs7B,YAsD5D,MAlDA97B,QAAO+H,KAAKkyC,GAAWvtC,QAAQ,SAASzL,GACpC,GAAIm5C,GAAWH,EAAUh5C,EAEzBjB,QAAOC,eAAe88B,EAAoBt8B,UAAWQ,GACjDb,IAAK,SAASi6C,GACV75C,KAAK05C,QAAQj5C,GAAK,GAAIq5C,kBAAiBF,EAAUvd,cAAcO,QAAQid,EAAG75C,KAAKs7B,cAEnF57B,IAAK,WACD,MAAOM,MAAK05C,QAAQj5C,GAAGuK,SAI3B4uC,EAASxrC,YACT5O,OAAOC,eAAe88B,EAAoBt8B,UAAWQ,EAAI,eACrDb,IAAK,SAASi6C,GACV75C,KAAK25C,aAAal5C,GAAKo5C,GAE3Bn6C,IAAK,WACD,MAAOM,MAAK25C,aAAal5C,QAMzC87B,EAAoBt8B,UAAU+8B,OAAS,WACnC,MAAOh9B,MAAK05C,SAGhBnd,EAAoBt8B,UAAUmO,WAAa,SAAS3N,EAAGs5C,GACnD,GAAIx7B,GAAIve,KAAK25C,aAAal5C,MAC1B,QACIgzB,SAAUv0B,KAAKmgB,SAASd,EAAEkV,SAAUsmB,EAAOtmB,SAAU,KACrD2lB,MAAOl6C,KAAKmgB,SAASd,EAAE66B,MAAOW,EAAOX,MAAO,KAIpD7c,EAAoBt8B,UAAUsa,KAAO,WACjC,GAAIkB,KAEJ,KAAK,GAAIo+B,KAAK75C,MAAK05C,QACfj+B,EAAOo+B,GAAK75C,KAAK05C,QAAQG,GAAG7uC,KAGhC,KAAK,GAAIuT,KAAKve,MAAK25C,aACfl+B,EAAO8C,EAAI,eAAiBve,KAAK25C,aAAaE,EAGlD,OAAOp+B,IAGJ8gB,EA7EX,GAAIr9B,MAAOZ,QAAQ,gBACfm7C,UAAYn7C,QAAQ,eACpB+9B,cAAgB/9B,QAAQ,oBACxBw7C,iBAAmBx7C,QAAQ,uBAE3B07C,QACAvc,SACAf,UAGJ+c,WAAUrvC,MAAM8D,KAAK8uB,OAAO9wB,QAAQ,SAASgC,GACzC8rC,OAAOvc,MAAMvvB,GAAQsrC,gBAAgBC,UAAU,SAAWvrC,IAC1D8rC,OAAOtd,OAAOxuB,GAAQsrC,gBAAgBC,UAAU,UAAYvrC,MAoEhE/P,OAAOC,QAAU,SAAS67C,EAAYC,EAAW75B,EAAYtG,GACzD,MAAO,IAAIigC,QAAOC,GAAYC,GAAW75B,EAAYtG;;A5BnFzD,YAWA,SAASF,YAAWzP,EAAO2P,GACvB/Z,KAAKq7B,OAASjxB,EACdpK,KAAKs7B,WAAavhB,EAElB/Z,KAAK+J,GAAKK,EAAML,GAChB/J,KAAKsb,IAAMlR,EAAMkR,IAGjBtb,KAAKu7B,aACLv7B,KAAKw7B,aAELx7B,KAAKy7B,OAAOrxB,GAwJhB,QAASsxB,kBAAiBtxB,EAAO8D,GAC7B,GAAIytB,GAAYztB,EAAO,SACnB0tB,EAAW1tB,EAAO,cAClB2tB,EAAc3tB,EAAO,iBACrB4tB,EAAQ1xB,EAAMuxB,GACdI,EAAY3xB,EAAMwxB,GAClBI,EAAe5xB,EAAMyxB,GACrBI,EAAU7xB,EAAM8D,EAAO,YAEvBguB,EAAeJ,GAAUG,EAAUH,EAAM,GACzCK,EAAcJ,GAAcE,EAAUF,EAAU,GAChDK,EAAiBJ,GAAiBC,EAAUD,EAAa,EAExCjqB,UAAjBmqB,GAA6C,EAAfA,IAC9B9xB,EAAMuxB,GAAaz8B,KAAK+f,aAAa6c,EAAM,GAAIA,EAAM,GAAIA,EAAM,GAAII,KAEnDnqB,SAAhBoqB,GAA2C,EAAdA,IAC7B/xB,EAAMwxB,GAAY18B,KAAK+f,aAAa8c,EAAU,GAAIA,EAAU,GAAIA,EAAU,GAAII,KAE3DpqB,SAAnBqqB,GAAiD,EAAjBA,IAChChyB,EAAMyxB,GAAe38B,KAAK+f,aAAa+c,EAAa,GAAIA,EAAa,GAAIA,EAAa,GAAII,KAhMlG,GAAIl9B,MAAOZ,QAAQ,gBACf+9B,cAAgB/9B,QAAQ,oBACxBg+B,gBAAkBh+B,QAAQ,sBAC1Bi+B,oBAAsBj+B,QAAQ,2BAC9Bk+B,iBAAmBl+B,QAAQ,uBAC3Bm+B,gBAAkBn+B,QAAQ,qBAE9BH,QAAOC,QAAUyb,WAgBjBA,WAAW5Z,WACP+Z,cAAe,WACNha,KAAKsb,MACNtb,KAAK08B,OAAS,GAAIF,kBAAiBx8B,KAAKkO,MACpCmuB,cAAcM,WAAW38B,KAAKq7B,OAAOqB,OAAQ18B,KAAKs7B,aAEd,SAApCt7B,KAAK08B,OAAO,sBACP18B,KAAK08B,OAAOvb,eAAe,6BAC5BnhB,KAAK08B,OAAO,2BAA6B,OAExC18B,KAAK08B,OAAOvb,eAAe,6BAC5BnhB,KAAK08B,OAAO,2BAA6B,OAE7C18B,KAAK08B,OAAO,uBAAwB,KAKhDxxB,kBAAmB,SAASH,EAAMC,GAC9BhL,KAAK08B,OAAO3xB,GAAQsxB,cAAcO,QAAQ5xB,EAAOhL,KAAKs7B,aAG1DnwB,kBAAmB,SAASJ,GACxB,MAAO/K,MAAK08B,OAAO3xB,IAGvBkP,iBAAkB,SAASjD,GACnBhX,KAAKsb,KACLtb,KAAKy7B,OAAOzkB,EAAOhX,KAAKsb,OAIhCpB,aAAc,WACV,IAAK,GAAI9Z,KAAKJ,MAAKq7B,OAAQ,CACvB,GAAIwB,GAAQz8B,EAAEy8B,MAAM,qBACfA,KAEL78B,KAAKu7B,UAAUsB,EAAM,IAAM,IACvB,GAAIN,qBAAoB,QAASv8B,KAAKkO,KAAMlO,KAAKq7B,OAAOj7B,GAAIJ,KAAKs7B,eAI7ExwB,iBAAkB,SAASC,EAAMC,EAAOjE,GACpC,GAAI+1B,GAAe98B,KAAKu7B,UAAUx0B,GAAS,GACtC+1B,KACDA,EAAe98B,KAAKu7B,UAAUx0B,GAAS,IACnC,GAAIw1B,qBAAoB,QAASv8B,KAAKkO,QAAUlO,KAAKs7B,aAE7DwB,EAAa/xB,GAAQC,GAGzBC,iBAAkB,SAASF,EAAMhE,GAC7B,GAAI+1B,GAAe98B,KAAKu7B,UAAUx0B,GAAS,GAC3C,OAAK+1B,GAEEA,EAAa/xB,GADTgH,QAIf0I,QAAS,SAASjV,EAASnC,EAAS05B,EAAax5B,GAC7C,IAAK,GAAIwD,KAAS/G,MAAKu7B,UACnB,GAAc,KAAVx0B,GAAiBvB,EAAQuB,GAA7B,CAGA,GAAI+1B,GAAe98B,KAAKu7B,UAAUx0B,GAC9Bi2B,EAASF,EAAaE,QAE1B,KAAK,GAAIv8B,KAAKu8B,GAAQ,CAClB,GAAIC,GAAiBD,EAAOv8B,GACxBy8B,EAAgB75B,EAAQ+K,WAAapO,KAAKw7B,UAAU/6B,GAAKsR,MAG7D,KAAKmrB,GAAiBA,EAAcC,YAAY5iB,OAAS0iB,EAAe1iB,KAAM,CAC1E,GAAI6iB,GAAgBN,EAAa1uB,WAAW3N,EAAGs8B,GAC3CM,EAAgBr9B,KAAKw7B,UAAU/6B,GAC/B,GAAI67B,iBAAgBW,EAAgBC,EAAeE,EAGlDC,GAAcC,YACfD,EAAc1oB,OAASpR,EAAc3D,IAAIy9B,EAAcE,SAAU,GAAKriB,OAAQiN,YAG9E+U,GACA35B,EAAcsR,OAAOqoB,EAAcvoB,YAOvDiG,YAAa,SAAS9G,EAAGkF,GACrB,GAAI9K,GAAOlO,KAAKkO,KACZsvB,EAAax9B,KAAKy9B,MAAQ,GAAIhB,iBAAgBvuB,EAElD,KAAK,GAAIzN,KAAKT,MAAKw7B,UACfgC,EAAW/8B,GAAKT,KAAKw7B,UAAU/6B,GAAGi9B,GAAG5pB,EAAGkF,EAuB5C,IApBAhZ,KAAK2sB,OAAU3sB,KAAK2K,SAAWmJ,EAAI9T,KAAK2K,SACzB3K,KAAK4K,SAAWkJ,GAAK9T,KAAK4K,SAEC,SAA3B5K,KAAK08B,OAAOiB,WAEd,WAATzvB,EACoC,IAA/BsvB,EAAW,iBAA0Bx9B,KAAK08B,OAAO,eAClB,IAA/Bc,EAAW,iBAA0Bx9B,KAAK08B,OAAO,eAGlDhB,iBAAiB8B,EAAY,QAC7B9B,iBAAiB8B,EAAY,SAH7Bx9B,KAAK2sB,QAAS,EAMuB,IAAlC6Q,EAAWtvB,EAAO,YACzBlO,KAAK2sB,QAAS,EAEd+O,iBAAiB8B,EAAYtvB,GAG7BlO,KAAKw7B,UAAU,kBAAmB,CAGlC,GAAIoC,GAAYJ,EAAW,kBACvBtZ,EAAYlkB,KAAKw7B,UAAU,cAC3Bx7B,KAAKw7B,UAAU,cAAckC,GAAGh8B,KAAKqU,MAAMjC,GAAIc,EAAAA,GAC/C4oB,EAAW,aAEfI,GAAUC,WAAa3Z,EACvB0Z,EAAUE,SAAW5Z,EAGzB,OAAQlkB,KAAK2sB,QAGjB8O,OAAQ,SAASrxB,GACblL,KAAK4G,OAAO9F,KAAMd,KAAKkhB,KAAKhW,GACvB,OAAQ,SAAU,eACnB,UAAW,UAAW,SACtB,aAGRmQ,KAAM,WACF,MAAOrb,MAAK4G,UACR9F,KAAKq7B,OACLn8B,KAAKkhB,KAAKpgB,MACL,OAAQ,SAAU,eACnB,UAAW,UAAW,SACtB,SAAU;;A2B1K1B,YAUA,SAASs8B,iBAAgBa,EAAaD,EAAelyB,GAEjDhL,KAAKm9B,YAAcA,EACnBn9B,KAAKi5C,UAAYj5C,KAAKu9B,SAAU,GAAKriB,OAAQiN,SAE7C,IAAIja,GAAOivB,EAAYjvB,IACT,YAATA,GAA8B,UAATA,IAAqBivB,EAAY+b,eAGvDl5C,KAAK+tB,OAASuF,YAAYplB,GAF1BlO,KAAK+tB,OAASorB,uBAKlBn5C,KAAKk9B,cAAgBA,EACrBl9B,KAAKyzB,SAAWzoB,EAAMyoB,UAAY,EAClCzzB,KAAKo5C,MAAQpuC,EAAMouC,OAAS,EAEvBp5C,KAAKs9B,YACNt9B,KAAKu9B,QAAUv9B,KAAKi5C,UAAYj5C,KAAKyzB,SAAWzzB,KAAKo5C,MACrDp5C,KAAKgf,KAAO9f,KAAKof,gBAGjB4e,GAAiBA,EAAcK,SAAWv9B,KAAKi5C,iBAIxC/b,GAAcA,cA6B7B,QAASic,wBAAuBvlB,EAAMC,EAAItV,GACtC,OACIqV,KAAMA,EAAKC,GACXgK,UAAWjK,EAAKkK,QAChBjK,GAAIA,EAAGA,GACPiK,QAASjK,EAAGiK,QACZvf,EAAGA,GApEX,GAAIrf,MAAOZ,QAAQ,gBACfg1B,YAAch1B,QAAQ,sBAE1BH,QAAOC,QAAUk+B,gBAkCjBA,gBAAgBr8B,UAAUq9B,QAAU,WAChC,OAAQt9B,KAAKk9B,gBAAkBl9B,KAAK+tB,QAA6B,IAAlB/tB,KAAKyzB,UAAiC,IAAfzzB,KAAKo5C,OAM/E9c,gBAAgBr8B,UAAUy9B,GAAK,SAAS5pB,EAAGkF,EAAauF,GAEpD,GAAIvT,GAAQhL,KAAKm9B,YAAYkc,UAAUvlC,EAAGkF,EAAahZ,KAAKyzB,SAE5D,IAAIzzB,KAAKs9B,UAAW,MAAOtyB,EAI3B,IAFAuT,EAAIA,GAAKrD,KAAKC,MAEVoD,EAAIve,KAAKu9B,QAAS,CAClB,GAAI+b,GAAWt5C,KAAKk9B,cAAcQ,GAAG5pB,EAAGkF,EAAahZ,KAAKi5C,WACtDM,EAAQv5C,KAAKgf,MAAMT,EAAIve,KAAKi5C,UAAYj5C,KAAKo5C,OAASp5C,KAAKyzB,SAC/DzoB,GAAQhL,KAAK+tB,OAAOurB,EAAUtuC,EAAOuuC,GAGzC,MAAOvuC;;A0E5DX,YAMA,SAASqzE,QAAOv+E,EAAGC,EAAGkC,EAAOulF,GACzBxnF,KAAKF,EAAIA,EACTE,KAAKD,EAAIA,EACTC,KAAKiC,MAAQA,EAEG8P,SAAZy1E,IACAxnF,KAAKwnF,QAAUA,GAVvB,GAAIxoF,OAAQV,QAAQ,iBAEpBH,QAAOC,QAAUigF,OAYjBA,OAAOp+E,UAAYT,OAAOsM,OAAO9M,MAAMiB,WAEvCo+E,OAAOp+E,UAAUC,MAAQ,WACrB,MAAO,IAAIm+E,QAAOr+E,KAAKF,EAAGE,KAAKD,EAAGC,KAAKiC,MAAOjC,KAAKwnF;;ArEnBvD,YAGA,SAAS3nD,SAAQr4B,EAAOC,GACpBzH,KAAKwH,MAAQA,EACbxH,KAAKyH,OAASA,EACdzH,KAAKihC,OAAUnhC,EAAG,EAAGC,EAAG,EAAGu2B,EAAG9uB,EAAO24B,EAAG14B,IAJ5CtJ,OAAOC,QAAUyhC,QAajBA,QAAQ5/B,UAAUogC,QAAU,SAASzB,GACjC,IAAK,GAAIz3B,GAAI,EAAGA,EAAInH,KAAKihC,KAAK75B,OAAQD,IAAK,CACvC,GAAI85B,GAAOjhC,KAAKihC,KAAK95B,EAErB,IAAI85B,EAAKlhC,IAAM6+B,EAAK7+B,GAAKkhC,EAAKd,IAAMvB,EAAKuB,GAAKc,EAAKnhC,EAAImhC,EAAK3K,IAAMsI,EAAK9+B,EACnEmhC,EAAK3K,GAAKsI,EAAKtI,MAEZ,IAAI2K,EAAKnhC,IAAM8+B,EAAK9+B,GAAKmhC,EAAK3K,IAAMsI,EAAKtI,GAAK2K,EAAKlhC,EAAIkhC,EAAKd,IAAMvB,EAAK7+B,EAC1EkhC,EAAKd,GAAKvB,EAAKuB,MAEZ,IAAIvB,EAAK7+B,IAAMkhC,EAAKlhC,GAAK6+B,EAAKuB,IAAMc,EAAKd,GAAKvB,EAAK9+B,EAAI8+B,EAAKtI,IAAM2K,EAAKnhC,EAC1EmhC,EAAKnhC,EAAI8+B,EAAK9+B,EACdmhC,EAAK3K,GAAKsI,EAAKtI,MAEZ,CAAA,GAAIsI,EAAK9+B,IAAMmhC,EAAKnhC,GAAK8+B,EAAKtI,IAAM2K,EAAK3K,GAAKsI,EAAK7+B,EAAI6+B,EAAKuB,IAAMc,EAAKlhC,EAIvE,QAHHkhC,GAAKlhC,EAAI6+B,EAAK7+B,EACdkhC,EAAKd,GAAKvB,EAAKuB,EAMnB,MAFAngC,MAAKihC,KAAKljB,OAAO5W,EAAG,OACpBnH,MAAKqgC,QAAQY,GAIjBjhC,KAAKihC,KAAKjwB,KAAK4tB,IAGnBiB,QAAQ5/B,UAAU2gC,SAAW,SAASp5B,EAAOC,GAIzC,IAAK,GAFDm3B,IAAS9+B,EAAG8U,EAAAA,EAAU7U,EAAG6U,EAAAA,EAAU0hB,EAAG1hB,EAAAA,EAAUurB,EAAGvrB,EAAAA,GACnDumC,EAAW,GACNh0C,EAAI,EAAGA,EAAInH,KAAKihC,KAAK75B,OAAQD,IAAK,CACvC,GAAImU,GAAMtb,KAAKihC,KAAK95B,EAChBK,IAAS8T,EAAIgb,GAAK7uB,GAAU6T,EAAI6kB,GAAK7kB,EAAIvb,GAAK6+B,EAAK7+B,GAAKub,EAAIxb,GAAK8+B,EAAK9+B,IACtE8+B,EAAOtjB,EACP6/B,EAAWh0C,GAInB,MAAe,GAAXg0C,GAESr7C,EAAG,GAAIC,EAAG,KAGvBC,KAAKihC,KAAKljB,OAAOo9B,EAAU,GAMvBvc,EAAKtI,EAAIsI,EAAKuB,GAKVvB,EAAKtI,EAAI9uB,GAAOxH,KAAKihC,KAAKjwB,MAAOlR,EAAG8+B,EAAK9+B,EAAI0H,EAAOzH,EAAG6+B,EAAK7+B,EAAGu2B,EAAGsI,EAAKtI,EAAI9uB,EAAO24B,EAAG14B,IACrFm3B,EAAKuB,EAAI14B,GAAQzH,KAAKihC,KAAKjwB,MAAOlR,EAAG8+B,EAAK9+B,EAAGC,EAAG6+B,EAAK7+B,EAAI0H,EAAQ6uB,EAAGsI,EAAKtI,EAAG6J,EAAGvB,EAAKuB,EAAI14B,MAMxFm3B,EAAKtI,EAAI9uB,GAAOxH,KAAKihC,KAAKjwB,MAAOlR,EAAG8+B,EAAK9+B,EAAI0H,EAAOzH,EAAG6+B,EAAK7+B,EAAGu2B,EAAGsI,EAAKtI,EAAI9uB,EAAO24B,EAAGvB,EAAKuB,IAC1FvB,EAAKuB,EAAI14B,GAAQzH,KAAKihC,KAAKjwB,MAAOlR,EAAG8+B,EAAK9+B,EAAGC,EAAG6+B,EAAK7+B,EAAI0H,EAAQ6uB,EAAG9uB,EAAO24B,EAAGvB,EAAKuB,EAAI14B,MAGtF3H,EAAG8+B,EAAK9+B,EAAGC,EAAG6+B,EAAK7+B,EAAGu2B,EAAG9uB,EAAO24B,EAAG14B;;A+ElFhD,YAiBA,SAAS0gF,eAAc97D,EAAMtb,EAAQ62E,EAAaqF,EAAYxF,GAG1D,GAAuB11E,SAAnBhB,EAAOy2E,QAAuB,OAAO,CAOzC,KALA,GAAIpnF,GAAI2Q,EACJ+uB,EAAQ/uB,EAAOy2E,QAAU,EACzBmF,EAAiB,EAGdA,GAAkB/E,EAAc,GAAG,CAItC,GAHA9nD,IAGY,EAARA,EAAW,OAAO,CAEtB6sD,IAAkBtgE,EAAKyT,GAAOj+B,KAAKzB,GACnCA,EAAIisB,EAAKyT,GAGb6sD,GAAkBtgE,EAAKyT,GAAOj+B,KAAKwqB,EAAKyT,EAAQ,IAChDA,GAOA,KAJA,GAAIotD,MACAC,EAAmB,EAGCvF,EAAc,EAA/B+E,GAAkC,CACrC,GAAInwB,GAAOnwC,EAAKyT,EAAQ,GACpB68C,EAAUtwD,EAAKyT,GACf4K,EAAOre,EAAKyT,EAAQ,EAGxB,KAAK4K,EAAM,OAAO,CAElB,IAAI0iD,GAAa5wB,EAAKr6D,QAAQw6E,GAAWA,EAAQx6E,QAAQuoC,EAWzD,KATA0iD,GAAeA,EAAa,EAAI1rF,KAAK+hB,KAAiB,EAAV/hB,KAAK+hB,IAAW/hB,KAAK+hB,GAEjEypE,EAAcl8E,MACVkhD,SAAUy6B,EACVS,WAAYA,IAEhBD,GAAoBC,EAGbT,EAAiBO,EAAc,GAAGh7B,SAAW+6B,GAChDE,GAAoBD,EAAc5hD,QAAQ8hD,UAI9C,IAAI1rF,KAAK8yB,IAAI24D,GAAoB1F,EAAU,OAAO,CAElD3nD,KACA6sD,GAAkBhQ,EAAQ96E,KAAK6oC,GAInC,OAAO,EA1EXvsC,OAAOC,QAAU+pF;;AFFjB,YAiBA,SAASpJ,UAAS/K,EAAOzjD,EAAIE,EAAIS,EAAInC,GAGjC,IAAK,GAFDi9D,MAEKt5B,EAAI,EAAGA,EAAIshB,EAAM5sE,OAAQsrD,IAI9B,IAAK,GAFDu5B,GADA5/D,EAAO2nD,EAAMthB,GAGRvrD,EAAI,EAAGA,EAAIklB,EAAKjlB,OAAS,EAAGD,IAAK,CACtC,GAAI41C,GAAK1wB,EAAKllB,GACV61C,EAAK3wB,EAAKllB,EAAI,EAGd41C,GAAGj9C,EAAIywB,GAAMysB,EAAGl9C,EAAIywB,IAEbwsB,EAAGj9C,EAAIywB,EACdwsB,EAAK,GAAI/9C,OAAMuxB,EAAIwsB,EAAGh9C,GAAKi9C,EAAGj9C,EAAIg9C,EAAGh9C,KAAOwwB,EAAKwsB,EAAGj9C,IAAMk9C,EAAGl9C,EAAIi9C,EAAGj9C,KAC7Dk9C,EAAGl9C,EAAIywB,IACdysB,EAAK,GAAIh+C,OAAMuxB,EAAIwsB,EAAGh9C,GAAKi9C,EAAGj9C,EAAIg9C,EAAGh9C,KAAOwwB,EAAKwsB,EAAGj9C,IAAMk9C,EAAGl9C,EAAIi9C,EAAGj9C,MAGpEi9C,EAAGh9C,EAAI0wB,GAAMusB,EAAGj9C,EAAI0wB,IAEbssB,EAAGh9C,EAAI0wB,EACdssB,EAAK,GAAI/9C,OAAM+9C,EAAGj9C,GAAKk9C,EAAGl9C,EAAIi9C,EAAGj9C,KAAO2wB,EAAKssB,EAAGh9C,IAAMi9C,EAAGj9C,EAAIg9C,EAAGh9C,IAAK0wB,GAC9DusB,EAAGj9C,EAAI0wB,IACdusB,EAAK,GAAIh+C,OAAM+9C,EAAGj9C,GAAKk9C,EAAGl9C,EAAIi9C,EAAGj9C,KAAO2wB,EAAKssB,EAAGh9C,IAAMi9C,EAAGj9C,EAAIg9C,EAAGh9C,IAAK0wB,IAGrEssB,EAAGj9C,GAAKoxB,GAAM8rB,EAAGl9C,GAAKoxB,IAEf6rB,EAAGj9C,GAAKoxB,EACf6rB,EAAK,GAAI/9C,OAAMkyB,EAAI6rB,EAAGh9C,GAAKi9C,EAAGj9C,EAAIg9C,EAAGh9C,KAAOmxB,EAAK6rB,EAAGj9C,IAAMk9C,EAAGl9C,EAAIi9C,EAAGj9C,KAC7Dk9C,EAAGl9C,GAAKoxB,IACf8rB,EAAK,GAAIh+C,OAAMkyB,EAAI6rB,EAAGh9C,GAAKi9C,EAAGj9C,EAAIg9C,EAAGh9C,KAAOmxB,EAAK6rB,EAAGj9C,IAAMk9C,EAAGl9C,EAAIi9C,EAAGj9C,MAGpEi9C,EAAGh9C,GAAKgvB,GAAMiuB,EAAGj9C,GAAKgvB,IAEfguB,EAAGh9C,GAAKgvB,EACfguB,EAAK,GAAI/9C,OAAM+9C,EAAGj9C,GAAKk9C,EAAGl9C,EAAIi9C,EAAGj9C,KAAOivB,EAAKguB,EAAGh9C,IAAMi9C,EAAGj9C,EAAIg9C,EAAGh9C,IAAKgvB,GAC9DiuB,EAAGj9C,GAAKgvB,IACfiuB,EAAK,GAAIh+C,OAAM+9C,EAAGj9C,GAAKk9C,EAAGl9C,EAAIi9C,EAAGj9C,KAAOivB,EAAKguB,EAAGh9C,IAAMi9C,EAAGj9C,EAAIg9C,EAAGh9C,IAAKgvB,IAGpEk9D,GAAgBlvC,EAAGn7C,OAAOqqF,EAAYA,EAAY7kF,OAAS,MAC5D6kF,GAAelvC,GACfivC,EAAah7E,KAAKi7E,IAGtBA,EAAYj7E,KAAKgsC,OAIzB,MAAOgvC,GApEX,GAAIhtF,OAAQV,QAAQ,iBAEpBH,QAAOC,QAAU2gF;;AGJjB,YA6CA,SAASsN,cAAa3T,EAAanoD,EAAIE,EAAIS,EAAInC,EAAIqpD,GAE/Cp4E,KAAK04E,YAAcA,EAGnB14E,KAAKuwB,GAAKA,EACVvwB,KAAKywB,GAAKA,EACVzwB,KAAKkxB,GAAKA,EACVlxB,KAAK+uB,GAAKA,EAIV/uB,KAAKo4E,SAAWA,EAGhBp4E,KAAKm5E,eAAiB,EAGtBn5E,KAAK,GAAKA,KAAK,GAAKA,KAAK,GAAKA,KAAK,GAAK,EA7D5C7B,OAAOC,QAAUiuF;;AFFjB,YAuBA,SAASpO,kBAAiB5xD,EAAMtb,EAAQm7E,EAAQxE,EAAU7yD,EAASs3D,GAE/D,GAAI17D,GAAKy7D,EAAO/6E,IAAMu2E,EAAW7yD,EAC7B9F,EAAKm9D,EAAO56E,OAASo2E,EAAW7yD,EAChCtE,EAAK27D,EAAOz6E,KAAOi2E,EAAW7yD,EAC9B3D,EAAKg7D,EAAOx6E,MAAQg2E,EAAW7yD,CAInC,IAFA70B,KAAKw4E,SAED2T,EAAW,CAEX,GAAI1kF,GAASsnB,EAAK0B,EACdrpB,EAAS8pB,EAAKX,CAElB,IAAc,GAAV9oB,EAAa,MAGjBA,GAAS/F,KAAKmU,IAAI,GAAK6xE,EAAUjgF,GAEjCzH,KAAKosF,uBAAuB//D,EAAMtb,EAAQ3J,EAAQK,OAGlDzH,MAAKw4E,MAAMxnE,KAAK,GAAIq7E,cAAa,GAAIrtF,OAAM+R,EAAOjR,EAAGiR,EAAOhR,GAAIwwB,EAAIE,EAAIS,EAAInC,EAAIna,EAAAA,IA3CxF,GAAIy3E,cAAe/tF,QAAQ,mBACvBU,MAAQV,QAAQ,iBAEpBH,QAAOC,QAAU6/E,iBAsDjBA,iBAAiBh+E,UAAUmsF,uBAAyB,SAAS//D,EAAMtb,EAAQ62E,EAAa0E,GACpF,GAAIC,GAAOD,EAAU,EACjBE,EAAS9qF,KAAKqU,MAAM6xE,EAAc2E,GAIlCE,GAAkBH,EAAU,EAE5BI,EAAS1sF,KAAKw4E,MAEdp4E,EAAI2Q,EACJ+uB,EAAQ/uB,EAAOy2E,QAAU,EACzBmF,EAAiBF,CAGrB,GAAG,CAKC,GAJA3sD,IAIY,EAARA,EAAW,MAAO4sD,EAEtBC,IAAkBtgE,EAAKyT,GAAOj+B,KAAKzB,GACnCA,EAAIisB,EAAKyT,SACJ6sD,GAAkB/E,EAAc,EAIzC,KAAK,GAFDgF,GAAgBvgE,EAAKyT,GAAOj+B,KAAKwqB,EAAKyT,EAAQ,IAEzC34B,EAAI,EAAOqlF,EAAJrlF,EAAYA,IAAK,CAK7B,IAHA,GAAI0lF,IAAuBjF,EAAc,EAAIzgF,EAAIolF,EAGTM,EAAjCF,EAAiBC,GAAqC,CAKzD,GAJAD,GAAkBC,EAClB9sD,IAGIA,EAAQ,GAAKzT,EAAKjlB,OAAQ,MAAOslF,EAErCE,GAAgBvgE,EAAKyT,GAAOj+B,KAAKwqB,EAAKyT,EAAQ,IAIlD,GAAIgtD,GAAqBD,EAAsBF,EAE3C5vC,EAAK1wB,EAAKyT,GACVkd,EAAK3wB,EAAKyT,EAAQ,GAClBitD,EAAiB/vC,EAAG18C,IAAIy8C,GAAI37C,QAAQV,MAAMosF,GAAoBzsF,KAAK08C,GAEnEiwC,EAAsBtrF,KAAKmU,IAAInU,KAAK8yB,IAAIq4D,EAAsBJ,GAAkBF,EAAO,EAAG,GAC1FnU,EAAWwP,EAAc,EAAIoF,CAEjCN,GAAO17E,KAAK,GAAIq7E,cAAaU,GAAiBT,EAAU,GAAIA,EAAU,EAAGA,EAAU,EAAGA,EAAU,EAAGlU,IAGvG,MAAOsU;;AnBnHX,YAgBA,SAAS5kB,eAAc7lE,EAAOiE,GAC1BlG,KAAKi4E,KAAOd,QACZn3E,KAAKiC,MAAQA,CAEb,IAAIO,GAAMd,KAAKc,IAAIP,GACfM,EAAMb,KAAKa,IAAIN,EACnBjC,MAAKq6B,gBAAkB93B,GAAMC,EAAKA,EAAKD,GAGvCvC,KAAKk4E,SAAW,EAAIx2E,KAAKa,IAAI2D,EAAQ,IAAMxE,KAAK+hB,IAIhDzjB,KAAKk4E,SAAWx2E,KAAKqS,IAAI/T,KAAKk4E,SAAU,KA3B5C,GAAIf,OAAQ74E,QAAQ,QAEpBH,QAAOC,QAAU0pE,cA4BjBA,cAAc7nE,UAAUk4E,SAAW,IACnCrQ,cAAc7nE,UAAUm4E,SAAW,EAWnCtQ,cAAc7nE,UAAUo4E,sBAAwB,SAASC,GAMrD,IAAK,GAJDC,GAAoBv4E,KAAKm4E,SACzB99C,EAAiBr6B,KAAKq6B,eACtB69C,EAAWl4E,KAAKk4E,SAEX91E,EAAI,EAAGA,EAAIk2E,EAAiBE,MAAMpxE,OAAQhF,IAAK,CAEpD,GAAIq2E,GAAMH,EAAiBE,MAAMp2E,GAE7Bs2E,EAAcD,EAAIC,YAAY13E,QAAQq5B,GACtCv6B,EAAI44E,EAAY54E,EAChBC,EAAI24E,EAAY34E,CAEpB04E,GAAI,GAAK34E,EAAI24E,EAAIloD,GACjBkoD,EAAI,GAAK14E,EAAI04E,EAAIhoD,GAAKynD,EACtBO,EAAI,GAAK34E,EAAI24E,EAAIvnD,GACjBunD,EAAI,GAAK14E,EAAI04E,EAAI1pD,GAAKmpD,CAItB,KAAK,GAFDS,GAAgB34E,KAAKi4E,KAAKJ,OAAOY,GAE5BtxE,EAAI,EAAGA,EAAIwxE,EAAcvxE,OAAQD,IAAK,CAC3C,GAAIyxE,GAAWD,EAAcxxE,GACzB0xE,EAAsBD,EAASF,YAAY13E,QAAQq5B,GAInDy+C,GAAMF,EAASroD,GAAKkoD,EAAIvnD,KAAOpxB,EAAI+4E,EAAoB/4E,GACvDi5E,GAAMH,EAAS1nD,GAAKunD,EAAIloD,KAAOzwB,EAAI+4E,EAAoB/4E,GACvDk5E,GAAMJ,EAASnoD,GAAKgoD,EAAI1pD,IAAMmpD,GAAYn4E,EAAI84E,EAAoB94E,GAClEk5E,GAAML,EAAS7pD,GAAK0pD,EAAIhoD,IAAMynD,GAAYn4E,EAAI84E,EAAoB94E,IAElE2c,MAAMo8D,IAAOp8D,MAAMq8D,MAAKD,EAAKC,EAAK,IAClCr8D,MAAMs8D,IAAOt8D,MAAMu8D,MAAKD,EAAKC,EAAK,EAEtC,IAAIC,GAAqBx3E,KAAKgU,IAAIhU,KAAKmU,IAAIijE,EAAIC,GAAKr3E,KAAKmU,IAAImjE,EAAIC,GAuBjE,IArBIC,EAAqBN,EAASR,WAG9Bc,EAAqBN,EAASR,UAG9Bc,EAAqBT,EAAIL,WAGzBc,EAAqBT,EAAIL,UAGzBc,EAAqBX,GACjBW,GAAsBN,EAASO,iBAKnCZ,EAAoBW,GAGpBX,GAAqBv4E,KAAKo4E,SAAU,MAAOG,IAIvD,MAAOA,IAWXzQ,cAAc7nE,UAAUm5E,uBAAyB,SAASd,EAAkBC,GAGxE,IAAK,GADDC,GAAQF,EAAiBE,MACpB/3E,EAAI,EAAGA,EAAI+3E,EAAMpxE,OAAQ3G,IAC9B+3E,EAAM/3E,GAAG04E,eAAiBZ,CAG1BA,GAAoBv4E,KAAKo4E,UACzBp4E,KAAKi4E,KAAK1lE,KAAKimE;;AW7HvB,YAQA,SAAS8F,YAAWjyD,EAAMkzD,EAASkI,EAAUtK,EAAYC,EAAYsC,EAAWgI,EAAU7zE,GAMtF,GAAI8zE,GAAkBxK,EAClB,GAAQuC,EAAYgI,EACpB,EAEAE,EAAclmF,KAAKmU,IACnBsnE,EAAaA,EAAWzrE,MAAQyrE,EAAW1rE,KAAO,EAClD2rE,EAAaA,EAAW1rE,MAAQ0rE,EAAW3rE,KAAO,EAGtD,IAAkB,IAAd4a,EAAK,GAAGvsB,GAAyB,OAAdusB,EAAK,GAAGvsB,GAA4B,IAAdusB,EAAK,GAAGtsB,GAAyB,OAAdssB,EAAK,GAAGtsB,EACpE,GAAI8nF,IAAgB,CAKgBtI,GAAU,EAA9CA,EAAUqI,EAAcF,IACxBnI,EAAUqI,EAAcF,EAAWnI,EAAU,EAQjD,IAAIuI,GAA+B,EAAZpI,EAEnBvwD,EAAU04D,EAETtI,EAAU,EAAI1rE,EAAe0rE,GAD5BqI,EAAc,EAAIE,GAAoBJ,EAAW7zE,EAAe0rE,CAGtE,OAAOwI,UAAS17D,EAAM8C,EAAQowD,EAASoI,EAAiBF,EAAUG,EAAcF,EAAUG,GAAe,GAI7G,QAASE,UAAS17D,EAAM8C,EAAQowD,EAASoI,EAAiBF,EAAUG,EAAaC,EAAeG,GAO5F,IAAK,GALD91B,GAAW,EACX+1B,EAAiB94D,EAASowD,EAE1BU,KAEK94E,EAAI,EAAGA,EAAIklB,EAAKjlB,OAAS,EAAGD,IAAK,CAQtC,IANA,GAAIrG,GAAIurB,EAAKllB,GACT/E,EAAIiqB,EAAKllB,EAAI,GAEb+gF,EAAcpnF,EAAEe,KAAKO,GACrBH,EAAQG,EAAED,QAAQrB,GAEYoxD,EAAWg2B,EAAtCD,EAAiB1I,GAAkC,CACtD0I,GAAkB1I,CAElB,IAAIhhE,IAAK0pE,EAAiB/1B,GAAYg2B,EAClCpoF,EAAIwzB,YAAYxyB,EAAEhB,EAAGsC,EAAEtC,EAAGye,GAC1Bxe,EAAIuzB,YAAYxyB,EAAEf,EAAGqC,EAAErC,EAAGwe,EAE9B,IAAIze,GAAK,GAAS,KAAJA,GAAYC,GAAK,GAAS,KAAJA,EAAU,CAC1CD,EAAI4B,KAAKH,MAAMzB,GACfC,EAAI2B,KAAKH,MAAMxB,EACf,IAAIgR,GAAS,GAAIstE,QAAOv+E,EAAGC,EAAGkC,EAAOkF,KAEhCwgF,GAAmBQ,cAAc97D,EAAMtb,EAAQ62E,EAAaD,EAAiBF,KAC9ExH,EAAQjvE,KAAKD,IAKzBmhD,GAAYg2B,EAYhB,MATKF,IAAkB/H,EAAQ74E,QAAWygF,IAMtC5H,EAAU8H,SAAS17D,EAAM6lC,EAAW,EAAGqtB,EAASoI,EAAiBF,EAAUG,EAAaC,GAAe,IAGpG5H,EA3FX,GAAI3sD,aAAch1B,QAAQ,uBACtB+/E,OAAS//E,QAAQ,oBACjB6pF,cAAgB7pF,QAAQ,oBAE5BH,QAAOC,QAAUkgF;;AnGNjB,YAKA,SAAS/lE,YAAW/Q,EAAOC,GACvBzH,KAAKwH,MAAQA,EACbxH,KAAKyH,OAASA,EAEdzH,KAAK4/B,IAAM,GAAIC,SAAQr4B,EAAOC,GAC9BzH,KAAK8/B,SACL9/B,KAAKs5B,OACLt5B,KAAK8R,KAAO,GAAImsB,YAAWz2B,EAAQC,GAVvC,GAAIo4B,SAAUvhC,QAAQ,aAEtBH,QAAOC,QAAUma,WAWjBA,WAAWtY,WACPwO,GAAIlB,SACA,MAAO,UAAYvN,OAEvByO,GAAIlB,OAAMvC,GACFA,IAAUhL,KAAK4nB,QACf5nB,KAAK4nB,OAASlc,SAAS4E,cAAc,UACrCtQ,KAAK4nB,OAAOpgB,MAAQxH,KAAKwH,MACzBxH,KAAK4nB,OAAOngB,OAASzH,KAAKyH,OAC1BiE,SAASq0B,KAAKtvB,YAAYzQ,KAAK4nB,QAC/B5nB,KAAK0jB,IAAM1jB,KAAK4nB,OAAOlF,WAAW,QAC1B1X,GAAShL,KAAK4nB,SACtB5nB,KAAK4nB,OAAOrY,WAAWC,YAAYxP,KAAK4nB,cACjC5nB,MAAK0jB,UACL1jB,MAAK4nB,UAKxBrP,WAAWtY,UAAU+/B,UAAY,WAC7B,GACInO,GACA9mB,EACAhB,EAHA0P,IAKJ,KAAK,GAAI9H,KAAO3R,MAAKs5B,IACjBzH,EAAQlgB,EAAIkgB,MAAM,KAClB9mB,EAAO8mB,EAAM,GACb9nB,EAAK8nB,EAAM,GAENpY,EAAO1O,KAAO0O,EAAO1O,OAC1B0O,EAAO1O,GAAMiG,KAAKjH,EAGtB,OAAO0P,IAGXlB,WAAWtY,UAAUggC,SAAW,WAC5B,GACIpO,GACA9mB,EACAhB,EAHAm2B,IAKJ,KAAK,GAAIvuB,KAAO3R,MAAKs5B,IACjBzH,EAAQlgB,EAAIkgB,MAAM,KAClB9mB,EAAO8mB,EAAM,GACb9nB,EAAK8nB,EAAM,GAENqO,EAAMn1B,KAAOm1B,EAAMn1B,OACxBm1B,EAAMn1B,GAAMhB,GAAM/J,KAAK8/B,MAAMnuB,EAGjC,OAAOuuB,IAGX3nB,WAAWtY,UAAUoU,aAAe,SAAStK,GACzC,IAAK,GAAI4H,KAAO3R,MAAKs5B,IAAK,CAEtB,GAAIA,GAAMt5B,KAAKs5B,IAAI3nB,GAEfxF,EAAMmtB,EAAIxb,QAAQ/T,EAItB,IAHIoC,GAAO,GAAGmtB,EAAIvb,OAAO5R,EAAK,GAC9BnM,KAAKs5B,IAAI3nB,GAAO2nB,GAEXA,EAAIlyB,OAAQ,CAIb,IAAK,GAHDw3B,GAAO5+B,KAAK8/B,MAAMnuB,GAElBxD,EAASnO,KAAK8R,KACT/R,EAAI,EAAGA,EAAI6+B,EAAKuB,EAAGpgC,IAExB,IAAK,GADD0wB,GAAKzwB,KAAKwH,OAASo3B,EAAK7+B,EAAIA,GAAK6+B,EAAK9+B,EACjCA,EAAI,EAAGA,EAAI8+B,EAAKtI,EAAGx2B,IACxBqO,EAAOsiB,EAAK3wB,GAAK,CAIzBE,MAAKogC,OAAQ,EAEbpgC,KAAK4/B,IAAIS,QAAQzB,SAEV5+B,MAAK8/B,MAAMnuB,SACX3R,MAAKs5B,IAAI3nB,IAKxB3R,KAAKsgC,cAActgC,KAAKoM,KAG5BmM,WAAWtY,UAAUu/B,SAAW,SAASz1B,EAAIgB,EAAM4zB,EAAO1sB,GACtD,IAAK0sB,EAED,MAAO,KAEX,IAAIhtB,GAAM5G,EAAO,IAAM4zB,EAAM50B,EAG7B,IAAI/J,KAAK8/B,MAAMnuB,GAIX,MAHI3R,MAAKs5B,IAAI3nB,GAAKmM,QAAQ/T,GAAM,GAC5B/J,KAAKs5B,IAAI3nB,GAAKX,KAAKjH,GAEhB/J,KAAK8/B,MAAMnuB,EAItB,KAAKgtB,EAAM4B,OACP,MAAO,KAGX,IAAIC,GAAgB7B,EAAMn3B,MAAiB,EAATyK,EAC9BwuB,EAAiB9B,EAAMl3B,OAAkB,EAATwK,EAGhC4iB,EAAU,EACV6L,EAAYF,EAAgB,EAAI3L,EAChC8L,EAAaF,EAAiB,EAAI5L,CAKtC6L,IAAc,EAAIA,EAAY,EAC9BC,GAAe,EAAIA,EAAa,CAEhC,IAAI/B,GAAO5+B,KAAK4/B,IAAIgB,SAASF,EAAWC,EACxC,IAAI/B,EAAK9+B,EAAI,EAET,MADAwM,SAAQu0B,KAAK,0BACJlC,MAAOA,EAAOC,KAAM,KAGjC5+B,MAAK8/B,MAAMnuB,GAAOitB,EAClB5+B,KAAKs5B,IAAI3nB,IAAQ5H,EAIjB,KAAK,GAFDoE,GAASnO,KAAK8R,KACd9H,EAAS20B,EAAM4B,OACVxgC,EAAI,EAAO0gC,EAAJ1gC,EAAoBA,IAGhC,IAAK,GAFD0wB,GAAKzwB,KAAKwH,OAASo3B,EAAK7+B,EAAIA,EAAI80B,GAAW+J,EAAK9+B,EAAI+0B,EACpD9F,EAAKyR,EAAgBzgC,EAChBD,EAAI,EAAO0gC,EAAJ1gC,EAAmBA,IAC/BqO,EAAOsiB,EAAK3wB,GAAKkK,EAAO+kB,EAAKjvB,EAMrC,OAFAE,MAAKogC,OAAQ,EAENxB,GAGXrmB,WAAWtY,UAAUsE,KAAO,SAAS6H,GACjCpM,KAAKoM,GAAKA,EACLpM,KAAKmX,QAUN/K,EAAGgL,YAAYhL,EAAGiL,WAAYrX,KAAKmX,UATnCnX,KAAKmX,QAAU/K,EAAGqL,gBAClBrL,EAAGgL,YAAYhL,EAAGiL,WAAYrX,KAAKmX,SACnC/K,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAG4L,mBAAoB5L,EAAG2L,QAC1D3L,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAG0L,mBAAoB1L,EAAG2L,QAC1D3L,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAGuL,eAAgBvL,EAAGwL,eACtDxL,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAGyL,eAAgBzL,EAAGwL,eACtDxL,EAAG6L,WAAW7L,EAAGiL,WAAY,EAAGjL,EAAG00B,MAAO9gC,KAAKwH,MAAOxH,KAAKyH,OAAQ,EAAG2E,EAAG00B,MAAO10B,EAAGoL,cAAe,QAO1Ge,WAAWtY,UAAUqgC,cAAgB,SAASl0B,GAE1C,GADApM,KAAKuE,KAAK6H,GACNpM,KAAKogC,MAAO,CAKZ,GAHAh0B,EAAGkL,cAAclL,EAAGiL,WAAY,EAAG,EAAG,EAAGrX,KAAKwH,MAAOxH,KAAKyH,OAAQ2E,EAAG00B,MAAO10B,EAAGoL,cAAexX,KAAK8R,MAG/F9R,KAAK0jB,IAAK,CAEV,IAAK,GADD5R,GAAO9R,KAAK0jB,IAAIoE,aAAa,EAAG,EAAG9nB,KAAKwH,MAAOxH,KAAKyH,QAC/CN,EAAI,EAAG45B,EAAI,EAAG55B,EAAInH,KAAK8R,KAAK1K,OAAQD,IAAK45B,GAAK,EACnDjvB,EAAKA,KAAKivB,GAAK/gC,KAAK8R,KAAK3K,GACzB2K,EAAKA,KAAKivB,EAAI,GAAK/gC,KAAK8R,KAAK3K,GAC7B2K,EAAKA,KAAKivB,EAAI,GAAK/gC,KAAK8R,KAAK3K,GAC7B2K,EAAKA,KAAKivB,EAAI,GAAK,GAEvB/gC,MAAK0jB,IAAIsd,aAAalvB,EAAM,EAAG,GAE/B9R,KAAK0jB,IAAIO,YAAc,KACvB,KAAK,GAAIxjB,GAAI,EAAGA,EAAIT,KAAK4/B,IAAIqB,KAAK75B,OAAQ3G,IAAK,CAC3C,GAAIwgC,GAAOjhC,KAAK4/B,IAAIqB,KAAKxgC,EACzBT,MAAK0jB,IAAIwd,WAAWD,EAAKnhC,EAAGmhC,EAAKlhC,EAAGkhC,EAAK3K,EAAG2K,EAAKd,IAKzDngC,KAAKogC,OAAQ;;AD1MrB,YAiBA,SAAS5mB,aAAYhF,EAAKJ,GACtBpU,KAAKwU,IAAMA,GAAOmF,aAAanF,GAC/BxU,KAAKoU,WAAaA,EAClBpU,KAAKsF,UACLtF,KAAKy+B,WA2DT,QAASC,aAAYC,EAAOC,EAAM3sB,GAC9B,GAAI4iB,GAAU,CACd70B,MAAK6+B,QAAUF,EAAME,QACrB7+B,KAAKyR,KAAOktB,EAAMltB,KAAOQ,EAAS4iB,EAClC70B,KAAKmR,IAAMwtB,EAAMxtB,IAAMc,EAAS4iB,EAChC70B,KAAK4+B,KAAOA,EAsChB,QAASE,UAASxiB,EAAWyiB,EAAOvqB,EAAKwqB,GAGrC,MAFAA,GAAaA,GAAc,MAEpBxqB,EACFod,QAAQ,MAAOoN,EAAW1iB,EAAUlV,OAAS43B,EAAW53B,SACxDwqB,QAAQ,cAAetV,GACvBsV,QAAQ,UAAWmN,GA/H5B,GAAIplB,cAAerb,QAAQ,kBAAkB2gC,mBACzC3/B,eAAiBhB,QAAQ,gBAAgBgB,eACzC4/B,OAAS5gC,QAAQ,kBACjB6gC,SAAW7gC,QAAQ,MAEvBH,QAAOC,QAAUob,YAiBjBA,YAAYvZ,UAAUoc,gBAAkB,SAASC,EAAW8iB,EAAUprB,EAAKrL,GAExCoJ,SAA3B/R,KAAKsF,OAAOgX,KAA0Btc,KAAKsF,OAAOgX,MActD,KAAK,GAFDyiB,GAVAtlB,KAEA4lB,EAAQr/B,KAAKsF,OAAOgX,GACpBlI,EAAapU,KAAKoU,WAGlBnC,EAAS,EAETqtB,KACA7f,EAAY,EAGPtY,EAAI,EAAGA,EAAIi4B,EAASh4B,OAAQD,IAAK,CACtC,GAAIo4B,GAAUH,EAASj4B,EAGvB,IAFA43B,EAAQr9B,KAAKqU,MAAMwpB,EAAU,KAEzBF,EAAMN,GAAQ,CACd,GAAIJ,GAAQU,EAAMN,GAAOtlB,OAAO8lB,GAC5BX,EAAQxqB,EAAWorB,SAASxrB,EAAKsI,EAAWqiB,EAAO1sB,EACnD0sB,KAAOllB,EAAO8lB,GAAW,GAAIb,aAAYC,EAAOC,EAAM3sB,QAEnCF,UAAnButB,EAAQP,KACRO,EAAQP,MACRtf,KAEJ6f,EAAQP,GAAO/tB,KAAKuuB,GAIvB9f,GAAW9W,EAASoJ,OAAW0H,EAEpC,IAAIgmB,GAAgB,SAAS9rB,EAAKorB,EAAOjtB,GAErC,IAAK6B,EAED,IAAK,GADD0rB,GAAQr/B,KAAKsF,OAAOgX,GAAWyiB,GAASjtB,EAAKxM,OAAO,GAC/C6B,EAAI,EAAGA,EAAIm4B,EAAQP,GAAO33B,OAAQD,IAAK,CAC5C,GAAIo4B,GAAUD,EAAQP,GAAO53B,GACzBw3B,EAAQU,EAAM5lB,OAAO8lB,GACrBX,EAAQxqB,EAAWorB,SAASxrB,EAAKsI,EAAWqiB,EAAO1sB,EACnD0sB,KAAOllB,EAAO8lB,GAAW,GAAIb,aAAYC,EAAOC,EAAM3sB,IAGlEwN,IACKA,GAAW9W,EAASoJ,OAAW0H,IACtClV,KAAKvE,KAEP,KAAK,GAAI01B,KAAK4J,GACVt/B,KAAK0/B,UAAUpjB,EAAWoZ,EAAG+J,IAarCjmB,YAAYvZ,UAAUy/B,UAAY,SAASpjB,EAAWyiB,EAAOp2B,GAEzD,GAAY,IAARo2B,EAAc,MAAO,MAAOp2B,GAAS,8BAEToJ,UAA5B/R,KAAKy+B,QAAQniB,KAA0Btc,KAAKy+B,QAAQniB,MACxD,IAAImiB,GAAUz+B,KAAKy+B,QAAQniB,EAE3B,IAAImiB,EAAQM,GACRN,EAAQM,GAAO/tB,KAAKrI,OACjB,CACH81B,EAAQM,IAAUp2B,EAElB,IAAIg3B,GAAqB,IAARZ,EAAe,KAAe,IAARA,EAAc,KACjDvqB,EAAMsqB,SAASxiB,EAAWqjB,EAAW3/B,KAAKwU,IAE9ClV,gBAAekV,EAAK,SAASb,EAAK7B,GAE9B,IAAK,GADD2H,IAAU9F,GAAO,GAAIurB,QAAO,GAAIC,UAAS,GAAIlB,YAAWnsB,KACnD3K,EAAI,EAAGA,EAAIs3B,EAAQM,GAAO33B,OAAQD,IACvCs3B,EAAQM,GAAO53B,GAAGwM,EAAKorB,EAAOtlB,SAE3BglB,GAAQM;;A0G5G3B,YAEA5gC,QAAOC,QAAU,SAAUmd,EAAUyjE,EAAczK,GAU/C,QAASp0E,GAAIM,GACT2qF,EAAep6E,KAAKuK,EAAS9a,IAC7B4qF,EAAWr6E,KAAKujE,EAAW9zE,IAC3B6qF,EAAYt6E,KAAKguE,EAAav+E,IAC9B8qF,IAGJ,QAASC,GAAeC,EAASC,EAAU1a,GACvC,GAAI7pE,GAAIwkF,EAAWF,EAMnB,cALOE,GAAWF,GAClBE,EAAWD,GAAYvkF,EAEvBkkF,EAAWlkF,GAAG,GAAGumB,MACjB29D,EAAWlkF,GAAG,GAAKkkF,EAAWlkF,GAAG,GAAGuU,OAAOs1D,EAAK,IACzC7pE,EAGX,QAASykF,GAAcH,EAASC,EAAU1a,GACtC,GAAI7pE,GAAI0kF,EAAUH,EAMlB,cALOG,GAAUH,GACjBG,EAAUJ,GAAWtkF,EAErBkkF,EAAWlkF,GAAG,GAAGmkC,QACjB+/C,EAAWlkF,GAAG,GAAK6pE,EAAK,GAAGt1D,OAAO2vE,EAAWlkF,GAAG,IACzCA,EAGX,QAAS2kF,GAAOj8E,EAAMmhE,EAAM+a,GACxB,GAAIvjF,GAAQujF,EAAU/a,EAAK,GAAGA,EAAK,GAAG5pE,OAAS,GAAK4pE,EAAK,GAAG,EAC5D,OAAOnhE,GAAO,IAAMrH,EAAM1I,EAAI,IAAM0I,EAAMzI,EArC9C,GAMIU,GANAorF,KACAF,KACAP,KACAC,KACAC,KACAC,EAAc,CAmClB,KAAK9qF,EAAI,EAAGA,EAAI8a,EAASnU,OAAQ3G,IAAK,CAClC,GAAIuwE,GAAOuD,EAAW9zE,GAClBoP,EAAOmvE,EAAav+E,EAExB,IAAKoP,EAAL,CAKA,GAAI47E,GAAUK,EAAOj8E,EAAMmhE,GACvB0a,EAAWI,EAAOj8E,EAAMmhE,GAAM,EAElC,IAAKya,IAAWE,IAAgBD,IAAYG,IAAeF,EAAWF,KAAaI,EAAUH,GAAY,CAErG,GAAI3qD,GAAI6qD,EAAcH,EAASC,EAAU1a,GACrC7pE,EAAIqkF,EAAeC,EAASC,EAAUL,EAAWtqD,UAE9C8qD,GAAUJ,SACVE,GAAWD,GAElBC,EAAWG,EAAOj8E,EAAMw7E,EAAWlkF,IAAI,IAASA,EAChDkkF,EAAWtqD,GAAK,SAET0qD,KAAWE,GAElBH,EAAeC,EAASC,EAAU1a,GAE3B0a,IAAYG,GAEnBD,EAAcH,EAASC,EAAU1a,IAIjC7wE,EAAIM,GACJorF,EAAUJ,GAAWF,EAAc,EACnCI,EAAWD,GAAYH,EAAc,OA9BrCprF,GAAIM,GAkCZ,OACI8a,SAAU6vE,EACVpM,aAAcsM,EACd/W,WAAY8W;;AJtFpB,YA6BA,SAASjD,YAAW1P,EAAat1C,EAAIzP,EAAI89C,EAAIpuC,EAAI69C,EAAKj/E,EAAOk2E,EAAUC,GACnEp4E,KAAK04E,YAAcA,EACnB14E,KAAKojC,GAAKA,EACVpjC,KAAK2zB,GAAKA,EACV3zB,KAAKyxE,GAAKA,EACVzxE,KAAKqjC,GAAKA,EACVrjC,KAAKkhF,IAAMA,EACXlhF,KAAKiC,MAAQA,EACbjC,KAAKm4E,SAAWA,EAChBn4E,KAAKo4E,SAAWA,EAepB,QAAS+F,cAAaptE,EAAQqsE,EAAYsK,EAAUr7D,EAAMqQ,EAAQskD,GAE9D,GAAIpiD,GAAOw+C,EAAWp6C,MAAMpE,KAExBypD,EAAS,EACT52E,EAAO2rE,EAAW3rE,KAAO42E,EACzB32E,EAAQD,EAAOmtB,EAAKtI,EACpBnlB,EAAMisE,EAAWjsE,IAAMk3E,EACvB/2E,EAASH,EAAMytB,EAAKuB,EACpBiD,EAAK,GAAIpkC,OAAMyS,EAAMN,GACrBwiB,EAAK,GAAI30B,OAAM0S,EAAOP,GACtBkyB,EAAK,GAAIrkC,OAAM0S,EAAOJ,GACtBmgE,EAAK,GAAIzyE,OAAMyS,EAAMH,GAErBrP,EAAQy6B,EAAO,eAAiBh7B,KAAK+hB,GAAK,GAC9C,IAAIu9D,EAAW,CACX,GAAIxkB,GAAOnwC,EAAKtb,EAAOy2E,QACvBvlF,IAASP,KAAKQ,MAAM6O,EAAOhR,EAAIy8D,EAAKz8D,EAAGgR,EAAOjR,EAAI08D,EAAK18D,GAG3D,GAAImC,EAAO,CACP,GAAIO,GAAMd,KAAKc,IAAIP,GACfM,EAAMb,KAAKa,IAAIN,GACfyqB,GAAUnqB,GAAMC,EAAKA,EAAKD,EAE9B6gC,GAAKA,EAAGpiC,QAAQ0rB,GAChBiH,EAAKA,EAAG3yB,QAAQ0rB,GAChB+kD,EAAKA,EAAGzwE,QAAQ0rB,GAChB2W,EAAKA,EAAGriC,QAAQ0rB,GAGpB,OAAQ,GAAI07D,YAAW,GAAIppF,OAAM+R,EAAOjR,EAAGiR,EAAOhR,GAAIqjC,EAAIzP,EAAI89C,EAAIpuC,EAAI+5C,EAAWp6C,MAAMpE,KAAM,EAAGu5C,SAAUvjE,EAAAA,IAe9G,QAASmpE,eAAchtE,EAAQu3E,EAASZ,EAAUr7D,EAAMqQ,EAAQskD,GAQ5D,IAAK,GANDuH,GAAa7rD,EAAO,eAAiBh7B,KAAK+hB,GAAK,IAC/Cs9D,EAAcrkD,EAAO,qBAErB8rD,EAAmBF,EAAQE,iBAC3B1H,KAEKrgF,EAAI,EAAGA,EAAI+nF,EAAiBphF,OAAQ3G,IAAK,CAC9C,GAAIgoF,GAAkBD,EAAiB/nF,GACnCk+B,EAAQ8pD,EAAgB9pD,MACxBC,EAAOD,EAAMC,IAEjB,IAAKA,EAAL,CAEA,GAEI8pD,GAFAC,GAAWF,EAAgB3oF,EAAI6+B,EAAME,QAAU,GAAK6oD,EAGpDkB,EAAgBzQ,QAChB6I,IACA0H,KACAE,EAAgBC,iBAAiBH,EAAgB33E,EAAQ43E,EAASt8D,EAAMtb,EAAOy2E,SAAS,GACpFzG,IACA6H,EAAgBlnF,KAAKgU,IAAIkzE,EAAeC,iBAAiBH,EAAgB33E,EAAQ43E,EAASt8D,EAAMtb,EAAOy2E,SAAS,MAIpHkB,IACIhQ,YAAa,GAAI15E,OAAM+R,EAAOjR,EAAGiR,EAAOhR,GACxCovB,OAAQ,EACRltB,MAAO,EACPm2E,SAAUxjE,EAAAA,EACVujE,SAAUA,UAclB,KAAK,GAVD5nD,GAAKk4D,EAAgB3oF,EAAI6+B,EAAMltB,KAC/Bgf,EAAKg4D,EAAgB1oF,EAAI4+B,EAAMxtB,IAC/B+f,EAAKX,EAAKqO,EAAKtI,EACfvH,EAAK0B,EAAKmO,EAAKuB,EAEf2oD,EAAM,GAAI9pF,OAAMuxB,EAAIE,GACpBs4D,EAAM,GAAI/pF,OAAMkyB,EAAIT,GACpBu4D,EAAM,GAAIhqF,OAAMuxB,EAAIxB,GACpBk6D,EAAM,GAAIjqF,OAAMkyB,EAAInC,GAEf5nB,EAAI,EAAGA,EAAIuhF,EAAethF,OAAQD,IAAK,CAE5C,GAAI+hF,GAAWR,EAAevhF,GAC1Bi8B,EAAK0lD,EACLn1D,EAAKo1D,EACLtX,EAAKuX,EACL3lD,EAAK4lD,EACLhnF,EAAQinF,EAASjnF,MAAQsmF,CAE7B,IAAItmF,EAAO,CACP,GAAIO,GAAMd,KAAKc,IAAIP,GACfM,EAAMb,KAAKa,IAAIN,GACfyqB,GAAUnqB,GAAMC,EAAKA,EAAKD,EAE9B6gC,GAAKA,EAAGpiC,QAAQ0rB,GAChBiH,EAAKA,EAAG3yB,QAAQ0rB,GAChB+kD,EAAKA,EAAGzwE,QAAQ0rB,GAChB2W,EAAKA,EAAGriC,QAAQ0rB,GAIpB,GAAIy8D,GAAgBznF,KAAKmU,IAAIqzE,EAAS/Q,SAAUyQ,GAE5CQ,GAAcr4E,EAAO9O,MAAQsmF,EAAaW,EAAS/5D,OAAS,EAAIztB,KAAK+hB,KAAO,EAAI/hB,KAAK+hB,GACzFq9D,GAAM9vE,KAAK,GAAIo3E,YAAWc,EAASxQ,YAAat1C,EAAIzP,EAAI89C,EAAIpuC,EAAIzE,EAAMwqD,EAAYD,EAAeD,EAAS9Q,aAKlH,MAAO0I,GAmBX,QAAS+H,kBAAiBpvE,EAAQ1I,EAAQoe,EAAQ9C,EAAMm7D,EAAS6B,GAC7D,GAAIC,IAAcD,CAEL,GAATl6D,IAAYk6D,GAAWA,GAEvBA,GAAS7B,GAEb,IAAI+B,GAAiB,GAAIvqF,OAAM+R,EAAOjR,EAAGiR,EAAOhR,GAC5Cy6C,EAAMnuB,EAAKm7D,GACXgC,EAAY50E,EAAAA,CAEhBua,GAASztB,KAAK8yB,IAAIrF,EAIlB,KAFA,GAAIgqD,GAAiBhB,WAER,CACT,GAAIjmB,GAAWq3B,EAAe1nF,KAAK24C,GAC/BrtB,EAAQgC,EAAS+iC,EAGjBjwD,EAAQP,KAAKQ,MAAMs4C,EAAIz6C,EAAIwpF,EAAexpF,EAAGy6C,EAAI16C,EAAIypF,EAAezpF,EAYxE,IAXKupF,IAASpnF,GAASP,KAAK+hB,IACxB6lE,IAAYrnF,GAASP,KAAK+hB,IAE9BhK,EAAOzI,MACH0nE,YAAa6Q,EACbp6D,OAAQm6D,EAAa5nF,KAAK+hB,GAAK,EAC/B00D,SAAUhrD,EACVirD,SAAUoR,EACVvnF,OAAQA,EAAQ,EAAIP,KAAK+hB,KAAO,EAAI/hB,KAAK+hB,MAGhC01D,GAAThsD,EAAyB,KAK7B,KAHAo8D,EAAiB/uC,EAGV+uC,EAAe3nF,OAAO44C,IAGzB,GAFAgtC,GAAW6B,EAAU,EAAI,GACzB7uC,EAAMnuB,EAAKm7D,IACNhtC,EACD,MAAOrtB,EAIf,IAAIhsB,GAAOq5C,EAAIl6C,IAAIipF,GAAgBnoF,OACnCmoF,GAAiBA,EAAejpF,IAAIa,EAAKT,MAAMwxD,IAE/Cs3B,EAAYr8D,EAGhB,MAAOgsD,GAlPX,GAAIn6E,OAAQV,QAAQ,iBAEpBH,QAAOC,SACH+/E,aAAcA,aACdJ,cAAeA,cAGnB,IAAI5F,UAAW;;AGTf,YAOA,SAASwG,cAAapjE,EAAU++D,GAG5B,IAAK,GAFDn+D,MAEKhV,EAAI,EAAG0jF,EAAKtvE,EAASnU,OAAYyjF,EAAJ1jF,EAAQA,IAAK,CAC/C,GAAI0I,GAAO0uE,cAAchjE,EAASpU,GAAGkZ,WAAYi6D,EAAiB,cAC7DzqE,IAEDsM,EAAM2B,QAAQjO,GAAQ,GACtBsM,EAAMnL,KAAKnB,GAInB,MAAOsM,GAjBX,GAAIoiE,eAAgBjgF,QAAQ,gBAE5BH,QAAOC,QAAUugF;;ADJjB,YAaA,SAASD,aAAYnjE,EAAU++D,EAAkB7gE,GAI7C,IAAK,GAHDulE,MACAziE,KAEKpV,EAAI,EAAG0jF,EAAKtvE,EAASnU,OAAYyjF,EAAJ1jF,EAAQA,IAAK,CAC/C,GAAI0I,GAAO0uE,cAAchjE,EAASpU,GAAGkZ,WAAYi6D,EAAiB,cAClE,IAAKzqE,EAAL,CAIAA,EAAOA,EAAKomC,UAEZ,IAAIzyC,GAAY82E,EAAiB,iBACf,eAAd92E,EACAqM,EAAOA,EAAKi7E,oBACS,cAAdtnF,IACPqM,EAAOA,EAAKk7E,oBAGhB,KAAK,GAAIhqD,GAAI,EAAGiqD,EAAKn7E,EAAKzI,OAAY4jF,EAAJjqD,EAAQA,IACtCxkB,EAAWvL,KAAKnB,EAAKukD,WAAWrzB,GAIpCi+C,GAAa73E,GAAK0I,MAjBdmvE,GAAa73E,GAAK,KAuB1B,MAFAoV,GAAa0uE,KAAK1uE,EAAY9C,IAG1BulE,aAAcA,EACdziE,WAAYA,GAIpB,QAAS0uE,MAAK3xD,EAAK4xD,GACf,GACI5sC,GADA/nB,IAEJ+C,GAAI5B,KAAKyzD,YACT,KAAK,GAAIhkF,GAAI,EAAGA,EAAImyB,EAAIlyB,OAAQD,IACxBmyB,EAAInyB,KAAOm3C,IACXA,EAAOhlB,EAAInyB,GACN+jF,EAAY5sC,IAAO/nB,EAAEvlB,KAAKsoB,EAAInyB,IAG3C,OAAOovB,GAGX,QAAS40D,aAAYrqF,EAAGsB,GACpB,MAAOtB,GAAIsB,EA7Df,GAAIm8E,eAAgBjgF,QAAQ,gBAE5BH,QAAOC,QAAUsgF;;ADJjB,YASA,SAAS+K,iBAAgBC,EAAW5pF,EAAGC,EAAG4+B,GACtC3+B,KAAK0pF,UAAYA,EACjB1pF,KAAKF,EAAIA,EACTE,KAAKD,EAAIA,EACTC,KAAK2+B,MAAQA,EAIjB,QAAS8/C,SAAQ+J,EAAkB34E,EAAMsB,EAAKG,EAAQG,EAAMC,GACxD1R,KAAKwoF,iBAAmBA,EACxBxoF,KAAK6P,KAAOA,EACZ7P,KAAKmR,IAAMA,EACXnR,KAAKsR,OAASA,EACdtR,KAAKyR,KAAOA,EACZzR,KAAK0R,MAAQA,EAGjB,QAASmtE,WAAUhvE,EAAM4J,EAAQ6lE,EAAUD,EAAYJ,EAAiBC,EAAeC,EAASI,EAAS57D,GAWrG,IAAK,GATD6kE,MACAF,EAAU,GAAI7J,SAAQ+J,EAAkB34E,EAAM8T,EAAU,GAAIA,EAAU,GAAIA,EAAU,GAAIA,EAAU,IAGlGgmE,EAAU,IAEV7pF,EAAI6jB,EAAU,GACd5jB,EAAI4jB,EAAU,GAAKgmE,EAEdxiF,EAAI,EAAGA,EAAI0I,EAAKzI,OAAQD,IAAK,CAClC,GAAIuiF,GAAY75E,EAAKukD,WAAWjtD,GAC5Bw3B,EAAQllB,EAAOiwE,EAEd/qD,KAEL6pD,EAAiBx3E,KAAK,GAAIy4E,iBAAgBC,EAAW5pF,EAAGC,EAAG4+B,IAC3D7+B,GAAK6+B,EAAME,QAAU0gD,GAGzB,MAAKiJ,GAAiBphF,QAEtBwiF,SAAStB,EAAS7uE,EAAQ4lE,EAAYC,EAAUL,EAAiBC,EAAeC,GAEzEmJ,IAJ8B,EASzC,QAASsB,UAAStB,EAAS7uE,EAAQ4lE,EAAYC,EAAUL,EAAiBC,EAAeC,GACrF,GAAI0K,GAAgB,KAEhBC,EAA0B,EAC1BC,EAAiB,EACjB19D,EAAO,EAEP29D,EAAgB,EAEhBxB,EAAmBF,EAAQE,gBAE/B,IAAIlJ,EACA,IAAK,GAAIn4E,GAAI,EAAGA,EAAIqhF,EAAiBphF,OAAQD,IAAK,CAC9C,GAAIshF,GAAkBD,EAAiBrhF,EAKvC,IAHAshF,EAAgB3oF,GAAKgqF,EACrBrB,EAAgB1oF,GAAKs/E,EAAahzD,EAE9Bo8D,EAAgB3oF,EAAIw/E,GAA8B,OAAlBuK,EAAwB,CAExD,GAAII,GAAazB,EAAiBqB,EAAgB,GAAG/pF,CACrDkqF,GAAgBtoF,KAAKmU,IAAIo0E,EAAYD,EAErC,KAAK,GAAIvpF,GAAIopF,EAAgB,EAAQ1iF,GAAL1G,EAAQA,IACpC+nF,EAAiB/nF,GAAGV,GAAKs/E,EACzBmJ,EAAiB/nF,GAAGX,GAAKmqF,CAGzB9K,IACA+K,YAAY1B,EAAkB/uE,EAAQswE,EAAgBF,EAAgB,EAAG1K,GAG7E4K,EAAiBF,EAAgB,EACjCA,EAAgB,KAChBC,GAA2BG,EAC3B59D,IAGA89D,UAAU1B,EAAgBiB,aAC1BG,EAAgB1iF,GAK5B,GAAIijF,GAAsB5B,EAAiBA,EAAiBphF,OAAS,GACjEijF,EAAiBD,EAAoBtqF,EAAI2Z,EAAO2wE,EAAoBV,WAAW7qD,OACnFmrD,GAAgBtoF,KAAKmU,IAAIm0E,EAAeK,EAExC,IAAI5iF,IAAU4kB,EAAO,GAAKgzD,CAE1B6K,aAAY1B,EAAkB/uE,EAAQswE,EAAgBvB,EAAiBphF,OAAS,EAAG+3E,GACnFmL,MAAM9B,EAAkBrJ,EAASF,EAAiBC,EAAe8K,EAAe3K,EAAYhzD,GAG5Fi8D,EAAQn3E,MAAQ+tE,EAAgBz3E,EAChC6gF,EAAQh3E,OAASg3E,EAAQn3E,IAAM1J,EAC/B6gF,EAAQ72E,OAASwtE,EAAkB+K,EACnC1B,EAAQ52E,MAAQ42E,EAAQ72E,KAAOu4E,EAGnC,QAASE,aAAY1B,EAAkB/uE,EAAQ6L,EAAOk1B,EAAK2kC,GAIvD,IAAK,GAHDoL,GAAc9wE,EAAO+uE,EAAiBhuC,GAAKkvC,WAAW7qD,QACtD2rD,GAAchC,EAAiBhuC,GAAK16C,EAAIyqF,GAAepL,EAElDp+C,EAAIzb,EAAYk1B,GAALzZ,EAAUA,IAC1BynD,EAAiBznD,GAAGjhC,GAAK0qF,EAKjC,QAASF,OAAM9B,EAAkBrJ,EAASF,EAAiBC,EAAe8K,EAAe3K,EAAYhzD,GAIjG,IAAK,GAHDo+D,IAAUtL,EAAUF,GAAmB+K,EACvCU,IAAWxL,GAAiB7yD,EAAO,GAAK,IAAOgzD,EAE1Ct+C,EAAI,EAAGA,EAAIynD,EAAiBphF,OAAQ25B,IACzCynD,EAAiBznD,GAAGjhC,GAAK2qF,EACzBjC,EAAiBznD,GAAGhhC,GAAK2qF,EAKjC,QAAS5L,WAAU97C,EAAOtG,GACtB,IAAKsG,IAAUA,EAAMpE,KAAM,MAAO,KAElC,IAAI78B,GAAK26B,EAAO,eAAe,GAC3B16B,EAAK06B,EAAO,eAAe,GAC3BnM,EAAKxuB,EAAKihC,EAAMx7B,MAAQ,EACxB0pB,EAAKX,EAAKyS,EAAMx7B,MAChBipB,EAAKzuB,EAAKghC,EAAMv7B,OAAS,EACzBsnB,EAAK0B,EAAKuS,EAAMv7B,MAEpB,OAAO,IAAIkjF,gBAAe3nD,EAAOvS,EAAI1B,EAAIwB,EAAIW,GAGjD,QAASy5D,gBAAe3nD,EAAO7xB,EAAKG,EAAQG,EAAMC,GAC9C1R,KAAKgjC,MAAQA,EACbhjC,KAAKmR,IAAMA,EACXnR,KAAKsR,OAASA,EACdtR,KAAKyR,KAAOA,EACZzR,KAAK0R,MAAQA,EAzJjBvT,OAAOC,SACHygF,UAAWA,UACXC,UAAWA,UAkDf,IAAIqL,YAAcS,IAAI;;ArGtDtB,YAKA,SAASnyE,aAAYjR,EAAOC,GACxBzH,KAAKwH,MAAQA,EACbxH,KAAKyH,OAASA,EAEdzH,KAAK4/B,IAAM,GAAIC,SAAQr4B,EAAOC,GAC9BzH,KAAKmhC,UACLnhC,KAAK8R,MAAO,EACZ9R,KAAKmX,QAAU,EACfnX,KAAKwK,OAAS,EACdxK,KAAKs+B,WAAa,EAClBt+B,KAAKogC,OAAQ,EAmEjB,QAASgB,YAAWthB,EAAKuhB,EAAWC,EAAMC,EAAMC,EAAKC,EAAWC,EAAMC,EAAMn6B,EAAOC,EAAQoB,GACvF,GAEI/I,GAAGC,EAFH6hC,EAAOL,EAAOF,EAAYC,EAC1BO,EAAOF,EAAOF,EAAYC,CAG9B,IAAI74B,EAGA,IADAg5B,GAAQJ,EACH1hC,EAAI,GAAS0H,GAAL1H,EAAaA,IAAK6hC,IAAS7hC,EAAI0H,GAAUA,EAAS85B,GAAQF,EAAYC,EAAMO,GAAQJ,EAC7F,IAAK3hC,EAAI,GAAS0H,GAAL1H,EAAYA,IACrB0hC,EAAIK,EAAO/hC,GAAKggB,EAAI8hB,GAAS9hC,EAAI0H,GAASA,OAKlD,KAAKzH,EAAI,EAAO0H,EAAJ1H,EAAYA,IAAK6hC,GAAQP,EAAWQ,GAAQJ,EACpD,IAAK3hC,EAAI,EAAO0H,EAAJ1H,EAAWA,IACnB0hC,EAAIK,EAAO/hC,GAAKggB,EAAI8hB,EAAO9hC,GAsM3C,QAASgiC,YAAWlD,EAAMp3B,EAAOC,EAAQ82B,GACrCv+B,KAAK4+B,KAAOA,EACZ5+B,KAAKwH,MAAQA,EACbxH,KAAKyH,OAASA,EACdzH,KAAKu+B,IAAMA,EA3Sf,GAAIsB,SAAUvhC,QAAQ,aAEtBH,QAAOC,QAAUqa,YAcjBA,YAAYxY,WACRwO,GAAIlB,SACA,MAAO,UAAYvN,OAEvByO,GAAIlB,OAAMvC,GACFA,IAAUhL,KAAK4nB,QACf5nB,KAAK4nB,OAASlc,SAAS4E,cAAc,UACrCtQ,KAAK4nB,OAAOpgB,MAAQxH,KAAKwH,MAAQxH,KAAKs+B,WACtCt+B,KAAK4nB,OAAOngB,OAASzH,KAAKyH,OAASzH,KAAKs+B,WACxCt+B,KAAK4nB,OAAOliB,MAAM8B,MAAQxH,KAAKwH,MAAQ,KACvCxH,KAAK4nB,OAAOliB,MAAM8B,MAAQxH,KAAKwH,MAAQ,KACvCkE,SAASq0B,KAAKtvB,YAAYzQ,KAAK4nB,QAC/B5nB,KAAK0jB,IAAM1jB,KAAK4nB,OAAOlF,WAAW,QAC1B1X,GAAShL,KAAK4nB,SACtB5nB,KAAK4nB,OAAOrY,WAAWC,YAAYxP,KAAK4nB,cACjC5nB,MAAK0jB,UACL1jB,MAAK4nB,UAKxBnP,YAAYxY,UAAU2E,OAAS,SAASm9B,GACpC,GAAI/hC,KAAKs+B,aAAeyD,EAAU,OAAO,CAEzC,IAAIC,GAAWhiC,KAAKs+B,UAQpB,IAPAt+B,KAAKs+B,WAAayD,EAEd/hC,KAAK4nB,SACL5nB,KAAK4nB,OAAOpgB,MAAQxH,KAAKwH,MAAQxH,KAAKs+B,WACtCt+B,KAAK4nB,OAAOngB,OAASzH,KAAKyH,OAASzH,KAAKs+B,YAGxCt+B,KAAK8R,KAAM,CACX,GAAImwB,GAAUjiC,KAAK8R,IAEnB9R,MAAK8R,MAAO,EACZ9R,KAAK4gC,WACL5gC,KAAKmX,SAAU,CAWf,KAAK,GATD+qB,GAAWliC,KAAKwH,MAAQw6B,EACxBG,EAAYniC,KAAKyH,OAASu6B,EAC1BI,EAAWpiC,KAAKwH,MAAQu6B,EACxBM,EAAYriC,KAAKyH,OAASs6B,EAG1BO,EAAWtiC,KAAK8R,KAChBywB,EAAWN,EAENliC,EAAI,EAAOsiC,EAAJtiC,EAAeA,IAG3B,IAAK,GAFDyiC,GAAa9gC,KAAKqU,MAAOhW,EAAIoiC,EAAaE,GAAaH,EACvDO,EAAa1iC,EAAIqiC,EACZtiC,EAAI,EAAOsiC,EAAJtiC,EAAcA,IAAK,CAC/B,GAAI4iC,GAAOhhC,KAAKqU,MAAOjW,EAAIoiC,EAAYE,EACvCE,GAASG,EAAa3iC,GAAKyiC,EAASC,EAAaE,GAIzDT,EAAU,KACVjiC,KAAKogC,OAAQ,EAGjB,MAAOpgC,MAAKogC,OA0BhB3nB,YAAYxY,UAAU0iC,cAAgB,SAASC,EAAYC,GAMvD,GAAIhO,GAAU,EACV6L,EAAYkC,EAAa/N,GAAW,GAAK+N,EAAa/N,GAAW,GACjE8L,EAAakC,EAAchO,GAAW,GAAKgO,EAAchO,GAAW,GAIpE+J,EAAO5+B,KAAK4/B,IAAIgB,SAASF,EAAWC,EACxC,OAAe,KAAX/B,EAAKtI,EACEsI,GAGXA,EAAKkE,cAAgBF,EACrBhE,EAAKmE,eAAiBF,EAEfjE,IAGXnmB,YAAYxY,UAAUsnB,SAAW,SAASxc,EAAMlC,GAC5C,GAAI7I,KAAKmhC,OAAOp2B,GACZ,MAAO/K,MAAKmhC,OAAOp2B,EAGvB,KAAK/K,KAAKqZ,OACN,MAAO,KAGX,IAAIlN,GAAMnM,KAAKqZ,OAAOmlB,kBAAkBzzB,EACxC,KAAKoB,EAAI3E,QAAU2E,EAAI1E,OACnB,MAAO,KAGX,IAAID,GAAQ2E,EAAI3E,MAAQ2E,EAAImyB,WACxB72B,EAAS0E,EAAI1E,OAAS0E,EAAImyB,WAC1BM,EAAO5+B,KAAK2iC,cAAcn7B,EAAOC,EACrC,IAAe,IAAXm3B,EAAKtI,EACL,MAAOsI,EAGX,IAAIoE,GAAQ,GAAIlB,YAAWlD,EAAMp3B,EAAOC,EAAQ0E,EAAIoyB,IAKpD,OAJAv+B,MAAKmhC,OAAOp2B,GAAQi4B,EAEpBhjC,KAAKijC,KAAKrE,EAAMzyB,EAAKtD,GAEdm6B,GAIXvqB,YAAYxY,UAAUijC,YAAc,SAASn4B,EAAMo4B,GAC/C,GAAIH,GAAQhjC,KAAKunB,SAASxc,EAAMo4B,GAC5BvE,EAAOoE,GAASA,EAAMpE,IAE1B,KAAKA,EACD,MAAO,KAKX,IAAIp3B,GAAQ27B,EAAYH,EAAMx7B,MAAQo3B,EAAKtI,EACvC7uB,EAAS07B,EAAYH,EAAMv7B,OAASm3B,EAAKuB,EACzCtL,EAAU,CAEd,QACI1sB,MAAOX,EAAOC,GACd27B,KAAMxE,EAAK9+B,EAAI+0B,GAAmB70B,KAAKwH,OAAQo3B,EAAK7+B,EAAI80B,GAAoB70B,KAAKyH,QACjF47B,KAAMzE,EAAK9+B,EAAI+0B,EAAUrtB,GAASxH,KAAKwH,OAAQo3B,EAAK7+B,EAAI80B,EAAUptB,GAAUzH,KAAKyH,UAKzFgR,YAAYxY,UAAU2gC,SAAW,WAC7B,IAAK5gC,KAAK8R,KAAM,CACZ,GAAIwkB,GAAI50B,KAAKqU,MAAM/V,KAAKwH,MAAQxH,KAAKs+B,YACjC6B,EAAIz+B,KAAKqU,MAAM/V,KAAKyH,OAASzH,KAAKs+B,WACtCt+B,MAAK8R,KAAO,GAAIwxB,aAAYhN,EAAI6J,EAChC,KAAK,GAAIh5B,GAAI,EAAGA,EAAInH,KAAK8R,KAAK1K,OAAQD,IAClCnH,KAAK8R,KAAK3K,GAAK,IAM3BsR,YAAYxY,UAAUgjC,KAAO,SAASzB,EAAK1hB,EAAKjX,GAE5C,GAAK7I,KAAKqZ,OAAOmO,IAAI1V,KAArB,CACA,GAAIyxB,GAAS,GAAID,aAAYtjC,KAAKqZ,OAAOmO,IAAI1V,KAAKG,OAElDjS,MAAK4gC,UACL,IAAI4C,GAASxjC,KAAK8R,KAEd+iB,EAAU,CAEduM,YACyBmC,EACAvjC,KAAKqZ,OAAOmO,IAAIhgB,MAChBsY,EAAIhgB,EACJggB,EAAI/f,EACJyjC,EACAxjC,KAAKwH,MAAQxH,KAAKs+B,YACjBkD,EAAI1hC,EAAI+0B,GAAW70B,KAAKs+B,YACxBkD,EAAIzhC,EAAI80B,GAAW70B,KAAKs+B,WACzBxe,EAAItY,MACJsY,EAAIrY,OACdoB,GAGf7I,KAAKogC,OAAQ,IAGjB3nB,YAAYxY,UAAUgc,UAAY,SAAS5C,GACvCrZ,KAAKqZ,OAASA,GAGlBZ,YAAYxY,UAAUic,SAAW,SAASC,EAAOxT,GAC7C,IAAK,GAAIxB,GAAI,EAAGA,EAAIgV,EAAM/U,OAAQD,IAC9BnH,KAAKunB,SAASpL,EAAMhV,GAGxBwB,GAAS,KAAM3I,KAAKmhC,SAGxB1oB,YAAYxY,UAAUsE,KAAO,SAAS6H,EAAI8oB,GACtC,GAAIuO,IAAQ,CACPzjC,MAAKmX,QAON/K,EAAGgL,YAAYhL,EAAGiL,WAAYrX,KAAKmX,UANnCnX,KAAKmX,QAAU/K,EAAGqL,gBAClBrL,EAAGgL,YAAYhL,EAAGiL,WAAYrX,KAAKmX,SACnC/K,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAGuL,eAAgBvL,EAAGwL,eACtDxL,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAGyL,eAAgBzL,EAAGwL,eACtD6rB,GAAQ,EAKZ,IAAIC,GAAYxO,EAAS9oB,EAAG2L,OAAS3L,EAAGu3B,OAOxC,IANID,IAAc1jC,KAAKwK,SACnB4B,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAG0L,mBAAoB4rB,GACvDt3B,EAAGsL,cAActL,EAAGiL,WAAYjL,EAAG4L,mBAAoB0rB,GACvD1jC,KAAKwK,OAASk5B,GAGd1jC,KAAKogC,QACLpgC,KAAK4gC,WAED6C,EACAr3B,EAAG6L,WACC7L,EAAGiL,WACH,EACAjL,EAAGmL,KACHvX,KAAKwH,MAAQxH,KAAKs+B,WAClBt+B,KAAKyH,OAASzH,KAAKs+B,WACnB,EACAlyB,EAAGmL,KACHnL,EAAGoL,cACH,GAAIymB,YAAWj+B,KAAK8R,KAAKG,SAG7B7F,EAAGkL,cACClL,EAAGiL,WACH,EACA,EACA,EACArX,KAAKwH,MAAQxH,KAAKs+B,WAClBt+B,KAAKyH,OAASzH,KAAKs+B,WACnBlyB,EAAGmL,KACHnL,EAAGoL,cACH,GAAIymB,YAAWj+B,KAAK8R,KAAKG,SAIjCjS,KAAKogC,OAAQ,EAGTpgC,KAAK0jB,KAAK,CACV,GAAI5R,GAAO9R,KAAK0jB,IAAIoE,aAAa,EAAG,EAAG9nB,KAAKwH,MAAQxH,KAAKs+B,WAAYt+B,KAAKyH,OAASzH,KAAKs+B,WACxFxsB,GAAKA,KAAKlS,IAAI,GAAIgkC,mBAAkB5jC,KAAK8R,KAAKG,SAC9CjS,KAAK0jB,IAAIsd,aAAalvB,EAAM,EAAG,GAE/B9R,KAAK0jB,IAAIO,YAAc,KACvB,KAAK,GAAIxjB,GAAI,EAAGA,EAAIT,KAAK4/B,IAAIqB,KAAK75B,OAAQ3G,IAAK,CAC3C,GAAIwgC,GAAOjhC,KAAK4/B,IAAIqB,KAAKxgC,EACzBT,MAAK0jB,IAAIwd,WAAWD,EAAKnhC,EAAIE,KAAKs+B,WAAY2C,EAAKlhC,EAAIC,KAAKs+B,WAAY2C,EAAK3K,EAAIt2B,KAAKs+B,WAAY2C,EAAKd,EAAIngC,KAAKs+B;;AVlShI,YAEA,IAAIp/B,MAAOZ,QAAQ,gBACfg1B,YAAch1B,QAAQ,uBACtBuE,QAAUvE,QAAQ,mBAClBQ,OAASR,QAAQ,kBACjBS,aAAeT,QAAQ,yBACvBU,MAAQV,QAAQ,kBA0BhB8E,OAASjF,OAAOC,QAAU,YAE9Bc,MAAK4G,OAAO1C,OAAOnD,WAKfod,UAAW,WAAa,MAAOrd,MAAKwD,UAAUuC,QAY9CwtB,UAAW,SAASxtB,GAEhB,MADA/F,MAAKoF,QAAQW,OAAQA,IACd/F,MAYXkvB,MAAO,SAASC,EAAQ9rB,GAEpB,MADArD,MAAKwzB,MAAMxzB,KAAKwD,UAAUuC,OAAQ7G,KAAK4G,QAAQqpB,OAAQnwB,MAAMyD,QAAQ0sB,GAAQ3uB,KAAK,KAAM6C,IACjFrD,MAYXwzB,MAAO,SAASnrB,EAAQhF,GACpBrD,KAAK2E,OAEL0D,EAASvJ,OAAO2D,QAAQ4F,GAExBhF,EAAUnE,KAAK4G,QACX2tB,SAAU,IACVC,OAAQx0B,KAAK8f,KACbmQ,QAAS,EAAG,IACb9rB,EAEH,IAAIswB,GAAK3zB,KAAKwD,UACV2rB,EAASnwB,MAAMyD,QAAQY,EAAQ8rB,QAAQtuB,QAAQ8yB,EAAG1xB,OAClD2xB,EAAOD,EAAGnrB,MACVqrB,EAAKF,EAAGvrB,QAAQC,GAAQ/H,IAAI6uB,EAahC,OAXK9rB,GAAQywB,aACT9zB,KAAKgI,KAAK,aAGdhI,KAAK+zB,MAAM,SAAStzB,GAChBkzB,EAAG5tB,OAAS4tB,EAAGprB,UAAUqrB,EAAKzzB,IAAI0zB,EAAGvzB,IAAIszB,GAAMpzB,KAAKC,KACpDT,KAAKgI,KAAK,SACX,WACChI,KAAKgI,KAAK,YACX3E,GAEIrD,MAQXykB,QAAS,WAAa,MAAOzkB,MAAKwD,UAAUwC,MAa5CguB,QAAS,SAAShuB,GAEd,MADAhG,MAAKoF,QAAQY,KAAMA,IACZhG,MAYXqV,OAAQ,SAASrP,EAAM3C,GACnBrD,KAAK2E,OAELtB,EAAUnE,KAAK4G,QACX2tB,SAAU,KACXpwB,GAEHA,EAAQqwB,OAAS1zB,KAAKi0B,cAAc5wB,EAAQowB,SAAUztB,EAAM3C,EAAQqwB,OAEpE,IAAIC,GAAK3zB,KAAKwD,UACV0wB,EAASP,EAAG5tB,OACZouB,EAAYR,EAAG3tB,IAkCnB,OAhCI3C,GAAQ6wB,OACRA,EAASp1B,OAAO2D,QAAQY,EAAQ6wB,QACzB7wB,EAAQ8rB,SACf+E,EAASP,EAAGzrB,cAAcyrB,EAAGzF,YAAY/tB,IAAInB,MAAMyD,QAAQY,EAAQ8rB,WAGnE9rB,EAAQ+wB,WAAY,IAAO/wB,EAAQowB,SAAW,GAE7CzzB,KAAK0N,UACN1N,KAAK0N,SAAU,EACf1N,KAAKgI,KAAK,cAGdhI,KAAK+zB,MAAM,SAAStzB,GAChBkzB,EAAGlE,cAAc6D,YAAYa,EAAWnuB,EAAMvF,GAAIyzB,GAClDl0B,KAAKgI,KAAK,QAAQA,KAAK,SACxB,WACChI,KAAKgf,KAAO,KACR3b,EAAQowB,UAAY,MACpBzzB,KAAK0N,SAAU,EACf1N,KAAKgI,KAAK,aAEf3E,GAECA,EAAQowB,SAAW,MACnB1lB,aAAa/N,KAAKq0B,YAClBr0B,KAAKq0B,WAAahnB,WAAW,WACzBrN,KAAK0N,SAAU,EACf1N,KAAKgI,KAAK,YACZzD,KAAKvE,MAAO,MAGXA,MAWX8hB,OAAQ,SAASze,GAEb,MADArD,MAAKqV,OAAOrV,KAAKykB,UAAY,EAAGphB,GACzBrD,MAWXgiB,QAAS,SAAS3e,GAEd,MADArD,MAAKqV,OAAOrV,KAAKykB,UAAY,EAAGphB,GACzBrD,MAQXkjB,WAAY,WAAa,MAAOljB,MAAKwD,UAAUyC,SAa/Cgd,WAAY,SAAShd,GAEjB,MADAjG,MAAKoF,QAAQa,QAASA,IACfjG,MAYXs0B,SAAU,SAASruB,EAAS5C,GACxBrD,KAAK2E,OAELtB,EAAUnE,KAAK4G,QACX2tB,SAAU,IACVC,OAAQx0B,KAAK8f,MACd3b,EAEH,IAAIswB,GAAK3zB,KAAKwD,UACV8hB,EAAQtlB,KAAKkjB,aACbgR,EAASP,EAAG5tB,MAqBhB,OAnBI1C,GAAQ6wB,OACRA,EAASp1B,OAAO2D,QAAQY,EAAQ6wB,QACzB7wB,EAAQ8rB,SACf+E,EAASP,EAAGzrB,cAAcyrB,EAAGzF,YAAY/tB,IAAInB,MAAMyD,QAAQY,EAAQ8rB,WAGvElpB,EAAUjG,KAAKu0B,kBAAkBtuB,EAASqf,GAE1CtlB,KAAKyN,UAAW,EAChBzN,KAAKgI,KAAK,aAEVhI,KAAK+zB,MAAM,SAAStzB,GAChBkzB,EAAGjE,iBAAiB4D,YAAYhO,EAAOrf,EAASxF,GAAIyzB,GACpDl0B,KAAKgI,KAAK,QAAQA,KAAK,WACxB,WACChI,KAAKyN,UAAW,EAChBzN,KAAKgI,KAAK,YACX3E,GAEIrD,MAWXkiB,WAAY,SAAS7e,GAEjB,MADArD,MAAKs0B,SAAS,EAAGp1B,KAAK4G,QAAQ2tB,SAAU,KAAOpwB,IACxCrD,MAWXujB,YAAa,SAASlgB,GAClB,MAAI3B,MAAK8yB,IAAIx0B,KAAKkjB,cAAgBljB,KAAKqD,QAAQqD,YACpC1G,KAAKkiB,WAAW7e,GAEpBrD,MAOXy0B,SAAU,WAAa,MAAOz0B,MAAKwD,UAAU0C,OAU7CwuB,SAAU,SAASxuB,GAEf,MADAlG,MAAKoF,QAAQc,MAAOA,IACblG,MAkBX20B,UAAW,SAASC,EAAQvxB,GAExBA,EAAUnE,KAAK4G,QACX+uB,QAAS,EACT1F,QAAS,EAAG,GACZzrB,QAASkR,EAAAA,GACVvR,GAEHuxB,EAAS71B,aAAa0D,QAAQmyB,EAE9B,IAAIzF,GAASnwB,MAAMyD,QAAQY,EAAQ8rB,QAC/BwE,EAAK3zB,KAAKwD,UACVsxB,EAAKnB,EAAGvrB,QAAQwsB,EAAOpX,gBACvBuX,EAAKpB,EAAGvrB,QAAQwsB,EAAOnX,gBACvBtV,EAAO4sB,EAAGz0B,IAAIw0B,GACdE,GAAUrB,EAAGnsB,MAA0B,EAAlBnE,EAAQwxB,QAAmC,EAArBnzB,KAAK8yB,IAAIrF,EAAOrvB,IAAUqI,EAAKrI,EAC1Em1B,GAAUtB,EAAGlsB,OAA2B,EAAlBpE,EAAQwxB,QAAmC,EAArBnzB,KAAK8yB,IAAIrF,EAAOpvB,IAAUoI,EAAKpI,CAM/E,OAJAsD,GAAQ0C,OAAS4tB,EAAGprB,UAAUusB,EAAG30B,IAAI40B,GAAIp0B,IAAI,IAC7C0C,EAAQ2C,KAAOtE,KAAKgU,IAAIie,EAAGnF,UAAUmF,EAAGxG,MAAQzrB,KAAKgU,IAAIsf,EAAQC,IAAU5xB,EAAQK,SACnFL,EAAQ4C,QAAU,EAEX5C,EAAQ6xB,OACXl1B,KAAKm1B,OAAO9xB,GACZrD,KAAKo1B,MAAM/xB,IAanB+B,OAAQ,SAAS/B,GACbrD,KAAK2E,MAEL,IAAIgvB,GAAK3zB,KAAKwD,UACV6xB,GAAc,EACdC,GAAiB,EACjBC,GAAe,CAoCnB,OAlCI,UAAYlyB,KACZswB,EAAG5tB,OAASjH,OAAO2D,QAAQY,EAAQ0C,SAGnC,QAAU1C,IAAWswB,EAAG3tB,QAAU3C,EAAQ2C,OAC1CqvB,GAAc,EACd1B,EAAG3tB,MAAQ3C,EAAQ2C,MAGnB,WAAa3C,IAAWswB,EAAG1tB,WAAa5C,EAAQ4C,UAChDqvB,GAAiB,EACjB3B,EAAG1tB,SAAW5C,EAAQ4C,SAGtB,SAAW5C,IAAWswB,EAAGztB,SAAW7C,EAAQ6C,QAC5CqvB,GAAe,EACf5B,EAAGztB,OAAS7C,EAAQ6C,OAGxBlG,KAAKgI,KAAK,aACLA,KAAK,QAENqtB,GACAr1B,KAAKgI,KAAK,QAGVstB,GACAt1B,KAAKgI,KAAK,UAGVutB,GACAv1B,KAAKgI,KAAK,SAGPhI,KAAKgI,KAAK,YAWrBmtB,OAAQ,SAAS9xB,GACbrD,KAAK2E,OAELtB,EAAUnE,KAAK4G,QACXqpB,QAAS,EAAG,GACZsE,SAAU,IACVC,OAAQx0B,KAAK8f,MACd3b,EAEH,IAAIswB,GAAK3zB,KAAKwD,UACV2rB,EAASnwB,MAAMyD,QAAQY,EAAQ8rB,QAAQtuB,QAAQ8yB,EAAG1xB,OAClD2xB,EAAOD,EAAGnrB,MACV2rB,EAAYn0B,KAAKykB,UACjB+Q,EAAex1B,KAAKkjB,aACpBuS,EAAaz1B,KAAKy0B,WAElBzuB,EAAO,QAAU3C,IAAWA,EAAQ2C,KAAOmuB,EAC3CluB,EAAU,WAAa5C,GAAUrD,KAAKu0B,kBAAkBlxB,EAAQ4C,QAASuvB,GAAgBA,EACzFtvB,EAAQ,SAAW7C,IAAWA,EAAQ6C,MAAQuvB,EAE9CtI,EAAQwG,EAAGtF,UAAUroB,EAAOmuB,GAC5BN,EAAK,UAAYxwB,GAAUswB,EAAGvrB,QAAQtJ,OAAO2D,QAAQY,EAAQ0C,SAASzF,IAAI6uB,EAAOxuB,IAAIwsB,IAAUyG,EAC/FM,EAASp1B,OAAO2D,QAAQY,EAAQ6wB,OA2CpC,OAzCIluB,KAASmuB,IACTn0B,KAAK0N,SAAU,GAEf8nB,IAAiBvvB,IACjBjG,KAAKyN,UAAW,GAGhBzN,KAAK0N,UAAYwmB,IACjBA,EAASP,EAAGzrB,cAAcyrB,EAAGzF,YAAY/tB,IAAI0zB,EAAGvzB,IAAIszB,GAAMjzB,IAAI,EAAI,EAAIwsB,MAG1EntB,KAAKgI,KAAK,aAEVhI,KAAK+zB,MAAM,SAAUtzB,GACbT,KAAK0N,QACLimB,EAAGlE,cAAc6D,YAAYa,EAAWnuB,EAAMvF,GAAIyzB,GAElDP,EAAG5tB,OAAS4tB,EAAGprB,UAAUqrB,EAAKzzB,IAAI0zB,EAAGvzB,IAAIszB,GAAMpzB,KAAKC,KAGpDT,KAAKyN,WACLkmB,EAAG1tB,QAAUqtB,YAAYkC,EAAcvvB,EAASxF,IAGhDyF,IAAUuvB,IACV9B,EAAGztB,MAAQotB,YAAYmC,EAAYvvB,EAAOzF,IAG9CT,KAAKgI,KAAK,QACNhI,KAAK0N,SACL1N,KAAKgI,KAAK,QAEVhI,KAAKyN,UACLzN,KAAKgI,KAAK,WAEf,WACChI,KAAK0N,SAAU,EACf1N,KAAKyN,UAAW,EAChBzN,KAAKgI,KAAK,YACX3E,GAEIrD,MA2BXo1B,MAAO,SAAS/xB,GAgCZ,QAASqyB,GAAEvuB,GACP,GAAI/E,IAAKiuB,EAAKA,EAAKD,EAAKA,GAAMjpB,EAAI,GAAK,GAAKwuB,EAAOA,EAAOC,EAAKA,IAAO,GAAKzuB,EAAIkpB,EAAKD,GAAMuF,EAAOC,EACjG,OAAOl0B,MAAKsU,IAAItU,KAAKC,KAAKS,EAAIA,EAAI,GAAKA,GAG3C,QAASyzB,GAAK1W,GAAK,OAAQzd,KAAKutB,IAAI9P,GAAKzd,KAAKutB,KAAK9P,IAAM,EACzD,QAAS2W,GAAK3W,GAAK,OAAQzd,KAAKutB,IAAI9P,GAAKzd,KAAKutB,KAAK9P,IAAM,EACzD,QAAS4W,GAAK5W,GAAK,MAAO0W,GAAK1W,GAAK2W,EAAK3W,GAtCzCnf,KAAK2E,OAELtB,EAAUnE,KAAK4G,QACXqpB,QAAS,EAAG,GACZ6G,MAAO,IACPC,MAAO,KACPvC,OAAQx0B,KAAK8f,MACd3b,EAEH,IAAIswB,GAAK3zB,KAAKwD,UACV2rB,EAASnwB,MAAMyD,QAAQY,EAAQ8rB,QAC/BgF,EAAYn0B,KAAKykB,UACjB+Q,EAAex1B,KAAKkjB,aAEpBnd,EAAS,UAAY1C,GAAUvE,OAAO2D,QAAQY,EAAQ0C,QAAU/F,KAAKqd,YACrErX,EAAO,QAAU3C,IAAYA,EAAQ2C,KAAOmuB,EAC5CluB,EAAU,WAAa5C,GAAUrD,KAAKu0B,kBAAkBlxB,EAAQ4C,QAASuvB,GAAgBA,EAEzFrI,EAAQwG,EAAGtF,UAAUroB,EAAOmuB,GAC5BP,EAAOD,EAAGnrB,MACVqrB,EAAKF,EAAGvrB,QAAQrC,GAAQzF,IAAI6uB,EAAOxuB,IAAIwsB,IAEvC+I,EAAiBvC,EAAG1F,UACpBkI,EAAM9yB,EAAQ4yB,MACdG,EAAI/yB,EAAQ2yB,MAEZ5F,EAAK1uB,KAAKmU,IAAI8d,EAAGnsB,MAAOmsB,EAAGlsB,QAC3B4oB,EAAKD,EAAKjD,EACVyI,EAAK/B,EAAGvzB,IAAIszB,GAAMnyB,MAClBk0B,EAAOQ,EAAMA,EAWbE,EAAKX,EAAE,GACPY,EAAI,SAAUrO,GAAK,MAAQ6N,GAAKO,GAAMP,EAAKO,EAAKF,EAAMlO,IACtDsO,EAAI,SAAUtO,GAAK,MAAOmI,KAAO0F,EAAKO,GAAMN,EAAKM,EAAKF,EAAMlO,GAAK4N,EAAKQ,IAAOV,GAAQC,GACrFY,GAAKd,EAAE,GAAKW,GAAMF,CAEtB,IAAIz0B,KAAK8yB,IAAIoB,GAAM,KAAU,CACzB,GAAIl0B,KAAK8yB,IAAIpE,EAAKC,GAAM,KAAU,MAAOrwB,KAEzC,IAAIS,GAAS2vB,EAALC,EAAU,GAAK,CACvBmG,GAAI90B,KAAK8yB,IAAI9yB,KAAKsU,IAAIqa,EAAKD,IAAO+F,EAElCI,EAAI,WAAa,MAAO,IACxBD,EAAI,SAASrO,GAAK,MAAOvmB,MAAKutB,IAAIxuB,EAAI01B,EAAMlO,IA+BhD,MA5BA5kB,GAAQowB,SAAW,IAAO+C,EAAIJ,EAE9Bp2B,KAAK0N,SAAU,EACX8nB,IAAiBvvB,IAASjG,KAAKyN,UAAW,GAE9CzN,KAAKgI,KAAK,aAEVhI,KAAK+zB,MAAM,SAAUtzB,GACjB,GAAIwnB,GAAIxnB,EAAI+1B,EACRC,EAAKF,EAAEtO,EAEX0L,GAAG3tB,KAAOmuB,EAAYR,EAAGnF,UAAU,EAAI8H,EAAErO,IACzC0L,EAAG5tB,OAAS4tB,EAAGprB,UAAUqrB,EAAKzzB,IAAI0zB,EAAGvzB,IAAIszB,GAAMpzB,KAAKi2B,IAAMP,GAEtDjwB,IAAYuvB,IACZ7B,EAAG1tB,QAAUqtB,YAAYkC,EAAcvvB,EAASxF,IAGpDT,KAAKgI,KAAK,QAAQA,KAAK,QACnB/B,IAAYuvB,GACZx1B,KAAKgI,KAAK,WAEf,WACChI,KAAK0N,SAAU,EACf1N,KAAKyN,UAAW,EAChBzN,KAAKgI,KAAK,YACX3E,GAEIrD,MAGX02B,SAAU,WACN,QAAS12B,KAAK22B,UAQlBhyB,KAAM,WAKF,MAJI3E,MAAK22B,WACL32B,KAAK22B,SAASzY,KAAKle,MACnBA,KAAK42B,eAEF52B,MAGX+zB,MAAO,SAAS/lB,EAAO6oB,EAAQxzB,GAC3BrD,KAAK82B,UAAYD,EACjB72B,KAAK22B,SAAW9zB,QAAQqiB,MAAM,SAAU3G,GACpCvQ,EAAMkQ,KAAKle,KAAMqD,EAAQqwB,OAAOnV,IACtB,IAANA,GACAve,KAAK42B,eAEVvzB,EAAQ+wB,WAAY,EAAQ,EAAI/wB,EAAQowB,SAAUzzB,OAGzD42B,YAAa,iBACF52B,MAAK22B,QAGZ,IAAIE,GAAS72B,KAAK82B,gBACX92B,MAAK82B,UACZD,EAAO3Y,KAAKle,OAIhBu0B,kBAAmB,SAAStuB,EAAS8wB,GACjC9wB,EAAU/G,KAAK2J,KAAK5C,EAAS,KAAM,IACnC,IAAI+wB,GAAOt1B,KAAK8yB,IAAIvuB,EAAU8wB,EAG9B,OAFIr1B,MAAK8yB,IAAIvuB,EAAU,IAAM8wB,GAAkBC,IAAM/wB,GAAW,KAC5DvE,KAAK8yB,IAAIvuB,EAAU,IAAM8wB,GAAkBC,IAAM/wB,GAAW,KACzDA,GAGXguB,cAAe,SAASR,EAAUztB,EAAM0Y,GACpC,GAAIgV,EAEJ,IAAI1zB,KAAKgf,KAAM,CACX,GAAIA,GAAOhf,KAAKgf,KACZT,GAAKrD,KAAKC,MAAQ6D,EAAKsG,OAAStG,EAAKyU,SACrCuC,EAAQhX,EAAK0U,OAAOnV,EAAI,KAAQS,EAAK0U,OAAOnV,GAG5Cze,EAAI,IAAO4B,KAAKC,KAAKq0B,EAAQA,EAAQ,MAAU,IAC/Cj2B,EAAI2B,KAAKC,KAAK,MAAc7B,EAAIA,EAEpC4zB,GAASx0B,KAAKwf,OAAO5e,EAAGC,EAAG,IAAM,OAEjC2zB,GAAShV,EAASxf,KAAKwf,OAAOoC,MAAM5hB,KAAMwf,GAAUxf,KAAK8f,IAW7D,OAPAhf,MAAKgf,MACDsG,OAAO,GAAKpK,OAAQiN,UACpB0L,GAAInyB,KAAKqS,IAAI,EAAG/N,GAChBytB,SAAUA,EACVC,OAAQA,GAGLA;;AR3qBf,YAcA,SAASj1B,gBAZT,GAAIF,SAAUD,QAAQ,aAClBwE,IAAMxE,QAAQ,kBACdY,KAAOZ,QAAQ,kBAEnBH,QAAOC,QAAUK,YAUjBA,YAAYwB,UAAYf,KAAKoE,QAAQ/E,SACjC8E,SACIme,SAAU,gBAGdnT,MAAO,SAASa,GACZ,GAAIwS,GAAY,uBACZjW,EAAYzL,KAAK0H,WAAa5E,IAAIgJ,OAAO,MAAO4V,EAAWxS,EAAI9D,eAQnE,OANApL,MAAKsP,UACLJ,EAAI7K,GAAG,cAAerE,KAAKsP,QAAQ/K,KAAKvE,OACxCkP,EAAI7K,GAAG,gBAAiBrE,KAAKsP,QAAQ/K,KAAKvE,OAC1CkP,EAAI7K,GAAG,gBAAiBrE,KAAKsP,QAAQ/K,KAAKvE,OAC1CkP,EAAI7K,GAAG,UAAWrE,KAAKokB,gBAAgB7f,KAAKvE,OAErCyL,GAGX6D,QAAS,WACL,GAAI+U,KAEJ,IAAIrkB,KAAKmP,KAAKzJ,MACV,IAAK,GAAIqE,KAAM/J,MAAKmP,KAAKzJ,MAAML,QAAS,CACpC,GAAI2E,GAAShK,KAAKmP,KAAKzJ,MAAML,QAAQ0E,EACjCC,GAAOsa,aAAeD,EAAavG,QAAQ9T,EAAOsa,aAAe,GACjED,EAAarT,KAAKhH,EAAOsa,aAKrCtkB,KAAK0H,WAAW6I,UAAY8T,EAAapT,KAAK,OAC9CjR,KAAKukB,UAAYvkB,KAAK0H,WAAW8c,uBAAuB,sBAAsB,GAC9ExkB,KAAKokB,mBAGTA,gBAAiB,WACb,GAAIpkB,KAAKukB,UAAW,CAChB,GAAIxe,GAAS/F,KAAKmP,KAAKkO,WACvBrd,MAAKukB,UAAUhR,KAAO,yCACdxN,EAAO0W,IAAM,IAAM1W,EAAOyW,IAAM,IAAM9a,KAAKH,MAAMvB,KAAKmP,KAAKsV,UAAY;;AFvD3F,YASA,SAASlmB,YAPTJ,OAAOC,QAAUG,QASjBA,QAAQ0B,WASJiF,MAAO,SAASgK,GACZlP,KAAKmP,KAAOD,CACZ,IAAIzD,GAAYzL,KAAK0H,WAAa1H,KAAKqO,MAAMa,EAC7C,IAAIlP,KAAKqD,SAAWrD,KAAKqD,QAAQme,SAAU,CACvC,GAAIrV,GAAMnM,KAAKqD,QAAQme,SACnBC,EAASvS,EAAIjD,gBAAgBE,EACjCV,GAAUiW,WAAa,iBACO,KAA1BvV,EAAI2R,QAAQ,UACZ2D,EAAOE,aAAalW,EAAWgW,EAAOjR,YAEtCiR,EAAOhR,YAAYhF,GAI3B,MAAOzL,OAQX8N,OAAQ,WAIJ,MAHA9N,MAAK0H,WAAW6H,WAAWC,YAAYxP,KAAK0H,YACxC1H,KAAKsO,UAAUtO,KAAKsO,SAAStO,KAAKmP,MACtCnP,KAAKmP,KAAO,KACLnP;;AC9Cf,YAgBA,SAASxB,YAAW6E,GAChBnE,KAAK6P,WAAW/O,KAAMqD,GAf1B,GAAI9E,SAAUD,QAAQ,aAClBwE,IAAMxE,QAAQ,kBACdY,KAAOZ,QAAQ,kBAEnBH,QAAOC,QAAUI,WAcjBA,WAAWyB,UAAYf,KAAKoE,QAAQ/E,SAChC8E,SACIme,SAAU,aAGdnT,MAAO,SAASa,GACZ,GAAIwS,GAAY,gBAEZjW,EAAYzL,KAAK0H,WAAa5E,IAAIgJ,OAAO,MAAO4V,EAAY,SAAUxS,EAAI9D,eAE9EpL,MAAK4hB,cAAgB5hB,KAAK6hB,cAAcH,EAAY,SAAWA,EAAY,WAAYxS,EAAI4S,OAAOvd,KAAK2K,IACvGlP,KAAK+hB,eAAiB/hB,KAAK6hB,cAAcH,EAAY,SAAWA,EAAY,YAAaxS,EAAI8S,QAAQzd,KAAK2K,IAC1GlP,KAAKiiB,SAAWjiB,KAAK6hB,cAAcH,EAAY,WAAYxS,EAAIgT,WAAW3d,KAAK2K,GAE/E,IAAIiT,GAAgBniB,KAAKoiB,eAAiBtf,IAAIgJ,OAAO,SAAU4V,EAAY,kBAAmB1hB,KAAKiiB,SAcnG,OAbAE,GAAczc,MAAM2c,QAAU,2BAC9BF,EAAc3a,MAAQ,GACtB2a,EAAc1a,OAAS,GAEvBzH,KAAKiiB,SAASvd,iBAAiB,YAAa1E,KAAKsiB,eAAe/d,KAAKvE,OACrEA,KAAKuiB,eAAiBviB,KAAKuiB,eAAehe,KAAKvE,MAC/CA,KAAKwiB,aAAexiB,KAAKwiB,aAAaje,KAAKvE,MAE3CA,KAAKyiB,YAAcN,EAAcO,WAAW,MAE5CxT,EAAI7K,GAAG,SAAUrE,KAAK2iB,WAAWpe,KAAKvE,OACtCA,KAAK2iB,aAEElX,GAGX6W,eAAgB,SAASrU,GACrBnL,IAAI8f,cAEJlX,SAAShH,iBAAiB,YAAa1E,KAAKuiB,gBAC5C7W,SAAShH,iBAAiB,UAAW1E,KAAKwiB,cAC1CxiB,KAAK6iB,OAAS5U,EAAE6U,QAEhB7U,EAAE8U,mBAGNR,eAAgB,SAAStU,GACrB,GAAInO,GAAImO,EAAE6U,QACN1D,EAAQ,EAAJtf,EAAQ,GACRA,EAAI2E,OAAOue,OAAOxb,MAAQ,EAAI,GAC7B1H,EAAIE,KAAK6iB,QAAU,CAE5B7iB,MAAKmP,KAAK8T,WAAWjjB,KAAKmP,KAAK+T,aAAe9D,GAC9Cpf,KAAK6iB,OAAS5U,EAAE6U,QAChB9iB,KAAKmjB,QAAS,EAEdlV,EAAEvB,kBAGN8V,aAAc,WACV9W,SAAS0X,oBAAoB,YAAapjB,KAAKuiB,gBAC/C7W,SAAS0X,oBAAoB,UAAWpjB,KAAKwiB,cAC7C1f,IAAIugB,aAEArjB,KAAKmjB,SACLnjB,KAAKmjB,QAAS,EACdrgB,IAAIwgB,iBAGRtjB,KAAKmP,KAAKoU,eAGd1B,cAAe,SAASH,EAAWhE,GAC/B,GAAI5c,GAAIgC,IAAIgJ,OAAO,SAAU4V,EAAW1hB,KAAK0H,WAE7C,OADA5G,GAAE4D,iBAAiB,QAAS,WAAagZ,MAClC5c,GAGX6hB,WAAY,WACR,GAAIa,GAAM,GACNhc,EAAQ,EACRzB,EAAS,GACT9D,EAAQjC,KAAKmP,KAAK3L,UAAUvB,MAASP,KAAK+hB,GAAK,EAC/CC,EAAM1jB,KAAKyiB,WAEfziB,MAAKoiB,eAAe5a,MAAQxH,KAAKoiB,eAAe5a,MAEhDkc,EAAIC,UAAU5d,EAAQA,GACtB2d,EAAI7iB,OAAOoB,GAEXyhB,EAAIE,YACJF,EAAIG,UAAY,OAChBH,EAAII,OAAO,GAAItc,GACfkc,EAAII,QAAQN,EAAK,GACjBE,EAAII,OAAO,EAAGtc,GACdkc,EAAIK,OAEJL,EAAIE,YACJF,EAAIG,UAAY,OAChBH,EAAIM,OAAO,EAAG,GACdN,EAAII,OAAO,EAAGtc,GACdkc,EAAII,OAAON,EAAK,GAChBE,EAAII,OAAO,GAAItc,GACfkc,EAAIK,OAEJL,EAAIE,YACJF,EAAIO,YAAc,OAClBP,EAAIQ,UAAY,EAChBR,EAAIM,OAAO,GAAIxc,GACfkc,EAAII,OAAO,EAAGtc,GACdkc,EAAIS;;AiD7HZ,YASA,SAASu4B,SAAQxtC,GACblP,KAAKmP,KAAOD,EACZlP,KAAKmyB,IAAMjjB,EAAI7D,qBACfrL,KAAK0H,WAAawH,EAAI9D,eAEtBlM,KAAKgiB,aAAalhB,MAZtB,GAAI8C,KAAMxE,QAAQ,kBACdS,aAAeT,QAAQ,4BACvBY,KAAOZ,QAAQ,kBAEnBH,QAAOC,QAAUs+C,QAWjBA,QAAQz8C,WACJ8E,OAAQ,WACJ/E,KAAKmyB,IAAIztB,iBAAiB,YAAa1E,KAAKsyB,cAAc,IAG9DK,QAAS,WACL3yB,KAAKmyB,IAAI/O,oBAAoB,YAAapjB,KAAKsyB,eAGnDA,aAAc,SAAUrkB,IAChBA,EAAEsuC,UAAyB,IAAZtuC,EAAE0uC,OAA4B,IAAb1uC,EAAE2uC,UAClClxC,SAAShH,iBAAiB,YAAa1E,KAAKyyB,cAAc,GAC1D/mB,SAAShH,iBAAiB,UAAW1E,KAAK68C,YAAY,GACtDnxC,SAAShH,iBAAiB,UAAW1E,KAAK88C,YAAY,GAEtD98C,KAAK4yB,UAAY9vB,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,GACxCjO,KAAKkzB,QAAS,IAItBT,aAAc,SAAUxkB,GACpB,GAAI8uC,GAAK/8C,KAAK4yB,UACVoqB,EAAKl6C,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,EAE3BjO,MAAKi9C,OACNj9C,KAAKi9C,KAAOn6C,IAAIgJ,OAAO,MAAO,mBAAoB9L,KAAK0H,YACvD1H,KAAK0H,WAAWkE,UAAUzL,IAAI,sBAE9B2C,IAAI8f,cAEJ5iB,KAAKmP,KAAKnH,KAAK,gBAGnB,IAAIsN,GAAO5T,KAAKgU,IAAIqnC,EAAGj9C,EAAGk9C,EAAGl9C,GACzB0V,EAAO9T,KAAKmU,IAAIknC,EAAGj9C,EAAGk9C,EAAGl9C,GACzByV,EAAO7T,KAAKgU,IAAIqnC,EAAGh9C,EAAGi9C,EAAGj9C,GACzB0V,EAAO/T,KAAKmU,IAAIknC,EAAGh9C,EAAGi9C,EAAGj9C,EAE7B+C,KAAI8O,aAAa5R,KAAKi9C,KAAM,aAAe3nC,EAAO,MAAQC,EAAO,OAEjEvV,KAAKi9C,KAAKv3C,MAAM8B,MAASgO,EAAOF,EAAQ,KACxCtV,KAAKi9C,KAAKv3C,MAAM+B,OAAUgO,EAAOF,EAAQ,MAG7CunC,WAAY,SAAU7uC,GAClB,GAAI8uC,GAAK/8C,KAAK4yB,UACVoqB,EAAKl6C,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,GAC5B2mB,EAAS,GAAI71B,cAAaiB,KAAKmP,KAAK5G,UAAUw0C,GAAK/8C,KAAKmP,KAAK5G,UAAUy0C,GAE3Eh9C,MAAKk9C,UAELl9C,KAAKmP,KACAwlB,UAAUC,GAASM,QAAQ,IAC3BltB,KAAK,cAAem1C,cAAevoB,KAG5CioB,WAAY,SAAU5uC,GACA,KAAdA,EAAEmvC,UACFp9C,KAAKk9C,UACLl9C,KAAKmP,KAAKnH,KAAK,mBAIvBk1C,QAAS,WACAl9C,KAAKi9C,OAEVj9C,KAAKkzB,QAAS,EAEdxnB,SAAS0X,oBAAoB,YAAapjB,KAAKyyB,cAAc,GAC7D/mB,SAAS0X,oBAAoB,UAAWpjB,KAAK68C,YAAY,GACzDnxC,SAAS0X,oBAAoB,UAAWpjB,KAAK88C,YAAY,GAEzD98C,KAAK0H,WAAWkE,UAAUkC,OAAO,sBAEjC9N,KAAKi9C,KAAK1tC,WAAWC,YAAYxP,KAAKi9C,MACtCj9C,KAAKi9C,KAAO,KAEZn6C,IAAIugB;;AI9FZ,YAIA,SAAS27B,iBAAgB9vC,GACrBlP,KAAKmP,KAAOD,EACZlP,KAAK0yB,YAAc1yB,KAAK0yB,YAAYnuB,KAAKvE,MAJ7C7B,OAAOC,QAAU4gD,gBAOjBA,gBAAgB/+C,WACZ8E,OAAQ,WACJ/E,KAAKmP,KAAK9K,GAAG,WAAYrE,KAAK0yB,cAGlCC,QAAS,WACL3yB,KAAKmP,KAAKjG,IAAI,WAAYlJ,KAAK0yB,cAGnCA,YAAa,SAAUzkB,GACnBjO,KAAKmP,KAAKkG,OAAO3T,KAAKH,MAAMvB,KAAKmP,KAAKsV,WAAa,GAAIyP,OAAQjmB,EAAEmlB;;AFnBzE,YAcA,SAASuqB,SAAQzuC,GACblP,KAAKmP,KAAOD,EACZlP,KAAKmyB,IAAMjjB,EAAI7D,qBAEfnM,KAAKgiB,aAAalhB,MAhBtB,GAAI8C,KAAMxE,QAAQ,kBACdY,KAAOZ,QAAQ,kBAEnBH,QAAOC,QAAUu/C,OAGjB,IAAIC,kBAAmB,IACnBC,cAAgB3+C,KAAKwf,OAAO,EAAG,EAAGk/B,iBAAkB,GACpDE,gBAAkB,IAClBC,oBAAsB,GAU1BJ,SAAQ19C,WACJ8E,OAAQ,WACJ/E,KAAKmyB,IAAIztB,iBAAiB,YAAa1E,KAAKg+C,SAAS,GACrDh+C,KAAKmyB,IAAIztB,iBAAiB,aAAc1E,KAAKg+C,SAAS,IAG1DrrB,QAAS,WACL3yB,KAAKmyB,IAAI/O,oBAAoB,YAAapjB,KAAKg+C,SAC/Ch+C,KAAKmyB,IAAI/O,oBAAoB,aAAcpjB,KAAKg+C,UAGpDA,QAAS,SAAU/vC,GACfjO,KAAK4yB,UAAY5yB,KAAKm8C,KAAOr5C,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,GAEpDjO,KAAKi+C,WAAa/iC,KAAKC,MAAOnb,KAAKm8C,OAE9BluC,EAAE6kB,QAIyB,IAArB7kB,EAAE6kB,QAAQ1rB,SACjBsE,SAAShH,iBAAiB,YAAa1E,KAAKk+C,SAAS,GACrDxyC,SAAShH,iBAAiB,WAAY1E,KAAKm+C,aAAa,KALxDzyC,SAAShH,iBAAiB,YAAa1E,KAAKk+C,SAAS,GACrDxyC,SAAShH,iBAAiB,UAAW1E,KAAK88C,YAAY,KAQ9DoB,QAAS,SAAUjwC,GACf,GAAIiB,GAAMlP,KAAKmP,IACf,MAAID,EAAI9I,QAAQ8sB,QAAUhkB,EAAI7I,WAAW6sB,QAAWjlB,EAAE6kB,SAAW7kB,EAAE6kB,QAAQ1rB,OAAS,GAApF,CAEA,GAAI+E,GAAMrJ,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,GAC7BmwC,EAAUp+C,KAAKi+C,SACf9iC,EAAMD,KAAKC,KAGf,KADAijC,EAAQptC,MAAMmK,EAAKhP,IACZiyC,EAAQh3C,OAAS,GAAK+T,EAAMijC,EAAQ,GAAG,GAAK,IAAIA,EAAQ9S,OAE/Dp8B,GAAIvK,OACJuK,EAAI1L,UAAU4rB,mBAAmBlgB,EAAI1L,UAAU0E,cAAclI,KAAKm8C,MAAOhwC,GACzE+C,EAAIlH,KAAK,QAEThI,KAAKm8C,KAAOhwC,EAEZ8B,EAAEvB,mBAGN2xC,MAAO,WACH,GAAID,GAAUp+C,KAAKi+C,QAEnB,IAAIG,EAAQh3C,OAAS,EAEjB,WADApH,MAAKmP,KAAKnH,KAAK,UAInB,IAAIs2C,GAAOF,EAAQA,EAAQh3C,OAAS,GAChCq8B,EAAQ2a,EAAQ,GAChBG,EAAcD,EAAK,GAAGh+C,IAAImjC,EAAM,IAChC+a,GAAiBF,EAAK,GAAK7a,EAAM,IAAM,IAGvCgb,EAAWF,EAAY/9C,KAAKo9C,iBAAmBY,GAC/CxoB,EAAQyoB,EAASh9C,KAEjBu0B,GAAQ8nB,kBACR9nB,EAAQ8nB,gBACRW,EAASr9C,QAAQV,MAAMs1B,GAG3B,IAAIvC,GAAWuC,GAAS+nB,oBAAsBH,kBAC1CzuB,EAASsvB,EAASj+C,MAAMizB,EAAW,EAEvCzzB,MAAKmP,KAAK+f,MAAMC,GACZsE,SAAqB,IAAXA,EACVC,OAAQmqB,cACR/pB,aAAa,KAIrBgpB,WAAY,WACR98C,KAAKq+C,QACL3yC,SAAS0X,oBAAoB,YAAapjB,KAAKk+C,SAAS,GACxDxyC,SAAS0X,oBAAoB,UAAWpjB,KAAK88C,YAAY,IAG7DqB,YAAa,WACTn+C,KAAKq+C,QACL3yC,SAAS0X,oBAAoB,YAAapjB,KAAKk+C,SAC/CxyC,SAAS0X,oBAAoB,WAAYpjB,KAAKm+C;;AD5GtD,YASA,SAASd,YAAWnuC,GAChBlP,KAAKmP,KAAOD,EACZlP,KAAKmyB,IAAMjjB,EAAI7D,qBAEfnM,KAAKgiB,aAAalhB,MAXtB,GAAI8C,KAAMxE,QAAQ,kBACdU,MAAQV,QAAQ,kBAChBY,KAAOZ,QAAQ,kBAEnBH,QAAOC,QAAUi/C,WAUjBA,WAAWp9C,WACP8E,OAAQ,WACJ/E,KAAKmyB,IAAIztB,iBAAiB,cAAe1E,KAAKs9C,gBAAgB,IAGlE3qB,QAAS,WACL3yB,KAAKmyB,IAAI/O,oBAAoB,cAAepjB,KAAKs9C,iBAGrDA,eAAgB,SAAUrvC,GACtBjO,KAAKmP,KAAKxK,OACV3E,KAAKkzB,QAAS,EACdlzB,KAAK4yB,UAAY5yB,KAAKm8C,KAAOr5C,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,GAEpDvC,SAAShH,iBAAiB,YAAa1E,KAAKyyB,cAAc,GAC1D/mB,SAAShH,iBAAiB,UAAW1E,KAAK88C,YAAY,GAEtD7uC,EAAEvB,kBAGN+lB,aAAc,SAAUxkB,GAEpB,GAAI8uC,GAAK/8C,KAAK4yB,UACVoqB,EAAKh9C,KAAKm8C,KACVoB,EAAKz6C,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,GAE5BiB,EAAMlP,KAAKmP,KACXpJ,EAASmJ,EAAI1L,UAAU0qB,YACvBsvB,EAAgBT,EAAGz8C,IAAIyF,GACvB03C,EAAoBD,EAAc/7C,KAEjCyN,GAAIzB,WACLyB,EAAIlH,KAAK,aACTkH,EAAIzB,UAAW,GAKK,IAApBgwC,IACA13C,EAASg3C,EAAG58C,IAAI,GAAInB,OAAM,KAAM,GAAG+B,QAAQy8C,EAAcv7C,UAG7D,IAAIy7C,GAAcV,EAAG18C,IAAIyF,GAAQ1D,UAAUk7C,EAAGj9C,IAAIyF,IAAWrE,KAAK+hB,GAAK,GACvEvU,GAAI1L,UAAUyC,QAAUiJ,EAAIgU,aAAew6B,EAE3CxuC,EAAIlH,KAAK,QAAQA,KAAK,UAEtB+F,aAAa/N,KAAKs8C,UAClBt8C,KAAKs8C,SAAWjvC,WAAWrN,KAAKizB,WAAY,KAE5CjzB,KAAKm8C,KAAOoB,GAGhBtqB,WAAY,WACR,GAAI/jB,GAAMlP,KAAKmP,IAEfD,GAAIzB,UAAW,EACfyB,EAAIqU,cAECrU,EAAIzB,WACLyB,EAAI1K,YACJ0K,EAAIlH,KAAK,aAIjB80C,WAAY,WACR98C,KAAKkzB,QAAS,EAEdxnB,SAAS0X,oBAAoB,YAAapjB,KAAKyyB,cAAc,GAC7D/mB,SAAS0X,oBAAoB,UAAWpjB,KAAK88C,YAAY;;AErFjE,YA0BA,SAAS4B,UAASxvC,GACdlP,KAAKmP,KAAOD,EACZlP,KAAKmyB,IAAMjjB,EAAI7D,qBAEfrL,KAAK68C,WAAa78C,KAAK68C,WAAWt4C,KAAKvE,MA5B3C7B,OAAOC,QAAUsgD,QAGjB,IAAIC,UAAW,GACXC,YAAc,CA2BlBF,UAASz+C,WACL8E,OAAQ,WACJ/E,KAAKmyB,IAAIztB,iBAAiB,UAAW1E,KAAK68C,YAAY,IAG1DlqB,QAAS,WACL3yB,KAAKmyB,IAAI/O,oBAAoB,UAAWpjB,KAAK68C,aAGjDA,WAAY,SAAU5uC,GAClB,KAAIA,EAAE4wC,QAAU5wC,EAAE6wC,SAAW7wC,EAAE8wC,SAA/B,CAEA,GAAI7vC,GAAMlP,KAAKmP,IAEf,QAAQlB,EAAEmvC,SACV,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,KACDluC,EAAImG,OAAO3T,KAAKH,MAAM2N,EAAIuV,YAAcxW,EAAEsuC,SAAW,EAAI,GACzD,MAEJ,KAAK,KACL,IAAK,KACL,IAAK,KACDrtC,EAAImG,OAAO3T,KAAKH,MAAM2N,EAAIuV,YAAcxW,EAAEsuC,SAAW,EAAI,GACzD,MAEJ,KAAK,IACGtuC,EAAEsuC,SACFrtC,EAAI+T,WAAW/T,EAAIgU,aAAe07B,aAElC1vC,EAAIggB,QAAQyvB,SAAU,GAE1B,MAEJ,KAAK,IACG1wC,EAAEsuC,SACFrtC,EAAI+T,WAAW/T,EAAIgU,aAAe07B,aAElC1vC,EAAIggB,OAAOyvB,SAAU,GAEzB,MAEJ,KAAK,IACDzvC,EAAIggB,OAAO,GAAIyvB,UACf,MAEJ,KAAK,IACDzvC,EAAIggB,OAAO,EAAGyvB;;AElF1B,YAQA,SAASM,OAAM/vC,GACXlP,KAAKmP,KAAOD,EACZlP,KAAKmyB,IAAMjjB,EAAI7D,qBAEfnM,KAAKgiB,aAAalhB,MAVtB,GAAI8C,KAAMxE,QAAQ,kBACdY,KAAOZ,QAAQ,kBAEnBH,QAAOC,QAAU6gD,MAUjBA,MAAMh/C,WACF8E,OAAQ,WACJ/E,KAAKmyB,IAAIztB,iBAAiB,aAAc1E,KAAKk/C,UAAU,IAG3DvsB,QAAS,WACL3yB,KAAKmyB,IAAI/O,oBAAoB,aAAcpjB,KAAKk/C,WAGpDA,SAAU,SAAUjxC,GAChB,GAAyB,IAArBA,EAAE6kB,QAAQ1rB,OAAd,CAEA,GAAI21C,GAAKj6C,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,EAAE6kB,QAAQ,IACtCkqB,EAAKl6C,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,EAAE6kB,QAAQ,GAE1C9yB,MAAKm/C,UAAYpC,EAAGz8C,IAAI08C,GACxBh9C,KAAKo/C,YAAcp/C,KAAKmP,KAAK3L,UAAU2pB,MACvCntB,KAAKq/C,cAAgBr/C,KAAKmP,KAAK3L,UAAUyC,QAEzCyF,SAAShH,iBAAiB,YAAa1E,KAAKk+C,SAAS,GACrDxyC,SAAShH,iBAAiB,WAAY1E,KAAKs/C,QAAQ,KAGvDpB,QAAS,SAAUjwC,GACf,GAAyB,IAArBA,EAAE6kB,QAAQ1rB,OAAd,CAEA,GAAI21C,GAAKj6C,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,EAAE6kB,QAAQ,IACtCkqB,EAAKl6C,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,EAAE6kB,QAAQ,IACtC1yB,EAAI28C,EAAG58C,IAAI68C,GAAIr8C,IAAI,GACnB4+C,EAAMxC,EAAGz8C,IAAI08C,GACb7vB,EAAQoyB,EAAI99C,MAAQzB,KAAKm/C,UAAU19C,MACnCwE,EAA0C,IAAhCs5C,EAAIl9C,UAAUrC,KAAKm/C,WAAmBz9C,KAAK+hB,GACrDvU,EAAMlP,KAAKmP,IAEfD,GAAIimB,QACAnvB,KAAMkJ,EAAI1L,UAAUgrB,UAAUxuB,KAAKo/C,YAAcjyB,GACjDlnB,QAASjG,KAAKq/C,cAAgBp5C,EAC9BwtB,SAAU,EACVS,OAAQhlB,EAAI3G,UAAUnI,KAG1B6N,EAAEvB,mBAGN4yC,OAAQ,WACJt/C,KAAKmP,KAAKoU,cAEV7X,SAAS0X,oBAAoB,YAAapjB,KAAKk+C,SAC/CxyC,SAAS0X,oBAAoB,WAAYpjB,KAAKs/C;;AN/DtD,YAcA,SAASlE,YAAWlsC,GAChBlP,KAAKmP,KAAOD,EACZlP,KAAKmyB,IAAMjjB,EAAI7D,qBAEfnM,KAAKgiB,aAAalhB,MAhBtB,GAAI8C,KAAMxE,QAAQ,kBACduE,QAAUvE,QAAQ,sBAClBY,KAAOZ,QAAQ,kBAEnBH,QAAOC,QAAUg9C,UAGjB,IAAIC,IAA0B,mBAAd50B,WAA4BA,UAAU60B,UAAUC,cAAgB,GAC5EC,QAAoC,KAA1BH,GAAGv9B,QAAQ,WACrB29B,OAAkC,KAAzBJ,GAAGv9B,QAAQ,WAA4C,KAAxBu9B,GAAGv9B,QAAQ,QAUvDs9B,YAAWn7C,WACP8E,OAAQ,WACJ/E,KAAKmyB,IAAIztB,iBAAiB,QAAS1E,KAAK07C,UAAU,GAClD17C,KAAKmyB,IAAIztB,iBAAiB,aAAc1E,KAAK07C,UAAU,IAG3D/oB,QAAS,WACL3yB,KAAKmyB,IAAI/O,oBAAoB,QAASpjB,KAAK07C,UAC3C17C,KAAKmyB,IAAI/O,oBAAoB,aAAcpjB,KAAK07C,WAGpDA,SAAU,SAAUztC,GAChB,GAAIjD,EAEW,WAAXiD,EAAEC,MACFlD,EAAQiD,EAAE0tC,OAENH,SAAWvtC,EAAE2tC,YAAcn3C,OAAOo3C,WAAWC,kBAAiB9wC,GAASnI,QAAQ6V,kBAC/EzK,EAAE2tC,YAAcn3C,OAAOo3C,WAAWE,iBAAgB/wC,GAAS,KAE7C,eAAXiD,EAAEC,OACTlD,GAASiD,EAAE+tC,YACPP,SAAQzwC,GAAgB,GAGhC,IAAImQ,IAAO1W,OAAO4gB,aAAenK,MAAMC,MACnC8gC,EAAY9gC,GAAOnb,KAAKk8C,OAAS,EAErCl8C,MAAKm8C,KAAOr5C,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,GACnCjO,KAAKk8C,MAAQ/gC,EAEC,IAAVnQ,GAAgBA,EAAQ,iBAAoB,GAE5ChL,KAAKo8C,MAAQ,QAEbpxC,EAAQtJ,KAAKqU,MAAM/K,EAAQ,IAEV,IAAVA,GAAetJ,KAAK8yB,IAAIxpB,GAAS,EAExChL,KAAKo8C,MAAQ,WAENH,EAAY,KAEnBj8C,KAAKo8C,MAAQ,KACbp8C,KAAKq8C,WAAarxC,EAGlBhL,KAAKs8C,SAAWjvC,WAAWrN,KAAKizB,WAAY,KAEpCjzB,KAAKo8C,QAGbp8C,KAAKo8C,MAAS16C,KAAK8yB,IAAIynB,EAAYjxC,GAAS,IAAO,WAAa,QAI5DhL,KAAKs8C,WACLvuC,aAAa/N,KAAKs8C,UAClBt8C,KAAKs8C,SAAW,KAChBtxC,GAAShL,KAAKq8C,aAKlBpuC,EAAEsuC,UAAYvxC,IAAOA,GAAgB,GAGrChL,KAAKo8C,OAAOp8C,KAAKouB,OAAOpjB,GAE5BiD,EAAEvB,kBAGNumB,WAAY,WACRjzB,KAAKo8C,MAAQ,QACbp8C,KAAKouB,OAAOpuB,KAAKq8C,aAGrBjuB,MAAO,SAAUouB,GACb,GAAIttC,GAAMlP,KAAKmP,KAGXge,EAAQ,GAAK,EAAIzrB,KAAKutB,KAAKvtB,KAAK8yB,IAAIgoB,EAAQ,MACpC,GAARA,GAAuB,IAAVrvB,IAAaA,EAAQ,EAAIA,EAE1C,IAAI0Q,GAAY3uB,EAAI8P,KAAO9P,EAAI8P,KAAK6U,GAAK3kB,EAAI1L,UAAU2pB,MACnDsvB,EAAavtC,EAAI1L,UAAUgrB,UAAUqP,EAAY1Q,EAErDje,GAAImG,OAAOonC,GACPhpB,SAAU,EACVS,OAAQhlB,EAAI3G,UAAUvI,KAAKm8C;;AzC9GvC,YAYA,SAASj5C,QACLhE,KAAKgF,SACD,gBACA,eACDlE,MARP7B,OAAOC,QAAU8E,IAEjB,IAAIhE,MAAOZ,QAAQ,eASnB4E,MAAKjD,WAMDiF,MAAO,SAASgK,GAIZ,MAHAlP,MAAKmP,KAAOD,EACZzK,OAAOC,iBAAiB,aAAc1E,KAAKmF,eAAe,GAC1DnF,KAAKmP,KAAK9K,GAAG,UAAWrE,KAAK2xB,aACtB3xB,MAOX8N,OAAQ,WAIJ,MAHArJ,QAAO2e,oBAAoB,aAAcpjB,KAAKmF,eAAe,GAC7DnF,KAAKmP,KAAKjG,IAAI,UAAWlJ,KAAK2xB,mBACvB3xB,MAAKmP,KACLnP,MAGXmF,cAAe,WACX,GAAIiQ,GAAMxM,SAAS3D,KAAK2sB,QAAQ,IAAK,IAAIC,MAAM,IAC/C,OAAIzc,GAAIhO,QAAU,GACdpH,KAAKmP,KAAK/J,QACNW,SAAUqP,EAAI,IAAKA,EAAI,IACvBpP,MAAOoP,EAAI,GACXnP,UAAWmP,EAAI,IAAM,MAElB,IAEJ,GAGXuc,YAAa,WACT,GAAI5rB,GAAS/F,KAAKmP,KAAKkO,YACnBrX,EAAOhG,KAAKmP,KAAKsV,UACjBxe,EAAUjG,KAAKmP,KAAK+T,aACpB4O,EAAYpwB,KAAKmU,IAAI,EAAGnU,KAAKqwB,KAAKrwB,KAAKsU,IAAIhQ,GAAQtE,KAAKuU,MAExDhR,EAAO,IAAOvD,KAAKH,MAAa,IAAPyE,GAAc,IACnC,IAAMD,EAAOyW,IAAIwV,QAAQF,GACzB,IAAM/rB,EAAO0W,IAAIuV,QAAQF,IACxB7rB,EAAU,IAAOvE,KAAKH,MAAgB,GAAV0E,GAAgB,GAAM,GAE3DxB,QAAOwtB,QAAQC,aAAa,GAAI,GAAIjtB;;ACnE5C,YAkDA,SAAS9B,aAAY+L,GACjBlP,KAAKmP,KAAOD,EACZlP,KAAKmyB,IAAMjjB,EAAI7D,oBAEf,KAAK,GAAIN,KAAQqnB,UACbljB,EAAInE,GAAQ,GAAIqnB,UAASrnB,GAAMmE,EAGnChQ,MAAKgiB,aAAalhB,MAxDtB,GAAIoyB,WACAjsB,WAAY7H,QAAQ,yBACpB8H,QAAS9H,QAAQ,sBACjB+H,WAAY/H,QAAQ,yBACpBgI,QAAShI,QAAQ,sBACjBiI,SAAUjI,QAAQ,sBAClBkI,gBAAiBlI,QAAQ,2BACzBmI,MAAOnI,QAAQ,oBAGfwE,IAAMxE,QAAQ,eACdY,KAAOZ,QAAQ,eAEnBH,QAAOC,QAAU+E,YA8CjBA,YAAYlD,WACR8E,OAAQ,WACJ,GAAI1B,GAAUrD,KAAKmP,KAAK9L,QACpBgvB,EAAKryB,KAAKmyB,GAEd,KAAK,GAAIpnB,KAAQqnB,UACT/uB,EAAQ0H,IAAO/K,KAAKmP,KAAKpE,GAAMhG,QAGvCstB,GAAG3tB,iBAAiB,YAAa1E,KAAKsyB,cAAc,GACpDD,EAAG3tB,iBAAiB,aAAc1E,KAAKuyB,eAAe,GACtDF,EAAG3tB,iBAAiB,QAAS1E,KAAKwyB,UAAU,GAC5CH,EAAG3tB,iBAAiB,YAAa1E,KAAKyyB,cAAc,GACpDJ,EAAG3tB,iBAAiB,WAAY1E,KAAK0yB,aAAa,IAGtDC,QAAS,WACL,GAAItvB,GAAUrD,KAAKmP,KAAK9L,QACpBgvB,EAAKryB,KAAKmyB,GAEd,KAAK,GAAIpnB,KAAQqnB,UACT/uB,EAAQ0H,IAAO/K,KAAKmP,KAAKpE,GAAM4nB,SAGvCN,GAAGjP,oBAAoB,YAAapjB,KAAKsyB,cACzCD,EAAGjP,oBAAoB,aAAcpjB,KAAKuyB,eAC1CF,EAAGjP,oBAAoB,QAASpjB,KAAKwyB,UACrCH,EAAGjP,oBAAoB,YAAapjB,KAAKyyB,cACzCJ,EAAGjP,oBAAoB,WAAYpjB,KAAK0yB,cAG5CJ,aAAc,SAAUrkB,GACpBjO,KAAK4yB,UAAY9vB,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,IAG5CskB,cAAe,SAAUtkB,IAChBA,EAAE6kB,SAAW7kB,EAAE6kB,QAAQ1rB,OAAS,IAEhCpH,KAAK+yB,SAINhlB,aAAa/N,KAAK+yB,SAClB/yB,KAAK+yB,QAAU,KACf/yB,KAAKgzB,WAAW,WAAY/kB,IAL5BjO,KAAK+yB,QAAU1lB,WAAWrN,KAAKizB,WAAY,OASnDA,WAAY,WACRjzB,KAAK+yB,QAAU,MAGnBN,aAAc,SAAUxkB,GACpB,GAAIiB,GAAMlP,KAAKmP,KACXkjB,EAAKryB,KAAKmyB,GAEd,KAAIjjB,EAAI5I,QAAQ4sB,SAAUhkB,EAAI7I,WAAW6sB,OAAzC,CAGA,IADA,GAAI/kB,GAASF,EAAEklB,WAAallB,EAAEE,OACvBA,GAAUA,IAAWkkB,GAAIlkB,EAASA,EAAOoB,UAC5CpB,KAAWkkB,GAEfryB,KAAKgzB,WAAW,YAAa/kB,KAGjCukB,SAAU,SAAUvkB,GAChB,GAAI9B,GAAMrJ,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,EAE7B9B,GAAIvK,OAAO5B,KAAK4yB,YAChB5yB,KAAKgzB,WAAW,QAAS/kB,IAIjCykB,YAAa,SAAUzkB,GACnBjO,KAAKgzB,WAAW,WAAY/kB,GAC5BA,EAAEvB,kBAGNsmB,WAAY,SAAU9kB,EAAMD,GACxB,GAAI9B,GAAMrJ,IAAI+vB,SAAS7yB,KAAKmyB,IAAKlkB,EAEjCjO,MAAKmP,KAAKnH,KAAKkG,GACXklB,OAAQpzB,KAAKmP,KAAK5G,UAAU4D,GAC5B3D,MAAO2D,EACPknB,cAAeplB;;AnBjJ3B,YAEA,IAAIrL,QAAStE,QAAQ,kBACjBY,KAAOZ,QAAQ,gBACfuE,QAAUvE,QAAQ,mBAClBW,QAAUX,QAAQ,mBAClBwE,IAAMxE,QAAQ,eAEdO,MAAQP,QAAQ,kBAChByE,cAAgBzE,QAAQ,2BACxB0E,QAAU1E,QAAQ,qBAElB2E,UAAY3E,QAAQ,oBACpB4E,KAAO5E,QAAQ,UAEf6E,YAAc7E,QAAQ,iBAEtB8E,OAAS9E,QAAQ,YACjBQ,OAASR,QAAQ,kBACjBS,aAAeT,QAAQ,yBACvBU,MAAQV,QAAQ,kBAChBG,YAAcH,QAAQ,yBAiCtBD,IAAMF,OAAOC,QAAU,SAASiF,GAOhC,GALAA,EAAUrD,KAAKqD,QAAUnE,KAAKoE,QAAQtD,KAAKqD,QAASA,GAEpDrD,KAAKuD,cAAgB,GAAIR,eACzB/C,KAAKwD,UAAY,GAAIP,WAAUI,EAAQI,QAASJ,EAAQK,SAEpDL,EAAQM,UAAW,CACnB,GAAIvB,GAAIrD,aAAa0D,QAAQY,EAAQM,UACrC3D,MAAKwD,UAAUI,UAAYxB,EAAEyB,WAAYzB,EAAE0B,YAC3C9D,KAAKwD,UAAUO,UAAY3B,EAAE4B,UAAW5B,EAAE6B,WAG9C/E,KAAKgF,SACD,qBACA,sBACA,qBACA,oBACA,eACA,iBACA,eACA,kBACA,kBACA,SACA,UACDlE,MAEHA,KAAKmE,kBACLnE,KAAKoE,gBAELpE,KAAKqE,GAAG,OAAQrE,KAAKsE,QACrBtE,KAAKqE,GAAG,OAAQrE,KAAKsE,OAAOC,KAAKvE,MAAM,IACvCA,KAAKqE,GAAG,UAAW,WACfrE,KAAKuD,cAAc3D,IAAI,KACvBI,KAAKwE,aACPD,KAAKvE,OAEe,mBAAXyE,SACPA,OAAOC,iBAAiB,SAAU,WAC9B1E,KAAK2E,OAAOC,SAASN,UACvBC,KAAKvE,OAAO,GAGlBA,KAAK6E,YAAc,GAAI1B,aAAYnD,MAE/BqD,EAAQyB,aACR9E,KAAK6E,YAAYE,SAGrB/E,KAAKgF,MAAQ3B,EAAQ4B,OAAQ,GAAK/B,OAAQgC,MAAMlF,MAE3CA,KAAKgF,OAAUhF,KAAKgF,MAAMG,iBAC3BnF,KAAKoF,OAAO/B,GAGhBrD,KAAKqF,WACLrF,KAAKsF,UACLtF,KAAKuF,YAELvF,KAAK4E,SAEDvB,EAAQmC,SAASxF,KAAKyF,WAAWpC,EAAQmC,SACzCnC,EAAQqC,OAAO1F,KAAK2F,SAAStC,EAAQqC,OACrCrC,EAAQuC,oBAAoB5F,KAAK6F,WAAW,GAAIpH,cAGxDS,MAAK4G,OAAOzH,IAAI4B,UAAWhB,SAC3BC,KAAK4G,OAAOzH,IAAI4B,UAAWmD,OAAOnD,WAClCf,KAAK4G,OAAOzH,IAAI4B,WAEZoD,SACI0C,QAAS,EAAG,GACZC,KAAM,EACNC,QAAS,EACTC,MAAO,EAEPzC,QAAS,EACTC,QAAS,GAEToB,aAAa,EAEbqB,YAAY,EACZC,SAAS,EACTC,YAAY,EACZC,SAAS,EACTC,UAAU,EACVC,iBAAiB,EACjBC,OAAO,EAEPC,YAAa,EAEbzB,MAAM,EAENW,oBAAoB,EAEpBe,8BAA8B,EAC9BC,uBAAuB,GAG3Bf,WAAY,SAASgB,GAEjB,MADAA,GAAQ3B,MAAMlF,MACPA,MAWX8G,SAAU,SAASC,EAAO1D,GAClBrD,KAAKuF,SAASwB,KAClB/G,KAAKuF,SAASwB,IAAS,EACnB/G,KAAK0F,OAAO1F,KAAK0F,MAAMsB,SAAShH,KAAKuF,SAAUlC,KAWvD4D,YAAa,SAASF,EAAO1D,GACpBrD,KAAKuF,SAASwB,WACZ/G,MAAKuF,SAASwB,GACjB/G,KAAK0F,OAAO1F,KAAK0F,MAAMsB,SAAShH,KAAKuF,SAAUlC,KAWvDoC,WAAY,SAASyB,EAAS7D,GAC1BrD,KAAKuF,WACL,KAAK,GAAI4B,GAAI,EAAGA,EAAID,EAAQE,OAAQD,IAChCnH,KAAKuF,SAAS2B,EAAQC,KAAM,CAE5BnH,MAAK0F,OAAO1F,KAAK0F,MAAMsB,SAAShH,KAAKuF,SAAUlC,IASvDgE,SAAU,SAASN,GACf,QAAS/G,KAAKuF,SAASwB,IAQ3BO,WAAY,WACR,MAAO9H,QAAO+H,KAAKvH,KAAKuF,WAQ5BX,OAAQ,WACJ,GAAI4C,GAAQ,EAAGC,EAAS,CAexB,OAbIzH,MAAK0H,aACLF,EAAQxH,KAAK0H,WAAWC,aAAe,IACvCF,EAASzH,KAAK0H,WAAWE,cAAgB,KAG7C5H,KAAK6H,QAAQjD,OAAO4C,EAAOC,GAE3BzH,KAAKwD,UAAUgE,MAAQA,EACvBxH,KAAKwD,UAAUiE,OAASA,EACxBzH,KAAKwD,UAAUsE,aAEf9H,KAAK+H,QAAQnD,OAAO4C,EAAOC,GAEpBzH,KACFgI,KAAK,aACLA,KAAK,QACLA,KAAK,UACLA,KAAK,YAQdC,UAAW,WACP,MAAO,IAAIlJ,cACPiB,KAAKwD,UAAU0E,cAAc,GAAIlJ,OAAM,EAAG,IAC1CgB,KAAKwD,UAAU0E,cAAclI,KAAKwD,UAAU2E,QASpDC,QAAS,SAASC,GACd,MAAOrI,MAAKwD,UAAU8E,cAAcxJ,OAAO2D,QAAQ4F,KASvDE,UAAW,SAASC,GAChB,MAAOxI,MAAKwD,UAAU0E,cAAclJ,MAAMyD,QAAQ+F,KAyBtDC,WAAY,SAASD,EAAOE,EAAQC,GAChC,GAAIC,GAAW5I,KAAKuI,UAAUC,GAAOK,OACjCC,EAAQ9I,KAAKwD,UAAUuF,mBAAmBH,EAE9C,OADA5I,MAAK0F,MAAM+C,WAAWK,EAAOJ,EAAQC,GAC9B3I,MAeXgJ,MAAO,SAASC,GACZjJ,KAAK0F,MAAMsD,MAAMC,GAEjBjJ,KAAK0F,MAAMsB,SAAShH,KAAKuF,UACzBvF,KAAKsE,QAAO,IAShBqB,SAAU,SAASD,GAuBf,MAtBI1F,MAAK0F,QACL1F,KAAK0F,MACAwD,IAAI,OAAQlJ,KAAKmJ,cACjBD,IAAI,QAASlJ,KAAKoJ,oBAClBF,IAAI,SAAUlJ,KAAKqJ,gBACnBH,IAAI,aAAclJ,KAAKsJ,cACvBJ,IAAI,gBAAiBlJ,KAAKuJ,iBAC1BL,IAAI,cAAelJ,KAAKwJ,iBACxBN,IAAI,eAAgBlJ,KAAKyJ,qBACzBP,IAAI,gBAAiBlJ,KAAKwJ,iBAC1BN,IAAI,YAAalJ,KAAK0J,oBACtBR,IAAI,eAAgBlJ,KAAK0J,oBACzBR,IAAI,WAAYlJ,KAAK2J,mBACrBT,IAAI,cAAelJ,KAAK2J,mBACxBT,IAAI,YAAalJ,KAAKsE,QACtB4E,IAAI,aAAclJ,KAAK2J,mBACvBC,UAEL5J,KAAKkJ,IAAI,SAAUlJ,KAAK0F,MAAMmE,gBAC9B7J,KAAKkJ,IAAI,QAASlJ,KAAK0F,MAAMmE,iBAG5BnE,GAGMA,YAAiB7G,OACxBmB,KAAK0F,MAAQA,EAEb1F,KAAK0F,MAAQ,GAAI7G,OAAM6G,EAAO1F,KAAKuD,eAGvCvD,KAAK0F,MACArB,GAAG,OAAQrE,KAAKmJ,cAChB9E,GAAG,QAASrE,KAAKoJ,oBACjB/E,GAAG,SAAUrE,KAAKqJ,gBAClBhF,GAAG,aAAcrE,KAAKsJ,cACtBjF,GAAG,gBAAiBrE,KAAKuJ,iBACzBlF,GAAG,cAAerE,KAAKwJ,iBACvBnF,GAAG,eAAgBrE,KAAKyJ,qBACxBpF,GAAG,gBAAiBrE,KAAKwJ,iBACzBnF,GAAG,YAAarE,KAAK0J,oBACrBrF,GAAG,eAAgBrE,KAAK0J,oBACxBrF,GAAG,WAAYrE,KAAK2J,mBACpBtF,GAAG,cAAerE,KAAK2J,mBACvBtF,GAAG,YAAarE,KAAKsE,QACrBD,GAAG,aAAcrE,KAAK2J,mBAE3B3J,KAAKqE,GAAG,SAAUrE,KAAK0F,MAAMmE,gBAC7B7J,KAAKqE,GAAG,QAASrE,KAAK0F,MAAMmE,gBAErB7J,OA3BHA,KAAK0F,MAAQ,KACN1F,OAsCf8J,UAAW,SAASC,EAAIC,GAEpB,MADAhK,MAAK0F,MAAMoE,UAAUC,EAAIC,GAClBhK,MAUXiK,aAAc,SAASF,GAEnB,MADA/J,MAAK0F,MAAMuE,aAAaF,GACjB/J,MASXkK,UAAW,SAASH,GAChB,MAAO/J,MAAK0F,MAAMwE,UAAUH,IAWhCI,SAAU,SAASC,EAAOC,GAGtB,MAFArK,MAAK0F,MAAMyE,SAASC,EAAOC,GAC3BrK,KAAK0F,MAAMsB,SAAShH,KAAKuF,UAClBvF,MAWXsK,YAAa,SAASP,GAGlB,MAFA/J,MAAK0F,MAAM4E,YAAYP,GACvB/J,KAAK0F,MAAMsB,SAAShH,KAAKuF,UAClBvF,MAUXuK,UAAW,SAASH,EAAOI,GAEvB,MADAxK,MAAK0F,MAAM6E,UAAUH,EAAOI,GACrBxK,MAWXyK,kBAAmB,SAASC,EAASC,EAASC,GAE1C,MADA5K,MAAK0F,MAAM+E,kBAAkBC,EAASC,EAASC,GACxC5K,MASX6K,UAAW,SAAST,GAChB,MAAOpK,MAAK0F,MAAMmF,UAAUT,IAYhCU,iBAAkB,SAASV,EAAOW,EAAMC,EAAOjE,GAI3C,MAHA/G,MAAK0F,MAAMoF,iBAAiBV,EAAOW,EAAMC,EAAOjE,GAChD/G,KAAK0F,MAAMsB,SAAShH,KAAKuF,UACzBvF,KAAKsE,QAAO,GACLtE,MAWXiL,iBAAkB,SAASb,EAAOW,EAAMhE,GACpC,MAAO/G,MAAK0F,MAAMuF,iBAAiBb,EAAOW,EAAMhE,IAWpDmE,kBAAmB,SAASd,EAAOW,EAAMC,GAErC,MADAhL,MAAK0F,MAAMwF,kBAAkBd,EAAOW,EAAMC,GACnChL,MAWXmL,kBAAmB,SAASf,EAAOW,GAC/B,MAAO/K,MAAK0F,MAAMyF,kBAAkBf,EAAOW,IAO/CK,aAAc,WACV,MAAOpL,MAAK0H,YAahB2D,mBAAoB,WAChB,MAAOrL,MAAKsL,kBAOhBC,UAAW,WACP,MAAOvL,MAAK6H,QAAQ2D,cAGxBrH,gBAAiB,WACb,GAAI4F,GAAK/J,KAAKqD,QAAQoI,UAElBA,EAAYzL,KAAK0H,WAA2B,gBAAPqC,GAAkB2B,SAASC,eAAe5B,GAAMA,CACzF0B,GAAUG,UAAUzL,IAAI,eAExB,IAAI0L,GAAkB7L,KAAKsL,iBAAmBxI,IAAIgJ,OAAO,MAAO,4BAA6BL,EACzFzL,MAAKqD,QAAQyB,aACb+G,EAAgBD,UAAUzL,IAAI,wBAElCH,KAAK6H,QAAU,GAAIjF,QAAO5C,KAAM6L,EAEhC,IAAIE,GAAmBjJ,IAAIgJ,OAAO,MAAO,6BAA8BL,GACnEO,EAAUhM,KAAKiM,oBAClB,WAAY,YAAa,cAAe,gBAAgBC,QAAQ,SAAUC,GACvEH,EAAQG,GAAOrJ,IAAIgJ,OAAO,MAAO,iBAAmBK,EAAKJ,MAIjE3H,cAAe,WACX,GAAIgI,GAAKpM,KAAK6H,QAAQwE,iBAClB1F,6BAA8B3G,KAAKqD,QAAQsD,6BAC3CC,sBAAuB5G,KAAKqD,QAAQuD,uBAGxC,OAAKwF,QAKLpM,KAAK+H,QAAU,GAAI/E,SAAQoJ,EAAIpM,KAAKwD,gBAJhC8I,SAAQC,MAAM,+BAOtBC,aAAc,SAASC,GACnBA,EAAMC,iBACF1M,KAAK2M,UACL9J,QAAQ+J,YAAY5M,KAAK2M,WAIjCE,iBAAkB,WACd7M,KAAKoE,gBACLpE,KAAK4E,SACL5E,KAAKsE,UAUTwI,OAAQ,WACJ,MAAI9M,MAAK+M,aAAe/M,KAAKgN,eAClB,EACPhN,KAAK0F,QAAU1F,KAAK0F,MAAMoH,UACnB,GACJ,GASXxI,OAAQ,SAAS2I,GACb,MAAKjN,MAAK0F,OAEV1F,KAAK+M,YAAc/M,KAAK+M,aAAeE,EACvCjN,KAAKgN,eAAgB,EAErBhN,KAAKwE,YAEExE,MAPiBA,MAe5BkN,OAAQ,WAsCJ,MArCIlN,MAAK0F,OAAS1F,KAAK+M,cACnB/M,KAAK+M,aAAc,EACnB/M,KAAK0F,MAAMyH,aAAanN,KAAKwD,UAAUwC,OAGvChG,KAAK0F,OAAS1F,KAAKgN,gBAAkBhN,KAAKoN,uBAC1CpN,KAAKgN,eAAgB,EACrBhN,KAAKoN,qBAAuBC,WAAW,WACnCrN,KAAKoN,qBAAuB,MAC9B7I,KAAKvE,MAAO,IACdA,KAAK0F,MAAM4H,eAAetN,KAAKwD,YAGnCxD,KAAK+H,QAAQmF,OAAOlN,KAAK0F,OACrB6H,MAAOvN,KAAKuN,MACZC,SAAUxN,KAAKwN,SACfC,SAAUzN,KAAKyN,SACfC,QAAS1N,KAAK0N,UAGlB1N,KAAKgI,KAAK,UAENhI,KAAK8M,WAAa9M,KAAK2N,UACvB3N,KAAK2N,SAAU,EACf3N,KAAKgI,KAAK,SAGdhI,KAAK2M,SAAW,KAEX3M,KAAKuD,cAAcqK,YACpB5N,KAAK+M,aAAc,IAGnB/M,KAAKgN,eAAiBhN,KAAK6N,WAAa7N,KAAKuD,cAAcqK,YAC3D5N,KAAKwE,YAGFxE,MAOX8N,OAAQ,WAKJ,MAJI9N,MAAKgF,OAAOhF,KAAKgF,MAAM8I,SAC3BjL,QAAQ+J,YAAY5M,KAAK2M,UACzBoB,aAAa/N,KAAKoN,sBAClBpN,KAAK2F,SAAS,MACP3F,MAGXwE,UAAW,WACHxE,KAAK0F,QAAU1F,KAAK2M,WACpB3M,KAAK2M,SAAW9J,QAAQmL,MAAMhO,KAAKkN,UAI3C9D,mBAAoB,SAAS6E,GACzBjO,KAAKgI,KAAK,SAAWiG,EAAEC,KAAMhP,KAAK4G,QAAQJ,MAAOuI,EAAEE,QAASF,KAGhExE,oBAAqB,SAASwE,GAC1BjO,KAAKgI,KAAKiG,EAAEC,KAAMhP,KAAK4G,QAAQJ,MAAOuI,EAAEE,QAASF,KAGrDvE,mBAAoB,SAASuE,GACzBjO,KAAKgI,KAAKiG,EAAEC,KAAMhP,KAAK4G,QAAQJ,MAAOuI,EAAEE,QAASF,KAGrDtE,kBAAmB,SAASsE,GACxBjO,KAAKgI,KAAKiG,EAAEC,KAAMhP,KAAK4G,QAAQJ,MAAOuI,EAAEE,QAASF,KAGrD9E,aAAc,SAAS8E,GACnBjO,KAAK0F,MAAMsB,SAAShH,KAAKuF,UAAW6I,YAAY,IAChDpO,KAAKoJ,mBAAmB6E,IAG5B5E,eAAgB,SAAS4E,GACrBjO,KAAKsE,QAAO,GACZtE,KAAKoJ,mBAAmB6E,IAG5B3E,aAAc,SAAS2E,GACnB,GAAIjE,GAASiE,EAAEjE,MACXA,GAAOqE,OACPrE,EAAOqE,MAAMrO,MACjBA,KAAKyJ,oBAAoBwE,IAG7B1E,gBAAiB,SAAS0E,GACtB,GAAIjE,GAASiE,EAAEjE,MACXA,GAAOsE,UACPtE,EAAOsE,SAAStO,MACpBA,KAAKyJ,oBAAoBwE,IAG7BzE,gBAAiB,SAASyE,GACtBjO,KAAKsE,SACLtE,KAAKyJ,oBAAoBwE,MAIjC/O,KAAKqP,UAAUlQ,IAAI4B,WAQfuO,QAAQ,EACRC,GAAIlB,SAAU,MAAOvN,MAAKwO,QAC1BC,GAAIlB,OAAMvC,GAAShL,KAAKwO,OAASxD,EAAOhL,KAAKsE,UAS7CoK,iBAAiB,EACjBD,GAAIE,kBAAmB,MAAO3O,MAAK0O,iBACnCD,GAAIE,gBAAe3D,GACfhL,KAAK0O,gBAAkB1D,CACvB,KAAK,GAAI7D,KAAKnH,MAAK0F,MAAML,QACrBrF,KAAK0F,MAAML,QAAQ8B,GAAGyH,QAE1B5O,MAAKsE,UASTuJ,UAAU,EACVY,GAAII,WAAY,MAAO7O,MAAK6N,UAC5BY,GAAII,SAAQ7D,GAAShL,KAAK6N,SAAW7C,EAAOhL,KAAKsE,UAGjDwK,WAAW,EACXL,GAAIjB,YAAa,MAAOxN,MAAK8O,WAC7BL,GAAIjB,UAASxC,GAAShL,KAAK8O,UAAY9D,EAAOhL,KAAKsE;;AChyBvD,YAqBA,SAAS5F,OAAM2E,GACXnE,KAAK6P,WAAW/O,KAAMqD,GACtBnE,KAAKgF,SACD,kBACA,iBACAlE,MAxBR7B,OAAOC,QAAUM,KAEjB,IAAIQ,MAAOZ,QAAQ,gBACfW,QAAUX,QAAQ,mBAClBwE,IAAMxE,QAAQ,eACdQ,OAASR,QAAQ,iBAsBrBI,OAAMuB,UAAYf,KAAKoE,QAAQrE,SAC3BoE,SACI2L,aAAa,EACbC,cAAc,GAQlB/J,MAAO,SAASgK,GAOZ,MANAlP,MAAKmP,KAAOD,EACZlP,KAAKmP,KAAK9K,GAAG,OAAQrE,KAAKoP,iBACtBpP,KAAKqD,QAAQ4L,cACbjP,KAAKmP,KAAK9K,GAAG,QAASrE,KAAKqP,eAE/BrP,KAAKsP,UACEtP,MAUX8N,OAAQ,WAWJ,MAVI9N,MAAK0H,YACL1H,KAAK0H,WAAW6H,WAAWC,YAAYxP,KAAK0H,YAG5C1H,KAAKmP,OACLnP,KAAKmP,KAAKjG,IAAI,OAAQlJ,KAAKoP,iBAC3BpP,KAAKmP,KAAKjG,IAAI,QAASlJ,KAAKqP,qBACrBrP,MAAKmP,MAGTnP,MAOXyP,UAAW,WACP,MAAOzP,MAAK0P,SAQhBC,UAAW,SAAStH,GAGhB,MAFArI,MAAK0P,QAAU5Q,OAAO2D,QAAQ4F,GAC9BrI,KAAKsP,UACEtP,MAQX4P,QAAS,SAASC,GAGd,MAFA7P,MAAK8P,SAAWpE,SAASqE,eAAeF,GACxC7P,KAAKgQ,iBACEhQ,MAQXiQ,QAAS,SAASC,GACdlQ,KAAK8P,SAAWpE,SAASyE,wBAEzB,IAA2CC,GAAvCC,EAAO3E,SAAS4E,cAAc,OAElC,KADAD,EAAKE,UAAYL,IACJ,CAET,GADAE,EAAQC,EAAKG,YACRJ,EAAO,KACZpQ,MAAK8P,SAASW,YAAYL,GAI9B,MADApQ,MAAKgQ,iBACEhQ,MAGXsP,QAAS,WACAtP,KAAKmP,OAELnP,KAAK0H,aACN1H,KAAK0H,WAAa5E,IAAIgJ,OAAO,MAAO,iBAAkB9L,KAAKmP,KAAK/D,gBAEhEpL,KAAK0Q,KAAW5N,IAAIgJ,OAAO,MAAO,qBAA0B9L,KAAK0H,YACjE1H,KAAK2Q,SAAW7N,IAAIgJ,OAAO,MAAO,yBAA0B9L,KAAK0H,YAE7D1H,KAAKqD,QAAQ2L,cACbhP,KAAK4Q,aAAe9N,IAAIgJ,OAAO,SAAU,8BAA+B9L,KAAK2Q,UAC7E3Q,KAAK4Q,aAAaL,UAAY,SAC9BvQ,KAAK4Q,aAAalM,iBAAiB,QAAS1E,KAAKqP,iBAIzDrP,KAAKgQ,iBACLhQ,KAAKoP,oBAGTY,eAAgB,WACZ,GAAKhQ,KAAK8P,UAAa9P,KAAK0H,WAA5B,CAIA,IAFA,GAAImJ,GAAO7Q,KAAK2Q,SAETE,EAAKC,iBACRD,EAAKrB,YAAYqB,EAAKL,WAGtBxQ,MAAKqD,QAAQ2L,aACb6B,EAAKJ,YAAYzQ,KAAK4Q,cAG1BC,EAAKJ,YAAYzQ,KAAK8P,YAG1BV,gBAAiB,WACb,GAAKpP,KAAK0P,SAAY1P,KAAK0H,WAA3B,CAEA,GAAIyE,GAAMnM,KAAKmP,KAAK/G,QAAQpI,KAAK0P,SAASnO,QACtCwP,EAAS/Q,KAAKqD,QAAQ0N,MAE1B,KAAKA,EAAQ,CACT,GAAIvJ,GAAQxH,KAAK0H,WAAWC,YACxBF,EAASzH,KAAK0H,WAAWE,YAGzBmJ,GADA5E,EAAIpM,EAAI0H,GACE,OACH0E,EAAIpM,EAAIC,KAAKmP,KAAK3L,UAAUiE,OAASA,GAClC,aAKV0E,EAAIrM,EAAI0H,EAAQ,EAChBuJ,EAAOC,KAAK,QACL7E,EAAIrM,EAAIE,KAAKmP,KAAK3L,UAAUgE,MAAQA,EAAQ,GACnDuJ,EAAOC,KAAK,SAIZD,EADkB,IAAlBA,EAAO3J,OACE,SAEA2J,EAAOE,KAAK,KAGzBjR,KAAKqD,QAAQ0N,OAASA,EAG1B,GAAIG,IACAC,IAAO,oBACPC,WAAY,iBACZC,YAAa,qBACbC,OAAU,wBACVC,cAAe,qBACfC,eAAgB,yBAChBC,KAAQ,oBACRC,MAAS,yBAGT9F,EAAY5L,KAAK0H,WAAWkE,SAChC,KAAK,GAAI+F,KAAOT,GACZtF,EAAUkC,OAAO,yBAA2B6D,EAEhD/F,GAAUzL,IAAI,yBAA2B4Q,GAEzCjO,IAAI8O,aAAa5R,KAAK0H,WAAYwJ,EAAgBH,GAAU,cAAgB5E,EAAIrM,EAAI,MAAQqM,EAAIpM,EAAI,SAGxGsP,cAAe,WACXrP,KAAK8N;;AqEnNb,YAcA,SAASg5B,OAAM34B,EAAQ6R,GACnBhgB,KAAKmO,OAASA,EACdnO,KAAKggB,OAASA,EACdhgB,KAAKmnD,aACLnnD,KAAKonD,WAAa,EAClBpnD,KAAKqnD,QAAUrnD,KAAKqnD,QAAQ9iD,KAAKvE,MACjCA,KAAKmO,OAAOzJ,iBAAiB,UAAW1E,KAAKqnD,SAAS,GAlB1DlpD,OAAOC,QAAU0oC,MAqBjBA,MAAM7mC,UAAUonD,QAAU,SAASjuC,GAC/B,GACIzQ,GADAmJ,EAAOsH,EAAQtH,IAGnB,IAAkB,eAAdA,EAAK5D,KACLvF,EAAW3I,KAAKmnD,UAAUr1C,EAAK/H,UACxB/J,MAAKmnD,UAAUr1C,EAAK/H,IAC3BpB,EAASmJ,EAAKvF,OAAS,KAAMuF,EAAKA,UAC/B,IAAuB,mBAAZA,GAAK/H,GAAoB,CACvC,GAAIA,GAAK+H,EAAK/H,EACd/J,MAAKggB,OAAOlO,EAAK5D,MAAM4D,EAAKA,KAAM,SAAS6B,EAAK7B,EAAMyoB,GAClDv6B,KAAKsnD,aACDp5C,KAAM,aACNnE,GAAI26C,OAAO36C,GACXwC,MAAOoH,EAAM+wC,OAAO/wC,GAAO,KAC3B7B,KAAMA,GACPyoB,IACLh2B,KAAKvE,WAEPA,MAAKggB,OAAOlO,EAAK5D,MAAM4D,EAAKA,OAIpCg1B,MAAM7mC,UAAUyT,KAAO,SAASxF,EAAM4D,EAAMnJ,EAAU4xB,GAClD,GAAIxwB,GAAK,IACLpB,KAAU3I,KAAKmnD,UAAUp9C,EAAK/J,KAAKonD,cAAgBz+C,GACvD3I,KAAKsnD,aAAcp5C,KAAMA,EAAMnE,GAAI26C,OAAO36C,GAAK+H,KAAMA,GAAQyoB,IAWjEuM,MAAM7mC,UAAUqnD,YAAc,SAASluC,EAASmuC,GAC5C,IACIvnD,KAAKmO,OAAOm5C,YAAYluC,EAASmuC,GACnC,MAAOt5C,GACLjO,KAAKmO,OAAOm5C,YAAYluC;;AxDhEhC,YA2CA,SAASsN,YAAWlS,GAChB,GAAI1T,GAAI4K,SAAS4E,cAAc,IAE/B,OADAxP,GAAEyS,KAAOiB,EACF1T,EAAE6lB,WAAajb,SAAS9C,SAAS+d,UAAY7lB,EAAE8lB,OAASlb,SAAS9C,SAASge,KA5CrFxoB,QAAQiB,QAAU,SAASmV,EAAK7L,GAC5B,GAAIke,GAAM,GAAIC,eAmBd,OAlBAD,GAAIE,KAAK,MAAOvS,GAAK,GACrBqS,EAAIG,QAAU,SAAS/Y,GACnBtF,EAASsF,IAEb4Y,EAAII,OAAS,WACT,GAAIJ,EAAIK,QAAU,KAAOL,EAAIK,OAAS,KAAOL,EAAIM,SAAU,CACvD,GAAIrV,EACJ,KACIA,EAAOyU,KAAKa,MAAMP,EAAIM,UACxB,MAAOxT,GACL,MAAOhL,GAASgL,GAEpBhL,EAAS,KAAMmJ,OAEfnJ,GAAS,GAAIwQ,OAAM0N,EAAIQ,cAG/BR,EAAInT,OACGmT,GAGXzoB,QAAQkB,eAAiB,SAASkV,EAAK7L,GACnC,GAAIke,GAAM,GAAIC,eAcd,OAbAD,GAAIE,KAAK,MAAOvS,GAAK,GACrBqS,EAAIS,aAAe,cACnBT,EAAIG,QAAU,SAAS/Y,GACnBtF,EAASsF,IAEb4Y,EAAII,OAAS,WACLJ,EAAIK,QAAU,KAAOL,EAAIK,OAAS,KAAOL,EAAIM,SAC7Cxe,EAAS,KAAMke,EAAIM,UAEnBxe,EAAS,GAAIwQ,OAAM0N,EAAIQ,cAG/BR,EAAInT,OACGmT,GASXzoB,QAAQmpB,SAAW,SAAS/S,EAAK7L,GAC7B,GAAI6e,GAAM,GAAIC,MAgBd,OAfKf,YAAWlS,KACZgT,EAAIE,YAAc,aAEtBF,EAAIP,OAAS,WACTte,EAAS,KAAM6e,IAEnBA,EAAI1H,IAAMtL,EACVgT,EAAIG,QAAU,WACV,GAAIC,GAASlc,SAAS4E,cAAc,UAChCmQ,EAAUmH,EAAOlF,WAAW,KAIhC,OAHAkF,GAAOpgB,MAAQggB,EAAIhgB,MACnBogB,EAAOngB,OAAS+f,EAAI/f,OACpBgZ,EAAQoH,UAAUL,EAAK,EAAG,GACnB/G,EAAQqH,aAAa,EAAG,EAAGN,EAAIhgB,MAAOggB,EAAI/f,QAAQqK,MAEtD0V,GAGXppB,QAAQmW,SAAW,SAASwT,EAAMpf,GAC9B,GAAI8L,GAAQ/I,SAAS4E,cAAc,QACnCmE,GAAMuT,YAAc,WAChBrf,EAAS,KAAM8L,GAEnB,KAAK,GAAItN,GAAI,EAAGA,EAAI4gB,EAAK3gB,OAAQD,IAAK,CAClC,GAAI8gB,GAAIvc,SAAS4E,cAAc,SAC1BoW,YAAWqB,EAAK5gB,MACjBsN,EAAMiT,YAAc,aAExBO,EAAEnI,IAAMiI,EAAK5gB,GACbsN,EAAMhE,YAAYwX,GAGtB,MADAxT,GAAMkT,QAAU,WAAa,MAAOlT,IAC7BA;;ADnFX,YAEA,IAAI7R,QAAStE,QAAQ,YAEjB0P,MAAQvJ,OAAOigB,uBACfjgB,OAAOkgB,0BACPlgB,OAAOmgB,6BACPngB,OAAOogB,uBAEXzmB,SAAQ4P,MAAQ,SAAS0P,GACrB,MAAO1P,OAAM0P,GAGjB,IAAI7I,QAASpQ,OAAOqgB,sBAChBrgB,OAAOsgB,yBACPtgB,OAAOugB,4BACPvgB,OAAOwgB,sBAEX7mB,SAAQwO,YAAc,SAAS7C,GAC3B8K,OAAO9K,IAGX3L,QAAQ8mB,MAAQ,SAAUxH,EAAIyH,EAAKzB,GAS/B,QAAS0B,GAAKjK,GACN1I,IACChO,OAAO4gB,cAAalK,EAAMD,KAAKC,OAEhCA,GAAOmK,EAAQH,EACfzH,EAAGQ,KAAKwF,EAAK,IAEbhG,EAAGQ,KAAKwF,GAAMvI,EAAMmK,GAASH,GAC7B/mB,QAAQ4P,MAAMoX,KAhBtB,IAAKD,EAED,MADAzH,GAAGQ,KAAKwF,EAAK,GACN,IAGX,IAAIjR,IAAQ,EACR6S,EAAQ7gB,OAAO4gB,YAAc5gB,OAAO4gB,YAAYlK,MAAQD,KAAKC,KAgBjE,OAFA/c,SAAQ4P,MAAMoX,GAEP,WAAa3S,GAAQ,IAWhCrU,QAAQe,UAAY,SAASkE,GAkDzB,IAAK,GAhDDkiB,KAEA,WAAa,MAAyB,mBAAX9gB,SAE3B,WAAa,MAA2B,mBAAbiH,WAE3B,WACI,SAAUhJ,MAAMzC,WACZyC,MAAMzC,UAAUulB,OAChB9iB,MAAMzC,UAAUuK,QAChB9H,MAAMzC,UAAUiM,SAChBxJ,MAAMzC,UAAU6d,SAChBpb,MAAMzC,UAAUwlB,aAChB/iB,MAAMzC,UAAUiP,KAChBxM,MAAMzC,UAAUylB,MAChBhjB,MAAMzC,UAAU0lB,QAChBjjB,MAAMzC,UAAU2lB,aAChBljB,MAAMC,UAGd,WACI,SAAUkjB,SAAS5lB,YAAa4lB,SAAS5lB,UAAUsE,QAC5C/E,OAAO+H,MACN/H,OAAOsM,QACPtM,OAAOsmB,gBACPtmB,OAAOumB,qBACPvmB,OAAOwmB,UACPxmB,OAAOymB,UACPzmB,OAAO0mB,cACP1mB,OAAOugB,0BACPvgB,OAAOC,gBACPD,OAAO2mB,kBACP3mB,OAAO4mB,MACP5mB,OAAO6mB,QACP7mB,OAAO8mB,qBAGnB,WACI,MAAO,QAAU7hB,SAAU,SAAW8hB,OAAQ,aAAeA,OAGjE,WACI,OAAO,GAAI3jB,SAAS4jB,qBAAsBnjB,GAAWA,EAAQsD,+BAAiC,IAGlG,WAAa,MAAO,UAAYlC,WAG3B0C,EAAI,EAAGA,EAAIoe,EAASne,OAAQD,IACjC,IAAKoe,EAASpe,KAAM,OAAO,CAE/B,QAAO,GAGX/I,QAAQka,oBAAsBmO,UAAUnO,qBAAuB,EAE/D9Y,OAAOC,eAAerB,QAAS,oBAC3BsB,IAAK,WAAa,MAAO+E,QAAOiU;;AoBnHpC,YAMA,SAAS9V,QAAOod,EAAQvU,GACpBzL,KAAK4nB,OAASlc,SAAS4E,cAAc,UAEjC0P,GAAUvU,IACVzL,KAAK4nB,OAAOliB,MAAM8b,SAAW,WAC7BxhB,KAAK4nB,OAAOhc,UAAUzL,IAAI,mBAC1BH,KAAK4nB,OAAOljB,iBAAiB,mBAAoBsb,EAAOxT,aAAajI,KAAKyb,IAAS,GACnFhgB,KAAK4nB,OAAOljB,iBAAiB,uBAAwBsb,EAAOnT,iBAAiBtI,KAAKyb,IAAS,GAC3FhgB,KAAK4nB,OAAOwd,aAAa,WAAY,GACrC35B,EAAUgF,YAAYzQ,KAAK4nB,SAbnC,GAAI1oB,MAAOZ,QAAQ,UAEnBH,QAAOC,QAAUwE,OAejBA,OAAO3C,UAAU2E,OAAS,SAAS4C,EAAOC,GACtC,GAAI62B,GAAa75B,OAAOiU,kBAAoB,CAG5C1Y,MAAK4nB,OAAOpgB,MAAQ82B,EAAa92B,EACjCxH,KAAK4nB,OAAOngB,OAAS62B,EAAa72B,EAGlCzH,KAAK4nB,OAAOliB,MAAM8B,MAAQA,EAAQ,KAClCxH,KAAK4nB,OAAOliB,MAAM+B,OAASA,EAAS,KAGxC,IAAI49B,4BACAC,WAAW,EACXpH,OAAO,EACPqH,SAAS,EACTC,OAAO,EAGX5iC,QAAO3C,UAAUoM,gBAAkB,SAASo5B,GAGxC,MAFAA,GAAavmC,KAAK4G,UAAW2/B,EAAYJ,2BAElCrlC,KAAK4nB,OAAOlF,WAAW,QAAS+iB,IACnCzlC,KAAK4nB,OAAOlF,WAAW,qBAAsB+iB,IAGrD7iC,OAAO3C,UAAUumB,qBAAuB,SAAS7f,GAC7C,GAAI8+B,GAAavmC,KAAK4G,QAClBa,6BAA8BA,GAC/B0+B,0BAEH,OAAI,2BAA6BrlC,MAAK4nB,OAC3B5nB,KAAK4nB,OAAO8d,wBAAwB,QAASD,IAChDzlC,KAAK4nB,OAAO8d,wBAAwB,qBAAsBD,GACvD,mBAAqBzlC,MAAK4nB,OAC1B5nB,KAAK4nB,OAAO+d,gBAAgB,QAASF,IACxCzlC,KAAK4nB,OAAO+d,gBAAgB,qBAAsBF,KAGjDhhC,OAAOmhC,yBAA2B5lC,KAAKqM,gBAAgB1F,IAGpE/D,OAAO3C,UAAUuL,WAAa,WAC1B,MAAOxL,MAAK4nB;;AE9DhB,YAOA,SAASvP,YAAWjR,EAAQ4Y,GACxBhgB,KAAKymC,UACLzmC,KAAK0mC,aAAe,CACpB,KAAK,GAAIv/B,GAAI,EAAOC,EAAJD,EAAYA,IAAK,CAC7B,GAAIw/B,GAAS,GAAIC,YAAWtoC,QAAQ,wBAChCuoC,EAAQ,GAAIC,OAAMH,EAAQ3mB,EAC9B6mB,GAAM97B,KAAO,UAAY5D,EACzBnH,KAAKymC,OAAOz1B,KAAK61B,IAZzB,GAAIC,OAAQxoC,QAAQ,YAChBsoC,WAAatoC,QAAQ,aAEzBH,QAAOC,QAAUia,WAajBA,WAAWpY,WACPua,UAAW,SAAStM,EAAM4D,GACtB,IAAK,GAAI3K,GAAI,EAAGA,EAAInH,KAAKymC,OAAOr/B,OAAQD,IACpCnH,KAAKymC,OAAOt/B,GAAGuM,KAAKxF,EAAM4D,IAIlC4B,KAAM,SAASxF,EAAM4D,EAAMnJ,EAAUo+B,EAAUxM,GAO3C,OANwB,gBAAbwM,IAAyBrqB,MAAMqqB,MAEtCA,EAAW/mC,KAAK0mC,cAAgB1mC,KAAK0mC,aAAe,GAAK1mC,KAAKymC,OAAOr/B,QAGzEpH,KAAKymC,OAAOM,GAAUrzB,KAAKxF,EAAM4D,EAAMnJ,EAAU4xB,GAC1CwM,GAGXj5B,OAAQ,WACJ,IAAK,GAAI3G,GAAI,EAAGA,EAAInH,KAAKymC,OAAOr/B,OAAQD,IACpCnH,KAAKymC,OAAOt/B,GAAGgH,OAAO64B,WAE1BhnC,MAAKymC;;ADvCb,YAaA,SAASZ,UAAS5lB,GACd,IAAK,GAAI9Y,GAAI,EAAGA,EAAI8Y,EAAM7Y,OAAQD,IAC9B,GAAI8Y,EAAM9Y,IAAM2+B,UACZ,MAAO7lB,GAAM9Y,GAyBzB,QAASmc,eAAcrV,GACnBA,EAAEvB,iBACFuB,EAAE8U,kBACFte,OAAO2e,oBAAoB,QAASE,eAAe,GA1CvD,GAAItkB,OAAQV,QAAQ,iBAEpBF,SAAQ0N,OAAS,SAAUi6B,EAASrkB,EAAWjW,GAC3C,GAAI4mB,GAAK3mB,SAAS4E,cAAcy1B,EAGhC,OAFIrkB,KAAW2Q,EAAG3Q,UAAYA,GAC1BjW,GAAWA,EAAUgF,YAAY4hB,GAC9BA,EAGX,IAAIyT,UAAWp6B,SAASs6B,gBAAgBtgC,MAUpCugC,WAAaJ,UAAU,aAAc,gBAAiB,mBAAoB,iBAC1EK,UACJ9nC,SAAQwkB,YAAc,WACdqjB,aACAC,WAAaJ,SAASG,YACtBH,SAASG,YAAc,SAG/B7nC,QAAQilB,WAAa,WACb4iB,aACAH,SAASG,YAAcC,YAI/B,IAAIC,eAAgBN,UAAU,YAAa,mBAC3CznC,SAAQwT,aAAe,SAASygB,EAAIrnB,GAChCqnB,EAAG3sB,MAAMygC,eAAiBn7B,GAS9B5M,QAAQklB,cAAgB,WACpB7e,OAAOC,iBAAiB,QAAS4e,eAAe,GAChD7e,OAAO4I,WAAW,WACd5I,OAAO2e,oBAAoB,QAASE,eAAe,IACpD,IAGPllB,QAAQy0B,SAAW,SAAUR,EAAIpkB,GAC7B,GAAI2wB,GAAOvM,EAAG+T,uBAEd,OADAn4B,GAAIA,EAAE6kB,QAAU7kB,EAAE6kB,QAAQ,GAAK7kB,EACxB,GAAIjP,OACPiP,EAAEo4B,QAAUzH,EAAKntB,KAAO4gB,EAAGiU,WAC3Br4B,EAAEs4B,QAAU3H,EAAKztB,IAAMkhB,EAAGmU;;AzB1DlC,YAEAroC,QAAOC,SACHgjB,SAAU,4BACVC,UAAW,6BACXC,aAAa,EACbC,sBAAsB;;AFN1B,YAEA,IAAIriB,MAAOZ,QAAQ,UAMfW,SAQAoF,GAAI,SAAS6J,EAAMwP,GAKf,MAJA1d,MAAK2d,QAAU3d,KAAK2d,YACpB3d,KAAK2d,QAAQzP,GAAQlO,KAAK2d,QAAQzP,OAClClO,KAAK2d,QAAQzP,GAAM8C,KAAK0M,GAEjB1d,MASXkJ,IAAK,SAASgF,EAAMwP,GAChB,IAAKxP,EAGD,aADOlO,MAAK2d,QACL3d,IAGX,KAAKA,KAAK4d,QAAQ1P,GAAO,MAAOlO,KAEhC,IAAI0d,EAAI,CACJ,GAAIG,GAAM7d,KAAK2d,QAAQzP,GAAM4P,QAAQJ,EACjCG,IAAO,GACP7d,KAAK2d,QAAQzP,GAAM6P,OAAOF,EAAK,GAE9B7d,KAAK2d,QAAQzP,GAAM9G,cACbpH,MAAK2d,QAAQzP,cAGjBlO,MAAK2d,QAAQzP,EAGxB,OAAOlO,OASXge,KAAM,SAAS9P,EAAMwP,GACjB,GAAIO,GAAU,SAASnM,GACnB9R,KAAKkJ,IAAIgF,EAAM+P,GACfP,EAAGQ,KAAKle,KAAM8R,IAChBvN,KAAKvE,KAEP,OADAA,MAAKqE,GAAG6J,EAAM+P,GACPje,MAUXgI,KAAM,SAASkG,EAAM4D,GACjB,IAAK9R,KAAK4d,QAAQ1P,GAAO,MAAOlO,KAEhC8R,GAAO5S,KAAK4G,UAAWgM,GACvB5S,KAAK4G,OAAOgM,GAAO5D,KAAMA,EAAMC,OAAQnO,MAKvC,KAAK,GAFDme,GAAYne,KAAK2d,QAAQzP,GAAMkQ,QAE1BjX,EAAI,EAAGA,EAAIgX,EAAU/W,OAAQD,IAClCgX,EAAUhX,GAAG+W,KAAKle,KAAM8R,EAG5B,OAAO9R,OAQX4d,QAAS,SAAS1P,GACd,SAAUlO,KAAK2d,UAAW3d,KAAK2d,QAAQzP,KAI/C/P,QAAOC,QAAUa;;AkDtGjB,YAIA,SAASigC,QAAOqb,EAAKC,GACjBx6C,KAAKsF,OAASi1C,EAAIE,WAAWC,kBAAoBF,GAGrD,QAASE,gBAAeC,EAAKr1C,EAAQi1C,GACjC,GAAY,IAARI,EAAW,CACX,GAAIr+B,GAAYi+B,EAAIK,YAAYC,eAAgBphC,WAChDnU,GAAO0L,KAAKsL,IAIpB,QAASu+B,eAAcF,EAAKr+B,EAAWi+B,GACnC,GAAY,IAARI,EAAWr+B,EAAUvR,KAAOwvC,EAAIO,iBAC/B,IAAY,IAARH,EAAWr+B,EAAUyiB,MAAQwb,EAAIO,iBACrC,IAAY,IAARH,EAAW,CAChB,GAAIhc,GAAQ4b,EAAIK,YAAYG,aAC5Bz+B,GAAU7C,OAAOklB,EAAM50B,IAAM40B,GAIrC,QAASoc,WAAUJ,EAAKhc,EAAO4b,GACf,IAARI,EAAWhc,EAAM50B,GAAKwwC,EAAIS,aACb,IAARL,EAAWhc,EAAM4B,OAASga,EAAIU,YACtB,IAARN,EAAWhc,EAAMn3B,MAAQ+yC,EAAIS,aACrB,IAARL,EAAWhc,EAAMl3B,OAAS8yC,EAAIS,aACtB,IAARL,EAAWhc,EAAMltB,KAAO8oC,EAAIW,cACpB,IAARP,EAAWhc,EAAMxtB,IAAMopC,EAAIW,cACnB,IAARP,IAAWhc,EAAME,QAAU0b,EAAIS,cA7B5C78C,OAAOC,QAAU8gC;;AVFjB,YAIA,SAAS5L,aAAYxyB,EAAGsB,EAAGmc,GACvB,MAAQzd,IAAK,EAAIyd,GAAOnc,EAAImc,EAHhCpgB,OAAOC,QAAUk1B,YAMjBA,YAAYujB,OAASvjB,YAErBA,YAAYwjB,KAAO,SAASljB,EAAMC,EAAItV,GAClC,OACI+U,YAAYM,EAAK,GAAIC,EAAG,GAAItV,GAC5B+U,YAAYM,EAAK,GAAIC,EAAG,GAAItV,KAYpC+U,YAAYwI,MAAQ,SAASlI,EAAMC,EAAItV,GACnC,OACI+U,YAAYM,EAAK,GAAIC,EAAG,GAAItV,GAC5B+U,YAAYM,EAAK,GAAIC,EAAG,GAAItV,GAC5B+U,YAAYM,EAAK,GAAIC,EAAG,GAAItV,GAC5B+U,YAAYM,EAAK,GAAIC,EAAG,GAAItV,KAIpC+U,YAAYhd,MAAQ,SAASsd,EAAMC,EAAItV,GACnC,MAAOqV,GAAK1kB,IAAI,SAASkQ,EAAGjY,GACxB,MAAOmsB,aAAYlU,EAAGyU,EAAG1sB,GAAIoX;;AfpCrC,YAKA,SAAS5E,cAAanF,EAAKswB,EAAYC,GAGnC,GAFAA,EAAcA,GAAexlC,OAAOI,cAE/BolC,GAAexlC,OAAOgiB,qBACvB,KAAM,IAAIpI,OAAM,6GAIpB,IAAI6rB,GAAQzlC,OAAO+hB,aACM,mBAAb5V,WAA2D,WAA/BA,SAAS9C,SAAS+d,QAK1D,IAHAnS,EAAMA,EAAIod,QAAQ,gBAAiBoT,EAAQzlC,OAAO8hB,UAAY9hB,OAAO6hB,UAAY0jB,GACjFtwB,GAA4B,KAArBA,EAAIsJ,QAAQ,KAAc,iBAAmB,iBAEhDve,OAAOgiB,qBAAsB,CAC7B,GAAuB,MAAnBwjB,EAAY,GACZ,KAAM,IAAI5rB,OAAM,iJAIpB3E,IAAOuwB,EAGX,MAAOvwB,GA1BX,GAAIjV,QAASjB,QAAQ,YACjBuE,QAAUvE,QAAQ,YA4BtBH,QAAOC,QAAQ0b,kBAAoB,SAAStF,EAAKuwB,GAC7C,GAAIE,GAAOzwB,EAAIqoB,MAAM,sBACrB,OAAKoI,GAGEtrB,aAAanF,EAAK,cAAgBywB,EAAK,GAAK,IAAKF,GAF7CvwB,GAKfrW,OAAOC,QAAQo7B,mBAAqB,SAAShlB,EAAKuwB,GAC9C,MAAKvwB,GAAIqoB,MAAM,iBAGfroB,EAAMmF,aAAanF,EAAM,QAAS,OAAQuwB,GAIb,IAAzBvwB,EAAIsJ,QAAQ,WACZtJ,GAAO,WAEJA,GATIA,GAYfrW,OAAOC,QAAQ6gC,mBAAqB,SAASzqB,EAAKuwB,GAC9C,MAAKvwB,GAAIqoB,MAAM,gBAGXroB,EAAIqoB,MAAM,yBACHljB,aAAanF,EAAK,OAAQuwB,GAE9BprB,aAAanF,EAAK,IAAKuwB,GALnBvwB,GAQfrW,OAAOC,QAAQ8mC,iBAAmB,SAAS1wB,EAAK2wB,GAC5C,MAAKA,IAAcA,EAAUtI,MAAM,gBAE5BroB,EAAIod,QAAQ,6BAA8B/uB,QAAQ6V,kBAAoB,EAAI,SAAW,OADjFlE;;AiBjEf,YAYA,SAAS0jC,UAASriC,EAAKvH,GACnBtO,KAAK6V,IAAMA,EACX7V,KAAKsO,SAAWA,EAChBtO,KAAK63B,QAJT15B,OAAOC,QAAU85C,SAajBA,SAASj4C,UAAU43B,MAAQ,WACvB,IAAK,GAAIlmB,KAAO3R,MAAKm4C,KACjBn4C,KAAKsO,SAAStO,KAAKm4C,KAAKxmC,GAM5B,OAHA3R,MAAKm4C,QACLn4C,KAAKo4C,SAEEp4C,MAaXk4C,SAASj4C,UAAUE,IAAM,SAASwR,EAAKG,GAInC,GAHA9R,KAAKm4C,KAAKxmC,GAAOG,EACjB9R,KAAKo4C,MAAMpnC,KAAKW,GAEZ3R,KAAKo4C,MAAMhxC,OAASpH,KAAK6V,IAAK,CAC9B,GAAIwiC,GAAcr4C,KAAKN,IAAIM,KAAKo4C,MAAM,GAClCC,IAAar4C,KAAKsO,SAAS+pC,GAGnC,MAAOr4C,OAUXk4C,SAASj4C,UAAUq4C,IAAM,SAAS3mC,GAC9B,MAAOA,KAAO3R,MAAKm4C,MASvBD,SAASj4C,UAAUsH,KAAO,WACtB,MAAOvH,MAAKo4C,OAWhBF,SAASj4C,UAAUP,IAAM,SAASiS,GAC9B,IAAK3R,KAAKs4C,IAAI3mC,GAAQ,MAAO,KAE7B,IAAIG,GAAO9R,KAAKm4C,KAAKxmC,EAKrB,cAHO3R,MAAKm4C,KAAKxmC,GACjB3R,KAAKo4C,MAAMr6B,OAAO/d,KAAKo4C,MAAMt6B,QAAQnM,GAAM,GAEpCG;;AgF9FX,YAYA,SAASysE,eAAcl+D,EAAYxQ,GAC/B,MAAOA,GAAK+hB,QAAQ,6BAA8B,SAASiL,EAAOlrB,GAC9D,MAAOA,KAAO0O,GAAaA,EAAW1O,GAAO,KAZrDxT,OAAOC,QAAUmgF;;AzHFjB,YAEA,IAAIlgE,YAAa/f,QAAQ,aAWzBF,SAAQkgB,eAAiB,SAAUC,GAC/B,GAAS,GAALA,EAAQ,MAAO,EACnB,IAAIA,GAAK,EAAG,MAAO,EACnB,IAAIC,GAAKD,EAAIA,EACTE,EAAKD,EAAKD,CACd,OAAO,IAAS,GAAJA,EAAUE,EAAK,GAAKF,EAAIC,GAAMC,EAAK,MAenDrgB,QAAQsgB,OAAS,SAASC,EAAKC,EAAKC,EAAKC,GACrC,GAAIJ,GAAS,GAAIL,YAAWM,EAAKC,EAAKC,EAAKC,EAC3C,OAAO,UAASP,GACZ,MAAOG,GAAOK,MAAMR,KAY5BngB,QAAQ4gB,KAAO5gB,QAAQsgB,OAAO,IAAM,GAAK,IAAM,GAW/CtgB,QAAQ6gB,YAAc,SAAUhI,GAI5B,MAHAA,GAAE,IAAMA,EAAE,GACVA,EAAE,IAAMA,EAAE,GACVA,EAAE,IAAMA,EAAE,GACHA,GAYX7Y,QAAQ8gB,MAAQ,SAAUC,EAAGzJ,EAAKG,GAC9B,MAAOnU,MAAKgU,IAAIG,EAAKnU,KAAKmU,IAAIH,EAAKyJ,KAWvC/gB,QAAQyK,KAAO,SAAUsW,EAAGzJ,EAAKG,GAC7B,GAAIuJ,GAAIvJ,EAAMH,CACd,OAAOyJ,KAAMtJ,EAAMsJ,IAAMA,EAAIzJ,GAAO0J,EAAIA,GAAKA,EAAI1J,GAQrDtX,QAAQihB,SAAW,WACf,IAAK,GAAIlY,GAAI,EAAGA,EAAImY,UAAUlY,OAAQD,IAAK,CACvC,GAAIoY,GAAMD,UAAUnY,EACpB,IAAY,OAARoY,GAAwBxN,SAARwN,EAChB,MAAOA,KAenBnhB,QAAQod,UAAY,SAAUlF,EAAOoH,EAAI/U,GAGrC,QAAS6W,KAA8B,MAAdC,GAAiB9W,IAF1C,GAAI8W,GAAYnJ,EAAMlP,MACtB,IAAkB,IAAdqY,EAAiB,MAAO9W,IAE5B,KAAK,GAAIxB,GAAI,EAAGA,EAAImP,EAAMlP,OAAQD,IAAKuW,EAAGpH,EAAMnP,GAAIqY,IAYxDphB,QAAQshB,eAAiB,SAAU1C,EAAK2C,GACpC,GAAIC,KACJ,KAAK,GAAIzY,KAAK6V,GACJ7V,IAAKwY,IACPC,EAAW5O,KAAK7J,EAGxB,OAAOyY,IAaXxhB,QAAQ0H,OAAS,SAAU+Z,GACvB,IAAK,GAAI1Y,GAAI,EAAGA,EAAImY,UAAUlY,OAAQD,IAAK,CACvC,GAAI2Y,GAAMR,UAAUnY,EACpB,KAAK,GAAI1G,KAAKqf,GACVD,EAAKpf,GAAKqf,EAAIrf,GAGtB,MAAOof,IAWXzhB,QAAQmQ,UAAY,SAAUsR,EAAMC,GAChC,IAAK,GAAI3Y,KAAK2Y,GACVtgB,OAAOC,eAAeogB,EAAM1Y,EAAG3H,OAAOugB,yBAAyBD,EAAK3Y,GAExE,OAAO0Y,IAYXzhB,QAAQkF,QAAU,SAAU0c,EAAQC,GAChC,GAAIC,GAAgC,kBAAXF,GAAwBA,EAAO/f,UAAY+f,EAChEG,EAAQ3gB,OAAOsM,OAAOoU,EAE1B,OADA9hB,SAAQmQ,UAAU4R,EAAOF,GAClBE,GAiBX/hB,QAAQgiB,KAAO,SAAUN,EAAKO,GAE1B,IAAK,GADD5E,MACKtU,EAAI,EAAGA,EAAIkZ,EAAWjZ,OAAQD,IAAK,CACxC,GAAI1G,GAAI4f,EAAWlZ,EACf1G,KAAKqf,KACLrE,EAAOhb,GAAKqf,EAAIrf,IAGxB,MAAOgb,GAGX,IAAI1R,IAAK,CAST3L,SAAQkiB,SAAW,WACf,MAAOvW,OAYX3L,QAAQmiB,SAAW,SAAU7C,EAAI8C,EAAMC,GACnC,GAAIC,GAAMC,EAAMC,EAAWC,CAwB3B,OAtBAA,GAAQ,WAEJH,GAAO,EACHC,IACAC,EAAUE,MAAML,EAASE,GACzBA,GAAO,IAIfC,EAAY,WACJF,EAEAC,EAAOrB,WAIP5B,EAAGoD,MAAML,EAASnB,WAClBjS,WAAWwT,EAAOL,GAClBE,GAAO,KAgBnBtiB,QAAQ2iB,SAAW,SAASrD,EAAI8C,GAC5B,GAAIQ,GAAOL,CAEX,OAAO,YACHA,EAAOrB,UACPvR,aAAaiT,GAEbA,EAAQ3T,WAAW,WACfqQ,EAAGoD,MAAM,KAAMH,IAChBH,KA0BXpiB,QAAQ8F,QAAU,SAAS+c,EAAKR,GAC5BQ,EAAI/U,QAAQ,SAASwR,GACjB+C,EAAQ/C,GAAM+C,EAAQ/C,GAAInZ,KAAKkc,MAIvCriB,QAAQ8iB,aAAe,SAAST,GAC5B,IAAK,GAAItZ,KAAKsZ,GACgB,kBAAfA,GAAQtZ,IAA0C,IAArBA,EAAE2W,QAAQ,SAC9C2C,EAAQtZ,GAAKsZ,EAAQtZ,GAAG5C,KAAKkc,KAezCriB,QAAQ2Q,WAAa,SAASiO,EAAK3Z,GAC1B2Z,EAAImE,eAAe,aACpBnE,EAAI3Z,QAAU2Z,EAAI3Z,QAAU7D,OAAOsM,OAAOkR,EAAI3Z,YAElD,KAAK,GAAI8D,KAAK9D,GACV2Z,EAAI3Z,QAAQ8D,GAAK9D,EAAQ8D,EAE7B,OAAO6V,GAAI3Z;;A0GvVc,kBAAlB7D,QAAOsM,OAEhB3N,OAAOC,QAAU,SAAkBk4E,EAAMC,GACvCD,EAAKE,OAASD,EACdD,EAAKr2E,UAAYT,OAAOsM,OAAOyqE,EAAUt2E,WACvC+qE,aACEhgE,MAAOsrE,EACPG,YAAY,EACZC,UAAU,EACVC,cAAc,MAMpBx4E,OAAOC,QAAU,SAAkBk4E,EAAMC,GACvCD,EAAKE,OAASD,CACd,IAAIK,GAAW,YACfA,GAAS32E,UAAYs2E,EAAUt2E,UAC/Bq2E,EAAKr2E,UAAY,GAAI22E,GACrBN,EAAKr2E,UAAU+qE,YAAcsL;;ARZjC,QAASvE,mBACLC,UAAW,EACPC,aAAa7qE,OACb8qE,MAAQD,aAAav2D,OAAOw2D,OAE5BC,WAAa,GAEbD,MAAM9qE,QACNgrE,aAIR,QAASA,cACL,IAAIJ,SAAJ,CAGA,GAAIK,GAAUhlE,WAAW0kE,gBACzBC,WAAW,CAGX,KADA,GAAIj1D,GAAMm1D,MAAM9qE,OACV2V,GAAK,CAGP,IAFAk1D,aAAeC,MACfA,WACSC,WAAap1D,GAClBk1D,aAAaE,YAAYG,KAE7BH,YAAa,GACbp1D,EAAMm1D,MAAM9qE,OAEhB6qE,aAAe,KACfD,UAAW,EACXjkE,aAAaskE,IAiBjB,QAASE,MAAKC,EAAKl8D,GACftW,KAAKwyE,IAAMA,EACXxyE,KAAKsW,MAAQA,EAYjB,QAASm8D,SApET,GAAI7E,SAAUzvE,OAAOC,WACjB8zE,SACAF,UAAW,EACXC,aACAE,WAAa,EAoCjBvE,SAAQ8E,SAAW,SAAUF,GACzB,GAAI7xD,GAAO,GAAIje,OAAM4c,UAAUlY,OAAS,EACxC,IAAIkY,UAAUlY,OAAS,EACnB,IAAK,GAAID,GAAI,EAAGA,EAAImY,UAAUlY,OAAQD,IAClCwZ,EAAKxZ,EAAI,GAAKmY,UAAUnY,EAGhC+qE,OAAMlhE,KAAK,GAAIuhE,MAAKC,EAAK7xD,IACJ,IAAjBuxD,MAAM9qE,QAAiB4qE,UACvB3kE,WAAW+kE,WAAY,IAS/BG,KAAKtyE,UAAUqyE,IAAM,WACjBtyE,KAAKwyE,IAAI1xD,MAAM,KAAM9gB,KAAKsW,QAE9Bs3D,QAAQ+E,MAAQ,UAChB/E,QAAQ/qE,SAAU,EAClB+qE,QAAQO,OACRP,QAAQgF,QACRhF,QAAQxX,QAAU,GAClBwX,QAAQiF,YAIRjF,QAAQvpE,GAAKouE,KACb7E,QAAQkF,YAAcL,KACtB7E,QAAQ5vD,KAAOy0D,KACf7E,QAAQ1kE,IAAMupE,KACd7E,QAAQmF,eAAiBN,KACzB7E,QAAQoF,mBAAqBP,KAC7B7E,QAAQqF,KAAOR,KAEf7E,QAAQsF,QAAU,SAAUnoE,GACxB,KAAM,IAAIoO,OAAM,qCAIpBy0D,QAAQuF,IAAM,WAAc,MAAO,KACnCvF,QAAQwF,MAAQ,SAAUC,GACtB,KAAM,IAAIl6D,OAAM,mCAEpBy0D,QAAQ0F,MAAQ,WAAa,MAAO;;ADzFpCn1E,OAAOC,QAAU,SAAkBmhB,GACjC,MAAOA,IAAsB,gBAARA,IACI,kBAAbA,GAAI0jB,MACS,kBAAb1jB,GAAIwE,MACc,kBAAlBxE,GAAIuyD;;;AXwHlB,QAAShI,SAAQ9sD,EAAK+sD,GAEpB,GAAIrmD,IACFsmD,QACAC,QAASC,eAkBX,OAfI5qD,WAAUlY,QAAU,IAAGsc,EAAI8hB,MAAQlmB,UAAU,IAC7CA,UAAUlY,QAAU,IAAGsc,EAAIymD,OAAS7qD,UAAU,IAC9C8qD,UAAUL,GAEZrmD,EAAI2mD,WAAaN,EACRA,GAET3rE,QAAQksE,QAAQ5mD,EAAKqmD,GAGnBQ,YAAY7mD,EAAI2mD,cAAa3mD,EAAI2mD,YAAa,GAC9CE,YAAY7mD,EAAI8hB,SAAQ9hB,EAAI8hB,MAAQ,GACpC+kC,YAAY7mD,EAAIymD,UAASzmD,EAAIymD,QAAS,GACtCI,YAAY7mD,EAAI8mD,iBAAgB9mD,EAAI8mD,eAAgB,GACpD9mD,EAAIymD,SAAQzmD,EAAIumD,QAAUQ,kBACvBC,YAAYhnD,EAAK1G,EAAK0G,EAAI8hB,OAoCnC,QAASilC,kBAAiB9mB,EAAKgnB,GAC7B,GAAIjlE,GAAQokE,QAAQc,OAAOD,EAE3B,OAAIjlE,GACK,KAAYokE,QAAQK,OAAOzkE,GAAO,GAAK,IAAMi+C,EAC7C,KAAYmmB,QAAQK,OAAOzkE,GAAO,GAAK,IAEvCi+C,EAKX,QAASumB,gBAAevmB,EAAKgnB,GAC3B,MAAOhnB,GAIT,QAASknB,aAAYv0D,GACnB,GAAIrR,KAMJ,OAJAqR,GAAMpK,QAAQ,SAASo2C,EAAKzkC,GAC1B5Y,EAAKq9C,IAAO,IAGPr9C,EAIT,QAASylE,aAAYhnD,EAAK1Y,EAAO8/D,GAG/B,GAAIpnD,EAAI8mD,eACJx/D,GACA+/D,WAAW//D,EAAM8+D,UAEjB9+D,EAAM8+D,UAAY1rE,QAAQ0rE,WAExB9+D,EAAMggE,aAAehgE,EAAMggE,YAAY/qE,YAAc+K,GAAQ,CACjE,GAAIigE,GAAMjgE,EAAM8+D,QAAQgB,EAAcpnD,EAItC,OAHKwnD,UAASD,KACZA,EAAMP,YAAYhnD,EAAKunD,EAAKH,IAEvBG,EAIT,GAAIE,GAAYC,gBAAgB1nD,EAAK1Y,EACrC,IAAImgE,EACF,MAAOA,EAIT,IAAI5jE,GAAO/H,OAAO+H,KAAKyD,GACnBqgE,EAAcR,YAAYtjE,EAQ9B,IANImc,EAAI2mD,aACN9iE,EAAO/H,OAAOumB,oBAAoB/a,IAKhCsgE,QAAQtgE,KACJzD,EAAKuW,QAAQ,YAAc,GAAKvW,EAAKuW,QAAQ,gBAAkB,GACrE,MAAOytD,aAAYvgE,EAIrB,IAAoB,IAAhBzD,EAAKH,OAAc,CACrB,GAAI2jE,WAAW//D,GAAQ,CACrB,GAAID,GAAOC,EAAMD,KAAO,KAAOC,EAAMD,KAAO,EAC5C,OAAO2Y,GAAIumD,QAAQ,YAAcl/D,EAAO,IAAK,WAE/C,GAAIygE,SAASxgE,GACX,MAAO0Y,GAAIumD,QAAQwB,OAAOxrE,UAAUg2C,SAAS/3B,KAAKlT,GAAQ,SAE5D,IAAI0gE,OAAO1gE,GACT,MAAO0Y,GAAIumD,QAAQ/uD,KAAKjb,UAAUg2C,SAAS/3B,KAAKlT,GAAQ,OAE1D,IAAIsgE,QAAQtgE,GACV,MAAOugE,aAAYvgE,GAIvB,GAAI+yB,GAAO,GAAIznB,GAAQ,EAAOq1D,GAAU,IAAK,IAS7C,IANIhpE,QAAQqI,KACVsL,GAAQ,EACRq1D,GAAU,IAAK,MAIbZ,WAAW//D,GAAQ,CACrB,GAAImU,GAAInU,EAAMD,KAAO,KAAOC,EAAMD,KAAO,EACzCgzB,GAAO,aAAe5e,EAAI,IAkB5B,GAdIqsD,SAASxgE,KACX+yB,EAAO,IAAM0tC,OAAOxrE,UAAUg2C,SAAS/3B,KAAKlT,IAI1C0gE,OAAO1gE,KACT+yB,EAAO,IAAM7iB,KAAKjb,UAAU2rE,YAAY1tD,KAAKlT,IAI3CsgE,QAAQtgE,KACV+yB,EAAO,IAAMwtC,YAAYvgE,IAGP,IAAhBzD,EAAKH,UAAkBkP,GAAyB,GAAhBtL,EAAM5D,QACxC,MAAOukE,GAAO,GAAK5tC,EAAO4tC,EAAO,EAGnC,IAAmB,EAAfb,EACF,MAAIU,UAASxgE,GACJ0Y,EAAIumD,QAAQwB,OAAOxrE,UAAUg2C,SAAS/3B,KAAKlT,GAAQ,UAEnD0Y,EAAIumD,QAAQ,WAAY,UAInCvmD,GAAIsmD,KAAKh5D,KAAKhG,EAEd,IAAI6gE,EAWJ,OATEA,GADEv1D,EACOw1D,YAAYpoD,EAAK1Y,EAAO8/D,EAAcO,EAAa9jE,GAEnDA,EAAK2H,IAAI,SAASyC,GACzB,MAAOo6D,gBAAeroD,EAAK1Y,EAAO8/D,EAAcO,EAAa15D,EAAK2E,KAItEoN,EAAIsmD,KAAKt8C,MAEFs+C,qBAAqBH,EAAQ9tC,EAAM4tC,GAI5C,QAASP,iBAAgB1nD,EAAK1Y,GAC5B,GAAIu/D,YAAYv/D,GACd,MAAO0Y,GAAIumD,QAAQ,YAAa,YAClC,IAAIiB,SAASlgE,GAAQ,CACnB,GAAIihE,GAAS,IAAO1lD,KAAKswC,UAAU7rD,GAAO4mB,QAAQ,SAAU,IAClBA,QAAQ,KAAM,OACdA,QAAQ,OAAQ,KAAO,GACjE,OAAOlO,GAAIumD,QAAQgC,EAAQ,UAE7B,MAAIC,UAASlhE,GACJ0Y,EAAIumD,QAAQ,GAAKj/D,EAAO,UAC7Bo/D,UAAUp/D,GACL0Y,EAAIumD,QAAQ,GAAKj/D,EAAO,WAE7BmhE,OAAOnhE,GACF0Y,EAAIumD,QAAQ,OAAQ,QAD7B,OAKF,QAASsB,aAAYvgE,GACnB,MAAO,IAAMmO,MAAMlZ,UAAUg2C,SAAS/3B,KAAKlT,GAAS,IAItD,QAAS8gE,aAAYpoD,EAAK1Y,EAAO8/D,EAAcO,EAAa9jE,GAE1D,IAAK,GADDskE,MACK1kE,EAAI,EAAGurD,EAAI1nD,EAAM5D,OAAYsrD,EAAJvrD,IAASA,EACrCga,eAAenW,EAAO05C,OAAOv9C,IAC/B0kE,EAAO76D,KAAK+6D,eAAeroD,EAAK1Y,EAAO8/D,EAAcO,EACjD3mB,OAAOv9C,IAAI,IAEf0kE,EAAO76D,KAAK,GAShB,OANAzJ,GAAK2E,QAAQ,SAASyF,GACfA,EAAIkrB,MAAM,UACbgvC,EAAO76D,KAAK+6D,eAAeroD,EAAK1Y,EAAO8/D,EAAcO,EACjD15D,GAAK,MAGNk6D,EAIT,QAASE,gBAAeroD,EAAK1Y,EAAO8/D,EAAcO,EAAa15D,EAAK2E,GAClE,GAAIvL,GAAM44C,EAAKyoB,CAsCf,IArCAA,EAAO5sE,OAAOugB,yBAAyB/U,EAAO2G,KAAU3G,MAAOA,EAAM2G,IACjEy6D,EAAK1sE,IAELikD,EADEyoB,EAAKxsE,IACD8jB,EAAIumD,QAAQ,kBAAmB,WAE/BvmD,EAAIumD,QAAQ,WAAY,WAG5BmC,EAAKxsE,MACP+jD,EAAMjgC,EAAIumD,QAAQ,WAAY,YAG7B9oD,eAAekqD,EAAa15D,KAC/B5G,EAAO,IAAM4G,EAAM,KAEhBgyC,IACCjgC,EAAIsmD,KAAKlsD,QAAQsuD,EAAKphE,OAAS,GAE/B24C,EADEwoB,OAAOrB,GACHJ,YAAYhnD,EAAK0oD,EAAKphE,MAAO,MAE7B0/D,YAAYhnD,EAAK0oD,EAAKphE,MAAO8/D,EAAe,GAEhDnnB,EAAI7lC,QAAQ,MAAQ,KAEpB6lC,EADErtC,EACIqtC,EAAI9xB,MAAM,MAAM3iB,IAAI,SAASmd,GACjC,MAAO,KAAOA,IACbpb,KAAK,MAAMstD,OAAO,GAEf,KAAO5a,EAAI9xB,MAAM,MAAM3iB,IAAI,SAASmd,GACxC,MAAO,MAAQA,IACdpb,KAAK,QAIZ0yC,EAAMjgC,EAAIumD,QAAQ,aAAc,YAGhCM,YAAYx/D,GAAO,CACrB,GAAIuL,GAAS3E,EAAIkrB,MAAM,SACrB,MAAO8mB,EAET54C,GAAOwb,KAAKswC,UAAU,GAAKllD,GACvB5G,EAAK8xB,MAAM,iCACb9xB,EAAOA,EAAKwzD,OAAO,EAAGxzD,EAAK3D,OAAS,GACpC2D,EAAO2Y,EAAIumD,QAAQl/D,EAAM,UAEzBA,EAAOA,EAAK6mB,QAAQ,KAAM,OACdA,QAAQ,OAAQ,KAChBA,QAAQ,WAAY,KAChC7mB,EAAO2Y,EAAIumD,QAAQl/D,EAAM,WAI7B,MAAOA,GAAO,KAAO44C,EAIvB,QAASqoB,sBAAqBH,EAAQ9tC,EAAM4tC,GAC1C,GAAIU,GAAc,EACdjlE,EAASykE,EAAOlmD,OAAO,SAAS62C,EAAM8P,GAGxC,MAFAD,KACIC,EAAIxuD,QAAQ,OAAS,GAAGuuD,IACrB7P,EAAO8P,EAAI16C,QAAQ,kBAAmB,IAAIxqB,OAAS,GACzD,EAEH,OAAIA,GAAS,GACJukE,EAAO,IACG,KAAT5tC,EAAc,GAAKA,EAAO,OAC3B,IACA8tC,EAAO56D,KAAK,SACZ,IACA06D,EAAO,GAGTA,EAAO,GAAK5tC,EAAO,IAAM8tC,EAAO56D,KAAK,MAAQ,IAAM06D,EAAO,GAMnE,QAAShpE,SAAQ4pE,GACf,MAAO7pE,OAAMC,QAAQ4pE,GAIvB,QAASnC,WAAU7qD,GACjB,MAAsB,iBAARA,GAIhB,QAAS4sD,QAAO5sD,GACd,MAAe,QAARA,EAIT,QAASitD,mBAAkBjtD,GACzB,MAAc,OAAPA,EAIT,QAAS2sD,UAAS3sD,GAChB,MAAsB,gBAARA,GAIhB,QAAS2rD,UAAS3rD,GAChB,MAAsB,gBAARA,GAIhB,QAASktD,UAASltD,GAChB,MAAsB,gBAARA,GAIhB,QAASgrD,aAAYhrD,GACnB,MAAe,UAARA,EAIT,QAASisD,UAASkB,GAChB,MAAOC,UAASD,IAA8B,oBAAvBE,eAAeF,GAIxC,QAASC,UAASptD,GAChB,MAAsB,gBAARA,IAA4B,OAARA,EAIpC,QAASmsD,QAAOtsD,GACd,MAAOutD,UAASvtD,IAA4B,kBAAtBwtD,eAAextD,GAIvC,QAASksD,SAAQr9D,GACf,MAAO0+D,UAAS1+D,KACW,mBAAtB2+D,eAAe3+D,IAA2BA,YAAakL,QAI9D,QAAS4xD,YAAWxrD,GAClB,MAAsB,kBAARA,GAIhB,QAASstD,aAAYttD,GACnB,MAAe,QAARA,GACe,iBAARA,IACQ,gBAARA,IACQ,gBAARA,IACQ,gBAARA,IACQ,mBAARA,GAMhB,QAASqtD,gBAAetf,GACtB,MAAO9tD,QAAOS,UAAUg2C,SAAS/3B,KAAKovC,GAIxC,QAASwf,KAAI3tD,GACX,MAAW,IAAJA,EAAS,IAAMA,EAAE82B,SAAS,IAAM92B,EAAE82B,SAAS,IAQpD,QAAS82B,aACP,GAAI3tD,GAAI,GAAIlE,MACRsF,GAAQssD,IAAI1tD,EAAE4tD,YACNF,IAAI1tD,EAAE6tD,cACNH,IAAI1tD,EAAE8tD,eAAej8D,KAAK,IACtC,QAAQmO,EAAE+tD,UAAWC,OAAOhuD,EAAEiuD,YAAa7sD,GAAMvP,KAAK,KAqCxD,QAASkQ,gBAAenE,EAAKo9B,GAC3B,MAAO56C,QAAOS,UAAUkhB,eAAejD,KAAKlB,EAAKo9B,GAnjBnD,GAAIkzB,cAAe,UACnBlvE,SAAQ+2D,OAAS,SAASnnB,GACxB,IAAKk9B,SAASl9B,GAAI,CAEhB,IAAK,GADDu/B,MACKpmE,EAAI,EAAGA,EAAImY,UAAUlY,OAAQD,IACpComE,EAAQv8D,KAAK84D,QAAQxqD,UAAUnY,IAEjC,OAAOomE,GAAQt8D,KAAK,KAsBtB,IAAK,GAnBD9J,GAAI,EACJwZ,EAAOrB,UACPvC,EAAM4D,EAAKvZ,OACXu8C,EAAMe,OAAO1W,GAAGpc,QAAQ07C,aAAc,SAASxtE,GACjD,GAAU,OAANA,EAAY,MAAO,GACvB,IAAIqH,GAAK4V,EAAK,MAAOjd,EACrB,QAAQA,GACN,IAAK,KAAM,MAAO4kD,QAAO/jC,EAAKxZ,KAC9B,KAAK,KAAM,MAAO6tD,QAAOr0C,EAAKxZ,KAC9B,KAAK,KACH,IACE,MAAOof,MAAKswC,UAAUl2C,EAAKxZ,MAC3B,MAAOwxC,GACP,MAAO,aAEX,QACE,MAAO74C,MAGJA,EAAI6gB,EAAKxZ,GAAQ4V,EAAJ5V,EAASrH,EAAI6gB,IAAOxZ,GAEtCw8C,GADEwoB,OAAOrsE,KAAO6sE,SAAS7sE,GAClB,IAAMA,EAEN,IAAMgqE,QAAQhqE,EAGzB,OAAO6jD,IAOTvlD,QAAQovE,UAAY,SAAS9vD,EAAI+vD,GAa/B,QAASC,KACP,IAAKC,EAAQ,CACX,GAAIC,QAAQC,iBACV,KAAM,IAAI10D,OAAMs0D,EACPG,SAAQE,iBACjBxhE,QAAQg+B,MAAMmjC,GAEdnhE,QAAQC,MAAMkhE,GAEhBE,GAAS,EAEX,MAAOjwD,GAAGoD,MAAM9gB,KAAMsf,WAtBxB,GAAIirD,YAAYxwB,OAAO6zB,SACrB,MAAO,YACL,MAAOxvE,SAAQovE,UAAU9vD,EAAI+vD,GAAK3sD,MAAM9gB,KAAMsf,WAIlD,IAAIsuD,QAAQG,iBAAkB,EAC5B,MAAOrwD,EAGT,IAAIiwD,IAAS,CAeb,OAAOD,GAIT,IAAIM,WACAC,YACJ7vE,SAAQ8vE,SAAW,SAAStuE,GAI1B,GAHI2qE,YAAY0D,gBACdA,aAAeL,QAAQO,IAAIC,YAAc,IAC3CxuE,EAAMA,EAAIyuE,eACLL,OAAOpuE,GACV,GAAI,GAAI6rE,QAAO,MAAQ7rE,EAAM,MAAO,KAAK0uE,KAAKL,cAAe,CAC3D,GAAIM,GAAMX,QAAQW,GAClBP,QAAOpuE,GAAO,WACZ,GAAI6tE,GAAMrvE,QAAQ+2D,OAAOr0C,MAAM1iB,QAASkhB,UACxChT,SAAQC,MAAM,YAAa3M,EAAK2uE,EAAKd,QAGvCO,QAAOpuE,GAAO,YAGlB,OAAOouE,QAAOpuE,IAoChBxB,QAAQ0rE,QAAUA,QAIlBA,QAAQK,QACNqE,MAAU,EAAG,IACbC,QAAY,EAAG,IACfC,WAAe,EAAG,IAClBpc,SAAa,EAAG,IAChBmV,OAAW,GAAI,IACftF,MAAU,GAAI,IACdjD,OAAW,GAAI,IACfE,MAAU,GAAI,IACdW,MAAU,GAAI,IACdkC,OAAW,GAAI,IACf+B,SAAa,GAAI,IACjBkC,KAAS,GAAI,IACbyB,QAAY,GAAI,KAIlBmC,QAAQc,QACN+D,QAAW,OACX93B,OAAU,SACV+3B,UAAW,SACX78D,UAAa,OACb88D,OAAQ,OACRpY,OAAU,QACVqY,KAAQ,UAERC,OAAU,OAkRZ3wE,QAAQuE,QAAUA,QAKlBvE,QAAQgsE,UAAYA,UAKpBhsE,QAAQ+tE,OAASA,OAKjB/tE,QAAQouE,kBAAoBA,kBAK5BpuE,QAAQ8tE,SAAWA,SAKnB9tE,QAAQ8sE,SAAWA,SAKnB9sE,QAAQquE,SAAWA,SAKnBruE,QAAQmsE,YAAcA,YAKtBnsE,QAAQotE,SAAWA,SAKnBptE,QAAQuuE,SAAWA,SAKnBvuE,QAAQstE,OAASA,OAMjBttE,QAAQktE,QAAUA,QAKlBltE,QAAQ2sE,WAAaA,WAUrB3sE,QAAQyuE,YAAcA,YAEtBzuE,QAAQsiD,SAAWpiD,QAAQ,qBAY3B,IAAI8uE,SAAU,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACxD,MAAO,MAAO,MAa5BhvE,SAAQ4X,IAAM,WACZ1J,QAAQ0J,IAAI,UAAW+2D,YAAa3uE,QAAQ+2D,OAAOr0C,MAAM1iB,QAASkhB,aAiBpElhB,QAAQ4wE,SAAW1wE,QAAQ,YAE3BF,QAAQksE,QAAU,SAAS2E,EAAQ9uE,GAEjC,IAAKA,IAAQwsE,SAASxsE,GAAM,MAAO8uE,EAInC,KAFA,GAAI1nE,GAAO/H,OAAO+H,KAAKpH,GACnBgH,EAAII,EAAKH,OACND,KACL8nE,EAAO1nE,EAAKJ,IAAMhH,EAAIoH,EAAKJ,GAE7B,OAAO8nE;;;;AHjeT,QAASrR,gBAAez2D,GAEtB,MADAA,GAAIzF,KAAKH,MAAM4F,GACJ,EAAJA,EAAQ,EAAIA,EAAI,IAAM,IAAMA,EAGrC,QAAS02D,iBAAgB7vB,GACvB,MAAW,GAAJA,EAAQ,EAAIA,EAAI,EAAI,EAAIA,EAGjC,QAAS8vB,eAAcna,GACrB,MACSia,gBADmB,MAAxBja,EAAIA,EAAIv8C,OAAS,GACG22D,WAAWpa,GAAO,IAAM,IAC1Bqa,SAASra,IAGjC,QAASsa,iBAAgBta,GACvB,MACSka,iBADmB,MAAxBla,EAAIA,EAAIv8C,OAAS,GACI22D,WAAWpa,GAAO,IACpBoa,WAAWpa,IAGpC,QAASua,gBAAe1mB,EAAI2mB,EAAIh+B,GAI9B,MAHQ,GAAJA,EAAOA,GAAK,EACPA,EAAI,IAAGA,GAAK,GAET,EAAJ,EAAJA,EAAkBqX,GAAM2mB,EAAK3mB,GAAMrX,EAAI,EAC/B,EAAJ,EAAJA,EAAkBg+B,EACV,EAAJ,EAAJh+B,EAAkBqX,GAAM2mB,EAAK3mB,IAAO,EAAE,EAAIrX,GAAK,EAC5CqX,EAGT,QAAS6C,eAAc+jB,GAErB,GAAIza,GAAMya,EAAQxsC,QAAQ,KAAM,IAAI2pB,aAGpC,IAAIoI,IAAO0a,gBAAgB,MAAOA,gBAAe1a,GAAKvlC,OAGtD,IAAe,MAAXulC,EAAI,GAAY,CAClB,GAAmB,IAAfA,EAAIv8C,OAAc,CACpB,GAAIk3D,GAAKN,SAASra,EAAI4a,OAAO,GAAI,GACjC,OAAMD,IAAM,GAAW,MAANA,IACF,KAALA,IAAe,GAAY,KAALA,IAAe,EACjC,IAALA,GAAoB,IAALA,IAAc,EACxB,GAALA,GAAmB,GAALA,IAAa,EAC5B,GAJ8B,KAKjC,GAAmB,IAAf3a,EAAIv8C,OAAc,CAC3B,GAAIk3D,GAAKN,SAASra,EAAI4a,OAAO,GAAI,GACjC,OAAMD,IAAM,GAAW,UAANA,IACH,SAALA,IAAkB,IACb,MAALA,IAAgB,EACZ,IAALA,EACA,GAJiC,KAO3C,MAAO,MAGT,GAAI3oB,GAAKgO,EAAI7lC,QAAQ,KAAM0gD,EAAK7a,EAAI7lC,QAAQ,IAC5C,IAAW,KAAP63B,GAAa6oB,EAAK,IAAM7a,EAAIv8C,OAAQ,CACtC,GAAIq3D,GAAQ9a,EAAI4a,OAAO,EAAG5oB,GACtBjtC,EAASi7C,EAAI4a,OAAO5oB,EAAG,EAAG6oB,GAAI7oB,EAAG,IAAI9jB,MAAM,KAC3CqM,EAAQ,CACZ,QAAQugC,GACN,IAAK,OACH,GAAsB,IAAlB/1D,EAAOtB,OAAc,MAAO,KAChC82B,GAAQ+/B,gBAAgBv1D,EAAOglB,MAEjC,KAAK,MACH,MAAsB,KAAlBhlB,EAAOtB,OAAqB,MACxB02D,cAAcp1D,EAAO,IACrBo1D,cAAcp1D,EAAO,IACrBo1D,cAAcp1D,EAAO,IACrBw1B,EACV,KAAK,OACH,GAAsB,IAAlBx1B,EAAOtB,OAAc,MAAO,KAChC82B,GAAQ+/B,gBAAgBv1D,EAAOglB,MAEjC,KAAK,MACH,GAAsB,IAAlBhlB,EAAOtB,OAAc,MAAO,KAChC,IAAI+4B,IAAO49B,WAAWr1D,EAAO,IAAM,IAAO,KAAO,IAAO,IAGpDuf,EAAIg2C,gBAAgBv1D,EAAO,IAC3BgqD,EAAIuL,gBAAgBv1D,EAAO,IAC3By1D,EAAU,IAALzL,EAAWA,GAAKzqC,EAAI,GAAKyqC,EAAIzqC,EAAIyqC,EAAIzqC,EAC1CuvB,EAAS,EAAJkb,EAAQyL,CACjB,QAAQP,eAA+C,IAAhCM,eAAe1mB,EAAI2mB,EAAIh+B,EAAE,EAAE,IAC1Cy9B,eAA2C,IAA5BM,eAAe1mB,EAAI2mB,EAAIh+B,IACtCy9B,eAA+C,IAAhCM,eAAe1mB,EAAI2mB,EAAIh+B,EAAE,EAAE,IAC1CjC,EACV,SACE,MAAO,OAIb,MAAO,MA7KT,GAAImgC,iBACFK,aAAgB,EAAE,EAAE,EAAE,GAAIC,WAAc,IAAI,IAAI,IAAI,GACpDC,cAAiB,IAAI,IAAI,IAAI,GAAIC,MAAS,EAAE,IAAI,IAAI,GACpDC,YAAe,IAAI,IAAI,IAAI,GAAIC,OAAU,IAAI,IAAI,IAAI,GACrDC,OAAU,IAAI,IAAI,IAAI,GAAIC,QAAW,IAAI,IAAI,IAAI,GACjDC,OAAU,EAAE,EAAE,EAAE,GAAIC,gBAAmB,IAAI,IAAI,IAAI,GACnDC,MAAS,EAAE,EAAE,IAAI,GAAIC,YAAe,IAAI,GAAG,IAAI,GAC/CC,OAAU,IAAI,GAAG,GAAG,GAAIC,WAAc,IAAI,IAAI,IAAI,GAClDC,WAAc,GAAG,IAAI,IAAI,GAAIC,YAAe,IAAI,IAAI,EAAE,GACtDC,WAAc,IAAI,IAAI,GAAG,GAAIC,OAAU,IAAI,IAAI,GAAG,GAClDC,gBAAmB,IAAI,IAAI,IAAI,GAAIC,UAAa,IAAI,IAAI,IAAI,GAC5DC,SAAY,IAAI,GAAG,GAAG,GAAIC,MAAS,EAAE,IAAI,IAAI,GAC7CC,UAAa,EAAE,EAAE,IAAI,GAAIC,UAAa,EAAE,IAAI,IAAI,GAChDC,eAAkB,IAAI,IAAI,GAAG,GAAIC,UAAa,IAAI,IAAI,IAAI,GAC1DC,WAAc,EAAE,IAAI,EAAE,GAAIC,UAAa,IAAI,IAAI,IAAI,GACnDC,WAAc,IAAI,IAAI,IAAI,GAAIC,aAAgB,IAAI,EAAE,IAAI,GACxDC,gBAAmB,GAAG,IAAI,GAAG,GAAIC,YAAe,IAAI,IAAI,EAAE,GAC1DC,YAAe,IAAI,GAAG,IAAI,GAAIC,SAAY,IAAI,EAAE,EAAE,GAClDC,YAAe,IAAI,IAAI,IAAI,GAAIC,cAAiB,IAAI,IAAI,IAAI,GAC5DC,eAAkB,GAAG,GAAG,IAAI,GAAIC,eAAkB,GAAG,GAAG,GAAG,GAC3DC,eAAkB,GAAG,GAAG,GAAG,GAAIC,eAAkB,EAAE,IAAI,IAAI,GAC3DC,YAAe,IAAI,EAAE,IAAI,GAAIC,UAAa,IAAI,GAAG,IAAI,GACrDC,aAAgB,EAAE,IAAI,IAAI,GAAIC,SAAY,IAAI,IAAI,IAAI,GACtDC,SAAY,IAAI,IAAI,IAAI,GAAIC,YAAe,GAAG,IAAI,IAAI,GACtDC,WAAc,IAAI,GAAG,GAAG,GAAIC,aAAgB,IAAI,IAAI,IAAI,GACxDC,aAAgB,GAAG,IAAI,GAAG,GAAIC,SAAY,IAAI,EAAE,IAAI,GACpDC,WAAc,IAAI,IAAI,IAAI,GAAIC,YAAe,IAAI,IAAI,IAAI,GACzDC,MAAS,IAAI,IAAI,EAAE,GAAIC,WAAc,IAAI,IAAI,GAAG,GAChDC,MAAS,IAAI,IAAI,IAAI,GAAIC,OAAU,EAAE,IAAI,EAAE,GAC3CC,aAAgB,IAAI,IAAI,GAAG,GAAIC,MAAS,IAAI,IAAI,IAAI,GACpDC,UAAa,IAAI,IAAI,IAAI,GAAIC,SAAY,IAAI,IAAI,IAAI,GACrDC,WAAc,IAAI,GAAG,GAAG,GAAIC,QAAW,GAAG,EAAE,IAAI,GAChDC,OAAU,IAAI,IAAI,IAAI,GAAIC,OAAU,IAAI,IAAI,IAAI,GAChDC,UAAa,IAAI,IAAI,IAAI,GAAIC,eAAkB,IAAI,IAAI,IAAI,GAC3DC,WAAc,IAAI,IAAI,EAAE,GAAIC,cAAiB,IAAI,IAAI,IAAI,GACzDC,WAAc,IAAI,IAAI,IAAI,GAAIC,YAAe,IAAI,IAAI,IAAI,GACzDC,WAAc,IAAI,IAAI,IAAI,GAAIC,sBAAyB,IAAI,IAAI,IAAI,GACnEC,WAAc,IAAI,IAAI,IAAI,GAAIC,YAAe,IAAI,IAAI,IAAI,GACzDC,WAAc,IAAI,IAAI,IAAI,GAAIC,WAAc,IAAI,IAAI,IAAI,GACxDC,aAAgB,IAAI,IAAI,IAAI,GAAIC,eAAkB,GAAG,IAAI,IAAI,GAC7DC,cAAiB,IAAI,IAAI,IAAI,GAAIC,gBAAmB,IAAI,IAAI,IAAI,GAChEC,gBAAmB,IAAI,IAAI,IAAI,GAAIC,gBAAmB,IAAI,IAAI,IAAI,GAClEC,aAAgB,IAAI,IAAI,IAAI,GAAIC,MAAS,EAAE,IAAI,EAAE,GACjDC,WAAc,GAAG,IAAI,GAAG,GAAIC,OAAU,IAAI,IAAI,IAAI,GAClDC,SAAY,IAAI,EAAE,IAAI,GAAIC,QAAW,IAAI,EAAE,EAAE,GAC7CC,kBAAqB,IAAI,IAAI,IAAI,GAAIC,YAAe,EAAE,EAAE,IAAI,GAC5DC,cAAiB,IAAI,GAAG,IAAI,GAAIC,cAAiB,IAAI,IAAI,IAAI,GAC7DC,gBAAmB,GAAG,IAAI,IAAI,GAAIC,iBAAoB,IAAI,IAAI,IAAI,GAClEC,mBAAsB,EAAE,IAAI,IAAI,GAAIC,iBAAoB,GAAG,IAAI,IAAI,GACnEC,iBAAoB,IAAI,GAAG,IAAI,GAAIC,cAAiB,GAAG,GAAG,IAAI,GAC9DC,WAAc,IAAI,IAAI,IAAI,GAAIC,WAAc,IAAI,IAAI,IAAI,GACxDC,UAAa,IAAI,IAAI,IAAI,GAAIC,aAAgB,IAAI,IAAI,IAAI,GACzDC,MAAS,EAAE,EAAE,IAAI,GAAIC,SAAY,IAAI,IAAI,IAAI,GAC7CC,OAAU,IAAI,IAAI,EAAE,GAAIC,WAAc,IAAI,IAAI,GAAG,GACjDC,QAAW,IAAI,IAAI,EAAE,GAAIC,WAAc,IAAI,GAAG,EAAE,GAChDC,QAAW,IAAI,IAAI,IAAI,GAAIC,eAAkB,IAAI,IAAI,IAAI,GACzDC,WAAc,IAAI,IAAI,IAAI,GAAIC,eAAkB,IAAI,IAAI,IAAI,GAC5DC,eAAkB,IAAI,IAAI,IAAI,GAAIC,YAAe,IAAI,IAAI,IAAI,GAC7DC,WAAc,IAAI,IAAI,IAAI,GAAIC,MAAS,IAAI,IAAI,GAAG,GAClDC,MAAS,IAAI,IAAI,IAAI,GAAIC,MAAS,IAAI,IAAI,IAAI,GAC9CC,YAAe,IAAI,IAAI,IAAI,GAAIC,QAAW,IAAI,EAAE,IAAI,GACpDC,KAAQ,IAAI,EAAE,EAAE,GAAIC,WAAc,IAAI,IAAI,IAAI,GAC9CC,WAAc,GAAG,IAAI,IAAI,GAAIC,aAAgB,IAAI,GAAG,GAAG,GACvDC,QAAW,IAAI,IAAI,IAAI,GAAIC,YAAe,IAAI,IAAI,GAAG,GACrDC,UAAa,GAAG,IAAI,GAAG,GAAIC,UAAa,IAAI,IAAI,IAAI,GACpDC,QAAW,IAAI,GAAG,GAAG,GAAIC,QAAW,IAAI,IAAI,IAAI,GAChDC,SAAY,IAAI,IAAI,IAAI,GAAIC,WAAc,IAAI,GAAG,IAAI,GACrDC,WAAc,IAAI,IAAI,IAAI,GAAIC,WAAc,IAAI,IAAI,IAAI,GACxDC,MAAS,IAAI,IAAI,IAAI,GAAIC,aAAgB,EAAE,IAAI,IAAI,GACnDC,WAAc,GAAG,IAAI,IAAI,GAAIp4C,KAAQ,IAAI,IAAI,IAAI,GACjDq4C,MAAS,EAAE,IAAI,IAAI,GAAIC,SAAY,IAAI,IAAI,IAAI,GAC/CC,QAAW,IAAI,GAAG,GAAG,GAAIC,WAAc,GAAG,IAAI,IAAI,GAClDC,QAAW,IAAI,IAAI,IAAI,GAAIC,OAAU,IAAI,IAAI,IAAI,GACjDC,OAAU,IAAI,IAAI,IAAI,GAAIC,YAAe,IAAI,IAAI,IAAI,GACrDC,QAAW,IAAI,IAAI,EAAE,GAAIC,aAAgB,IAAI,IAAI,GAAG,GAsGtD,KAAMxpE,QAAQi8C,cAAgBA,cAAgB,MAAMpsC;;AkCvMpD,YAIA,SAASi4E,OAAMC,GACX,MAAO,UAASxtC,EAAGhnC,EAAK3G,GACpB,MAAY,UAAR2G,EACO,IAAMw0E,EAAWC,uBAAuBtoE,QAAQ9S,GAEhD,KAAOub,KAAKswC,UAAUllD,GAAO,IAAMw0E,EAAW5/D,KAAKswC,UAAU7rD,IAKhF,QAASq7E,aAAYF,GACjB,GAAIG,GAAiBJ,MAAMC,EAC3B,OAAO,UAASxtC,EAAGhnC,EAAK3G,GACpB,MAAY,UAAR2G,EACO20E,EAAe3tC,EAAGhnC,EAAK3G,GAEvB,YAAcub,KAAKswC,UAAUllD,GAAO,iBAAmB4U,KAAKswC,UAAU7rD,GAAS,QAClFs7E,EAAe3tC,EAAGhnC,EAAK3G,IAmCvC,QAASu7E,SAAQ/7E,GACb,MAAOg8E,WAAUh8E,EAAO,IAAIsW,MAAMtW,EAAQA,GAG9C,QAASi8E,SACL,OAAO,EA3DX,GAAIL,yBAA0B,UAAW,QAAS,aAAc,WAwB5DI,WACAE,KAAMR,MAAM,OACZS,KAAMT,MAAM,OACZ9rB,IAAKisB,YAAY,KACjBnsB,IAAKmsB,YAAY,KACjBO,KAAMP,YAAY,MAClBQ,KAAMR,YAAY,MAClBS,KAAM,SAASnuC,EAAGhnC,GACd,MAAOjP,OAAMzC,UAAUme,MAAMF,KAAKoB,UAAW,GAAGpQ,IAAI,SAASlE,GACzD,MAAO,IAAMw7E,UAAU,MAAM7tC,EAAGhnC,EAAK3G,GAAS,MAC/CiG,KAAK,OAAS,SAErB81E,MAAO,WACH,MAAO,KAAOP,UAAAA,MAAa1lE,MAAM9gB,KAAMsf,WAAa,KAExD0nE,IAAO,WACH,MAAOtkF,OAAMzC,UAAUme,MAAMF,KAAKoB,UAAW,GAAGpQ,IAAI,SAAS1E,GACzD,MAAO,IAAM+7E,QAAQ/7E,GAAU,MAChCyG,KAAK,OAAS,SAErBkyE,IAAO,WACH,MAAOzgF,OAAMzC,UAAUme,MAAMF,KAAKoB,UAAW,GAAGpQ,IAAI,SAAS1E,GACzD,MAAO,IAAM+7E,QAAQ/7E,GAAU,MAChCyG,KAAK,OAAS,QAErBg2E,KAAQ,WACJ,MAAO,KAAOT,UAAUQ,IAAIlmE,MAAM9gB,KAAMsf,WAAa,KAoB7DnhB,QAAOC,QAAU,SAAUoM,GACvB,IAAKA,EAAQ,MAAOi8E,MACpB,IAAIS,GAAY,4DAA8DX,QAAQ/7E,GAAU,GAEhG,OAAO,IAAIqb,UAAS,IAAKqhE;;Ad5E7B,YAWA,SAAS7V,MAAK91D,EAAU4R,EAAOukD,EAAIC,EAAIhlB,EAAMqoB,EAAWC,EAAQC,GAK5D,GAHAxD,GAAMvkD,EACNwkD,GAAMxkD,EAEF8nD,GAAUvD,GAAgBC,GAAVuD,EAAc,MAAO35D,EACpC,IAAI05D,EAAStD,GAAeD,EAATwD,EAAa,MAAO,KAI5C,KAAK,GAFDC,MAEKhuE,EAAI,EAAGA,EAAIoU,EAASnU,OAAQD,IAAK,CAEtC,GAGIuO,GAAKG,EAHL8F,EAAUJ,EAASpU,GACnBmiE,EAAW3tD,EAAQ2tD,SACnBp7D,EAAOyN,EAAQzN,IAMnB,IAHAwH,EAAMiG,EAAQjG,IAAIi3C,GAClB92C,EAAM8F,EAAQ9F,IAAI82C,GAEdj3C,GAAOg8D,GAAaC,GAAP97D,EACbs/D,EAAQnkE,KAAK2K,OAEV,MAAIjG,EAAMi8D,GAAYD,EAAN77D,GAAhB,CAEP,GAAIu/D,GAAkB,IAATlnE,EACLmnE,WAAW/L,EAAUoI,EAAIC,EAAIhlB,GAC7B2oB,aAAahM,EAAUoI,EAAIC,EAAIhlB,EAAMqoB,EAAoB,IAAT9mE,EAEpDknE,GAAOhuE,QAGP+tE,EAAQnkE,MACJs4D,SAAU8L,EACVlnE,KAAMA,EACNq7D,KAAMhuD,EAASpU,GAAGoiE,MAAQ,KAC1B7zD,IAAKiG,EAAQjG,IACbG,IAAK8F,EAAQ9F,OAKzB,MAAOs/D,GAAQ/tE,OAAS+tE,EAAU,KAGtC,QAASE,YAAW/L,EAAUoI,EAAIC,EAAIhlB,GAGlC,IAAK,GAFDvuC,MAEKjX,EAAI,EAAGA,EAAImiE,EAASliE,OAAQD,IAAK,CACtC,GAAIrG,GAAIwoE,EAASniE,GACbouE,EAAKz0E,EAAE6rD,EAEP4oB,IAAM7D,GAAYC,GAAN4D,GAAUn3D,EAAMpN,KAAKlQ,GAEzC,MAAOsd,GAGX,QAASk3D,cAAahM,EAAUoI,EAAIC,EAAIhlB,EAAMqoB,EAAWQ,GAIrD,IAAK,GAFDJ,MAEKjuE,EAAI,EAAGA,EAAImiE,EAASliE,OAAQD,IAAK,CAEtC,GAOIrG,GAAGigC,EAPHw0C,EAAK,EACLE,EAAK,EACLrzE,EAAI,KACJyyE,EAASvL,EAASniE,GAClB2tE,EAAOD,EAAOC,KACdjzE,EAAOgzE,EAAOhzE,KACdkb,EAAM83D,EAAOztE,OAGbgX,IAEJ,KAAK2iB,EAAI,EAAOhkB,EAAM,EAAVgkB,EAAaA,IACrBjgC,EAAIsB,GAAKyyE,EAAO9zC,GAChB3+B,EAAIyyE,EAAO9zC,EAAI,GACfw0C,EAAKE,GAAM30E,EAAE6rD,GACb8oB,EAAKrzE,EAAEuqD,GAEE+kB,EAAL6D,EAEKE,EAAK9D,GACNvzD,EAAMpN,KAAKgkE,EAAUl0E,EAAGsB,EAAGsvE,GAAKsD,EAAUl0E,EAAGsB,EAAGuvE,IAC3C6D,IAAQp3D,EAAQs3D,SAASN,EAAQh3D,EAAO02D,EAAMjzE,KAE5C4zE,GAAM/D,GAAItzD,EAAMpN,KAAKgkE,EAAUl0E,EAAGsB,EAAGsvE,IAEzC6D,EAAK5D,EAEFD,EAAL+D,GACDr3D,EAAMpN,KAAKgkE,EAAUl0E,EAAGsB,EAAGuvE,GAAKqD,EAAUl0E,EAAGsB,EAAGsvE,IAC3C8D,IAAQp3D,EAAQs3D,SAASN,EAAQh3D,EAAO02D,EAAMjzE,KAEtC8vE,GAAN8D,GAAUr3D,EAAMpN,KAAKgkE,EAAUl0E,EAAGsB,EAAGuvE,KAIhDvzD,EAAMpN,KAAKlQ,GAEF4wE,EAAL+D,GACAr3D,EAAMpN,KAAKgkE,EAAUl0E,EAAGsB,EAAGsvE,IACtB8D,IAAQp3D,EAAQs3D,SAASN,EAAQh3D,EAAO02D,EAAMjzE,KAE5C4zE,EAAK9D,IACZvzD,EAAMpN,KAAKgkE,EAAUl0E,EAAGsB,EAAGuvE,IACtB6D,IAAQp3D,EAAQs3D,SAASN,EAAQh3D,EAAO02D,EAAMjzE,KAO/Df,GAAI+zE,EAAO93D,EAAM,GACjBw4D,EAAKz0E,EAAE6rD,GACH4oB,GAAM7D,GAAYC,GAAN4D,GAAUn3D,EAAMpN,KAAKlQ,GAGjC00E,GAAUp3D,EAAM,KAAOA,EAAMA,EAAMhX,OAAS,IAAIgX,EAAMpN,KAAKoN,EAAM,IAGrEs3D,SAASN,EAAQh3D,EAAO02D,EAAMjzE,GAGlC,MAAOuzE,GAGX,QAASM,UAASN,EAAQh3D,EAAO02D,EAAMjzE,GASnC,MARIuc,GAAMhX,SAGNgX,EAAM02D,KAAOA,EACb12D,EAAMvc,KAAOA,EAEbuzE,EAAOpkE,KAAKoN,OA/IpBjgB,OAAOC,QAAUizE;;ADFjB,YAQA,SAAS5uE,SAAQqP,EAAMI,GACnB,GAAIqJ,KAEJ,IAAkB,sBAAdzJ,EAAK5D,KACL,IAAK,GAAI/G,GAAI,EAAGA,EAAI2K,EAAKyJ,SAASnU,OAAQD,IACtCktE,eAAe94D,EAAUzJ,EAAKyJ,SAASpU,GAAI+K,OAE1B,YAAdJ,EAAK5D,KACZmmE,eAAe94D,EAAUzJ,EAAMI,GAI/BmiE,eAAe94D,GAAW+tD,SAAUx3D,GAAOI,EAE/C,OAAOqJ,GAGX,QAAS84D,gBAAe94D,EAAUI,EAASzJ,GACvC,GAII/K,GAAG45B,EAAG2oC,EAJNsH,EAAOr1D,EAAQ2tD,SACfp7D,EAAO8iE,EAAK9iE,KACZiH,EAAS67D,EAAK18D,YACdi1D,EAAO5tD,EAAQ0E,UAGnB,IAAa,UAATnS,EACAqN,EAASvK,KAAKlF,OAAOy9D,EAAM,GAAI+K,aAAan/D,UAEzC,IAAa,eAATjH,EACPqN,EAASvK,KAAKlF,OAAOy9D,EAAM,EAAGnhE,QAAQ+M,SAEnC,IAAa,eAATjH,EACPqN,EAASvK,KAAKlF,OAAOy9D,EAAM,GAAInhE,QAAQ+M,EAAQjD,UAE5C,IAAa,oBAAThE,GAAuC,YAATA,EAAoB,CAEzD,IADAw7D,KACKviE,EAAI,EAAGA,EAAIgO,EAAO/N,OAAQD,IAC3BuiE,EAAM14D,KAAK5I,QAAQ+M,EAAOhO,GAAI+K,GAElCqJ,GAASvK,KAAKlF,OAAOy9D,EAAe,YAATr7D,EAAqB,EAAI,EAAGw7D,QAEpD,IAAa,iBAATx7D,EAAyB,CAEhC,IADAw7D,KACKviE,EAAI,EAAGA,EAAIgO,EAAO/N,OAAQD,IAC3B,IAAK45B,EAAI,EAAGA,EAAI5rB,EAAOhO,GAAGC,OAAQ25B,IAC9B2oC,EAAM14D,KAAK5I,QAAQ+M,EAAOhO,GAAG45B,GAAI7uB,GAGzCqJ,GAASvK,KAAKlF,OAAOy9D,EAAM,EAAGG,QAE3B,IAAa,uBAATx7D,EACP,IAAK/G,EAAI,EAAGA,EAAI6pE,EAAKuD,WAAWntE,OAAQD,IACpCktE,eAAe94D,GACX+tD,SAAU0H,EAAKuD,WAAWptE,GAC1BkZ,WAAYkpD,GACbr3D,OAIP5F,SAAQu0B,KAAK,6BAA+BmwC,EAAK9iE,MAIzD,QAASpC,QAAOy9D,EAAMr7D,EAAMo7D,GACxB,GAAI3tD,IACA2tD,SAAUA,EACVp7D,KAAMA,EACNq7D,KAAMA,GAAQ,KACd7zD,KAAM,EAAG,GACTG,KAAM,GAAI,GAGd,OADA2+D,UAAS74D,GACFA,EAGX,QAASvT,SAAQqsE,EAASviE,GAEtB,IAAK,GADDwiE,MACKvtE,EAAI,EAAGA,EAAIstE,EAAQrtE,OAAQD,IAChCutE,EAAU1jE,KAAKsjE,aAAaG,EAAQttE,IAMxC,OAJI+K,KACAyiE,SAASD,EAAWxiE,GACpB0iE,SAASF,IAENA,EAGX,QAASJ,cAAal0E,GAClB,GAAIoC,GAAMd,KAAKc,IAAIpC,EAAE,GAAKsB,KAAK+hB,GAAK,KAChC3jB,EAAKM,EAAE,GAAK,IAAM,GAClBL,EAAK,GAAM,IAAO2B,KAAKsU,KAAK,EAAIxT,IAAQ,EAAIA,IAAQd,KAAK+hB,EAK7D,OAHA1jB,GAAQ,GAAJA,EAAS,GACTA,EAAI,EAAI,EAAIA,GAERD,EAAGC,EAAG,GAIlB,QAAS60E,UAASC,GAId,IAAK,GAAW/zE,GAAGsB,EAHf0yE,EAAO,EACPjzE,EAAO,EAEFsF,EAAI,EAASA,EAAI0tE,EAAOztE,OAAS,EAAGD,IACzCrG,EAAIsB,GAAKyyE,EAAO1tE,GAChB/E,EAAIyyE,EAAO1tE,EAAI,GAEf2tE,GAAQh0E,EAAE,GAAKsB,EAAE,GAAKA,EAAE,GAAKtB,EAAE,GAG/Be,GAAQH,KAAK8yB,IAAIpyB,EAAE,GAAKtB,EAAE,IAAMY,KAAK8yB,IAAIpyB,EAAE,GAAKtB,EAAE,GAEtD+zE,GAAOC,KAAOpzE,KAAK8yB,IAAIsgD,EAAO,GAC9BD,EAAOhzE,KAAOA,EAIlB,QAAS2yE,UAAS74D,GACd,GAAI2tD,GAAW3tD,EAAQ2tD,SACnB5zD,EAAMiG,EAAQjG,IACdG,EAAM8F,EAAQ9F,GAElB,IAAqB,IAAjB8F,EAAQzN,KAAY6mE,aAAar/D,EAAKG,EAAKyzD,OAC1C,KAAK,GAAIniE,GAAI,EAAGA,EAAImiE,EAASliE,OAAQD,IAAK4tE,aAAar/D,EAAKG,EAAKyzD,EAASniE,GAE/E,OAAOwU,GAGX,QAASo5D,cAAar/D,EAAKG,EAAKg/D,GAC5B,IAAK,GAAWz0E,GAAP+G,EAAI,EAAMA,EAAI0tE,EAAOztE,OAAQD,IAClC/G,EAAIy0E,EAAO1tE,GACXuO,EAAI,GAAKhU,KAAKgU,IAAItV,EAAE,GAAIsV,EAAI,IAC5BG,EAAI,GAAKnU,KAAKmU,IAAIzV,EAAE,GAAIyV,EAAI,IAC5BH,EAAI,GAAKhU,KAAKgU,IAAItV,EAAE,GAAIsV,EAAI,IAC5BG,EAAI,GAAKnU,KAAKmU,IAAIzV,EAAE,GAAIyV,EAAI,IA3IpC1X,OAAOC,QAAUqE,OAEjB,IAAIkyE,UAAWr2E,QAAQ;;ANJvB,YAUA,SAAS4nD,WAAUp0C,EAAMzO,GACrB,MAAO,IAAI+sE,WAAUt+D,EAAMzO,GAG/B,QAAS+sE,WAAUt+D,EAAMzO,GACrBA,EAAUrD,KAAKqD,QAAUyC,OAAOtG,OAAOsM,OAAO9L,KAAKqD,SAAUA,EAE7D,IAAIkK,GAAQlK,EAAQkK,KAEhBA,IAAOjB,QAAQkU,KAAK,kBAExB,IAAI2qC,GAAK,GAAK9nD,EAAQK,QAClB6X,EAAW9Y,QAAQqP,EAAMzO,EAAQ6O,WAAai5C,EAAK9nD,EAAQo3B,QAE/Dz6B,MAAKi4C,SAED1qC,IACAjB,QAAQ+jE,QAAQ,mBAChB/jE,QAAQ0J,IAAI,oCAAqC3S,EAAQitE,aAAcjtE,EAAQktE,gBAC/EjkE,QAAQkU,KAAK,kBACbxgB,KAAKwwE,SACLxwE,KAAKywE,MAAQ,GAGjBl1D,EAAW1S,KAAK0S,EAAUlY,EAAQ4O,OAAS5O,EAAQo3B,OAAQi2C,YAG3D1wE,KAAK2wE,UAAUp1D,EAAU,EAAG,EAAG,GAE3BhO,IACAjB,QAAQ0J,IAAI,2BAA4BhW,KAAKi4C,MAAM,GAAG24B,YAAa5wE,KAAKi4C,MAAM,GAAG44B,WACjFvkE,QAAQ+jE,QAAQ,kBAChB/jE,QAAQ0J,IAAI,mBAAoBhW,KAAKywE,MAAOlqD,KAAKswC,UAAU72D,KAAKwwE,SAmJxE,QAASM,eAAcl9D,EAAM6mB,GACzB,IAAK7mB,GAAQA,EAAKm9D,YAAa,MAAOn9D,EAEtC,IAGIzM,GAAG45B,EAAGtgC,EAHN0qD,EAAKv3C,EAAKu3C,GACVkkB,EAAKz7D,EAAK9T,EACVwvE,EAAK17D,EAAK7T,CAGd,KAAKoH,EAAI,EAAGA,EAAIyM,EAAK2H,SAASnU,OAAQD,IAAK,CACvC,GAAIwU,GAAU/H,EAAK2H,SAASpU,GACxB6pE,EAAOr1D,EAAQ2tD,SACfp7D,EAAOyN,EAAQzN,IAEnB,IAAa,IAATA,EACA,IAAK6yB,EAAI,EAAGA,EAAIiwC,EAAK5pE,OAAQ25B,IAAKiwC,EAAKjwC,GAAKkwC,eAAeD,EAAKjwC,GAAItG,EAAQ0wB,EAAIkkB,EAAIC,OAGpF,KAAKvuC,EAAI,EAAGA,EAAIiwC,EAAK5pE,OAAQ25B,IAAK,CAC9B,GAAI4oC,GAAOqH,EAAKjwC,EAChB,KAAKtgC,EAAI,EAAGA,EAAIkpE,EAAKviE,OAAQ3G,IAAKkpE,EAAKlpE,GAAKwwE,eAAetH,EAAKlpE,GAAIg6B,EAAQ0wB,EAAIkkB,EAAIC,IAOhG,MAFA17D,GAAKm9D,aAAc,EAEZn9D,EAGX,QAASq9D,gBAAe7wE,EAAGq6B,EAAQ0wB,EAAIkkB,EAAIC,GACvC,GAAIxvE,GAAI4B,KAAKH,MAAMk5B,GAAUr6B,EAAE,GAAK+qD,EAAKkkB,IACrCtvE,EAAI2B,KAAKH,MAAMk5B,GAAUr6B,EAAE,GAAK+qD,EAAKmkB,GACzC,QAAQxvE,EAAGC,GAIf,QAASmxE,iBAAgB31D,EAAUkf,EAAQxoB,GACvC,GAAwB,IAApBsJ,EAASnU,OAAc,OAAO,CAElC,IAAIuU,GAAUJ,EAAS,EACvB,IAAqB,IAAjBI,EAAQzN,MAAcyN,EAAQ2tD,SAASliE,OAAS,EAAG,OAAO,CAE9D,KAAK,GAAID,GAAI,EAAGA,EAAIwU,EAAQ2tD,SAAS,GAAGliE,OAAQD,IAAK,CACjD,GAAI/G,GAAIub,EAAQ2tD,SAAS,GAAGniE,EAC5B,IAAK/G,EAAE,MAAQ6R,GAAU7R,EAAE,KAAOq6B,EAASxoB,GACtC7R,EAAE,MAAQ6R,GAAU7R,EAAE,KAAOq6B,EAASxoB,EAAS,OAAO,EAE/D,OAAO,EAGX,QAASk/D,MAAKr9D,EAAGhU,EAAGC,GAChB,MAA6B,MAAnB,GAAK+T,GAAK/T,EAAID,GAAWgU,EAGvC,QAAS48D,YAAW5vE,EAAGsB,EAAGtC,GACtB,OAAQA,GAAIA,EAAIgB,EAAE,KAAOsB,EAAE,GAAKtB,EAAE,KAAOsB,EAAE,GAAKtB,EAAE,IAAMA,EAAE,GAAI,GAElE,QAASswE,YAAWtwE,EAAGsB,EAAGrC,GACtB,QAASA,EAAIe,EAAE,KAAOsB,EAAE,GAAKtB,EAAE,KAAOsB,EAAE,GAAKtB,EAAE,IAAMA,EAAE,GAAIf,EAAG,GAGlE,QAAS+F,QAAO+Z,EAAMC,GAClB,IAAK,GAAI3Y,KAAK2Y,GAAKD,EAAK1Y,GAAK2Y,EAAI3Y,EACjC,OAAO0Y,GA1PX1hB,OAAOC,QAAU8nD,SAEjB,IAAIzjD,SAAUnE,QAAQ,aAClB+yE,KAAO/yE,QAAQ,UACfuK,KAAOvK,QAAQ,UACfyW,WAAazW,QAAQ,SAuCzB8xE,WAAUnwE,UAAUoD,SAChBK,QAAS,GACT4sE,aAAc,EACdC,eAAgB,IAChBr+D,UAAW,EACXuoB,OAAQ,KACRxoB,OAAQ,GACR1E,MAAO,GAGX6iE,UAAUnwE,UAAU0wE,UAAY,SAAUp1D,EAAUzH,EAAGhU,EAAGC,EAAGuxE,EAAI5pC,EAAIG,GASjE,IAPA,GAAIxI,IAAS9jB,EAAUzH,EAAGhU,EAAGC,GACzBsD,EAAUrD,KAAKqD,QACfkK,EAAQlK,EAAQkK,MAChBktB,EAASp3B,EAAQo3B,OACjBxoB,EAAS5O,EAAQ4O,OAGdotB,EAAMj4B,QAAQ,CACjBmU,EAAW8jB,EAAMiM,QACjBx3B,EAAIurB,EAAMiM,QACVxrC,EAAIu/B,EAAMiM,QACVvrC,EAAIs/B,EAAMiM,OAEV,IAAI6f,GAAK,GAAKr3C,EACV/J,EAAKonE,KAAKr9D,EAAGhU,EAAGC,GAChB6T,EAAO5T,KAAKi4C,MAAMluC,GAClBwnE,EAAgBz9D,IAAMzQ,EAAQK,QAAU,EAAIL,EAAQ6O,WAAai5C,EAAK1wB,EAE1E,KAAK7mB,IACGrG,EAAQ,GAAGjB,QAAQkU,KAAK,YAE5B5M,EAAO5T,KAAKi4C,MAAMluC,GAAMgL,WAAWwG,EAAU4vC,EAAIrrD,EAAGC,EAAGwxE,EAAez9D,IAAMzQ,EAAQK,SAEhF6J,GAAO,CACHA,EAAQ,IACRjB,QAAQ0J,IAAI,4DACRlC,EAAGhU,EAAGC,EAAG6T,EAAKg9D,YAAah9D,EAAKi9D,UAAWj9D,EAAK49D,eACpDllE,QAAQ+jE,QAAQ,YAEpB,IAAI1+D,GAAM,IAAMmC,CAChB9T,MAAKwwE,MAAM7+D,IAAQ3R,KAAKwwE,MAAM7+D,IAAQ,GAAK,EAC3C3R,KAAKywE,QAQb,GAHA78D,EAAK5J,OAASuR,GAGV21D,gBAAgBt9D,EAAK2H,SAAUkf,EAAQxoB,GAA3C,CAGA,GAAKq/D,EAKE,CAEH,GAAIx9D,IAAMzQ,EAAQK,SAAWoQ,IAAMw9D,EAAI,QAGvC,IAAIrwE,GAAI,GAAMqwE,EAAKx9D,CACnB,IAAIhU,IAAM4B,KAAKqU,MAAM2xB,EAAKzmC,IAAMlB,IAAM2B,KAAKqU,MAAM8xB,EAAK5mC,GAAI,aAT1D,IAAI6S,IAAMzQ,EAAQitE,cAAgB18D,EAAKi9D,WAAaxtE,EAAQktE,eAAgB,QAahF38D,GAAK5J,OAAS,KAEVuD,EAAQ,GAAGjB,QAAQkU,KAAK,WAG5B,IAII4iB,GAAIquC,EAAI99C,EAAI0P,EAAI5xB,EAAMC,EAJtBggE,EAAK,GAAMz/D,EAASwoB,EACpBk3C,EAAK,GAAMD,EACXE,EAAK,GAAMF,EACXG,EAAK,EAAIH,CAGbtuC,GAAKquC,EAAK99C,EAAK0P,EAAK,KAEpB5xB,EAAQ4/D,KAAK91D,EAAU4vC,EAAIrrD,EAAI4xE,EAAI5xE,EAAI8xE,EAAI,EAAGlB,WAAY98D,EAAK8B,IAAI,GAAI9B,EAAKiC,IAAI,IAChFnE,EAAQ2/D,KAAK91D,EAAU4vC,EAAIrrD,EAAI6xE,EAAI7xE,EAAI+xE,EAAI,EAAGnB,WAAY98D,EAAK8B,IAAI,GAAI9B,EAAKiC,IAAI,IAE5EpE,IACA2xB,EAAKiuC,KAAK5/D,EAAM05C,EAAIprD,EAAI2xE,EAAI3xE,EAAI6xE,EAAI,EAAGR,WAAYx9D,EAAK8B,IAAI,GAAI9B,EAAKiC,IAAI,IACzE47D,EAAKJ,KAAK5/D,EAAM05C,EAAIprD,EAAI4xE,EAAI5xE,EAAI8xE,EAAI,EAAGT,WAAYx9D,EAAK8B,IAAI,GAAI9B,EAAKiC,IAAI,KAGzEnE,IACAiiB,EAAK09C,KAAK3/D,EAAOy5C,EAAIprD,EAAI2xE,EAAI3xE,EAAI6xE,EAAI,EAAGR,WAAYx9D,EAAK8B,IAAI,GAAI9B,EAAKiC,IAAI,IAC1EwtB,EAAKguC,KAAK3/D,EAAOy5C,EAAIprD,EAAI4xE,EAAI5xE,EAAI8xE,EAAI,EAAGT,WAAYx9D,EAAK8B,IAAI,GAAI9B,EAAKiC,IAAI,KAG1EtI,EAAQ,GAAGjB,QAAQ+jE,QAAQ,YAE3BjtC,GAAI/D,EAAMruB,KAAKoyB,EAAItvB,EAAI,EAAO,EAAJhU,EAAe,EAAJC,GACrC0xE,GAAIpyC,EAAMruB,KAAKygE,EAAI39D,EAAI,EAAO,EAAJhU,EAAe,EAAJC,EAAQ,GAC7C4zB,GAAI0L,EAAMruB,KAAK2iB,EAAI7f,EAAI,EAAO,EAAJhU,EAAQ,EAAO,EAAJC,GACrCsjC,GAAIhE,EAAMruB,KAAKqyB,EAAIvvB,EAAI,EAAO,EAAJhU,EAAQ,EAAO,EAAJC,EAAQ,MAIzDqwE,UAAUnwE,UAAU63B,QAAU,SAAUhkB,EAAGhU,EAAGC,GAC1C,GAAIsD,GAAUrD,KAAKqD,QACfo3B,EAASp3B,EAAQo3B,OACjBltB,EAAQlK,EAAQkK,MAEhB49C,EAAK,GAAKr3C,CACdhU,IAAMA,EAAIqrD,EAAMA,GAAMA,CAEtB,IAAIphD,GAAKonE,KAAKr9D,EAAGhU,EAAGC,EACpB,IAAIC,KAAKi4C,MAAMluC,GAAK,MAAO+mE,eAAc9wE,KAAKi4C,MAAMluC,GAAK0wB,EAErDltB,GAAQ,GAAGjB,QAAQ0J,IAAI,6BAA8BlC,EAAGhU,EAAGC,EAO/D,KALA,GAGIigB,GAHA0Q,EAAK5c,EACLwc,EAAKxwB,EACL0wB,EAAKzwB,GAGDigB,GAAU0Q,EAAK,GACnBA,IACAJ,EAAK5uB,KAAKqU,MAAMua,EAAK,GACrBE,EAAK9uB,KAAKqU,MAAMya,EAAK,GACrBxQ,EAAShgB,KAAKi4C,MAAMk5B,KAAKzgD,EAAIJ,EAAIE,GAMrC,IAHIjjB,EAAQ,GAAGjB,QAAQ0J,IAAI,8BAA+B0a,EAAIJ,EAAIE,GAG9DxQ,EAAOhW,OAAQ,CACf,GAAIknE,gBAAgBlxD,EAAOzE,SAAUlY,EAAQo3B,OAAQp3B,EAAQ4O,QAAS,MAAO6+D,eAAc9wD,EAAQya,EAE/FltB,GAAQ,GAAGjB,QAAQkU,KAAK,iBAC5BxgB,KAAK2wE,UAAU3wD,EAAOhW,OAAQ0mB,EAAIJ,EAAIE,EAAI1c,EAAGhU,EAAGC,GAC5CwN,EAAQ,GAAGjB,QAAQ+jE,QAAQ,iBAGnC,MAAOS,eAAc9wE,KAAKi4C,MAAMluC,GAAK0wB;;AW1LzC,YAMA,SAASk6C,UAASE,EAAQ3iE,GAEtB,GAKI/K,GAAG0vE,EAAWC,EAAQh3C,EALtBs2C,EAAclkE,EAAYA,EAC1B6K,EAAM83D,EAAOztE,OACbq8B,EAAQ,EACR6a,EAAOvhC,EAAM,EACbsiB,IAQJ,KAJAw1C,EAAOpxC,GAAO,GAAK,EACnBoxC,EAAOv2B,GAAM,GAAK,EAGXA,GAAM,CAIT,IAFAu4B,EAAY,EAEP1vE,EAAIs8B,EAAQ,EAAO6a,EAAJn3C,EAAUA,IAC1B2vE,EAASC,aAAalC,EAAO1tE,GAAI0tE,EAAOpxC,GAAQoxC,EAAOv2B,IAEnDw4B,EAASD,IACT/2C,EAAQ34B,EACR0vE,EAAYC,EAIhBD,GAAYT,GACZvB,EAAO/0C,GAAO,GAAK+2C,EACnBx3C,EAAMruB,KAAKyyB,GACXpE,EAAMruB,KAAK8uB,GACX2D,EAAQ3D,IAGRwe,EAAOjf,EAAM3R,MACb+V,EAAQpE,EAAM3R,QAM1B,QAASqpD,cAAa32E,EAAGU,EAAGsB,GAExB,GAAItC,GAAIgB,EAAE,GAAIf,EAAIe,EAAE,GAChB6mC,EAAKvlC,EAAE,GAAI0lC,EAAK1lC,EAAE,GAClB40E,EAAK52E,EAAE,GAAI62E,EAAK72E,EAAE,GAClB2B,EAAK4lC,EAAK7nC,EACVkC,EAAK8lC,EAAK/nC,CAEd,IAAW,IAAPgC,GAAmB,IAAPC,EAAU,CAEtB,GAAIuc,KAAMy4D,EAAKl3E,GAAKiC,GAAMk1E,EAAKl3E,GAAKiC,IAAOD,EAAKA,EAAKC,EAAKA,EAEtDuc,GAAI,GACJze,EAAI6nC,EACJ5nC,EAAI+nC,GAEGvpB,EAAI,IACXze,GAAKiC,EAAKwc,EACVxe,GAAKiC,EAAKuc,GAOlB,MAHAxc,GAAKi1E,EAAKl3E,EACVkC,EAAKi1E,EAAKl3E,EAEHgC,EAAKA,EAAKC,EAAKA,EAtE1B7D,OAAOC,QAAUu2E;;AFFjB,YAIA,SAAS5/D,YAAWwG,EAAU4vC,EAAIkkB,EAAIC,EAAIp9D,EAAW+jE,GAcjD,IAAK,GAbDriE,IACA2H,YACAs1D,UAAW,EACXW,cAAe,EACfZ,YAAa,EACb5mE,OAAQ,KACRlK,EAAGuvE,EACHtvE,EAAGuvE,EACHnkB,GAAIA,EACJ4lB,aAAa,EACbr7D,KAAM,EAAG,GACTG,KAAM,GAAI,IAEL1O,EAAI,EAAGA,EAAIoU,EAASnU,OAAQD,IAAK,CACtCyM,EAAKg9D,cACLsF,WAAWtiE,EAAM2H,EAASpU,GAAI+K,EAAW+jE,EAEzC,IAAIvgE,GAAM6F,EAASpU,GAAGuO,IAClBG,EAAM0F,EAASpU,GAAG0O,GAElBH,GAAI,GAAK9B,EAAK8B,IAAI,KAAI9B,EAAK8B,IAAI,GAAKA,EAAI,IACxCA,EAAI,GAAK9B,EAAK8B,IAAI,KAAI9B,EAAK8B,IAAI,GAAKA,EAAI,IACxCG,EAAI,GAAKjC,EAAKiC,IAAI,KAAIjC,EAAKiC,IAAI,GAAKA,EAAI,IACxCA,EAAI,GAAKjC,EAAKiC,IAAI,KAAIjC,EAAKiC,IAAI,GAAKA,EAAI,IAEhD,MAAOjC,GAGX,QAASsiE,YAAWtiE,EAAM+H,EAASzJ,EAAW+jE,GAE1C,GAII9uE,GAAG45B,EAAG4oC,EAAMvpE,EAJZ4wE,EAAOr1D,EAAQ2tD,SACfp7D,EAAOyN,EAAQzN,KACfioE,KACAC,EAAclkE,EAAYA,CAG9B,IAAa,IAAThE,EACA,IAAK/G,EAAI,EAAGA,EAAI6pE,EAAK5pE,OAAQD,IACzBgvE,EAAWnlE,KAAKggE,EAAK7pE,IACrByM,EAAKi9D,YACLj9D,EAAK49D,oBAMT,KAAKrqE,EAAI,EAAGA,EAAI6pE,EAAK5pE,OAAQD,IAIzB,GAHAwiE,EAAOqH,EAAK7pE,GAGP8uE,KAAyB,IAAT/nE,GAAcy7D,EAAK9nE,KAAOqQ,GACjB,IAAThE,GAAcy7D,EAAKmL,KAAOsB,GAD/C,CAMA,GAAIC,KAEJ,KAAKt1C,EAAI,EAAGA,EAAI4oC,EAAKviE,OAAQ25B,IACzB3gC,EAAIupE,EAAK5oC,IAELk1C,GAAc71E,EAAE,GAAKg2E,KACrBC,EAAerlE,KAAK5Q,GACpBwT,EAAK49D,iBAET59D,EAAKi9D,WAGTsF,GAAWnlE,KAAKqlE,OAhBZziE,GAAKi9D,WAAalH,EAAKviE,MAoB/B+uE,GAAW/uE,QACXwM,EAAK2H,SAASvK,MACVs4D,SAAU6M,EACVjoE,KAAMA,EACNq7D,KAAM5tD,EAAQ4tD,MAAQ,OA/ElCprE,OAAOC,QAAU2W;;ADFjB,YAMA,SAASlM,MAAK0S,EAAUtJ,EAAQy+D,GAC5B,GAAIiF,GAASp6D,EACT9J,EAAQ4/D,KAAK91D,EAAU,EAAG,GAAKtJ,EAAQA,EAAY,EAAGy+D,EAAY,GAAI,GACtEh/D,EAAQ2/D,KAAK91D,EAAU,EAAI,EAAItJ,EAAQ,EAAIA,EAAQ,EAAGy+D,EAAY,GAAI,EAS1E,QAPIj/D,GAAQC,KACRikE,EAAStE,KAAK91D,EAAU,GAAItJ,EAAQ,EAAIA,EAAQ,EAAGy+D,EAAY,GAAI,GAE/Dj/D,IAAMkkE,EAASC,mBAAmBnkE,EAAM,GAAGiK,OAAOi6D,IAClDjkE,IAAOikE,EAASA,EAAOj6D,OAAOk6D,mBAAmBlkE,EAAO,OAGzDikE,EAGX,QAASC,oBAAmBr6D,EAAU4T,GAGlC,IAAK,GAFD0mD,MAEK1uE,EAAI,EAAGA,EAAIoU,EAASnU,OAAQD,IAAK,CACtC,GAGI2uE,GAHAn6D,EAAUJ,EAASpU,GACnB+G,EAAOyN,EAAQzN,IAInB,IAAa,IAATA,EACA4nE,EAAcC,YAAYp6D,EAAQ2tD,SAAUn6C,OACzC,CACH2mD,IACA,KAAK,GAAI/0C,GAAI,EAAGA,EAAIplB,EAAQ2tD,SAASliE,OAAQ25B,IACzC+0C,EAAY9kE,KAAK+kE,YAAYp6D,EAAQ2tD,SAASvoC,GAAI5R,IAI1D0mD,EAAY7kE,MACRs4D,SAAUwM,EACV5nE,KAAMA,EACNq7D,KAAM5tD,EAAQ4tD,KACd7zD,KAAMiG,EAAQjG,IAAI,GAAKyZ,EAAQxT,EAAQjG,IAAI,IAC3CG,KAAM8F,EAAQ9F,IAAI,GAAKsZ,EAAQxT,EAAQ9F,IAAI,MAInD,MAAOggE,GAGX,QAASE,aAAYlB,EAAQ1lD,GACzB,GAAI6mD,KACJA,GAAUlB,KAAOD,EAAOC,KACxBkB,EAAUn0E,KAAOgzE,EAAOhzE,IAExB,KAAK,GAAIsF,GAAI,EAAGA,EAAI0tE,EAAOztE,OAAQD,IAC/B6uE,EAAUhlE,MAAM6jE,EAAO1tE,GAAG,GAAKgoB,EAAQ0lD,EAAO1tE,GAAG,GAAI0tE,EAAO1tE,GAAG,IAEnE,OAAO6uE,GAzDX,GAAI3E,MAAO/yE,QAAQ,SAEnBH,QAAOC,QAAUyK;;A7CwBjBzK,QAAQ+hD,SAAW7hD,QAAQ,yBAC3BF,QAAQ27B,KAAOz7B,QAAQ,uBACvBF,QAAQgiD,MAAQ9hD,QAAQ,wBACxBF,QAAQi1C,KAAO/0C,QAAQ,uBACvBF,QAAQsqB,KAAOpqB,QAAQ,uBACvBF,QAAQiiD,KAAO/hD,QAAQ,uBACvBF,QAAQ04C,KAAOx4C,QAAQ,uBACvBF,QAAQkiD,KAAOhiD,QAAQ,uBACvBF,QAAQ4vB,KAAO1vB,QAAQ;;AKZvB,GAAI6hD,YAGJA,UAASqH,QAAU,KACnBrH,SAASsH,WAAsC,mBAAjBn6B,cAAgCA,aAAe5qB,MAC7Ey9C,SAASuH,OAAShmD,KAAKimD,OAOvBxH,SAASyH,mBAAqB,SAAS15C,GACnC25C,iBAAmB35C,EAGvB,IAAI45C,QAASpmD,KAAK+hB,GAAK,GAOvB08B,UAAS4H,SAAW,SAASjnD,GACxB,MAAOA,GAAIgnD,QAGhB3pD,OAAOC,QAAU+hD;;AC/BjB,GAAIA,UAAW7hD,QAAQ,eAMnBy7B,OAOJA,MAAKjuB,OAAS,WACV,GAAIk8C,GAAM,GAAI7H,UAASsH,WAAW,EAKlC,OAJAO,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GASXjuB,KAAK75B,MAAQ,SAASY,GAClB,GAAIknD,GAAM,GAAI7H,UAASsH,WAAW,EAKlC,OAJAO,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACJknD,GAUXjuB,KAAKkJ,KAAO,SAAS+kB,EAAKlnD,GAKtB,MAJAknD,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACJknD,GASXjuB,KAAKG,SAAW,SAAS8tB,GAKrB,MAJAA,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GAUXjuB,KAAKkuB,UAAY,SAASD,EAAKlnD,GAE3B,GAAIknD,IAAQlnD,EAAG,CACX,GAAIonD,GAAKpnD,EAAE,EACXknD,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKE,MAETF,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,EAGf,OAAOknD,IAUXjuB,KAAKhK,OAAS,SAASi4B,EAAKlnD,GACxB,GAAIqnD,GAAKrnD,EAAE,GAAIonD,EAAKpnD,EAAE,GAAIsnD,EAAKtnD,EAAE,GAAIunD,EAAKvnD,EAAE,GAGxCwnD,EAAMH,EAAKE,EAAKD,EAAKF,CAEzB,OAAKI,IAGLA,EAAM,EAAMA,EAEZN,EAAI,GAAMK,EAAKC,EACfN,EAAI,IAAME,EAAKI,EACfN,EAAI,IAAMI,EAAKE,EACfN,EAAI,GAAMG,EAAKG,EAERN,GATI,MAmBfjuB,KAAKwuB,QAAU,SAASP,EAAKlnD,GAEzB,GAAIqnD,GAAKrnD,EAAE,EAMX,OALAknD,GAAI,GAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,GACZknD,EAAI,GAAMG,EAEHH,GASXjuB,KAAKyuB,YAAc,SAAU1nD,GACzB,MAAOA,GAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAWlCi5B,KAAKjJ,SAAW,SAAUk3B,EAAKlnD,EAAGsB,GAC9B,GAAI+lD,GAAKrnD,EAAE,GAAIonD,EAAKpnD,EAAE,GAAIsnD,EAAKtnD,EAAE,GAAIunD,EAAKvnD,EAAE,GACxCqiD,EAAK/gD,EAAE,GAAIghD,EAAKhhD,EAAE,GAAIihD,EAAKjhD,EAAE,GAAIkhD,EAAKlhD,EAAE,EAK5C,OAJA4lD,GAAI,GAAKG,EAAKhF,EAAKiF,EAAKhF,EACxB4E,EAAI,GAAKE,EAAK/E,EAAKkF,EAAKjF,EACxB4E,EAAI,GAAKG,EAAK9E,EAAK+E,EAAK9E,EACxB0E,EAAI,GAAKE,EAAK7E,EAAKgF,EAAK/E,EACjB0E,GAOXjuB,KAAK0uB,IAAM1uB,KAAKjJ,SAUhBiJ,KAAKl5B,OAAS,SAAUmnD,EAAKlnD,EAAG0iB,GAC5B,GAAI2kC,GAAKrnD,EAAE,GAAIonD,EAAKpnD,EAAE,GAAIsnD,EAAKtnD,EAAE,GAAIunD,EAAKvnD,EAAE,GACxCmnB,EAAIvmB,KAAKc,IAAIghB,GACbvM,EAAIvV,KAAKa,IAAIihB,EAKjB,OAJAwkC,GAAI,GAAKG,EAAMlxC,EAAImxC,EAAKngC,EACxB+/B,EAAI,GAAKE,EAAMjxC,EAAIoxC,EAAKpgC,EACxB+/B,EAAI,GAAKG,GAAMlgC,EAAImgC,EAAKnxC,EACxB+wC,EAAI,GAAKE,GAAMjgC,EAAIogC,EAAKpxC,EACjB+wC,GAWXjuB,KAAK5M,MAAQ,SAAS66B,EAAKlnD,EAAG+4C,GAC1B,GAAIsO,GAAKrnD,EAAE,GAAIonD,EAAKpnD,EAAE,GAAIsnD,EAAKtnD,EAAE,GAAIunD,EAAKvnD,EAAE,GACxC4nD,EAAK7O,EAAE,GAAI8O,EAAK9O,EAAE,EAKtB,OAJAmO,GAAI,GAAKG,EAAKO,EACdV,EAAI,GAAKE,EAAKQ,EACdV,EAAI,GAAKI,EAAKO,EACdX,EAAI,GAAKK,EAAKM,EACPX,GAcXjuB,KAAK6uB,aAAe,SAASZ,EAAKxkC,GAC9B,GAAIyE,GAAIvmB,KAAKc,IAAIghB,GACbvM,EAAIvV,KAAKa,IAAIihB,EAKjB,OAJAwkC,GAAI,GAAK/wC,EACT+wC,EAAI,GAAK//B,EACT+/B,EAAI,IAAM//B,EACV+/B,EAAI,GAAK/wC,EACF+wC,GAcXjuB,KAAK8uB,YAAc,SAASb,EAAKnO,GAK7B,MAJAmO,GAAI,GAAKnO,EAAE,GACXmO,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAKnO,EAAE,GACJmO,GASXjuB,KAAK4pB,IAAM,SAAU7iD,GACjB,MAAO,QAAUA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAStEi5B,KAAK+uB,KAAO,SAAUhoD,GAClB,MAAOY,MAAKC,KAAKD,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,KAWhGi5B,KAAKgvB,IAAM,SAAUC,EAAGC,EAAGC,EAAGpoD,GAK1B,MAJAkoD,GAAE,GAAKloD,EAAE,GAAGA,EAAE,GACdooD,EAAE,GAAKpoD,EAAE,GACTooD,EAAE,GAAKpoD,EAAE,GACTooD,EAAE,GAAKpoD,EAAE,GAAKkoD,EAAE,GAAKE,EAAE,IACfF,EAAGC,EAAGC,IAIlB/qD,OAAOC,QAAU27B;;ACzRjB,GAAIomB,UAAW7hD,QAAQ,eAoBnB8hD,QAOJA,OAAMt0C,OAAS,WACX,GAAIk8C,GAAM,GAAI7H,UAASsH,WAAW,EAOlC,OANAO,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GASX5H,MAAMlgD,MAAQ,SAASY,GACnB,GAAIknD,GAAM,GAAI7H,UAASsH,WAAW,EAOlC,OANAO,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACJknD,GAUX5H,MAAMnd,KAAO,SAAS+kB,EAAKlnD,GAOvB,MANAknD,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACJknD,GASX5H,MAAMlmB,SAAW,SAAS8tB,GAOtB,MANAA,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GAUX5H,MAAMrwB,OAAS,SAASi4B,EAAKlnD,GACzB,GAAIqoD,GAAKroD,EAAE,GAAI82C,EAAK92C,EAAE,GAAIsoD,EAAKtoD,EAAE,GAAIuoD,EAAKvoD,EAAE,GACxCwoD,EAAMxoD,EAAE,GAAIyoD,EAAMzoD,EAAE,GAEpBwnD,EAAMa,EAAKE,EAAKzR,EAAKwR,CACzB,OAAId,IAGJA,EAAM,EAAMA,EAEZN,EAAI,GAAKqB,EAAKf,EACdN,EAAI,IAAMpQ,EAAK0Q,EACfN,EAAI,IAAMoB,EAAKd,EACfN,EAAI,GAAKmB,EAAKb,EACdN,EAAI,IAAMoB,EAAKG,EAAMF,EAAKC,GAAOhB,EACjCN,EAAI,IAAMpQ,EAAK0R,EAAMH,EAAKI,GAAOjB,EAC1BN,GAVI,MAmBf5H,MAAMoI,YAAc,SAAU1nD,GAC1B,MAAOA,GAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IAWlCs/C,MAAMtvB,SAAW,SAAUk3B,EAAKlnD,EAAGsB,GAC/B,GAAI+lD,GAAKrnD,EAAE,GAAIonD,EAAKpnD,EAAE,GAAIsnD,EAAKtnD,EAAE,GAAIunD,EAAKvnD,EAAE,GAAI0oD,EAAK1oD,EAAE,GAAI2oD,EAAK3oD,EAAE,GAC9DqiD,EAAK/gD,EAAE,GAAIghD,EAAKhhD,EAAE,GAAIihD,EAAKjhD,EAAE,GAAIkhD,EAAKlhD,EAAE,GAAIsnD,EAAKtnD,EAAE,GAAIunD,EAAKvnD,EAAE,EAOlE,OANA4lD,GAAI,GAAKG,EAAKhF,EAAKiF,EAAKhF,EACxB4E,EAAI,GAAKE,EAAK/E,EAAKkF,EAAKjF,EACxB4E,EAAI,GAAKG,EAAK9E,EAAK+E,EAAK9E,EACxB0E,EAAI,GAAKE,EAAK7E,EAAKgF,EAAK/E,EACxB0E,EAAI,GAAKG,EAAKuB,EAAKtB,EAAKuB,EAAKH,EAC7BxB,EAAI,GAAKE,EAAKwB,EAAKrB,EAAKsB,EAAKF,EACtBzB,GAOX5H,MAAMqI,IAAMrI,MAAMtvB,SAUlBsvB,MAAMv/C,OAAS,SAAUmnD,EAAKlnD,EAAG0iB,GAC7B,GAAI2kC,GAAKrnD,EAAE,GAAIonD,EAAKpnD,EAAE,GAAIsnD,EAAKtnD,EAAE,GAAIunD,EAAKvnD,EAAE,GAAI0oD,EAAK1oD,EAAE,GAAI2oD,EAAK3oD,EAAE,GAC9DmnB,EAAIvmB,KAAKc,IAAIghB,GACbvM,EAAIvV,KAAKa,IAAIihB,EAOjB,OANAwkC,GAAI,GAAKG,EAAMlxC,EAAImxC,EAAKngC,EACxB+/B,EAAI,GAAKE,EAAMjxC,EAAIoxC,EAAKpgC,EACxB+/B,EAAI,GAAKG,GAAMlgC,EAAImgC,EAAKnxC,EACxB+wC,EAAI,GAAKE,GAAMjgC,EAAIogC,EAAKpxC,EACxB+wC,EAAI,GAAKwB,EACTxB,EAAI,GAAKyB,EACFzB,GAWX5H,MAAMjzB,MAAQ,SAAS66B,EAAKlnD,EAAG+4C,GAC3B,GAAIsO,GAAKrnD,EAAE,GAAIonD,EAAKpnD,EAAE,GAAIsnD,EAAKtnD,EAAE,GAAIunD,EAAKvnD,EAAE,GAAI0oD,EAAK1oD,EAAE,GAAI2oD,EAAK3oD,EAAE,GAC9D4nD,EAAK7O,EAAE,GAAI8O,EAAK9O,EAAE,EAOtB,OANAmO,GAAI,GAAKG,EAAKO,EACdV,EAAI,GAAKE,EAAKQ,EACdV,EAAI,GAAKI,EAAKO,EACdX,EAAI,GAAKK,EAAKM,EACdX,EAAI,GAAKwB,EACTxB,EAAI,GAAKyB,EACFzB,GAWX5H,MAAMz8B,UAAY,SAASqkC,EAAKlnD,EAAG+4C,GAC/B,GAAIsO,GAAKrnD,EAAE,GAAIonD,EAAKpnD,EAAE,GAAIsnD,EAAKtnD,EAAE,GAAIunD,EAAKvnD,EAAE,GAAI0oD,EAAK1oD,EAAE,GAAI2oD,EAAK3oD,EAAE,GAC9D4nD,EAAK7O,EAAE,GAAI8O,EAAK9O,EAAE,EAOtB,OANAmO,GAAI,GAAKG,EACTH,EAAI,GAAKE,EACTF,EAAI,GAAKI,EACTJ,EAAI,GAAKK,EACTL,EAAI,GAAKG,EAAKO,EAAKN,EAAKO,EAAKa,EAC7BxB,EAAI,GAAKE,EAAKQ,EAAKL,EAAKM,EAAKc,EACtBzB,GAcX5H,MAAMwI,aAAe,SAASZ,EAAKxkC,GAC/B,GAAIyE,GAAIvmB,KAAKc,IAAIghB,GAAMvM,EAAIvV,KAAKa,IAAIihB,EAOpC,OANAwkC,GAAI,GAAK/wC,EACT+wC,EAAI,GAAK//B,EACT+/B,EAAI,IAAM//B,EACV+/B,EAAI,GAAK/wC,EACT+wC,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GAcX5H,MAAMyI,YAAc,SAASb,EAAKnO,GAO9B,MANAmO,GAAI,GAAKnO,EAAE,GACXmO,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAKnO,EAAE,GACXmO,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GAcX5H,MAAMwJ,gBAAkB,SAAS5B,EAAKnO,GAOlC,MANAmO,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAKnO,EAAE,GACXmO,EAAI,GAAKnO,EAAE,GACJmO,GASX5H,MAAMuD,IAAM,SAAU7iD,GAClB,MAAO,SAAWA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KACrCA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KASvDs/C,MAAM0I,KAAO,SAAUhoD,GACnB,MAAOY,MAAKC,KAAKD,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAK,IAG7I3C,OAAOC,QAAUgiD;;ACxSjB,GAAID,UAAW7hD,QAAQ,eAMnB+0C,OAOJA,MAAKvnC,OAAS,WACV,GAAIk8C,GAAM,GAAI7H,UAASsH,WAAW,EAUlC,OATAO,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GAUX3U,KAAKwW,SAAW,SAAS7B,EAAKlnD,GAU1B,MATAknD,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,IACJknD,GASX3U,KAAKnzC,MAAQ,SAASY,GAClB,GAAIknD,GAAM,GAAI7H,UAASsH,WAAW,EAUlC,OATAO,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACJknD,GAUX3U,KAAKpQ,KAAO,SAAS+kB,EAAKlnD,GAUtB,MATAknD,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACJknD,GASX3U,KAAKnZ,SAAW,SAAS8tB,GAUrB,MATAA,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GAUX3U,KAAK4U,UAAY,SAASD,EAAKlnD,GAE3B,GAAIknD,IAAQlnD,EAAG,CACX,GAAIgpD,GAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAAIkpD,EAAMlpD,EAAE,EACpCknD,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAK8B,EACT9B,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAK+B,EACT/B,EAAI,GAAKgC,MAEThC,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,EAGf,OAAOknD,IAUX3U,KAAKtjB,OAAS,SAASi4B,EAAKlnD,GACxB,GAAImpD,GAAMnpD,EAAE,GAAIgpD,EAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAChCopD,EAAMppD,EAAE,GAAIqpD,EAAMrpD,EAAE,GAAIkpD,EAAMlpD,EAAE,GAChCspD,EAAMtpD,EAAE,GAAIupD,EAAMvpD,EAAE,GAAIwpD,EAAMxpD,EAAE,GAEhCypD,EAAMD,EAAMH,EAAMH,EAAMK,EACxBG,GAAOF,EAAMJ,EAAMF,EAAMI,EACzBK,EAAMJ,EAAMH,EAAMC,EAAMC,EAGxB9B,EAAM2B,EAAMM,EAAMT,EAAMU,EAAMT,EAAMU,CAExC,OAAKnC,IAGLA,EAAM,EAAMA,EAEZN,EAAI,GAAKuC,EAAMjC,EACfN,EAAI,KAAOsC,EAAMR,EAAMC,EAAMM,GAAO/B,EACpCN,EAAI,IAAMgC,EAAMF,EAAMC,EAAMI,GAAO7B,EACnCN,EAAI,GAAKwC,EAAMlC,EACfN,EAAI,IAAMsC,EAAML,EAAMF,EAAMK,GAAO9B,EACnCN,EAAI,KAAOgC,EAAMC,EAAMF,EAAMG,GAAO5B,EACpCN,EAAI,GAAKyC,EAAMnC,EACfN,EAAI,KAAOqC,EAAMJ,EAAMH,EAAMM,GAAO9B,EACpCN,EAAI,IAAMmC,EAAMF,EAAMH,EAAMI,GAAO5B,EAC5BN,GAbI,MAuBf3U,KAAKkV,QAAU,SAASP,EAAKlnD,GACzB,GAAImpD,GAAMnpD,EAAE,GAAIgpD,EAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAChCopD,EAAMppD,EAAE,GAAIqpD,EAAMrpD,EAAE,GAAIkpD,EAAMlpD,EAAE,GAChCspD,EAAMtpD,EAAE,GAAIupD,EAAMvpD,EAAE,GAAIwpD,EAAMxpD,EAAE,EAWpC,OATAknD,GAAI,GAAMmC,EAAMG,EAAMN,EAAMK,EAC5BrC,EAAI,GAAM+B,EAAMM,EAAMP,EAAMQ,EAC5BtC,EAAI,GAAM8B,EAAME,EAAMD,EAAMI,EAC5BnC,EAAI,GAAMgC,EAAMI,EAAMF,EAAMI,EAC5BtC,EAAI,GAAMiC,EAAMK,EAAMP,EAAMK,EAC5BpC,EAAI,GAAM+B,EAAMG,EAAMD,EAAMD,EAC5BhC,EAAI,GAAMkC,EAAMG,EAAMF,EAAMC,EAC5BpC,EAAI,GAAM8B,EAAMM,EAAMH,EAAMI,EAC5BrC,EAAI,GAAMiC,EAAME,EAAML,EAAMI,EACrBlC,GASX3U,KAAKmV,YAAc,SAAU1nD,GACzB,GAAImpD,GAAMnpD,EAAE,GAAIgpD,EAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAChCopD,EAAMppD,EAAE,GAAIqpD,EAAMrpD,EAAE,GAAIkpD,EAAMlpD,EAAE,GAChCspD,EAAMtpD,EAAE,GAAIupD,EAAMvpD,EAAE,GAAIwpD,EAAMxpD,EAAE,EAEpC,OAAOmpD,IAAOK,EAAMH,EAAMH,EAAMK,GAAOP,IAAQQ,EAAMJ,EAAMF,EAAMI,GAAOL,GAAOM,EAAMH,EAAMC,EAAMC,IAWrG/W,KAAKviB,SAAW,SAAUk3B,EAAKlnD,EAAGsB,GAC9B,GAAI6nD,GAAMnpD,EAAE,GAAIgpD,EAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAChCopD,EAAMppD,EAAE,GAAIqpD,EAAMrpD,EAAE,GAAIkpD,EAAMlpD,EAAE,GAChCspD,EAAMtpD,EAAE,GAAIupD,EAAMvpD,EAAE,GAAIwpD,EAAMxpD,EAAE,GAEhC4pD,EAAMtoD,EAAE,GAAImoD,EAAMnoD,EAAE,GAAIuoD,EAAMvoD,EAAE,GAChCwoD,EAAMxoD,EAAE,GAAIooD,EAAMpoD,EAAE,GAAIyoD,EAAMzoD,EAAE,GAChC0oD,EAAM1oD,EAAE,GAAIqoD,EAAMroD,EAAE,GAAI2oD,EAAM3oD,EAAE,EAapC,OAXA4lD,GAAI,GAAK0C,EAAMT,EAAMM,EAAML,EAAMS,EAAMP,EACvCpC,EAAI,GAAK0C,EAAMZ,EAAMS,EAAMJ,EAAMQ,EAAMN,EACvCrC,EAAI,GAAK0C,EAAMX,EAAMQ,EAAMP,EAAMW,EAAML,EAEvCtC,EAAI,GAAK4C,EAAMX,EAAMO,EAAMN,EAAMW,EAAMT,EACvCpC,EAAI,GAAK4C,EAAMd,EAAMU,EAAML,EAAMU,EAAMR,EACvCrC,EAAI,GAAK4C,EAAMb,EAAMS,EAAMR,EAAMa,EAAMP,EAEvCtC,EAAI,GAAK8C,EAAMb,EAAMQ,EAAMP,EAAMa,EAAMX,EACvCpC,EAAI,GAAK8C,EAAMhB,EAAMW,EAAMN,EAAMY,EAAMV,EACvCrC,EAAI,GAAK8C,EAAMf,EAAMU,EAAMT,EAAMe,EAAMT,EAChCtC,GAOX3U,KAAKoV,IAAMpV,KAAKviB,SAUhBuiB,KAAK1vB,UAAY,SAASqkC,EAAKlnD,EAAG+4C,GAC9B,GAAIoQ,GAAMnpD,EAAE,GAAIgpD,EAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAChCopD,EAAMppD,EAAE,GAAIqpD,EAAMrpD,EAAE,GAAIkpD,EAAMlpD,EAAE,GAChCspD,EAAMtpD,EAAE,GAAIupD,EAAMvpD,EAAE,GAAIwpD,EAAMxpD,EAAE,GAChChB,EAAI+5C,EAAE,GAAI95C,EAAI85C,EAAE,EAapB,OAXAmO,GAAI,GAAKiC,EACTjC,EAAI,GAAK8B,EACT9B,EAAI,GAAK+B,EAET/B,EAAI,GAAKkC,EACTlC,EAAI,GAAKmC,EACTnC,EAAI,GAAKgC,EAEThC,EAAI,GAAKloD,EAAImqD,EAAMlqD,EAAImqD,EAAME,EAC7BpC,EAAI,GAAKloD,EAAIgqD,EAAM/pD,EAAIoqD,EAAME,EAC7BrC,EAAI,GAAKloD,EAAIiqD,EAAMhqD,EAAIiqD,EAAMM,EACtBtC,GAWX3U,KAAKxyC,OAAS,SAAUmnD,EAAKlnD,EAAG0iB,GAC5B,GAAIymC,GAAMnpD,EAAE,GAAIgpD,EAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAChCopD,EAAMppD,EAAE,GAAIqpD,EAAMrpD,EAAE,GAAIkpD,EAAMlpD,EAAE,GAChCspD,EAAMtpD,EAAE,GAAIupD,EAAMvpD,EAAE,GAAIwpD,EAAMxpD,EAAE,GAEhCmnB,EAAIvmB,KAAKc,IAAIghB,GACbvM,EAAIvV,KAAKa,IAAIihB,EAajB,OAXAwkC,GAAI,GAAK/wC,EAAIgzC,EAAMhiC,EAAIiiC,EACvBlC,EAAI,GAAK/wC,EAAI6yC,EAAM7hC,EAAIkiC,EACvBnC,EAAI,GAAK/wC,EAAI8yC,EAAM9hC,EAAI+hC,EAEvBhC,EAAI,GAAK/wC,EAAIizC,EAAMjiC,EAAIgiC,EACvBjC,EAAI,GAAK/wC,EAAIkzC,EAAMliC,EAAI6hC,EACvB9B,EAAI,GAAK/wC,EAAI+yC,EAAM/hC,EAAI8hC,EAEvB/B,EAAI,GAAKoC,EACTpC,EAAI,GAAKqC,EACTrC,EAAI,GAAKsC,EACFtC,GAWX3U,KAAKlmB,MAAQ,SAAS66B,EAAKlnD,EAAG+4C,GAC1B,GAAI/5C,GAAI+5C,EAAE,GAAI95C,EAAI85C,EAAE,EAapB,OAXAmO,GAAI,GAAKloD,EAAIgB,EAAE,GACfknD,EAAI,GAAKloD,EAAIgB,EAAE,GACfknD,EAAI,GAAKloD,EAAIgB,EAAE,GAEfknD,EAAI,GAAKjoD,EAAIe,EAAE,GACfknD,EAAI,GAAKjoD,EAAIe,EAAE,GACfknD,EAAI,GAAKjoD,EAAIe,EAAE,GAEfknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACJknD,GAcX3U,KAAKuW,gBAAkB,SAAS5B,EAAKnO,GAUjC,MATAmO,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAKnO,EAAE,GACXmO,EAAI,GAAKnO,EAAE,GACXmO,EAAI,GAAK,EACFA,GAcX3U,KAAKuV,aAAe,SAASZ,EAAKxkC,GAC9B,GAAIyE,GAAIvmB,KAAKc,IAAIghB,GAAMvM,EAAIvV,KAAKa,IAAIihB,EAapC,OAXAwkC,GAAI,GAAK/wC,EACT+wC,EAAI,GAAK//B,EACT+/B,EAAI,GAAK,EAETA,EAAI,IAAM//B,EACV+/B,EAAI,GAAK/wC,EACT+wC,EAAI,GAAK,EAETA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GAcX3U,KAAKwV,YAAc,SAASb,EAAKnO,GAY7B,MAXAmO,GAAI,GAAKnO,EAAE,GACXmO,EAAI,GAAK,EACTA,EAAI,GAAK,EAETA,EAAI,GAAK,EACTA,EAAI,GAAKnO,EAAE,GACXmO,EAAI,GAAK,EAETA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GAUX3U,KAAK2X,UAAY,SAAShD,EAAKlnD,GAY3B,MAXAknD,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAK,EAETA,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAK,EAETA,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAK,EACFA,GAWX3U,KAAK4X,SAAW,SAAUjD,EAAKkD,GAC3B,GAAIprD,GAAIorD,EAAE,GAAInrD,EAAImrD,EAAE,GAAIp3C,EAAIo3C,EAAE,GAAI50B,EAAI40B,EAAE,GACpCh6B,EAAKpxB,EAAIA,EACTivB,EAAKhvB,EAAIA,EACTorD,EAAKr3C,EAAIA,EAETs3C,EAAKtrD,EAAIoxB,EACTm6B,EAAKtrD,EAAImxB,EACTo6B,EAAKvrD,EAAIgvB,EACTw8B,EAAKz3C,EAAIod,EACTs6B,EAAK13C,EAAIib,EACT08B,EAAK33C,EAAIq3C,EACTnT,EAAK1hB,EAAIpF,EACTw6B,EAAKp1B,EAAIvH,EACT48B,EAAKr1B,EAAI60B,CAcb,OAZAnD,GAAI,GAAK,EAAIsD,EAAKG,EAClBzD,EAAI,GAAKqD,EAAKM,EACd3D,EAAI,GAAKuD,EAAKG,EAEd1D,EAAI,GAAKqD,EAAKM,EACd3D,EAAI,GAAK,EAAIoD,EAAKK,EAClBzD,EAAI,GAAKwD,EAAKxT,EAEdgQ,EAAI,GAAKuD,EAAKG,EACd1D,EAAI,GAAKwD,EAAKxT,EACdgQ,EAAI,GAAK,EAAIoD,EAAKE,EAEXtD,GAWX3U,KAAKuY,eAAiB,SAAU5D,EAAKlnD,GACjC,GAAImpD,GAAMnpD,EAAE,GAAIgpD,EAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAAI+qD,EAAM/qD,EAAE,GAC5CopD,EAAMppD,EAAE,GAAIqpD,EAAMrpD,EAAE,GAAIkpD,EAAMlpD,EAAE,GAAIgrD,EAAMhrD,EAAE,GAC5CspD,EAAMtpD,EAAE,GAAIupD,EAAMvpD,EAAE,GAAIwpD,EAAMxpD,EAAE,IAAKirD,EAAMjrD,EAAE,IAC7CkrD,EAAMlrD,EAAE,IAAKmrD,EAAMnrD,EAAE,IAAKorD,EAAMprD,EAAE,IAAKqrD,EAAMrrD,EAAE,IAE/C4pD,EAAMT,EAAME,EAAML,EAAMI,EACxBK,EAAMN,EAAMD,EAAMD,EAAMG,EACxBS,EAAMV,EAAM6B,EAAMD,EAAM3B,EACxBkC,EAAMtC,EAAME,EAAMD,EAAMI,EACxBkC,EAAMvC,EAAMgC,EAAMD,EAAM1B,EACxBmC,EAAMvC,EAAM+B,EAAMD,EAAM7B,EACxBuC,EAAMnC,EAAM6B,EAAM5B,EAAM2B,EACxBQ,EAAMpC,EAAM8B,EAAM5B,EAAM0B,EACxBS,EAAMrC,EAAM+B,EAAMJ,EAAMC,EACxBU,EAAMrC,EAAM6B,EAAM5B,EAAM2B,EACxBrB,EAAMP,EAAM8B,EAAMJ,EAAME,EACxBzB,EAAMF,EAAM6B,EAAMJ,EAAMG,EAGxB5D,EAAMoC,EAAMF,EAAMD,EAAMK,EAAMD,EAAM+B,EAAMN,EAAMK,EAAMJ,EAAMG,EAAMF,EAAMC,CAE5E,OAAKjE,IAGLA,EAAM,EAAMA,EAEZN,EAAI,IAAMmC,EAAMK,EAAMR,EAAMY,EAAMkB,EAAMY,GAAOpE,EAC/CN,EAAI,IAAMgC,EAAMyC,EAAMvC,EAAMM,EAAMsB,EAAMU,GAAOlE,EAC/CN,EAAI,IAAMkC,EAAMU,EAAMT,EAAMsC,EAAMX,EAAMS,GAAOjE,EAE/CN,EAAI,IAAM+B,EAAMa,EAAMd,EAAMU,EAAMqB,EAAMa,GAAOpE,EAC/CN,EAAI,IAAMiC,EAAMO,EAAMT,EAAM0C,EAAMZ,EAAMW,GAAOlE,EAC/CN,EAAI,IAAM8B,EAAM2C,EAAMxC,EAAMW,EAAMiB,EAAMU,GAAOjE,EAE/CN,EAAI,IAAMiE,EAAMK,EAAMJ,EAAMG,EAAMF,EAAMC,GAAO9D,EAC/CN,EAAI,IAAMkE,EAAMvB,EAAMqB,EAAMM,EAAMH,EAAM5B,GAAOjC,EAC/CN,EAAI,IAAMgE,EAAMK,EAAMJ,EAAMtB,EAAMwB,EAAMzB,GAAOpC,EAExCN,GAhBI,MAyBf3U,KAAKsQ,IAAM,SAAU7iD,GACjB,MAAO,QAAUA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KACpCA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KACnCA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KASvDuyC,KAAKyV,KAAO,SAAUhoD,GAClB,MAAOY,MAAKC,KAAKD,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,KAIpM3C,OAAOC,QAAUi1C;;AChiBjB,GAAI8M,UAAW7hD,QAAQ,eAMnBoqB,OAOJA,MAAK5c,OAAS,WACV,GAAIk8C,GAAM,GAAI7H,UAASsH,WAAW,GAiBlC,OAhBAO,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACHA,GASXt/B,KAAKxoB,MAAQ,SAASY,GAClB,GAAIknD,GAAM,GAAI7H,UAASsH,WAAW,GAiBlC,OAhBAO,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACLknD,GAUXt/B,KAAKua,KAAO,SAAS+kB,EAAKlnD,GAiBtB,MAhBAknD,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACLknD,GASXt/B,KAAKwR,SAAW,SAAS8tB,GAiBrB,MAhBAA,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACHA,GAUXt/B,KAAKu/B,UAAY,SAASD,EAAKlnD,GAE3B,GAAIknD,IAAQlnD,EAAG,CACX,GAAIgpD,GAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAAI+qD,EAAM/qD,EAAE,GAChCkpD,EAAMlpD,EAAE,GAAIgrD,EAAMhrD,EAAE,GACpBirD,EAAMjrD,EAAE,GAEZknD,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,IACXknD,EAAI,GAAK8B,EACT9B,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,IACXknD,EAAI,GAAK+B,EACT/B,EAAI,GAAKgC,EACThC,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAM6D,EACV7D,EAAI,IAAM8D,EACV9D,EAAI,IAAM+D,MAEV/D,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,IACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,IACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,GAGhB,OAAOknD,IAUXt/B,KAAKqH,OAAS,SAASi4B,EAAKlnD,GACxB,GAAImpD,GAAMnpD,EAAE,GAAIgpD,EAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAAI+qD,EAAM/qD,EAAE,GAC5CopD,EAAMppD,EAAE,GAAIqpD,EAAMrpD,EAAE,GAAIkpD,EAAMlpD,EAAE,GAAIgrD,EAAMhrD,EAAE,GAC5CspD,EAAMtpD,EAAE,GAAIupD,EAAMvpD,EAAE,GAAIwpD,EAAMxpD,EAAE,IAAKirD,EAAMjrD,EAAE,IAC7CkrD,EAAMlrD,EAAE,IAAKmrD,EAAMnrD,EAAE,IAAKorD,EAAMprD,EAAE,IAAKqrD,EAAMrrD,EAAE,IAE/C4pD,EAAMT,EAAME,EAAML,EAAMI,EACxBK,EAAMN,EAAMD,EAAMD,EAAMG,EACxBS,EAAMV,EAAM6B,EAAMD,EAAM3B,EACxBkC,EAAMtC,EAAME,EAAMD,EAAMI,EACxBkC,EAAMvC,EAAMgC,EAAMD,EAAM1B,EACxBmC,EAAMvC,EAAM+B,EAAMD,EAAM7B,EACxBuC,EAAMnC,EAAM6B,EAAM5B,EAAM2B,EACxBQ,EAAMpC,EAAM8B,EAAM5B,EAAM0B,EACxBS,EAAMrC,EAAM+B,EAAMJ,EAAMC,EACxBU,EAAMrC,EAAM6B,EAAM5B,EAAM2B,EACxBrB,EAAMP,EAAM8B,EAAMJ,EAAME,EACxBzB,EAAMF,EAAM6B,EAAMJ,EAAMG,EAGxB5D,EAAMoC,EAAMF,EAAMD,EAAMK,EAAMD,EAAM+B,EAAMN,EAAMK,EAAMJ,EAAMG,EAAMF,EAAMC,CAE5E,OAAKjE,IAGLA,EAAM,EAAMA,EAEZN,EAAI,IAAMmC,EAAMK,EAAMR,EAAMY,EAAMkB,EAAMY,GAAOpE,EAC/CN,EAAI,IAAM+B,EAAMa,EAAMd,EAAMU,EAAMqB,EAAMa,GAAOpE,EAC/CN,EAAI,IAAMiE,EAAMK,EAAMJ,EAAMG,EAAMF,EAAMC,GAAO9D,EAC/CN,EAAI,IAAMsC,EAAM+B,EAAMhC,EAAMiC,EAAMP,EAAMK,GAAO9D,EAC/CN,EAAI,IAAMgC,EAAMyC,EAAMvC,EAAMM,EAAMsB,EAAMU,GAAOlE,EAC/CN,EAAI,IAAMiC,EAAMO,EAAMT,EAAM0C,EAAMZ,EAAMW,GAAOlE,EAC/CN,EAAI,IAAMkE,EAAMvB,EAAMqB,EAAMM,EAAMH,EAAM5B,GAAOjC,EAC/CN,EAAI,IAAMoC,EAAMkC,EAAMhC,EAAMK,EAAMoB,EAAMxB,GAAOjC,EAC/CN,EAAI,IAAMkC,EAAMU,EAAMT,EAAMsC,EAAMX,EAAMS,GAAOjE,EAC/CN,EAAI,IAAM8B,EAAM2C,EAAMxC,EAAMW,EAAMiB,EAAMU,GAAOjE,EAC/CN,EAAI,KAAOgE,EAAMK,EAAMJ,EAAMtB,EAAMwB,EAAMzB,GAAOpC,EAChDN,EAAI,KAAOqC,EAAMM,EAAMP,EAAMiC,EAAMN,EAAMrB,GAAOpC,EAChDN,EAAI,KAAOmC,EAAMqC,EAAMtC,EAAMwC,EAAM1C,EAAMuC,GAAOjE,EAChDN,EAAI,KAAOiC,EAAMyC,EAAM5C,EAAM0C,EAAMzC,EAAMwC,GAAOjE,EAChDN,EAAI,KAAOiE,EAAM1B,EAAMyB,EAAMI,EAAMF,EAAMxB,GAAOpC,EAChDN,EAAI,KAAOoC,EAAMgC,EAAM/B,EAAME,EAAMD,EAAMI,GAAOpC,EAEzCN,GArBI,MA+Bft/B,KAAK6/B,QAAU,SAASP,EAAKlnD,GACzB,GAAImpD,GAAMnpD,EAAE,GAAIgpD,EAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAAI+qD,EAAM/qD,EAAE,GAC5CopD,EAAMppD,EAAE,GAAIqpD,EAAMrpD,EAAE,GAAIkpD,EAAMlpD,EAAE,GAAIgrD,EAAMhrD,EAAE,GAC5CspD,EAAMtpD,EAAE,GAAIupD,EAAMvpD,EAAE,GAAIwpD,EAAMxpD,EAAE,IAAKirD,EAAMjrD,EAAE,IAC7CkrD,EAAMlrD,EAAE,IAAKmrD,EAAMnrD,EAAE,IAAKorD,EAAMprD,EAAE,IAAKqrD,EAAMrrD,EAAE,GAkBnD,OAhBAknD,GAAI,GAAQmC,GAAOG,EAAM6B,EAAMJ,EAAMG,GAAO7B,GAAOL,EAAMmC,EAAML,EAAMI,GAAOD,GAAOjC,EAAM+B,EAAMD,EAAMxB,GACrGtC,EAAI,KAAQ8B,GAAOQ,EAAM6B,EAAMJ,EAAMG,GAAO7B,GAAON,EAAMoC,EAAMN,EAAMK,GAAOD,GAAOlC,EAAMgC,EAAMF,EAAMvB,IACrGtC,EAAI,GAAQ8B,GAAOE,EAAMmC,EAAML,EAAMI,GAAO/B,GAAOJ,EAAMoC,EAAMN,EAAMK,GAAOD,GAAOlC,EAAM+B,EAAMD,EAAM7B,GACrGhC,EAAI,KAAQ8B,GAAOE,EAAM+B,EAAMD,EAAMxB,GAAOH,GAAOJ,EAAMgC,EAAMF,EAAMvB,GAAOD,GAAON,EAAM+B,EAAMD,EAAM7B,IACrGhC,EAAI,KAAQkC,GAAOI,EAAM6B,EAAMJ,EAAMG,GAAO9B,GAAOJ,EAAMmC,EAAML,EAAMI,GAAOF,GAAOhC,EAAM+B,EAAMD,EAAMxB,IACrGtC,EAAI,GAAQiC,GAAOK,EAAM6B,EAAMJ,EAAMG,GAAO9B,GAAOL,EAAMoC,EAAMN,EAAMK,GAAOF,GAAOjC,EAAMgC,EAAMF,EAAMvB,GACrGtC,EAAI,KAAQiC,GAAOD,EAAMmC,EAAML,EAAMI,GAAOhC,GAAOH,EAAMoC,EAAMN,EAAMK,GAAOF,GAAOjC,EAAM+B,EAAMD,EAAM7B,IACrGhC,EAAI,GAAQiC,GAAOD,EAAM+B,EAAMD,EAAMxB,GAAOJ,GAAOH,EAAMgC,EAAMF,EAAMvB,GAAOF,GAAOL,EAAM+B,EAAMD,EAAM7B,GACrGhC,EAAI,GAAQkC,GAAOG,EAAM8B,EAAMJ,EAAME,GAAO7B,GAAOD,EAAMgC,EAAML,EAAMG,GAAOD,GAAO7B,EAAM4B,EAAMD,EAAMzB,GACrGrC,EAAI,KAAQiC,GAAOI,EAAM8B,EAAMJ,EAAME,GAAO7B,GAAON,EAAMqC,EAAMN,EAAMI,GAAOD,GAAOlC,EAAMiC,EAAMF,EAAMxB,IACrGrC,EAAI,IAAQiC,GAAOE,EAAMgC,EAAML,EAAMG,GAAO/B,GAAOJ,EAAMqC,EAAMN,EAAMI,GAAOD,GAAOlC,EAAMgC,EAAMD,EAAM1B,GACrGnC,EAAI,MAAQiC,GAAOE,EAAM4B,EAAMD,EAAMzB,GAAOH,GAAOJ,EAAMiC,EAAMF,EAAMxB,GAAOD,GAAON,EAAMgC,EAAMD,EAAM1B,IACrGnC,EAAI,MAAQkC,GAAOG,EAAM6B,EAAM5B,EAAM2B,GAAO7B,GAAOD,EAAM+B,EAAMlC,EAAMiC,GAAOD,GAAO7B,EAAMG,EAAMN,EAAMK,IACrGrC,EAAI,IAAQiC,GAAOI,EAAM6B,EAAM5B,EAAM2B,GAAO7B,GAAON,EAAMoC,EAAMnC,EAAMkC,GAAOD,GAAOlC,EAAMQ,EAAMP,EAAMM,GACrGrC,EAAI,MAAQiC,GAAOE,EAAM+B,EAAMlC,EAAMiC,GAAO/B,GAAOJ,EAAMoC,EAAMnC,EAAMkC,GAAOD,GAAOlC,EAAME,EAAMD,EAAMI,IACrGnC,EAAI,IAAQiC,GAAOE,EAAMG,EAAMN,EAAMK,GAAOH,GAAOJ,EAAMQ,EAAMP,EAAMM,GAAOD,GAAON,EAAME,EAAMD,EAAMI,GAC9FnC,GASXt/B,KAAK8/B,YAAc,SAAU1nD,GACzB,GAAImpD,GAAMnpD,EAAE,GAAIgpD,EAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAAI+qD,EAAM/qD,EAAE,GAC5CopD,EAAMppD,EAAE,GAAIqpD,EAAMrpD,EAAE,GAAIkpD,EAAMlpD,EAAE,GAAIgrD,EAAMhrD,EAAE,GAC5CspD,EAAMtpD,EAAE,GAAIupD,EAAMvpD,EAAE,GAAIwpD,EAAMxpD,EAAE,IAAKirD,EAAMjrD,EAAE,IAC7CkrD,EAAMlrD,EAAE,IAAKmrD,EAAMnrD,EAAE,IAAKorD,EAAMprD,EAAE,IAAKqrD,EAAMrrD,EAAE,IAE/C4pD,EAAMT,EAAME,EAAML,EAAMI,EACxBK,EAAMN,EAAMD,EAAMD,EAAMG,EACxBS,EAAMV,EAAM6B,EAAMD,EAAM3B,EACxBkC,EAAMtC,EAAME,EAAMD,EAAMI,EACxBkC,EAAMvC,EAAMgC,EAAMD,EAAM1B,EACxBmC,EAAMvC,EAAM+B,EAAMD,EAAM7B,EACxBuC,EAAMnC,EAAM6B,EAAM5B,EAAM2B,EACxBQ,EAAMpC,EAAM8B,EAAM5B,EAAM0B,EACxBS,EAAMrC,EAAM+B,EAAMJ,EAAMC,EACxBU,EAAMrC,EAAM6B,EAAM5B,EAAM2B,EACxBrB,EAAMP,EAAM8B,EAAMJ,EAAME,EACxBzB,EAAMF,EAAM6B,EAAMJ,EAAMG,CAG5B,OAAOxB,GAAMF,EAAMD,EAAMK,EAAMD,EAAM+B,EAAMN,EAAMK,EAAMJ,EAAMG,EAAMF,EAAMC,GAW7E7jC,KAAKoI,SAAW,SAAUk3B,EAAKlnD,EAAGsB,GAC9B,GAAI6nD,GAAMnpD,EAAE,GAAIgpD,EAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAAI+qD,EAAM/qD,EAAE,GAC5CopD,EAAMppD,EAAE,GAAIqpD,EAAMrpD,EAAE,GAAIkpD,EAAMlpD,EAAE,GAAIgrD,EAAMhrD,EAAE,GAC5CspD,EAAMtpD,EAAE,GAAIupD,EAAMvpD,EAAE,GAAIwpD,EAAMxpD,EAAE,IAAKirD,EAAMjrD,EAAE,IAC7CkrD,EAAMlrD,EAAE,IAAKmrD,EAAMnrD,EAAE,IAAKorD,EAAMprD,EAAE,IAAKqrD,EAAMrrD,EAAE,IAG/CqiD,EAAM/gD,EAAE,GAAIghD,EAAKhhD,EAAE,GAAIihD,EAAKjhD,EAAE,GAAIkhD,EAAKlhD,EAAE,EAuB7C,OAtBA4lD,GAAI,GAAK7E,EAAG8G,EAAM7G,EAAG8G,EAAM7G,EAAG+G,EAAM9G,EAAG0I,EACvChE,EAAI,GAAK7E,EAAG2G,EAAM1G,EAAG+G,EAAM9G,EAAGgH,EAAM/G,EAAG2I,EACvCjE,EAAI,GAAK7E,EAAG4G,EAAM3G,EAAG4G,EAAM3G,EAAGiH,EAAMhH,EAAG4I,EACvClE,EAAI,GAAK7E,EAAG0I,EAAMzI,EAAG0I,EAAMzI,EAAG0I,EAAMzI,EAAG6I,EAEvChJ,EAAK/gD,EAAE,GAAIghD,EAAKhhD,EAAE,GAAIihD,EAAKjhD,EAAE,GAAIkhD,EAAKlhD,EAAE,GACxC4lD,EAAI,GAAK7E,EAAG8G,EAAM7G,EAAG8G,EAAM7G,EAAG+G,EAAM9G,EAAG0I,EACvChE,EAAI,GAAK7E,EAAG2G,EAAM1G,EAAG+G,EAAM9G,EAAGgH,EAAM/G,EAAG2I,EACvCjE,EAAI,GAAK7E,EAAG4G,EAAM3G,EAAG4G,EAAM3G,EAAGiH,EAAMhH,EAAG4I,EACvClE,EAAI,GAAK7E,EAAG0I,EAAMzI,EAAG0I,EAAMzI,EAAG0I,EAAMzI,EAAG6I,EAEvChJ,EAAK/gD,EAAE,GAAIghD,EAAKhhD,EAAE,GAAIihD,EAAKjhD,EAAE,IAAKkhD,EAAKlhD,EAAE,IACzC4lD,EAAI,GAAK7E,EAAG8G,EAAM7G,EAAG8G,EAAM7G,EAAG+G,EAAM9G,EAAG0I,EACvChE,EAAI,GAAK7E,EAAG2G,EAAM1G,EAAG+G,EAAM9G,EAAGgH,EAAM/G,EAAG2I,EACvCjE,EAAI,IAAM7E,EAAG4G,EAAM3G,EAAG4G,EAAM3G,EAAGiH,EAAMhH,EAAG4I,EACxClE,EAAI,IAAM7E,EAAG0I,EAAMzI,EAAG0I,EAAMzI,EAAG0I,EAAMzI,EAAG6I,EAExChJ,EAAK/gD,EAAE,IAAKghD,EAAKhhD,EAAE,IAAKihD,EAAKjhD,EAAE,IAAKkhD,EAAKlhD,EAAE,IAC3C4lD,EAAI,IAAM7E,EAAG8G,EAAM7G,EAAG8G,EAAM7G,EAAG+G,EAAM9G,EAAG0I,EACxChE,EAAI,IAAM7E,EAAG2G,EAAM1G,EAAG+G,EAAM9G,EAAGgH,EAAM/G,EAAG2I,EACxCjE,EAAI,IAAM7E,EAAG4G,EAAM3G,EAAG4G,EAAM3G,EAAGiH,EAAMhH,EAAG4I,EACxClE,EAAI,IAAM7E,EAAG0I,EAAMzI,EAAG0I,EAAMzI,EAAG0I,EAAMzI,EAAG6I,EACjCnE,GAOXt/B,KAAK+/B,IAAM//B,KAAKoI,SAUhBpI,KAAK/E,UAAY,SAAUqkC,EAAKlnD,EAAG+4C,GAC/B,GACIoQ,GAAKH,EAAKC,EAAK8B,EACf3B,EAAKC,EAAKH,EAAK8B,EACf1B,EAAKC,EAAKC,EAAKyB,EAHfjsD,EAAI+5C,EAAE,GAAI95C,EAAI85C,EAAE,GAAI/lC,EAAI+lC,EAAE,EAyB9B,OApBI/4C,KAAMknD,GACNA,EAAI,IAAMlnD,EAAE,GAAKhB,EAAIgB,EAAE,GAAKf,EAAIe,EAAE,GAAKgT,EAAIhT,EAAE,IAC7CknD,EAAI,IAAMlnD,EAAE,GAAKhB,EAAIgB,EAAE,GAAKf,EAAIe,EAAE,GAAKgT,EAAIhT,EAAE,IAC7CknD,EAAI,IAAMlnD,EAAE,GAAKhB,EAAIgB,EAAE,GAAKf,EAAIe,EAAE,IAAMgT,EAAIhT,EAAE,IAC9CknD,EAAI,IAAMlnD,EAAE,GAAKhB,EAAIgB,EAAE,GAAKf,EAAIe,EAAE,IAAMgT,EAAIhT,EAAE,MAE9CmpD,EAAMnpD,EAAE,GAAIgpD,EAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAAI+qD,EAAM/qD,EAAE,GAC5CopD,EAAMppD,EAAE,GAAIqpD,EAAMrpD,EAAE,GAAIkpD,EAAMlpD,EAAE,GAAIgrD,EAAMhrD,EAAE,GAC5CspD,EAAMtpD,EAAE,GAAIupD,EAAMvpD,EAAE,GAAIwpD,EAAMxpD,EAAE,IAAKirD,EAAMjrD,EAAE,IAE7CknD,EAAI,GAAKiC,EAAKjC,EAAI,GAAK8B,EAAK9B,EAAI,GAAK+B,EAAK/B,EAAI,GAAK6D,EACnD7D,EAAI,GAAKkC,EAAKlC,EAAI,GAAKmC,EAAKnC,EAAI,GAAKgC,EAAKhC,EAAI,GAAK8D,EACnD9D,EAAI,GAAKoC,EAAKpC,EAAI,GAAKqC,EAAKrC,EAAI,IAAMsC,EAAKtC,EAAI,IAAM+D,EAErD/D,EAAI,IAAMiC,EAAMnqD,EAAIoqD,EAAMnqD,EAAIqqD,EAAMt2C,EAAIhT,EAAE,IAC1CknD,EAAI,IAAM8B,EAAMhqD,EAAIqqD,EAAMpqD,EAAIsqD,EAAMv2C,EAAIhT,EAAE,IAC1CknD,EAAI,IAAM+B,EAAMjqD,EAAIkqD,EAAMjqD,EAAIuqD,EAAMx2C,EAAIhT,EAAE,IAC1CknD,EAAI,IAAM6D,EAAM/rD,EAAIgsD,EAAM/rD,EAAIgsD,EAAMj4C,EAAIhT,EAAE,KAGvCknD,GAWXt/B,KAAKyE,MAAQ,SAAS66B,EAAKlnD,EAAG+4C,GAC1B,GAAI/5C,GAAI+5C,EAAE,GAAI95C,EAAI85C,EAAE,GAAI/lC,EAAI+lC,EAAE,EAkB9B,OAhBAmO,GAAI,GAAKlnD,EAAE,GAAKhB,EAChBkoD,EAAI,GAAKlnD,EAAE,GAAKhB,EAChBkoD,EAAI,GAAKlnD,EAAE,GAAKhB,EAChBkoD,EAAI,GAAKlnD,EAAE,GAAKhB,EAChBkoD,EAAI,GAAKlnD,EAAE,GAAKf,EAChBioD,EAAI,GAAKlnD,EAAE,GAAKf,EAChBioD,EAAI,GAAKlnD,EAAE,GAAKf,EAChBioD,EAAI,GAAKlnD,EAAE,GAAKf,EAChBioD,EAAI,GAAKlnD,EAAE,GAAKgT,EAChBk0C,EAAI,GAAKlnD,EAAE,GAAKgT,EAChBk0C,EAAI,IAAMlnD,EAAE,IAAMgT,EAClBk0C,EAAI,IAAMlnD,EAAE,IAAMgT,EAClBk0C,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACLknD,GAYXt/B,KAAK7nB,OAAS,SAAUmnD,EAAKlnD,EAAG0iB,EAAKmpC,GACjC,GAEI1kC,GAAGhR,EAAGsH,EACN0rC,EAAKH,EAAKC,EAAK8B,EACf3B,EAAKC,EAAKH,EAAK8B,EACf1B,EAAKC,EAAKC,EAAKyB,EACfrB,EAAKH,EAAKI,EACVC,EAAKJ,EAAKK,EACVC,EAAKL,EAAKM,EARVjrD,EAAI6sD,EAAK,GAAI5sD,EAAI4sD,EAAK,GAAI74C,EAAI64C,EAAK,GACnC5vC,EAAMrb,KAAKC,KAAK7B,EAAIA,EAAIC,EAAIA,EAAI+T,EAAIA,EASxC,OAAIpS,MAAK8yB,IAAIzX,GAAOojC,SAASqH,QAAkB,MAE/CzqC,EAAM,EAAIA,EACVjd,GAAKid,EACLhd,GAAKgd,EACLjJ,GAAKiJ,EAELkL,EAAIvmB,KAAKc,IAAIghB,GACbvM,EAAIvV,KAAKa,IAAIihB,GACbjF,EAAI,EAAItH,EAERgzC,EAAMnpD,EAAE,GAAIgpD,EAAMhpD,EAAE,GAAIipD,EAAMjpD,EAAE,GAAI+qD,EAAM/qD,EAAE,GAC5CopD,EAAMppD,EAAE,GAAIqpD,EAAMrpD,EAAE,GAAIkpD,EAAMlpD,EAAE,GAAIgrD,EAAMhrD,EAAE,GAC5CspD,EAAMtpD,EAAE,GAAIupD,EAAMvpD,EAAE,GAAIwpD,EAAMxpD,EAAE,IAAKirD,EAAMjrD,EAAE,IAG7C4pD,EAAM5qD,EAAIA,EAAIye,EAAItH,EAAGszC,EAAMxqD,EAAID,EAAIye,EAAIzK,EAAImU,EAAG0iC,EAAM72C,EAAIhU,EAAIye,EAAIxe,EAAIkoB,EACpE2iC,EAAM9qD,EAAIC,EAAIwe,EAAIzK,EAAImU,EAAGuiC,EAAMzqD,EAAIA,EAAIwe,EAAItH,EAAG4zC,EAAM/2C,EAAI/T,EAAIwe,EAAIze,EAAImoB,EACpE6iC,EAAMhrD,EAAIgU,EAAIyK,EAAIxe,EAAIkoB,EAAGwiC,EAAM1qD,EAAI+T,EAAIyK,EAAIze,EAAImoB,EAAG8iC,EAAMj3C,EAAIA,EAAIyK,EAAItH,EAGpE+wC,EAAI,GAAKiC,EAAMS,EAAMR,EAAMK,EAAMH,EAAMO,EACvC3C,EAAI,GAAK8B,EAAMY,EAAMP,EAAMI,EAAMF,EAAMM,EACvC3C,EAAI,GAAK+B,EAAMW,EAAMV,EAAMO,EAAMD,EAAMK,EACvC3C,EAAI,GAAK6D,EAAMnB,EAAMoB,EAAMvB,EAAMwB,EAAMpB,EACvC3C,EAAI,GAAKiC,EAAMW,EAAMV,EAAMM,EAAMJ,EAAMS,EACvC7C,EAAI,GAAK8B,EAAMc,EAAMT,EAAMK,EAAMH,EAAMQ,EACvC7C,EAAI,GAAK+B,EAAMa,EAAMZ,EAAMQ,EAAMF,EAAMO,EACvC7C,EAAI,GAAK6D,EAAMjB,EAAMkB,EAAMtB,EAAMuB,EAAMlB,EACvC7C,EAAI,GAAKiC,EAAMa,EAAMZ,EAAMO,EAAML,EAAMW,EACvC/C,EAAI,GAAK8B,EAAMgB,EAAMX,EAAMM,EAAMJ,EAAMU,EACvC/C,EAAI,IAAM+B,EAAMe,EAAMd,EAAMS,EAAMH,EAAMS,EACxC/C,EAAI,IAAM6D,EAAMf,EAAMgB,EAAMrB,EAAMsB,EAAMhB,EAEpCjqD,IAAMknD,IACNA,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,KAETknD,IAWXt/B,KAAK+I,QAAU,SAAUu2B,EAAKlnD,EAAG0iB,GAC7B,GAAIyE,GAAIvmB,KAAKc,IAAIghB,GACbvM,EAAIvV,KAAKa,IAAIihB,GACb0mC,EAAMppD,EAAE,GACRqpD,EAAMrpD,EAAE,GACRkpD,EAAMlpD,EAAE,GACRgrD,EAAMhrD,EAAE,GACRspD,EAAMtpD,EAAE,GACRupD,EAAMvpD,EAAE,GACRwpD,EAAMxpD,EAAE,IACRirD,EAAMjrD,EAAE,GAsBZ,OApBIA,KAAMknD,IACNA,EAAI,GAAMlnD,EAAE,GACZknD,EAAI,GAAMlnD,EAAE,GACZknD,EAAI,GAAMlnD,EAAE,GACZknD,EAAI,GAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,KAIhBknD,EAAI,GAAKkC,EAAMjzC,EAAImzC,EAAMniC,EACzB+/B,EAAI,GAAKmC,EAAMlzC,EAAIozC,EAAMpiC,EACzB+/B,EAAI,GAAKgC,EAAM/yC,EAAIqzC,EAAMriC,EACzB+/B,EAAI,GAAK8D,EAAM70C,EAAI80C,EAAM9jC,EACzB+/B,EAAI,GAAKoC,EAAMnzC,EAAIizC,EAAMjiC,EACzB+/B,EAAI,GAAKqC,EAAMpzC,EAAIkzC,EAAMliC,EACzB+/B,EAAI,IAAMsC,EAAMrzC,EAAI+yC,EAAM/hC,EAC1B+/B,EAAI,IAAM+D,EAAM90C,EAAI60C,EAAM7jC,EACnB+/B,GAWXt/B,KAAKkkC,QAAU,SAAU5E,EAAKlnD,EAAG0iB,GAC7B,GAAIyE,GAAIvmB,KAAKc,IAAIghB,GACbvM,EAAIvV,KAAKa,IAAIihB,GACbymC,EAAMnpD,EAAE,GACRgpD,EAAMhpD,EAAE,GACRipD,EAAMjpD,EAAE,GACR+qD,EAAM/qD,EAAE,GACRspD,EAAMtpD,EAAE,GACRupD,EAAMvpD,EAAE,GACRwpD,EAAMxpD,EAAE,IACRirD,EAAMjrD,EAAE,GAsBZ,OApBIA,KAAMknD,IACNA,EAAI,GAAMlnD,EAAE,GACZknD,EAAI,GAAMlnD,EAAE,GACZknD,EAAI,GAAMlnD,EAAE,GACZknD,EAAI,GAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,KAIhBknD,EAAI,GAAKiC,EAAMhzC,EAAImzC,EAAMniC,EACzB+/B,EAAI,GAAK8B,EAAM7yC,EAAIozC,EAAMpiC,EACzB+/B,EAAI,GAAK+B,EAAM9yC,EAAIqzC,EAAMriC,EACzB+/B,EAAI,GAAK6D,EAAM50C,EAAI80C,EAAM9jC,EACzB+/B,EAAI,GAAKiC,EAAMhiC,EAAImiC,EAAMnzC,EACzB+wC,EAAI,GAAK8B,EAAM7hC,EAAIoiC,EAAMpzC,EACzB+wC,EAAI,IAAM+B,EAAM9hC,EAAIqiC,EAAMrzC,EAC1B+wC,EAAI,IAAM6D,EAAM5jC,EAAI8jC,EAAM90C,EACnB+wC,GAWXt/B,KAAKgJ,QAAU,SAAUs2B,EAAKlnD,EAAG0iB,GAC7B,GAAIyE,GAAIvmB,KAAKc,IAAIghB,GACbvM,EAAIvV,KAAKa,IAAIihB,GACbymC,EAAMnpD,EAAE,GACRgpD,EAAMhpD,EAAE,GACRipD,EAAMjpD,EAAE,GACR+qD,EAAM/qD,EAAE,GACRopD,EAAMppD,EAAE,GACRqpD,EAAMrpD,EAAE,GACRkpD,EAAMlpD,EAAE,GACRgrD,EAAMhrD,EAAE,EAsBZ,OApBIA,KAAMknD,IACNA,EAAI,GAAMlnD,EAAE,GACZknD,EAAI,GAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,IACZknD,EAAI,IAAMlnD,EAAE,KAIhBknD,EAAI,GAAKiC,EAAMhzC,EAAIizC,EAAMjiC,EACzB+/B,EAAI,GAAK8B,EAAM7yC,EAAIkzC,EAAMliC,EACzB+/B,EAAI,GAAK+B,EAAM9yC,EAAI+yC,EAAM/hC,EACzB+/B,EAAI,GAAK6D,EAAM50C,EAAI60C,EAAM7jC,EACzB+/B,EAAI,GAAKkC,EAAMjzC,EAAIgzC,EAAMhiC,EACzB+/B,EAAI,GAAKmC,EAAMlzC,EAAI6yC,EAAM7hC,EACzB+/B,EAAI,GAAKgC,EAAM/yC,EAAI8yC,EAAM9hC,EACzB+/B,EAAI,GAAK8D,EAAM70C,EAAI40C,EAAM5jC,EAClB+/B,GAcXt/B,KAAKkhC,gBAAkB,SAAS5B,EAAKnO,GAiBjC,MAhBAmO,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAMnO,EAAE,GACZmO,EAAI,IAAMnO,EAAE,GACZmO,EAAI,IAAMnO,EAAE,GACZmO,EAAI,IAAM,EACHA,GAcXt/B,KAAKmgC,YAAc,SAASb,EAAKnO,GAiB7B,MAhBAmO,GAAI,GAAKnO,EAAE,GACXmO,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAKnO,EAAE,GACXmO,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,IAAMnO,EAAE,GACZmO,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACHA,GAeXt/B,KAAKkgC,aAAe,SAASZ,EAAKxkC,EAAKmpC,GACnC,GAEI1kC,GAAGhR,EAAGsH,EAFNze,EAAI6sD,EAAK,GAAI5sD,EAAI4sD,EAAK,GAAI74C,EAAI64C,EAAK,GACnC5vC,EAAMrb,KAAKC,KAAK7B,EAAIA,EAAIC,EAAIA,EAAI+T,EAAIA,EAGxC,OAAIpS,MAAK8yB,IAAIzX,GAAOojC,SAASqH,QAAkB,MAE/CzqC,EAAM,EAAIA,EACVjd,GAAKid,EACLhd,GAAKgd,EACLjJ,GAAKiJ,EAELkL,EAAIvmB,KAAKc,IAAIghB,GACbvM,EAAIvV,KAAKa,IAAIihB,GACbjF,EAAI,EAAItH,EAGR+wC,EAAI,GAAKloD,EAAIA,EAAIye,EAAItH,EACrB+wC,EAAI,GAAKjoD,EAAID,EAAIye,EAAIzK,EAAImU,EACzB+/B,EAAI,GAAKl0C,EAAIhU,EAAIye,EAAIxe,EAAIkoB,EACzB+/B,EAAI,GAAK,EACTA,EAAI,GAAKloD,EAAIC,EAAIwe,EAAIzK,EAAImU,EACzB+/B,EAAI,GAAKjoD,EAAIA,EAAIwe,EAAItH,EACrB+wC,EAAI,GAAKl0C,EAAI/T,EAAIwe,EAAIze,EAAImoB,EACzB+/B,EAAI,GAAK,EACTA,EAAI,GAAKloD,EAAIgU,EAAIyK,EAAIxe,EAAIkoB,EACzB+/B,EAAI,GAAKjoD,EAAI+T,EAAIyK,EAAIze,EAAImoB,EACzB+/B,EAAI,IAAMl0C,EAAIA,EAAIyK,EAAItH,EACtB+wC,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACHA,IAcXt/B,KAAKmkC,cAAgB,SAAS7E,EAAKxkC,GAC/B,GAAIyE,GAAIvmB,KAAKc,IAAIghB,GACbvM,EAAIvV,KAAKa,IAAIihB,EAmBjB,OAhBAwkC,GAAI,GAAM,EACVA,EAAI,GAAM,EACVA,EAAI,GAAM,EACVA,EAAI,GAAM,EACVA,EAAI,GAAK,EACTA,EAAI,GAAK/wC,EACT+wC,EAAI,GAAK//B,EACT+/B,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,IAAM//B,EACV+/B,EAAI,IAAM/wC,EACV+wC,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACHA,GAcXt/B,KAAKokC,cAAgB,SAAS9E,EAAKxkC,GAC/B,GAAIyE,GAAIvmB,KAAKc,IAAIghB,GACbvM,EAAIvV,KAAKa,IAAIihB,EAmBjB,OAhBAwkC,GAAI,GAAM/wC,EACV+wC,EAAI,GAAM,EACVA,EAAI,IAAO//B,EACX+/B,EAAI,GAAM,EACVA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK//B,EACT+/B,EAAI,GAAK,EACTA,EAAI,IAAM/wC,EACV+wC,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACHA,GAcXt/B,KAAKqkC,cAAgB,SAAS/E,EAAKxkC,GAC/B,GAAIyE,GAAIvmB,KAAKc,IAAIghB,GACbvM,EAAIvV,KAAKa,IAAIihB,EAmBjB,OAhBAwkC,GAAI,GAAM/wC,EACV+wC,EAAI,GAAM//B,EACV+/B,EAAI,GAAM,EACVA,EAAI,GAAM,EACVA,EAAI,IAAM//B,EACV+/B,EAAI,GAAK/wC,EACT+wC,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACHA,GAkBXt/B,KAAKskC,wBAA0B,SAAUhF,EAAKkD,EAAGrR,GAE7C,GAAI/5C,GAAIorD,EAAE,GAAInrD,EAAImrD,EAAE,GAAIp3C,EAAIo3C,EAAE,GAAI50B,EAAI40B,EAAE,GACpCh6B,EAAKpxB,EAAIA,EACTivB,EAAKhvB,EAAIA,EACTorD,EAAKr3C,EAAIA,EAETs3C,EAAKtrD,EAAIoxB,EACT6mB,EAAKj4C,EAAIivB,EACTk+B,EAAKntD,EAAIqrD,EACTG,EAAKvrD,EAAIgvB,EACTm+B,EAAKntD,EAAIorD,EACTM,EAAK33C,EAAIq3C,EACTnT,EAAK1hB,EAAIpF,EACTw6B,EAAKp1B,EAAIvH,EACT48B,EAAKr1B,EAAI60B,CAmBb,OAjBAnD,GAAI,GAAK,GAAKsD,EAAKG,GACnBzD,EAAI,GAAKjQ,EAAK4T,EACd3D,EAAI,GAAKiF,EAAKvB,EACd1D,EAAI,GAAK,EACTA,EAAI,GAAKjQ,EAAK4T,EACd3D,EAAI,GAAK,GAAKoD,EAAKK,GACnBzD,EAAI,GAAKkF,EAAKlV,EACdgQ,EAAI,GAAK,EACTA,EAAI,GAAKiF,EAAKvB,EACd1D,EAAI,GAAKkF,EAAKlV,EACdgQ,EAAI,IAAM,GAAKoD,EAAKE,GACpBtD,EAAI,IAAM,EACVA,EAAI,IAAMnO,EAAE,GACZmO,EAAI,IAAMnO,EAAE,GACZmO,EAAI,IAAMnO,EAAE,GACZmO,EAAI,IAAM,EAEHA,GAoBXt/B,KAAKykC,6BAA+B,SAAUnF,EAAKkD,EAAGrR,EAAG5xB,GAErD,GAAInoB,GAAIorD,EAAE,GAAInrD,EAAImrD,EAAE,GAAIp3C,EAAIo3C,EAAE,GAAI50B,EAAI40B,EAAE,GACpCh6B,EAAKpxB,EAAIA,EACTivB,EAAKhvB,EAAIA,EACTorD,EAAKr3C,EAAIA,EAETs3C,EAAKtrD,EAAIoxB,EACT6mB,EAAKj4C,EAAIivB,EACTk+B,EAAKntD,EAAIqrD,EACTG,EAAKvrD,EAAIgvB,EACTm+B,EAAKntD,EAAIorD,EACTM,EAAK33C,EAAIq3C,EACTnT,EAAK1hB,EAAIpF,EACTw6B,EAAKp1B,EAAIvH,EACT48B,EAAKr1B,EAAI60B,EACTl6B,EAAKhJ,EAAE,GACP+I,EAAK/I,EAAE,GACPmlC,EAAKnlC,EAAE,EAmBX,OAjBA+/B,GAAI,IAAM,GAAKsD,EAAKG,IAAOx6B,EAC3B+2B,EAAI,IAAMjQ,EAAK4T,GAAM16B,EACrB+2B,EAAI,IAAMiF,EAAKvB,GAAMz6B,EACrB+2B,EAAI,GAAK,EACTA,EAAI,IAAMjQ,EAAK4T,GAAM36B,EACrBg3B,EAAI,IAAM,GAAKoD,EAAKK,IAAOz6B,EAC3Bg3B,EAAI,IAAMkF,EAAKlV,GAAMhnB,EACrBg3B,EAAI,GAAK,EACTA,EAAI,IAAMiF,EAAKvB,GAAM0B,EACrBpF,EAAI,IAAMkF,EAAKlV,GAAMoV,EACrBpF,EAAI,KAAO,GAAKoD,EAAKE,IAAO8B,EAC5BpF,EAAI,IAAM,EACVA,EAAI,IAAMnO,EAAE,GACZmO,EAAI,IAAMnO,EAAE,GACZmO,EAAI,IAAMnO,EAAE,GACZmO,EAAI,IAAM,EAEHA,GAuBXt/B,KAAK2kC,mCAAqC,SAAUrF,EAAKkD,EAAGrR,EAAG5xB,EAAGqlC,GAEhE,GAAIxtD,GAAIorD,EAAE,GAAInrD,EAAImrD,EAAE,GAAIp3C,EAAIo3C,EAAE,GAAI50B,EAAI40B,EAAE,GACpCh6B,EAAKpxB,EAAIA,EACTivB,EAAKhvB,EAAIA,EACTorD,EAAKr3C,EAAIA,EAETs3C,EAAKtrD,EAAIoxB,EACT6mB,EAAKj4C,EAAIivB,EACTk+B,EAAKntD,EAAIqrD,EACTG,EAAKvrD,EAAIgvB,EACTm+B,EAAKntD,EAAIorD,EACTM,EAAK33C,EAAIq3C,EACTnT,EAAK1hB,EAAIpF,EACTw6B,EAAKp1B,EAAIvH,EACT48B,EAAKr1B,EAAI60B,EAETl6B,EAAKhJ,EAAE,GACP+I,EAAK/I,EAAE,GACPmlC,EAAKnlC,EAAE,GAEPslC,EAAKD,EAAE,GACPE,EAAKF,EAAE,GACPG,EAAKH,EAAE,EAmBX,OAjBAtF,GAAI,IAAM,GAAKsD,EAAKG,IAAOx6B,EAC3B+2B,EAAI,IAAMjQ,EAAK4T,GAAM16B,EACrB+2B,EAAI,IAAMiF,EAAKvB,GAAMz6B,EACrB+2B,EAAI,GAAK,EACTA,EAAI,IAAMjQ,EAAK4T,GAAM36B,EACrBg3B,EAAI,IAAM,GAAKoD,EAAKK,IAAOz6B,EAC3Bg3B,EAAI,IAAMkF,EAAKlV,GAAMhnB,EACrBg3B,EAAI,GAAK,EACTA,EAAI,IAAMiF,EAAKvB,GAAM0B,EACrBpF,EAAI,IAAMkF,EAAKlV,GAAMoV,EACrBpF,EAAI,KAAO,GAAKoD,EAAKE,IAAO8B,EAC5BpF,EAAI,IAAM,EACVA,EAAI,IAAMnO,EAAE,GAAK0T,GAAMvF,EAAI,GAAKuF,EAAKvF,EAAI,GAAKwF,EAAKxF,EAAI,GAAKyF,GAC5DzF,EAAI,IAAMnO,EAAE,GAAK2T,GAAMxF,EAAI,GAAKuF,EAAKvF,EAAI,GAAKwF,EAAKxF,EAAI,GAAKyF,GAC5DzF,EAAI,IAAMnO,EAAE,GAAK4T,GAAMzF,EAAI,GAAKuF,EAAKvF,EAAI,GAAKwF,EAAKxF,EAAI,IAAMyF,GAC7DzF,EAAI,IAAM,EAEHA,GAGTt/B,KAAKuiC,SAAW,SAAUjD,EAAKkD,GAC3B,GAAIprD,GAAIorD,EAAE,GAAInrD,EAAImrD,EAAE,GAAIp3C,EAAIo3C,EAAE,GAAI50B,EAAI40B,EAAE,GACpCh6B,EAAKpxB,EAAIA,EACTivB,EAAKhvB,EAAIA,EACTorD,EAAKr3C,EAAIA,EAETs3C,EAAKtrD,EAAIoxB,EACTm6B,EAAKtrD,EAAImxB,EACTo6B,EAAKvrD,EAAIgvB,EACTw8B,EAAKz3C,EAAIod,EACTs6B,EAAK13C,EAAIib,EACT08B,EAAK33C,EAAIq3C,EACTnT,EAAK1hB,EAAIpF,EACTw6B,EAAKp1B,EAAIvH,EACT48B,EAAKr1B,EAAI60B,CAsBb,OApBAnD,GAAI,GAAK,EAAIsD,EAAKG,EAClBzD,EAAI,GAAKqD,EAAKM,EACd3D,EAAI,GAAKuD,EAAKG,EACd1D,EAAI,GAAK,EAETA,EAAI,GAAKqD,EAAKM,EACd3D,EAAI,GAAK,EAAIoD,EAAKK,EAClBzD,EAAI,GAAKwD,EAAKxT,EACdgQ,EAAI,GAAK,EAETA,EAAI,GAAKuD,EAAKG,EACd1D,EAAI,GAAKwD,EAAKxT,EACdgQ,EAAI,IAAM,EAAIoD,EAAKE,EACnBtD,EAAI,IAAM,EAEVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EAEHA,GAeXt/B,KAAKglC,QAAU,SAAU1F,EAAKv2C,EAAMC,EAAOJ,EAAQH,EAAKw8C,EAAMC,GAC1D,GAAIC,GAAK,GAAKn8C,EAAQD,GAClBq8C,EAAK,GAAK38C,EAAMG,GAChBy8C,EAAK,GAAKJ,EAAOC,EAiBrB,OAhBA5F,GAAI,GAAa,EAAP2F,EAAYE,EACtB7F,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAa,EAAP2F,EAAYG,EACtB9F,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,IAAMt2C,EAAQD,GAAQo8C,EAC1B7F,EAAI,IAAM72C,EAAMG,GAAUw8C,EAC1B9F,EAAI,KAAO4F,EAAMD,GAAQI,EACzB/F,EAAI,IAAM,GACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAO4F,EAAMD,EAAO,EAAKI,EAC7B/F,EAAI,IAAM,EACHA,GAaXt/B,KAAK8I,YAAc,SAAUw2B,EAAKgG,EAAMC,EAAQN,EAAMC,GAClD,GAAI5f,GAAI,EAAMtsC,KAAKotB,IAAIk/B,EAAO,GAC1BD,EAAK,GAAKJ,EAAOC,EAiBrB,OAhBA5F,GAAI,GAAKha,EAAIigB,EACbjG,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAKha,EACTga,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,KAAO4F,EAAMD,GAAQI,EACzB/F,EAAI,IAAM,GACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAO,EAAI4F,EAAMD,EAAQI,EAC7B/F,EAAI,IAAM,EACHA,GAcXt/B,KAAKwlC,2BAA6B,SAAUlG,EAAKmG,EAAKR,EAAMC,GACxD,GAAIQ,GAAQ1sD,KAAKotB,IAAIq/B,EAAIE,UAAY3sD,KAAK+hB,GAAG,KACzC6qC,EAAU5sD,KAAKotB,IAAIq/B,EAAII,YAAc7sD,KAAK+hB,GAAG,KAC7C+qC,EAAU9sD,KAAKotB,IAAIq/B,EAAIM,YAAc/sD,KAAK+hB,GAAG,KAC7CirC,EAAWhtD,KAAKotB,IAAIq/B,EAAIQ,aAAejtD,KAAK+hB,GAAG,KAC/CmrC,EAAS,GAAOJ,EAAUE,GAC1BG,EAAS,GAAOT,EAAQE,EAkB5B,OAhBAtG,GAAI,GAAK4G,EACT5G,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK6G,EACT7G,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,MAAQwG,EAAUE,GAAYE,EAAS,IAC3C5G,EAAI,IAAOoG,EAAQE,GAAWO,EAAS,GACvC7G,EAAI,IAAM4F,GAAOD,EAAOC,GACxB5F,EAAI,IAAM,GACVA,EAAI,IAAM,EACVA,EAAI,IAAM,EACVA,EAAI,IAAO4F,EAAMD,GAASA,EAAOC,GACjC5F,EAAI,IAAM,EACHA,GAeXt/B,KAAK0R,MAAQ,SAAU4tB,EAAKv2C,EAAMC,EAAOJ,EAAQH,EAAKw8C,EAAMC,GACxD,GAAIkB,GAAK,GAAKr9C,EAAOC,GACjBq9C,EAAK,GAAKz9C,EAASH,GACnB48C,EAAK,GAAKJ,EAAOC,EAiBrB,OAhBA5F,GAAI,GAAK,GAAK8G,EACd9G,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,GAAK+G,EACd/G,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,IAAM,EAAI+F,EACd/F,EAAI,IAAM,EACVA,EAAI,KAAOv2C,EAAOC,GAASo9C,EAC3B9G,EAAI,KAAO72C,EAAMG,GAAUy9C,EAC3B/G,EAAI,KAAO4F,EAAMD,GAAQI,EACzB/F,EAAI,IAAM,EACHA,GAYXt/B,KAAKsmC,OAAS,SAAUhH,EAAKiH,EAAKlpD,EAAQmpD,GACtC,GAAI5+B,GAAIC,EAAIW,EAAIV,EAAIC,EAAI1B,EAAI2B,EAAIC,EAAIw6B,EAAIpuC,EACpCoyC,EAAOF,EAAI,GACXG,EAAOH,EAAI,GACXI,EAAOJ,EAAI,GACXK,EAAMJ,EAAG,GACTK,EAAML,EAAG,GACTM,EAAMN,EAAG,GACTO,EAAU1pD,EAAO,GACjB2pD,EAAU3pD,EAAO,GACjB4pD,EAAU5pD,EAAO,EAErB,OAAIrE,MAAK8yB,IAAI26B,EAAOM,GAAWtP,SAASqH,SACpC9lD,KAAK8yB,IAAI46B,EAAOM,GAAWvP,SAASqH,SACpC9lD,KAAK8yB,IAAI66B,EAAOM,GAAWxP,SAASqH,QAC7B9+B,KAAKwR,SAAS8tB,IAGzBt3B,EAAKy+B,EAAOM,EACZ9+B,EAAKy+B,EAAOM,EACZvE,EAAKkE,EAAOM,EAEZ5yC,EAAM,EAAIrb,KAAKC,KAAK+uB,EAAKA,EAAKC,EAAKA,EAAKw6B,EAAKA,GAC7Cz6B,GAAM3T,EACN4T,GAAM5T,EACNouC,GAAMpuC,EAENuT,EAAKi/B,EAAMpE,EAAKqE,EAAM7+B,EACtBJ,EAAKi/B,EAAM9+B,EAAK4+B,EAAMnE,EACtBj6B,EAAKo+B,EAAM3+B,EAAK4+B,EAAM7+B,EACtB3T,EAAMrb,KAAKC,KAAK2uB,EAAKA,EAAKC,EAAKA,EAAKW,EAAKA,GACpCnU,GAKDA,EAAM,EAAIA,EACVuT,GAAMvT,EACNwT,GAAMxT,EACNmU,GAAMnU,IAPNuT,EAAK,EACLC,EAAK,EACLW,EAAK,GAQTV,EAAKG,EAAKO,EAAKi6B,EAAK56B,EACpBE,EAAK06B,EAAK76B,EAAKI,EAAKQ,EACpBnC,EAAK2B,EAAKH,EAAKI,EAAKL,EAEpBvT,EAAMrb,KAAKC,KAAK6uB,EAAKA,EAAKC,EAAKA,EAAK1B,EAAKA,GACpChS,GAKDA,EAAM,EAAIA,EACVyT,GAAMzT,EACN0T,GAAM1T,EACNgS,GAAMhS,IAPNyT,EAAK,EACLC,EAAK,EACL1B,EAAK,GAQTi5B,EAAI,GAAK13B,EACT03B,EAAI,GAAKx3B,EACTw3B,EAAI,GAAKt3B,EACTs3B,EAAI,GAAK,EACTA,EAAI,GAAKz3B,EACTy3B,EAAI,GAAKv3B,EACTu3B,EAAI,GAAKr3B,EACTq3B,EAAI,GAAK,EACTA,EAAI,GAAK92B,EACT82B,EAAI,GAAKj5B,EACTi5B,EAAI,IAAMmD,EACVnD,EAAI,IAAM,EACVA,EAAI,MAAQ13B,EAAK6+B,EAAO5+B,EAAK6+B,EAAOl+B,EAAKm+B,GACzCrH,EAAI,MAAQx3B,EAAK2+B,EAAO1+B,EAAK2+B,EAAOrgC,EAAKsgC,GACzCrH,EAAI,MAAQt3B,EAAKy+B,EAAOx+B,EAAKy+B,EAAOjE,EAAKkE,GACzCrH,EAAI,IAAM,EAEHA,IASXt/B,KAAKi7B,IAAM,SAAU7iD,GACjB,MAAO,QAAUA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAClDA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KACjDA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,IAAM,KAAOA,EAAE,IAAM,KACnDA,EAAE,IAAM,KAAOA,EAAE,IAAM,KAAOA,EAAE,IAAM,KAAOA,EAAE,IAAM,KASzE4nB,KAAKogC,KAAO,SAAUhoD,GAClB,MAAOY,MAAKC,KAAKD,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,GAAI,GAAKY,KAAKqS,IAAIjT,EAAE,IAAK,GAAKY,KAAKqS,IAAIjT,EAAE,IAAK,GAAKY,KAAKqS,IAAIjT,EAAE,IAAK,GAAKY,KAAKqS,IAAIjT,EAAE,IAAK,GAAKY,KAAKqS,IAAIjT,EAAE,IAAK,GAAKY,KAAKqS,IAAIjT,EAAE,IAAK,KAItV3C,OAAOC,QAAUsqB;;AC9uCjB,GAAIy3B,UAAW7hD,QAAQ,eACnB+0C,KAAO/0C,QAAQ,aACfgiD,KAAOhiD,QAAQ,aACf0vB,KAAO1vB,QAAQ,aAMf+hD,OAOJA,MAAKv0C,OAAS,WACV,GAAIk8C,GAAM,GAAI7H,UAASsH,WAAW,EAKlC,OAJAO,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GAcX3H,KAAKuP,WAAa,WACd,GAAIC,GAAUvP,KAAKx0C,SACfgkD,EAAYxP,KAAKyP,WAAW,EAAE,EAAE,GAChCC,EAAY1P,KAAKyP,WAAW,EAAE,EAAE,EAEpC,OAAO,UAAS/H,EAAKlnD,EAAGsB,GACpB,GAAI6tD,GAAM3P,KAAK2P,IAAInvD,EAAGsB,EACtB,QAAW,QAAP6tD,GACA3P,KAAK4P,MAAML,EAASC,EAAWhvD,GAC3Bw/C,KAAKl5C,OAAOyoD,GAAW,MACvBvP,KAAK4P,MAAML,EAASG,EAAWlvD,GACnCw/C,KAAK6P,UAAUN,EAASA,GACxBxP,KAAK+P,aAAapI,EAAK6H,EAASnuD,KAAK+hB,IAC9BukC,GACAiI,EAAM,SACbjI,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,IAEP1H,KAAK4P,MAAML,EAAS/uD,EAAGsB,GACvB4lD,EAAI,GAAK6H,EAAQ,GACjB7H,EAAI,GAAK6H,EAAQ,GACjB7H,EAAI,GAAK6H,EAAQ,GACjB7H,EAAI,GAAK,EAAIiI,EACN5P,KAAK8P,UAAUnI,EAAKA,QAevC3H,KAAKgQ,QAAU,WACX,GAAIC,GAAOjd,KAAKvnC,QAEhB,OAAO,UAASk8C,EAAKuI,EAAM7+C,EAAOw9C,GAa9B,MAZAoB,GAAK,GAAK5+C,EAAM,GAChB4+C,EAAK,GAAK5+C,EAAM,GAChB4+C,EAAK,GAAK5+C,EAAM,GAEhB4+C,EAAK,GAAKpB,EAAG,GACboB,EAAK,GAAKpB,EAAG,GACboB,EAAK,GAAKpB,EAAG,GAEboB,EAAK,IAAMC,EAAK,GAChBD,EAAK,IAAMC,EAAK,GAChBD,EAAK,IAAMC,EAAK,GAETlQ,KAAK8P,UAAUnI,EAAK3H,KAAKmQ,SAASxI,EAAKsI,QAWtDjQ,KAAKngD,MAAQ8tB,KAAK9tB,MAYlBmgD,KAAK0P,WAAa/hC,KAAK+hC,WAUvB1P,KAAKpd,KAAOjV,KAAKiV,KAajBod,KAAKzgD,IAAMouB,KAAKpuB,IAQhBygD,KAAKnmB,SAAW,SAAS8tB,GAKrB,MAJAA,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GAYX3H,KAAK+P,aAAe,SAASpI,EAAK2E,EAAMnpC,GACpCA,EAAY,GAANA,CACN,IAAIyE,GAAIvmB,KAAKc,IAAIghB,EAKjB,OAJAwkC,GAAI,GAAK//B,EAAI0kC,EAAK,GAClB3E,EAAI,GAAK//B,EAAI0kC,EAAK,GAClB3E,EAAI,GAAK//B,EAAI0kC,EAAK,GAClB3E,EAAI,GAAKtmD,KAAKa,IAAIihB,GACXwkC,GAYX3H,KAAKlgD,IAAM6tB,KAAK7tB,IAUhBkgD,KAAKvvB,SAAW,SAASk3B,EAAKlnD,EAAGsB,GAC7B,GAAIwlC,GAAK9mC,EAAE,GAAIinC,EAAKjnC,EAAE,GAAI2vD,EAAK3vD,EAAE,GAAI4vD,EAAK5vD,EAAE,GACxC6mC,EAAKvlC,EAAE,GAAI0lC,EAAK1lC,EAAE,GAAIuuD,EAAKvuD,EAAE,GAAIwuD,EAAKxuD,EAAE,EAM5C,OAJA4lD,GAAI,GAAKpgB,EAAKgpB,EAAKF,EAAK/oB,EAAKI,EAAK4oB,EAAKF,EAAK3oB,EAC5CkgB,EAAI,GAAKjgB,EAAK6oB,EAAKF,EAAK5oB,EAAK2oB,EAAK9oB,EAAKC,EAAK+oB,EAC5C3I,EAAI,GAAKyI,EAAKG,EAAKF,EAAKC,EAAK/oB,EAAKE,EAAKC,EAAKJ,EAC5CqgB,EAAI,GAAK0I,EAAKE,EAAKhpB,EAAKD,EAAKI,EAAKD,EAAK2oB,EAAKE,EACrC3I,GAOX3H,KAAKoI,IAAMpI,KAAKvvB,SAWhBuvB,KAAKlzB,MAAQa,KAAKb,MAUlBkzB,KAAK5uB,QAAU,SAAUu2B,EAAKlnD,EAAG0iB,GAC7BA,GAAO,EAEP,IAAIokB,GAAK9mC,EAAE,GAAIinC,EAAKjnC,EAAE,GAAI2vD,EAAK3vD,EAAE,GAAI4vD,EAAK5vD,EAAE,GACxC6mC,EAAKjmC,KAAKc,IAAIghB,GAAMotC,EAAKlvD,KAAKa,IAAIihB,EAMtC,OAJAwkC,GAAI,GAAKpgB,EAAKgpB,EAAKF,EAAK/oB,EACxBqgB,EAAI,GAAKjgB,EAAK6oB,EAAKH,EAAK9oB,EACxBqgB,EAAI,GAAKyI,EAAKG,EAAK7oB,EAAKJ,EACxBqgB,EAAI,GAAK0I,EAAKE,EAAKhpB,EAAKD,EACjBqgB,GAWX3H,KAAKuM,QAAU,SAAU5E,EAAKlnD,EAAG0iB,GAC7BA,GAAO,EAEP,IAAIokB,GAAK9mC,EAAE,GAAIinC,EAAKjnC,EAAE,GAAI2vD,EAAK3vD,EAAE,GAAI4vD,EAAK5vD,EAAE,GACxCgnC,EAAKpmC,KAAKc,IAAIghB,GAAMotC,EAAKlvD,KAAKa,IAAIihB,EAMtC,OAJAwkC,GAAI,GAAKpgB,EAAKgpB,EAAKH,EAAK3oB,EACxBkgB,EAAI,GAAKjgB,EAAK6oB,EAAKF,EAAK5oB,EACxBkgB,EAAI,GAAKyI,EAAKG,EAAKhpB,EAAKE,EACxBkgB,EAAI,GAAK0I,EAAKE,EAAK7oB,EAAKD,EACjBkgB,GAWX3H,KAAK3uB,QAAU,SAAUs2B,EAAKlnD,EAAG0iB,GAC7BA,GAAO,EAEP,IAAIokB,GAAK9mC,EAAE,GAAIinC,EAAKjnC,EAAE,GAAI2vD,EAAK3vD,EAAE,GAAI4vD,EAAK5vD,EAAE,GACxC6vD,EAAKjvD,KAAKc,IAAIghB,GAAMotC,EAAKlvD,KAAKa,IAAIihB,EAMtC,OAJAwkC,GAAI,GAAKpgB,EAAKgpB,EAAK7oB,EAAK4oB,EACxB3I,EAAI,GAAKjgB,EAAK6oB,EAAKhpB,EAAK+oB,EACxB3I,EAAI,GAAKyI,EAAKG,EAAKF,EAAKC,EACxB3I,EAAI,GAAK0I,EAAKE,EAAKH,EAAKE,EACjB3I,GAYX3H,KAAKwQ,WAAa,SAAU7I,EAAKlnD,GAC7B,GAAIhB,GAAIgB,EAAE,GAAIf,EAAIe,EAAE,GAAIgT,EAAIhT,EAAE,EAM9B,OAJAknD,GAAI,GAAKloD,EACTkoD,EAAI,GAAKjoD,EACTioD,EAAI,GAAKl0C,EACTk0C,EAAI,GAAKtmD,KAAKC,KAAKD,KAAK8yB,IAAI,EAAM10B,EAAIA,EAAIC,EAAIA,EAAI+T,EAAIA,IAC/Ck0C,GAWX3H,KAAK4P,IAAMjiC,KAAKiiC,IAYhB5P,KAAKyQ,KAAO9iC,KAAK8iC,KAWjBzQ,KAAK0Q,MAAQ,SAAU/I,EAAKlnD,EAAGsB,EAAGmc,GAI9B,GAGWyyC,GAAOC,EAAOC,EAAOC,EAAQC,EAHpCxpB,EAAK9mC,EAAE,GAAIinC,EAAKjnC,EAAE,GAAI2vD,EAAK3vD,EAAE,GAAI4vD,EAAK5vD,EAAE,GACxC6mC,EAAKvlC,EAAE,GAAI0lC,EAAK1lC,EAAE,GAAIuuD,EAAKvuD,EAAE,GAAIwuD,EAAKxuD,EAAE,EAiC5C,OA5BA6uD,GAAQrpB,EAAKD,EAAKI,EAAKD,EAAK2oB,EAAKE,EAAKD,EAAKE,EAE9B,EAARK,IACDA,GAASA,EACTtpB,GAAOA,EACPG,GAAOA,EACP6oB,GAAOA,EACPC,GAAOA,GAGL,EAAMK,EAAS,MAEjBD,EAAStvD,KAAK2vD,KAAKJ,GACnBC,EAASxvD,KAAKc,IAAIwuD,GAClBG,EAASzvD,KAAKc,KAAK,EAAM+b,GAAKyyC,GAASE,EACvCE,EAAS1vD,KAAKc,IAAI+b,EAAIyyC,GAASE,IAI/BC,EAAS,EAAM5yC,EACf6yC,EAAS7yC,GAGbypC,EAAI,GAAKmJ,EAASvpB,EAAKwpB,EAASzpB,EAChCqgB,EAAI,GAAKmJ,EAASppB,EAAKqpB,EAAStpB,EAChCkgB,EAAI,GAAKmJ,EAASV,EAAKW,EAAST,EAChC3I,EAAI,GAAKmJ,EAAST,EAAKU,EAASR,EAEzB5I,GAcX3H,KAAKiR,OAAU,WACb,GAAIC,GAAQlR,KAAKv0C,SACb0lD,EAAQnR,KAAKv0C,QAEjB,OAAO,UAAUk8C,EAAKlnD,EAAGsB,EAAG6U,EAAGmI,EAAGb,GAKhC,MAJA8hC,MAAK0Q,MAAMQ,EAAOzwD,EAAGse,EAAGb,GACxB8hC,KAAK0Q,MAAMS,EAAOpvD,EAAG6U,EAAGsH,GACxB8hC,KAAK0Q,MAAM/I,EAAKuJ,EAAOC,EAAO,EAAIjzC,GAAK,EAAIA,IAEpCypC,MAWX3H,KAAKtwB,OAAS,SAASi4B,EAAKlnD,GACxB,GAAIqnD,GAAKrnD,EAAE,GAAIonD,EAAKpnD,EAAE,GAAIsnD,EAAKtnD,EAAE,GAAIunD,EAAKvnD,EAAE,GACxCmvD,EAAM9H,EAAGA,EAAKD,EAAGA,EAAKE,EAAGA,EAAKC,EAAGA,EACjCoJ,EAASxB,EAAM,EAAIA,EAAM,CAQ7B,OAJAjI,GAAI,IAAMG,EAAGsJ,EACbzJ,EAAI,IAAME,EAAGuJ,EACbzJ,EAAI,IAAMI,EAAGqJ,EACbzJ,EAAI,GAAKK,EAAGoJ,EACLzJ,GAWX3H,KAAKqR,UAAY,SAAU1J,EAAKlnD,GAK5B,MAJAknD,GAAI,IAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,GACZknD,EAAI,GAAKlnD,EAAE,GACJknD,GAUX3H,KAAKj5C,OAAS4mB,KAAK5mB,OAMnBi5C,KAAKtjC,IAAMsjC,KAAKj5C,OAShBi5C,KAAKsR,cAAgB3jC,KAAK2jC,cAM1BtR,KAAKuR,OAASvR,KAAKsR,cAUnBtR,KAAK8P,UAAYniC,KAAKmiC,UAatB9P,KAAKmQ,SAAW,SAASxI,EAAK/mD,GAG1B,GACI4wD,GADAC,EAAS7wD,EAAE,GAAKA,EAAE,GAAKA,EAAE,EAG7B,IAAK6wD,EAAS,EAEVD,EAAQnwD,KAAKC,KAAKmwD,EAAS,GAC3B9J,EAAI,GAAK,GAAM6J,EACfA,EAAQ,GAAIA,EACZ7J,EAAI,IAAM/mD,EAAE,GAAGA,EAAE,IAAI4wD,EACrB7J,EAAI,IAAM/mD,EAAE,GAAGA,EAAE,IAAI4wD,EACrB7J,EAAI,IAAM/mD,EAAE,GAAGA,EAAE,IAAI4wD,MAClB,CAEH,GAAI1qD,GAAI,CACHlG,GAAE,GAAKA,EAAE,KACZkG,EAAI,GACDlG,EAAE,GAAKA,EAAI,EAAFkG,EAAIA,KAChBA,EAAI,EACN,IAAI45B,IAAK55B,EAAE,GAAG,EACV1G,GAAK0G,EAAE,GAAG,CAEd0qD,GAAQnwD,KAAKC,KAAKV,EAAI,EAAFkG,EAAIA,GAAGlG,EAAI,EAAF8/B,EAAIA,GAAG9/B,EAAI,EAAFR,EAAIA,GAAK,GAC/CunD,EAAI7gD,GAAK,GAAM0qD,EACfA,EAAQ,GAAMA,EACd7J,EAAI,IAAM/mD,EAAI,EAAF8/B,EAAItgC,GAAKQ,EAAI,EAAFR,EAAIsgC,IAAM8wB,EACjC7J,EAAIjnB,IAAM9/B,EAAI,EAAF8/B,EAAI55B,GAAKlG,EAAI,EAAFkG,EAAI45B,IAAM8wB,EACjC7J,EAAIvnD,IAAMQ,EAAI,EAAFR,EAAI0G,GAAKlG,EAAI,EAAFkG,EAAI1G,IAAMoxD,EAGrC,MAAO7J,IASX3H,KAAKsD,IAAM,SAAU7iD,GACjB,MAAO,QAAUA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAGtE3C,OAAOC,QAAUiiD;;ACphBjB,GAAIF,UAAW7hD,QAAQ,eAMnBw4C,OAOJA,MAAKhrC,OAAS,WACV,GAAIk8C,GAAM,GAAI7H,UAASsH,WAAW,EAGlC,OAFAO,GAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GASXlR,KAAK52C,MAAQ,SAASY,GAClB,GAAIknD,GAAM,GAAI7H,UAASsH,WAAW,EAGlC,OAFAO,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACJknD,GAUXlR,KAAKiZ,WAAa,SAASjwD,EAAGC,GAC1B,GAAIioD,GAAM,GAAI7H,UAASsH,WAAW,EAGlC,OAFAO,GAAI,GAAKloD,EACTkoD,EAAI,GAAKjoD,EACFioD,GAUXlR,KAAK7T,KAAO,SAAS+kB,EAAKlnD,GAGtB,MAFAknD,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACJknD,GAWXlR,KAAKl3C,IAAM,SAASooD,EAAKloD,EAAGC,GAGxB,MAFAioD,GAAI,GAAKloD,EACTkoD,EAAI,GAAKjoD,EACFioD,GAWXlR,KAAK32C,IAAM,SAAS6nD,EAAKlnD,EAAGsB,GAGxB,MAFA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GACX4lD,GAWXlR,KAAKib,SAAW,SAAS/J,EAAKlnD,EAAGsB,GAG7B,MAFA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GACX4lD,GAOXlR,KAAKx2C,IAAMw2C,KAAKib,SAUhBjb,KAAKhmB,SAAW,SAASk3B,EAAKlnD,EAAGsB,GAG7B,MAFA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GACX4lD,GAOXlR,KAAK2R,IAAM3R,KAAKhmB,SAUhBgmB,KAAKkb,OAAS,SAAShK,EAAKlnD,EAAGsB,GAG3B,MAFA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GACX4lD,GAOXlR,KAAKn2C,IAAMm2C,KAAKkb,OAUhBlb,KAAKphC,IAAM,SAASsyC,EAAKlnD,EAAGsB,GAGxB,MAFA4lD,GAAI,GAAKtmD,KAAKgU,IAAI5U,EAAE,GAAIsB,EAAE,IAC1B4lD,EAAI,GAAKtmD,KAAKgU,IAAI5U,EAAE,GAAIsB,EAAE,IACnB4lD,GAWXlR,KAAKjhC,IAAM,SAASmyC,EAAKlnD,EAAGsB,GAGxB,MAFA4lD,GAAI,GAAKtmD,KAAKmU,IAAI/U,EAAE,GAAIsB,EAAE,IAC1B4lD,EAAI,GAAKtmD,KAAKmU,IAAI/U,EAAE,GAAIsB,EAAE,IACnB4lD,GAWXlR,KAAK3pB,MAAQ,SAAS66B,EAAKlnD,EAAGsB,GAG1B,MAFA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAChB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EACT4lD,GAYXlR,KAAKmb,YAAc,SAASjK,EAAKlnD,EAAGsB,EAAG+qB,GAGnC,MAFA66B,GAAI,GAAKlnD,EAAE,GAAMsB,EAAE,GAAK+qB,EACxB66B,EAAI,GAAKlnD,EAAE,GAAMsB,EAAE,GAAK+qB,EACjB66B,GAUXlR,KAAKob,SAAW,SAASpxD,EAAGsB,GACxB,GAAItC,GAAIsC,EAAE,GAAKtB,EAAE,GACbf,EAAIqC,EAAE,GAAKtB,EAAE,EACjB,OAAOY,MAAKC,KAAK7B,EAAEA,EAAIC,EAAEA,IAO7B+2C,KAAKj1C,KAAOi1C,KAAKob,SASjBpb,KAAKqb,gBAAkB,SAASrxD,EAAGsB,GAC/B,GAAItC,GAAIsC,EAAE,GAAKtB,EAAE,GACbf,EAAIqC,EAAE,GAAKtB,EAAE,EACjB,OAAOhB,GAAEA,EAAIC,EAAEA,GAOnB+2C,KAAKsb,QAAUtb,KAAKqb,gBAQpBrb,KAAK1vC,OAAS,SAAUtG,GACpB,GAAIhB,GAAIgB,EAAE,GACNf,EAAIe,EAAE,EACV,OAAOY,MAAKC,KAAK7B,EAAEA,EAAIC,EAAEA,IAO7B+2C,KAAK/5B,IAAM+5B,KAAK1vC,OAQhB0vC,KAAK6a,cAAgB,SAAU7wD,GAC3B,GAAIhB,GAAIgB,EAAE,GACNf,EAAIe,EAAE,EACV,OAAOhB,GAAEA,EAAIC,EAAEA,GAOnB+2C,KAAK8a,OAAS9a,KAAK6a,cASnB7a,KAAKub,OAAS,SAASrK,EAAKlnD,GAGxB,MAFAknD,GAAI,IAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,GACLknD,GAUXlR,KAAKwb,QAAU,SAAStK,EAAKlnD,GAG3B,MAFAknD,GAAI,GAAK,EAAMlnD,EAAE,GACjBknD,EAAI,GAAK,EAAMlnD,EAAE,GACVknD,GAUTlR,KAAKqZ,UAAY,SAASnI,EAAKlnD,GAC3B,GAAIhB,GAAIgB,EAAE,GACNf,EAAIe,EAAE,GACNic,EAAMjd,EAAEA,EAAIC,EAAEA,CAOlB,OANIgd,GAAM,IAENA,EAAM,EAAIrb,KAAKC,KAAKob,GACpBirC,EAAI,GAAKlnD,EAAE,GAAKic,EAChBirC,EAAI,GAAKlnD,EAAE,GAAKic,GAEbirC,GAUXlR,KAAKmZ,IAAM,SAAUnvD,EAAGsB,GACpB,MAAOtB,GAAE,GAAKsB,EAAE,GAAKtB,EAAE,GAAKsB,EAAE,IAYlC00C,KAAKoZ,MAAQ,SAASlI,EAAKlnD,EAAGsB,GAC1B,GAAI0R,GAAIhT,EAAE,GAAKsB,EAAE,GAAKtB,EAAE,GAAKsB,EAAE,EAG/B,OAFA4lD,GAAI,GAAKA,EAAI,GAAK,EAClBA,EAAI,GAAKl0C,EACFk0C,GAYXlR,KAAKga,KAAO,SAAU9I,EAAKlnD,EAAGsB,EAAGmc,GAC7B,GAAIqpB,GAAK9mC,EAAE,GACPinC,EAAKjnC,EAAE,EAGX,OAFAknD,GAAI,GAAKpgB,EAAKrpB,GAAKnc,EAAE,GAAKwlC,GAC1BogB,EAAI,GAAKjgB,EAAKxpB,GAAKnc,EAAE,GAAK2lC,GACnBigB,GAUXlR,KAAK6Q,OAAS,SAAUK,EAAK76B,GACzBA,EAAQA,GAAS,CACjB,IAAIuI,GAAwB,EAApByqB,SAASuH,SAAiBhmD,KAAK+hB,EAGvC,OAFAukC,GAAI,GAAKtmD,KAAKa,IAAImzB,GAAKvI,EACvB66B,EAAI,GAAKtmD,KAAKc,IAAIkzB,GAAKvI,EAChB66B,GAWXlR,KAAKyb,cAAgB,SAASvK,EAAKlnD,EAAGG,GAClC,GAAInB,GAAIgB,EAAE,GACNf,EAAIe,EAAE,EAGV,OAFAknD,GAAI,GAAK/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAC3BioD,EAAI,GAAK/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EACpBioD,GAWXlR,KAAK0b,eAAiB,SAASxK,EAAKlnD,EAAGG,GACnC,GAAInB,GAAIgB,EAAE,GACNf,EAAIe,EAAE,EAGV,OAFAknD,GAAI,GAAK/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,GACjC+mD,EAAI,GAAK/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,GAC1B+mD,GAYXlR,KAAK2b,cAAgB,SAASzK,EAAKlnD,EAAGG,GAClC,GAAInB,GAAIgB,EAAE,GACNf,EAAIe,EAAE,EAGV,OAFAknD,GAAI,GAAK/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,GACjC+mD,EAAI,GAAK/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,GAC1B+mD,GAaXlR,KAAK5mB,cAAgB,SAAS83B,EAAKlnD,EAAGG,GAClC,GAAInB,GAAIgB,EAAE,GACNf,EAAIe,EAAE,EAGV,OAFAknD,GAAI,GAAK/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,IACjC+mD,EAAI,GAAK/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,IAC1B+mD,GAeXlR,KAAK5qC,QAAU,WACX,GAAIqzC,GAAMzI,KAAKhrC,QAEf,OAAO,UAAShL,EAAGu1C,EAAQlnB,EAAQkf,EAAO3wB,EAAI6B,GAC1C,GAAIpY,GAAGurD,CAeP,KAdIrc,IACAA,EAAS,GAGTlnB,IACAA,EAAS,GAITujC,EADDrkB,EACK3sC,KAAKgU,IAAK24B,EAAQgI,EAAUlnB,EAAQruB,EAAEsG,QAEtCtG,EAAEsG,OAGND,EAAIgoB,EAAYujC,EAAJvrD,EAAOA,GAAKkvC,EACxBkJ,EAAI,GAAKz+C,EAAEqG,GAAIo4C,EAAI,GAAKz+C,EAAEqG,EAAE,GAC5BuW,EAAG6hC,EAAKA,EAAKhgC,GACbze,EAAEqG,GAAKo4C,EAAI,GAAIz+C,EAAEqG,EAAE,GAAKo4C,EAAI,EAGhC,OAAOz+C,OAUfg2C,KAAK6M,IAAM,SAAU7iD,GACjB,MAAO,QAAUA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAG1C3C,OAAOC,QAAU04C;;ACtfjB,GAAIqJ,UAAW7hD,QAAQ,eAMnBgiD,OAOJA,MAAKx0C,OAAS,WACV,GAAIk8C,GAAM,GAAI7H,UAASsH,WAAW,EAIlC,OAHAO,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GASX1H,KAAKpgD,MAAQ,SAASY,GAClB,GAAIknD,GAAM,GAAI7H,UAASsH,WAAW,EAIlC,OAHAO,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACJknD,GAWX1H,KAAKyP,WAAa,SAASjwD,EAAGC,EAAG+T,GAC7B,GAAIk0C,GAAM,GAAI7H,UAASsH,WAAW,EAIlC,OAHAO,GAAI,GAAKloD,EACTkoD,EAAI,GAAKjoD,EACTioD,EAAI,GAAKl0C,EACFk0C,GAUX1H,KAAKrd,KAAO,SAAS+kB,EAAKlnD,GAItB,MAHAknD,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACJknD,GAYX1H,KAAK1gD,IAAM,SAASooD,EAAKloD,EAAGC,EAAG+T,GAI3B,MAHAk0C,GAAI,GAAKloD,EACTkoD,EAAI,GAAKjoD,EACTioD,EAAI,GAAKl0C,EACFk0C,GAWX1H,KAAKngD,IAAM,SAAS6nD,EAAKlnD,EAAGsB,GAIxB,MAHA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GACX4lD,GAWX1H,KAAKyR,SAAW,SAAS/J,EAAKlnD,EAAGsB,GAI7B,MAHA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GACX4lD,GAOX1H,KAAKhgD,IAAMggD,KAAKyR,SAUhBzR,KAAKxvB,SAAW,SAASk3B,EAAKlnD,EAAGsB,GAI7B,MAHA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GACX4lD,GAOX1H,KAAKmI,IAAMnI,KAAKxvB,SAUhBwvB,KAAK0R,OAAS,SAAShK,EAAKlnD,EAAGsB,GAI3B,MAHA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GACX4lD,GAOX1H,KAAK3/C,IAAM2/C,KAAK0R,OAUhB1R,KAAK5qC,IAAM,SAASsyC,EAAKlnD,EAAGsB,GAIxB,MAHA4lD,GAAI,GAAKtmD,KAAKgU,IAAI5U,EAAE,GAAIsB,EAAE,IAC1B4lD,EAAI,GAAKtmD,KAAKgU,IAAI5U,EAAE,GAAIsB,EAAE,IAC1B4lD,EAAI,GAAKtmD,KAAKgU,IAAI5U,EAAE,GAAIsB,EAAE,IACnB4lD,GAWX1H,KAAKzqC,IAAM,SAASmyC,EAAKlnD,EAAGsB,GAIxB,MAHA4lD,GAAI,GAAKtmD,KAAKmU,IAAI/U,EAAE,GAAIsB,EAAE,IAC1B4lD,EAAI,GAAKtmD,KAAKmU,IAAI/U,EAAE,GAAIsB,EAAE,IAC1B4lD,EAAI,GAAKtmD,KAAKmU,IAAI/U,EAAE,GAAIsB,EAAE,IACnB4lD,GAWX1H,KAAKnzB,MAAQ,SAAS66B,EAAKlnD,EAAGsB,GAI1B,MAHA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAChB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAChB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EACT4lD,GAYX1H,KAAK2R,YAAc,SAASjK,EAAKlnD,EAAGsB,EAAG+qB,GAInC,MAHA66B,GAAI,GAAKlnD,EAAE,GAAMsB,EAAE,GAAK+qB,EACxB66B,EAAI,GAAKlnD,EAAE,GAAMsB,EAAE,GAAK+qB,EACxB66B,EAAI,GAAKlnD,EAAE,GAAMsB,EAAE,GAAK+qB,EACjB66B,GAUX1H,KAAK4R,SAAW,SAASpxD,EAAGsB,GACxB,GAAItC,GAAIsC,EAAE,GAAKtB,EAAE,GACbf,EAAIqC,EAAE,GAAKtB,EAAE,GACbgT,EAAI1R,EAAE,GAAKtB,EAAE,EACjB,OAAOY,MAAKC,KAAK7B,EAAEA,EAAIC,EAAEA,EAAI+T,EAAEA,IAOnCwsC,KAAKz+C,KAAOy+C,KAAK4R,SASjB5R,KAAK6R,gBAAkB,SAASrxD,EAAGsB,GAC/B,GAAItC,GAAIsC,EAAE,GAAKtB,EAAE,GACbf,EAAIqC,EAAE,GAAKtB,EAAE,GACbgT,EAAI1R,EAAE,GAAKtB,EAAE,EACjB,OAAOhB,GAAEA,EAAIC,EAAEA,EAAI+T,EAAEA,GAOzBwsC,KAAK8R,QAAU9R,KAAK6R,gBAQpB7R,KAAKl5C,OAAS,SAAUtG,GACpB,GAAIhB,GAAIgB,EAAE,GACNf,EAAIe,EAAE,GACNgT,EAAIhT,EAAE,EACV,OAAOY,MAAKC,KAAK7B,EAAEA,EAAIC,EAAEA,EAAI+T,EAAEA,IAOnCwsC,KAAKvjC,IAAMujC,KAAKl5C,OAQhBk5C,KAAKqR,cAAgB,SAAU7wD,GAC3B,GAAIhB,GAAIgB,EAAE,GACNf,EAAIe,EAAE,GACNgT,EAAIhT,EAAE,EACV,OAAOhB,GAAEA,EAAIC,EAAEA,EAAI+T,EAAEA,GAOzBwsC,KAAKsR,OAAStR,KAAKqR,cASnBrR,KAAK+R,OAAS,SAASrK,EAAKlnD,GAIxB,MAHAknD,GAAI,IAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,GACLknD,GAUX1H,KAAKgS,QAAU,SAAStK,EAAKlnD,GAI3B,MAHAknD,GAAI,GAAK,EAAMlnD,EAAE,GACjBknD,EAAI,GAAK,EAAMlnD,EAAE,GACjBknD,EAAI,GAAK,EAAMlnD,EAAE,GACVknD,GAUT1H,KAAK6P,UAAY,SAASnI,EAAKlnD,GAC3B,GAAIhB,GAAIgB,EAAE,GACNf,EAAIe,EAAE,GACNgT,EAAIhT,EAAE,GACNic,EAAMjd,EAAEA,EAAIC,EAAEA,EAAI+T,EAAEA,CAQxB,OAPIiJ,GAAM,IAENA,EAAM,EAAIrb,KAAKC,KAAKob,GACpBirC,EAAI,GAAKlnD,EAAE,GAAKic,EAChBirC,EAAI,GAAKlnD,EAAE,GAAKic,EAChBirC,EAAI,GAAKlnD,EAAE,GAAKic,GAEbirC,GAUX1H,KAAK2P,IAAM,SAAUnvD,EAAGsB,GACpB,MAAOtB,GAAE,GAAKsB,EAAE,GAAKtB,EAAE,GAAKsB,EAAE,GAAKtB,EAAE,GAAKsB,EAAE,IAWhDk+C,KAAK4P,MAAQ,SAASlI,EAAKlnD,EAAGsB,GAC1B,GAAIwlC,GAAK9mC,EAAE,GAAIinC,EAAKjnC,EAAE,GAAI2vD,EAAK3vD,EAAE,GAC7B6mC,EAAKvlC,EAAE,GAAI0lC,EAAK1lC,EAAE,GAAIuuD,EAAKvuD,EAAE,EAKjC,OAHA4lD,GAAI,GAAKjgB,EAAK4oB,EAAKF,EAAK3oB,EACxBkgB,EAAI,GAAKyI,EAAK9oB,EAAKC,EAAK+oB,EACxB3I,EAAI,GAAKpgB,EAAKE,EAAKC,EAAKJ,EACjBqgB,GAYX1H,KAAKwQ,KAAO,SAAU9I,EAAKlnD,EAAGsB,EAAGmc,GAC7B,GAAIqpB,GAAK9mC,EAAE,GACPinC,EAAKjnC,EAAE,GACP2vD,EAAK3vD,EAAE,EAIX,OAHAknD,GAAI,GAAKpgB,EAAKrpB,GAAKnc,EAAE,GAAKwlC,GAC1BogB,EAAI,GAAKjgB,EAAKxpB,GAAKnc,EAAE,GAAK2lC,GAC1BigB,EAAI,GAAKyI,EAAKlyC,GAAKnc,EAAE,GAAKquD,GACnBzI,GAcX1H,KAAKqS,QAAU,SAAU3K,EAAKlnD,EAAGsB,EAAG6U,EAAGmI,EAAGb,GACxC,GAAIq0C,GAAer0C,EAAIA,EACnBs0C,EAAUD,GAAgB,EAAIr0C,EAAI,GAAK,EACvCu0C,EAAUF,GAAgBr0C,EAAI,GAAKA,EACnCw0C,EAAUH,GAAgBr0C,EAAI,GAC9By0C,EAAUJ,GAAgB,EAAI,EAAIr0C,EAMtC,OAJAypC,GAAI,GAAKlnD,EAAE,GAAK+xD,EAAUzwD,EAAE,GAAK0wD,EAAU77C,EAAE,GAAK87C,EAAU3zC,EAAE,GAAK4zC,EACnEhL,EAAI,GAAKlnD,EAAE,GAAK+xD,EAAUzwD,EAAE,GAAK0wD,EAAU77C,EAAE,GAAK87C,EAAU3zC,EAAE,GAAK4zC,EACnEhL,EAAI,GAAKlnD,EAAE,GAAK+xD,EAAUzwD,EAAE,GAAK0wD,EAAU77C,EAAE,GAAK87C,EAAU3zC,EAAE,GAAK4zC,EAE5DhL,GAcT1H,KAAK5hC,OAAS,SAAUspC,EAAKlnD,EAAGsB,EAAG6U,EAAGmI,EAAGb,GACvC,GAAI00C,GAAgB,EAAI10C,EACpB20C,EAAwBD,EAAgBA,EACxCL,EAAer0C,EAAIA,EACnBs0C,EAAUK,EAAwBD,EAClCH,EAAU,EAAIv0C,EAAI20C,EAClBH,EAAU,EAAIH,EAAeK,EAC7BD,EAAUJ,EAAer0C,CAM7B,OAJAypC,GAAI,GAAKlnD,EAAE,GAAK+xD,EAAUzwD,EAAE,GAAK0wD,EAAU77C,EAAE,GAAK87C,EAAU3zC,EAAE,GAAK4zC,EACnEhL,EAAI,GAAKlnD,EAAE,GAAK+xD,EAAUzwD,EAAE,GAAK0wD,EAAU77C,EAAE,GAAK87C,EAAU3zC,EAAE,GAAK4zC,EACnEhL,EAAI,GAAKlnD,EAAE,GAAK+xD,EAAUzwD,EAAE,GAAK0wD,EAAU77C,EAAE,GAAK87C,EAAU3zC,EAAE,GAAK4zC,EAE5DhL,GAUT1H,KAAKqH,OAAS,SAAUK,EAAK76B,GACzBA,EAAQA,GAAS,CAEjB,IAAIuI,GAAwB,EAApByqB,SAASuH,SAAiBhmD,KAAK+hB,GACnC3P,EAAyB,EAApBqsC,SAASuH,SAAkB,EAChCyL,EAASzxD,KAAKC,KAAK,EAAImS,EAAEA,GAAKqZ,CAKlC,OAHA66B,GAAI,GAAKtmD,KAAKa,IAAImzB,GAAKy9B,EACvBnL,EAAI,GAAKtmD,KAAKc,IAAIkzB,GAAKy9B,EACvBnL,EAAI,GAAKl0C,EAAIqZ,EACN66B,GAYX1H,KAAKpwB,cAAgB,SAAS83B,EAAKlnD,EAAGG,GAClC,GAAInB,GAAIgB,EAAE,GAAIf,EAAIe,EAAE,GAAIgT,EAAIhT,EAAE,GAC1Bw1B,EAAIr1B,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,IAAM6S,EAAI7S,EAAE,GAK5C,OAJAq1B,GAAIA,GAAK,EACT0xB,EAAI,IAAM/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,GAAK6S,EAAI7S,EAAE,KAAOq1B,EACpD0xB,EAAI,IAAM/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,GAAK6S,EAAI7S,EAAE,KAAOq1B,EACpD0xB,EAAI,IAAM/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,IAAM6S,EAAI7S,EAAE,KAAOq1B,EAC9C0xB,GAWX1H,KAAKmS,cAAgB,SAASzK,EAAKlnD,EAAGG,GAClC,GAAInB,GAAIgB,EAAE,GAAIf,EAAIe,EAAE,GAAIgT,EAAIhT,EAAE,EAI9B,OAHAknD,GAAI,GAAKloD,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,GAAK6S,EAAI7S,EAAE,GACrC+mD,EAAI,GAAKloD,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,GAAK6S,EAAI7S,EAAE,GACrC+mD,EAAI,GAAKloD,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,GAAK6S,EAAI7S,EAAE,GAC9B+mD,GAWX1H,KAAK8S,cAAgB,SAASpL,EAAKlnD,EAAGoqD,GAGlC,GAAIprD,GAAIgB,EAAE,GAAIf,EAAIe,EAAE,GAAIgT,EAAIhT,EAAE,GAC1BuyD,EAAKnI,EAAE,GAAIoI,EAAKpI,EAAE,GAAIqI,EAAKrI,EAAE,GAAIsI,EAAKtI,EAAE,GAGxCuI,EAAKD,EAAK1zD,EAAIwzD,EAAKx/C,EAAIy/C,EAAKxzD,EAC5B2zD,EAAKF,EAAKzzD,EAAIwzD,EAAKzzD,EAAIuzD,EAAKv/C,EAC5B6/C,EAAKH,EAAK1/C,EAAIu/C,EAAKtzD,EAAIuzD,EAAKxzD,EAC5B8zD,GAAMP,EAAKvzD,EAAIwzD,EAAKvzD,EAAIwzD,EAAKz/C,CAMjC,OAHAk0C,GAAI,GAAKyL,EAAKD,EAAKI,GAAMP,EAAKK,GAAMH,EAAKI,GAAML,EAC/CtL,EAAI,GAAK0L,EAAKF,EAAKI,GAAMN,EAAKK,GAAMN,EAAKI,GAAMF,EAC/CvL,EAAI,GAAK2L,EAAKH,EAAKI,GAAML,EAAKE,GAAMH,EAAKI,GAAML,EACxCrL,GAWX1H,KAAK7uB,QAAU,SAASu2B,EAAKlnD,EAAGsB,EAAG6U,GAChC,GAAI7W,MAAQs1B,IAgBZ,OAdAt1B,GAAE,GAAKU,EAAE,GAAKsB,EAAE,GAChBhC,EAAE,GAAKU,EAAE,GAAKsB,EAAE,GAChBhC,EAAE,GAAKU,EAAE,GAAKsB,EAAE,GAGhBszB,EAAE,GAAKt1B,EAAE,GACTs1B,EAAE,GAAKt1B,EAAE,GAAGsB,KAAKa,IAAI0U,GAAK7W,EAAE,GAAGsB,KAAKc,IAAIyU,GACxCye,EAAE,GAAKt1B,EAAE,GAAGsB,KAAKc,IAAIyU,GAAK7W,EAAE,GAAGsB,KAAKa,IAAI0U,GAGxC+wC,EAAI,GAAKtyB,EAAE,GAAKtzB,EAAE,GAClB4lD,EAAI,GAAKtyB,EAAE,GAAKtzB,EAAE,GAClB4lD,EAAI,GAAKtyB,EAAE,GAAKtzB,EAAE,GAEX4lD,GAWV1H,KAAKsM,QAAU,SAAS5E,EAAKlnD,EAAGsB,EAAG6U,GAChC,GAAI7W,MAAQs1B,IAgBZ,OAdAt1B,GAAE,GAAKU,EAAE,GAAKsB,EAAE,GAChBhC,EAAE,GAAKU,EAAE,GAAKsB,EAAE,GAChBhC,EAAE,GAAKU,EAAE,GAAKsB,EAAE,GAGhBszB,EAAE,GAAKt1B,EAAE,GAAGsB,KAAKc,IAAIyU,GAAK7W,EAAE,GAAGsB,KAAKa,IAAI0U,GACxCye,EAAE,GAAKt1B,EAAE,GACTs1B,EAAE,GAAKt1B,EAAE,GAAGsB,KAAKa,IAAI0U,GAAK7W,EAAE,GAAGsB,KAAKc,IAAIyU,GAGxC+wC,EAAI,GAAKtyB,EAAE,GAAKtzB,EAAE,GAClB4lD,EAAI,GAAKtyB,EAAE,GAAKtzB,EAAE,GAClB4lD,EAAI,GAAKtyB,EAAE,GAAKtzB,EAAE,GAEX4lD,GAWV1H,KAAK5uB,QAAU,SAASs2B,EAAKlnD,EAAGsB,EAAG6U,GAChC,GAAI7W,MAAQs1B,IAgBZ,OAdAt1B,GAAE,GAAKU,EAAE,GAAKsB,EAAE,GAChBhC,EAAE,GAAKU,EAAE,GAAKsB,EAAE,GAChBhC,EAAE,GAAKU,EAAE,GAAKsB,EAAE,GAGhBszB,EAAE,GAAKt1B,EAAE,GAAGsB,KAAKa,IAAI0U,GAAK7W,EAAE,GAAGsB,KAAKc,IAAIyU,GACxCye,EAAE,GAAKt1B,EAAE,GAAGsB,KAAKc,IAAIyU,GAAK7W,EAAE,GAAGsB,KAAKa,IAAI0U,GACxCye,EAAE,GAAKt1B,EAAE,GAGT4nD,EAAI,GAAKtyB,EAAE,GAAKtzB,EAAE,GAClB4lD,EAAI,GAAKtyB,EAAE,GAAKtzB,EAAE,GAClB4lD,EAAI,GAAKtyB,EAAE,GAAKtzB,EAAE,GAEX4lD,GAeV1H,KAAKp0C,QAAU,WACX,GAAIqzC,GAAMe,KAAKx0C,QAEf,OAAO,UAAShL,EAAGu1C,EAAQlnB,EAAQkf,EAAO3wB,EAAI6B,GAC1C,GAAIpY,GAAGurD,CAeP,KAdIrc,IACAA,EAAS,GAGTlnB,IACAA,EAAS,GAITujC,EADDrkB,EACK3sC,KAAKgU,IAAK24B,EAAQgI,EAAUlnB,EAAQruB,EAAEsG,QAEtCtG,EAAEsG,OAGND,EAAIgoB,EAAYujC,EAAJvrD,EAAOA,GAAKkvC,EACxBkJ,EAAI,GAAKz+C,EAAEqG,GAAIo4C,EAAI,GAAKz+C,EAAEqG,EAAE,GAAIo4C,EAAI,GAAKz+C,EAAEqG,EAAE,GAC7CuW,EAAG6hC,EAAKA,EAAKhgC,GACbze,EAAEqG,GAAKo4C,EAAI,GAAIz+C,EAAEqG,EAAE,GAAKo4C,EAAI,GAAIz+C,EAAEqG,EAAE,GAAKo4C,EAAI,EAGjD,OAAOz+C,OAUfw/C,KAAKr+C,MAAQ,SAASnB,EAAGsB,GAErB,GAAIyxD,GAAQvT,KAAKyP,WAAWjvD,EAAE,GAAIA,EAAE,GAAIA,EAAE,IACtCgzD,EAAQxT,KAAKyP,WAAW3tD,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAE1Ck+C,MAAK6P,UAAU0D,EAAOA,GACtBvT,KAAK6P,UAAU2D,EAAOA,EAEtB,IAAIC,GAASzT,KAAK2P,IAAI4D,EAAOC,EAE7B,OAAGC,GAAS,EACD,EAEAryD,KAAK2vD,KAAK0C,IAUzBzT,KAAKqD,IAAM,SAAU7iD,GACjB,MAAO,QAAUA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAGxD3C,OAAOC,QAAUkiD;;AChrBjB,GAAIH,UAAW7hD,QAAQ,eAMnB0vB,OAOJA,MAAKliB,OAAS,WACV,GAAIk8C,GAAM,GAAI7H,UAASsH,WAAW,EAKlC,OAJAO,GAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACTA,EAAI,GAAK,EACFA,GASXh6B,KAAK9tB,MAAQ,SAASY,GAClB,GAAIknD,GAAM,GAAI7H,UAASsH,WAAW,EAKlC,OAJAO,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACJknD,GAYXh6B,KAAK+hC,WAAa,SAASjwD,EAAGC,EAAG+T,EAAGwiB,GAChC,GAAI0xB,GAAM,GAAI7H,UAASsH,WAAW,EAKlC,OAJAO,GAAI,GAAKloD,EACTkoD,EAAI,GAAKjoD,EACTioD,EAAI,GAAKl0C,EACTk0C,EAAI,GAAK1xB,EACF0xB,GAUXh6B,KAAKiV,KAAO,SAAS+kB,EAAKlnD,GAKtB,MAJAknD,GAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACXknD,EAAI,GAAKlnD,EAAE,GACJknD,GAaXh6B,KAAKpuB,IAAM,SAASooD,EAAKloD,EAAGC,EAAG+T,EAAGwiB,GAK9B,MAJA0xB,GAAI,GAAKloD,EACTkoD,EAAI,GAAKjoD,EACTioD,EAAI,GAAKl0C,EACTk0C,EAAI,GAAK1xB,EACF0xB,GAWXh6B,KAAK7tB,IAAM,SAAS6nD,EAAKlnD,EAAGsB,GAKxB,MAJA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GACX4lD,GAWXh6B,KAAK+jC,SAAW,SAAS/J,EAAKlnD,EAAGsB,GAK7B,MAJA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GACX4lD,GAOXh6B,KAAK1tB,IAAM0tB,KAAK+jC,SAUhB/jC,KAAK8C,SAAW,SAASk3B,EAAKlnD,EAAGsB,GAK7B,MAJA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GACX4lD,GAOXh6B,KAAKy6B,IAAMz6B,KAAK8C,SAUhB9C,KAAKgkC,OAAS,SAAShK,EAAKlnD,EAAGsB,GAK3B,MAJA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GAClB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAAE,GACX4lD,GAOXh6B,KAAKrtB,IAAMqtB,KAAKgkC,OAUhBhkC,KAAKtY,IAAM,SAASsyC,EAAKlnD,EAAGsB,GAKxB,MAJA4lD,GAAI,GAAKtmD,KAAKgU,IAAI5U,EAAE,GAAIsB,EAAE,IAC1B4lD,EAAI,GAAKtmD,KAAKgU,IAAI5U,EAAE,GAAIsB,EAAE,IAC1B4lD,EAAI,GAAKtmD,KAAKgU,IAAI5U,EAAE,GAAIsB,EAAE,IAC1B4lD,EAAI,GAAKtmD,KAAKgU,IAAI5U,EAAE,GAAIsB,EAAE,IACnB4lD,GAWXh6B,KAAKnY,IAAM,SAASmyC,EAAKlnD,EAAGsB,GAKxB,MAJA4lD,GAAI,GAAKtmD,KAAKmU,IAAI/U,EAAE,GAAIsB,EAAE,IAC1B4lD,EAAI,GAAKtmD,KAAKmU,IAAI/U,EAAE,GAAIsB,EAAE,IAC1B4lD,EAAI,GAAKtmD,KAAKmU,IAAI/U,EAAE,GAAIsB,EAAE,IAC1B4lD,EAAI,GAAKtmD,KAAKmU,IAAI/U,EAAE,GAAIsB,EAAE,IACnB4lD,GAWXh6B,KAAKb,MAAQ,SAAS66B,EAAKlnD,EAAGsB,GAK1B,MAJA4lD,GAAI,GAAKlnD,EAAE,GAAKsB,EAChB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAChB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EAChB4lD,EAAI,GAAKlnD,EAAE,GAAKsB,EACT4lD,GAYXh6B,KAAKikC,YAAc,SAASjK,EAAKlnD,EAAGsB,EAAG+qB,GAKnC,MAJA66B,GAAI,GAAKlnD,EAAE,GAAMsB,EAAE,GAAK+qB,EACxB66B,EAAI,GAAKlnD,EAAE,GAAMsB,EAAE,GAAK+qB,EACxB66B,EAAI,GAAKlnD,EAAE,GAAMsB,EAAE,GAAK+qB,EACxB66B,EAAI,GAAKlnD,EAAE,GAAMsB,EAAE,GAAK+qB,EACjB66B,GAUXh6B,KAAKkkC,SAAW,SAASpxD,EAAGsB,GACxB,GAAItC,GAAIsC,EAAE,GAAKtB,EAAE,GACbf,EAAIqC,EAAE,GAAKtB,EAAE,GACbgT,EAAI1R,EAAE,GAAKtB,EAAE,GACbw1B,EAAIl0B,EAAE,GAAKtB,EAAE,EACjB,OAAOY,MAAKC,KAAK7B,EAAEA,EAAIC,EAAEA,EAAI+T,EAAEA,EAAIwiB,EAAEA,IAOzCtI,KAAKnsB,KAAOmsB,KAAKkkC,SASjBlkC,KAAKmkC,gBAAkB,SAASrxD,EAAGsB,GAC/B,GAAItC,GAAIsC,EAAE,GAAKtB,EAAE,GACbf,EAAIqC,EAAE,GAAKtB,EAAE,GACbgT,EAAI1R,EAAE,GAAKtB,EAAE,GACbw1B,EAAIl0B,EAAE,GAAKtB,EAAE,EACjB,OAAOhB,GAAEA,EAAIC,EAAEA,EAAI+T,EAAEA,EAAIwiB,EAAEA,GAO/BtI,KAAKokC,QAAUpkC,KAAKmkC,gBAQpBnkC,KAAK5mB,OAAS,SAAUtG,GACpB,GAAIhB,GAAIgB,EAAE,GACNf,EAAIe,EAAE,GACNgT,EAAIhT,EAAE,GACNw1B,EAAIx1B,EAAE,EACV,OAAOY,MAAKC,KAAK7B,EAAEA,EAAIC,EAAEA,EAAI+T,EAAEA,EAAIwiB,EAAEA,IAOzCtI,KAAKjR,IAAMiR,KAAK5mB,OAQhB4mB,KAAK2jC,cAAgB,SAAU7wD,GAC3B,GAAIhB,GAAIgB,EAAE,GACNf,EAAIe,EAAE,GACNgT,EAAIhT,EAAE,GACNw1B,EAAIx1B,EAAE,EACV,OAAOhB,GAAEA,EAAIC,EAAEA,EAAI+T,EAAEA,EAAIwiB,EAAEA,GAO/BtI,KAAK4jC,OAAS5jC,KAAK2jC,cASnB3jC,KAAKqkC,OAAS,SAASrK,EAAKlnD,GAKxB,MAJAknD,GAAI,IAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,GACZknD,EAAI,IAAMlnD,EAAE,GACLknD,GAUXh6B,KAAKskC,QAAU,SAAStK,EAAKlnD,GAK3B,MAJAknD,GAAI,GAAK,EAAMlnD,EAAE,GACjBknD,EAAI,GAAK,EAAMlnD,EAAE,GACjBknD,EAAI,GAAK,EAAMlnD,EAAE,GACjBknD,EAAI,GAAK,EAAMlnD,EAAE,GACVknD,GAUTh6B,KAAKmiC,UAAY,SAASnI,EAAKlnD,GAC3B,GAAIhB,GAAIgB,EAAE,GACNf,EAAIe,EAAE,GACNgT,EAAIhT,EAAE,GACNw1B,EAAIx1B,EAAE,GACNic,EAAMjd,EAAEA,EAAIC,EAAEA,EAAI+T,EAAEA,EAAIwiB,EAAEA,CAQ9B,OAPIvZ,GAAM,IACNA,EAAM,EAAIrb,KAAKC,KAAKob,GACpBirC,EAAI,GAAKloD,EAAIid,EACbirC,EAAI,GAAKjoD,EAAIgd,EACbirC,EAAI,GAAKl0C,EAAIiJ,EACbirC,EAAI,GAAK1xB,EAAIvZ,GAEVirC,GAUXh6B,KAAKiiC,IAAM,SAAUnvD,EAAGsB,GACpB,MAAOtB,GAAE,GAAKsB,EAAE,GAAKtB,EAAE,GAAKsB,EAAE,GAAKtB,EAAE,GAAKsB,EAAE,GAAKtB,EAAE,GAAKsB,EAAE,IAY9D4rB,KAAK8iC,KAAO,SAAU9I,EAAKlnD,EAAGsB,EAAGmc,GAC7B,GAAIqpB,GAAK9mC,EAAE,GACPinC,EAAKjnC,EAAE,GACP2vD,EAAK3vD,EAAE,GACP4vD,EAAK5vD,EAAE,EAKX,OAJAknD,GAAI,GAAKpgB,EAAKrpB,GAAKnc,EAAE,GAAKwlC,GAC1BogB,EAAI,GAAKjgB,EAAKxpB,GAAKnc,EAAE,GAAK2lC,GAC1BigB,EAAI,GAAKyI,EAAKlyC,GAAKnc,EAAE,GAAKquD,GAC1BzI,EAAI,GAAK0I,EAAKnyC,GAAKnc,EAAE,GAAKsuD,GACnB1I,GAUXh6B,KAAK25B,OAAS,SAAUK,EAAK76B,GAUzB,MATAA,GAAQA,GAAS,EAGjB66B,EAAI,GAAK7H,SAASuH,SAClBM,EAAI,GAAK7H,SAASuH,SAClBM,EAAI,GAAK7H,SAASuH,SAClBM,EAAI,GAAK7H,SAASuH,SAClB15B,KAAKmiC,UAAUnI,EAAKA,GACpBh6B,KAAKb,MAAM66B,EAAKA,EAAK76B,GACd66B,GAWXh6B,KAAKkC,cAAgB,SAAS83B,EAAKlnD,EAAGG,GAClC,GAAInB,GAAIgB,EAAE,GAAIf,EAAIe,EAAE,GAAIgT,EAAIhT,EAAE,GAAIw1B,EAAIx1B,EAAE,EAKxC,OAJAknD,GAAI,GAAK/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,GAAK6S,EAAI7S,EAAE,IAAMq1B,EAClD0xB,EAAI,GAAK/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,GAAK6S,EAAI7S,EAAE,IAAMq1B,EAClD0xB,EAAI,GAAK/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,IAAM6S,EAAI7S,EAAE,IAAMq1B,EACnD0xB,EAAI,GAAK/mD,EAAE,GAAKnB,EAAImB,EAAE,GAAKlB,EAAIkB,EAAE,IAAM6S,EAAI7S,EAAE,IAAMq1B,EAC5C0xB,GAWXh6B,KAAKolC,cAAgB,SAASpL,EAAKlnD,EAAGoqD,GAClC,GAAIprD,GAAIgB,EAAE,GAAIf,EAAIe,EAAE,GAAIgT,EAAIhT,EAAE,GAC1BuyD,EAAKnI,EAAE,GAAIoI,EAAKpI,EAAE,GAAIqI,EAAKrI,EAAE,GAAIsI,EAAKtI,EAAE,GAGxCuI,EAAKD,EAAK1zD,EAAIwzD,EAAKx/C,EAAIy/C,EAAKxzD,EAC5B2zD,EAAKF,EAAKzzD,EAAIwzD,EAAKzzD,EAAIuzD,EAAKv/C,EAC5B6/C,EAAKH,EAAK1/C,EAAIu/C,EAAKtzD,EAAIuzD,EAAKxzD,EAC5B8zD,GAAMP,EAAKvzD,EAAIwzD,EAAKvzD,EAAIwzD,EAAKz/C,CAOjC,OAJAk0C,GAAI,GAAKyL,EAAKD,EAAKI,GAAMP,EAAKK,GAAMH,EAAKI,GAAML,EAC/CtL,EAAI,GAAK0L,EAAKF,EAAKI,GAAMN,EAAKK,GAAMN,EAAKI,GAAMF,EAC/CvL,EAAI,GAAK2L,EAAKH,EAAKI,GAAML,EAAKE,GAAMH,EAAKI,GAAML,EAC/CrL,EAAI,GAAKlnD,EAAE,GACJknD,GAeXh6B,KAAK9hB,QAAU,WACX,GAAIqzC,GAAMvxB,KAAKliB,QAEf,OAAO,UAAShL,EAAGu1C,EAAQlnB,EAAQkf,EAAO3wB,EAAI6B,GAC1C,GAAIpY,GAAGurD,CAeP,KAdIrc,IACAA,EAAS,GAGTlnB,IACAA,EAAS,GAITujC,EADDrkB,EACK3sC,KAAKgU,IAAK24B,EAAQgI,EAAUlnB,EAAQruB,EAAEsG,QAEtCtG,EAAEsG,OAGND,EAAIgoB,EAAYujC,EAAJvrD,EAAOA,GAAKkvC,EACxBkJ,EAAI,GAAKz+C,EAAEqG,GAAIo4C,EAAI,GAAKz+C,EAAEqG,EAAE,GAAIo4C,EAAI,GAAKz+C,EAAEqG,EAAE,GAAIo4C,EAAI,GAAKz+C,EAAEqG,EAAE,GAC9DuW,EAAG6hC,EAAKA,EAAKhgC,GACbze,EAAEqG,GAAKo4C,EAAI,GAAIz+C,EAAEqG,EAAE,GAAKo4C,EAAI,GAAIz+C,EAAEqG,EAAE,GAAKo4C,EAAI,GAAIz+C,EAAEqG,EAAE,GAAKo4C,EAAI,EAGlE,OAAOz+C,OAUfktB,KAAK21B,IAAM,SAAU7iD,GACjB,MAAO,QAAUA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAAOA,EAAE,GAAK,KAGtE3C,OAAOC,QAAU4vB;;AuCxhBjB,YAEA,SAAS2rD,UAAS3uE,GACd,MAAO,YACH,MAAOA,IAIf,QAAS4uE,mBAAkB94E,EAAGsB,EAAGmc,GAC7B,MAAQzd,IAAK,EAAIyd,GAAOnc,EAAImc,EAGhC,QAASs7D,kBAAiB/4E,EAAGsB,EAAGmc,GAE5B,IAAK,GADD9C,MACKtU,EAAI,EAAGA,EAAIrG,EAAEsG,OAAQD,IAC1BsU,EAAOtU,GAAKyyE,kBAAkB94E,EAAEqG,GAAI/E,EAAE+E,GAAIoX,EAE9C,OAAO9C,GAGXrd,QAAsB,aAAI,SAAS4vC,GAC/B,IAAKA,EAAEgL,MACH,MAAO2gC,UAAS3rC,EAGpB,IAAIgL,GAAQhL,EAAEgL,MACVjb,EAAOiQ,EAAEjQ,MAAQ,EACjBzK,EAAc5wB,MAAMC,QAAQq2C,EAAM,GAAG,IAAM6gC,iBAAmBD,iBAElE,OAAO,UAAS9lE,GAIZ,IAAK,GAFDgmE,GAAKC,EAEA5yE,EAAI,EAAGA,EAAI6xC,EAAM5xC,OAAQD,IAAK,CACnC,GAAIxC,GAAOq0C,EAAM7xC,EAMjB,IAJIxC,EAAK,IAAMmP,IACXgmE,EAAMn1E,GAGNA,EAAK,GAAKmP,EAAG,CACbimE,EAAOp1E,CACP,QAIR,GAAIm1E,GAAOC,EAAM,CACb,GAAIluC,GAAWkuC,EAAK,GAAKD,EAAI,GACzBE,EAAelmE,EAAIgmE,EAAI,GAEvBv7D,EAAa,IAATwf,EACJi8C,EAAenuC,GACdnqC,KAAKqS,IAAIgqB,EAAMi8C,GAAgB,IAAMt4E,KAAKqS,IAAIgqB,EAAM8N,GAAY,EAErE,OAAOvY,GAAYwmD,EAAI,GAAIC,EAAK,GAAIx7D,GAEjC,MAAIu7D,GACAA,EAAI,GAEJC,EACAA,EAAK,GADT,SAMf37E,QAAQ,sBAAwB,SAAS4vC,GACrC,IAAKA,EAAEgL,MACH,MAAO2gC,UAAS3rC,EAGpB,IAAIgL,GAAQhL,EAAEgL,KAEd,OAAO,UAASllC,GACZ,IAAK,GAAI3M,GAAI,EAAGA,EAAI6xC,EAAM5xC,OAAQD,IAC9B,GAAI6xC,EAAM7xC,GAAG,GAAK2M,EACd,MAAOklC,GAAY,IAAN7xC,EAAU,EAAIA,EAAI,GAAG,EAI1C,OAAO6xC,GAAMA,EAAM5xC,OAAS,GAAG;;AhD/EvC,YAEA,IAAIqyC,WAAYn7C,QAAQ,6BACpB4a,SAAW5a,QAAQ,WAEvBH,QAAOC,QAAU,SAASsH,GACtB,MAAOwT,UAASxT,EAAO+zC;;AYN3B,YA6WA,SAASsb,SAAQzS,GACb,MAAIA,aAAe0S,QACR,SACP1S,YAAeoC,QACR,SACPpC,YAAeoB,SACR,UACPhhD,MAAMC,QAAQ2/C,GACP,QACC,OAARA,EACO,aACGA,GAGlB,QAAS2S,UAAStc,GACd,MAAIA,aAAaqc,SACbrc,YAAa+L,SACb/L,YAAa+K,SACN/K,EAAEuc,UAEFvc,EA/Xf,GAAI0B,eAAgB/7C,QAAQ,kBAAkB+7C,cAC1C8a,OAAS72D,QAAQ,QAAQ62D,MAE7Bh3D,QAAOC,QAAU,SAASsH,EAAO+zC,GAM7B,QAASltC,GAAMoF,EAAK2wC,GAChB,GAAI3uC,IACAyF,SAAUzH,EAAMA,EAAM,KAAO,IAC7BwjD,OAAOr0C,MAAMq0C,OAAQzyD,MAAMzC,UAAUme,MAAMF,KAAKoB,UAAW,IAGnD,QAARgjC,GAAwBvwC,SAARuwC,GAAqBA,EAAI8S,WACzCzhD,EAAI0Y,KAAOi2B,EAAI8S,UAGnBC,EAAOrkD,KAAK2C,GAYhB,QAASuF,GAASvH,EAAK2wC,EAAKgT,GACxB,GAAIpnD,GAAO6mD,QAAQzS,EAGnB,IAAa,WAATp0C,GAAgC,MAAXo0C,EAAI,GAAY,CACrC,KAAMA,IAAOvoC,IACT,MAAOxN,GAAMoF,EAAK2wC,EAAK,0BAA2BA,EAEtDA,GAAMvoC,EAAUuoC,GAChBp0C,EAAO6mD,QAAQzS,GAInB,GAAIgT,EAAAA,aAA0B,WAATpnD,EACjB,MAAOgL,GAAAA,YAAkBvH,EAAK2wC,EAAKgT,EAGvC,IAAIA,EAAKpnD,KAAM,CACX,GAAIqnD,GAAYr8C,EAASo8C,EAAKpnD,KAC9B,IAAIqnD,EACA,MAAOA,GAAU5jD,EAAK2wC,EAAKgT,EAE/BA,GAAO7b,EAAU6b,EAAKpnD,MAG1BgL,EAASs8C,OAAO7jD,EAAK2wC,EAAKgT,GAuR9B,QAASG,GAAcC,GACnB,MAAO,UAAS/jD,EAAK2wC,EAAKgT,GACtB,GAAIK,GAASZ,QAAQzS,EACjBqT,KAAWD,GACXnpD,EAAMoF,EAAK2wC,EAAK,wBAAyBoT,EAAUC,GAGnD,WAAaL,IAAQhT,EAAMgT,EAAKM,SAChCrpD,EAAMoF,EAAK2wC,EAAK,uCAAwCA,EAAKgT,EAAKM,SAGlE,WAAaN,IAAQhT,EAAMgT,EAAKO,SAChCtpD,EAAMoF,EAAK2wC,EAAK,0CAA2CA,EAAKgT,EAAKO,UAtVjF,GAAI97C,GAAYrU,EAAMqU,cAClB/C,KACAq+C,IAiWJ,OA7SAn8C,GAASa,UAAY,SAASpI,EAAK2wC,GAC/B,GAAIp0C,GAAO6mD,QAAQzS,EACnB,IAAa,WAATp0C,EACA,MAAO3B,GAAMoF,EAAK2wC,EAAK,4BAA6Bp0C,EAGxD,KAAK,GAAIzN,KAAK6hD,GACG,MAAT7hD,EAAE,IACF8L,EAAMoF,EAAM,IAAMlR,EAAG6hD,EAAI7hD,GAAI,kCAKzCyY,EAASlP,OAAS,SAAS2H,EAAK2wC,GAC5B,IAAKA,EAAIp0C,KAEL,WADA3B,GAAMoF,EAAK2wC,EAAK,qBAIpB,IAAIp0C,GAAO+mD,SAAS3S,EAAIp0C,KACxB,QAAQA,GACJ,IAAK,SACL,IAAK,SAGD,GAFAgL,EAASs8C,OAAO7jD,EAAK2wC,EAAK7I,EAAUqc,aAEhC,OAASxT,GACT,IAAK,GAAIlI,KAAQkI,IACR,OAAQ,MAAO,YAAYxkC,QAAQs8B,GAAQ,GAC5C7tC,EAAMoF,EAAM,IAAMyoC,EAAMkI,EAAIlI,GAAO,iEAAkEA,EAKjH,MACJ,KAAK,UACDlhC,EAASs8C,OAAO7jD,EAAK2wC,EAAK7I,EAAUsc,eACpC,MACJ,KAAK,QACD78C,EAASs8C,OAAO7jD,EAAK2wC,EAAK7I,EAAUuc,aACpC,MACJ,SACI98C,EAAAA,QAAcvH,EAAM,QAAS2wC,EAAIp0C,MAAO8uB,QAAS,SAAU,SAAU,UAAW,aAI5F9jB,EAAS9O,MAAQ,SAASuH,EAAK2wC,GACtBA,EAAIp0C,MAASo0C,EAAIhnC,KAClB/O,EAAMoF,EAAK2wC,EAAK,qCAGpB,IAAIp0C,GAAO+mD,SAAS3S,EAAIp0C,MACpBoN,EAAM25C,SAAS3S,EAAIhnC,IAUvB,IARIgnC,EAAIv4C,KACAiN,EAAOsrC,EAAIv4C,IACXwC,EAAMoF,EAAK2wC,EAAIv4C,GAAI,sDAAuDu4C,EAAIv4C,GAAIiN,EAAOsrC,EAAIv4C,KAE7FiN,EAAOsrC,EAAIv4C,IAAMu4C,EAAIv4C,GAAGqrD,UAI5B,OAAS9S,GAAK,EACb,OAAQ,SAAU,eAAgB,SAAU,UAAUp2C,QAAQ,SAAU9L,GACjEA,IAAKkiD,IACL/1C,EAAMoF,EAAK2wC,EAAIliD,GAAI,oCAAqCA,IAIhE,IAAI4f,EAEJta,GAAMsR,OAAO9K,QAAQ,SAAS9B,GACtBA,EAAML,IAAMuR,IAAK0E,EAAS5V,KAG7B4V,EAEMA,EAAO1E,IACd/O,EAAMoF,EAAK2wC,EAAIhnC,IAAK,0CAEpBpN,EAAO8R,EAAO9R,KAJd3B,EAAMoF,EAAK2wC,EAAIhnC,IAAK,2BAA4BA,OAMjD,IAAa,eAATpN,EACP,GAAKo0C,EAAIt4C,OAEF,CACH,GAAIA,GAAStE,EAAML,QAAQi9C,EAAIt4C,OAC1BA,GAEqB,UAAfA,EAAOkE,MAA4B,UAARA,EAClC3B,EAAMoF,EAAK2wC,EAAIt4C,OAAQ,sCAAuCs4C,EAAIv4C,IAC5C,UAAfC,EAAOkE,MAA4B,UAARA,GAClC3B,EAAMoF,EAAK2wC,EAAIt4C,OAAQ,sCAAuCs4C,EAAIv4C,IAJlEwC,EAAMoF,EAAK2wC,EAAIt4C,OAAQ,wBAAyBs4C,EAAIt4C,YAJxDuC,GAAMoF,EAAK2wC,EAAK,qCAaxBppC,GAASs8C,OAAO7jD,EAAK2wC,EAAK7I,EAAUrvC,OAChCI,OAAQ0O,EAAS1O,OACjBkyB,OAAQ,SAAS/qB,EAAK2wC,GAClB,GAAIgT,GAAO7b,EAAU,UAAYvrC,EACjC,OAAOA,IAAQonD,GAAQp8C,EAASvH,EAAK2wC,EAAKgT,IAE9C73B,MAAO,SAAS9rB,EAAK2wC,GACjB,GAAIgT,GAAO7b,EAAU,SAAWvrC,EAChC,OAAOA,IAAQonD,GAAQp8C,EAASvH,EAAK2wC,EAAKgT,OAKtDp8C,EAASs8C,OAAS,SAAU7jD,EAAK2wC,EAAKgT,EAAMW,GACxCA,EAAaA,KAEb,IAAI/nD,GAAO6mD,QAAQzS,EACnB,IAAa,WAATp0C,EACA,MAAO3B,GAAMoF,EAAK2wC,EAAK,4BAA6Bp0C,EAGxD,KAAK,GAAIzN,KAAK6hD,GAAK,CACf,GAAI4T,GAAUz1D,EAAEoxB,MAAM,KAAK,GACvBskC,EAAMb,EAAKY,IAAYZ,EAAK,KAC5BlnD,EAAa8nD,EAAQr5B,MAAM,oBAE3Bs5B,IACCF,EAAWC,IAAYh9C,IAAWvH,EAAMA,EAAM,IAAMA,GAAOlR,EAAG6hD,EAAI7hD,GAAI01D,GAChE/nD,GAAcknD,EAAKlnD,EAAW,KAAOknD,EAAKlnD,EAAW,IAAIA,WAChE8K,GAAUvH,EAAMA,EAAM,IAAMA,GAAOlR,EAAG6hD,EAAI7hD,GAAIg5C,EAAUrrC,YAEzC,KAARuD,GAAwC,IAA1BA,EAAIkgB,MAAM,KAAKzqB,QACpCmF,EAAMoF,EAAK2wC,EAAI7hD,GAAI,wBAAyBA,GAIpD,IAAK,GAAIiyD,KAAK4C,GACNA,EAAK5C,GAAG75B,UAAmC9mB,SAAvBujD,EAAK5C,GAAG,YAAuC3gD,SAAXuwC,EAAIoQ,IAC5DnmD,EAAMoF,EAAK2wC,EAAK,iCAAkCoQ,IAK9Dx5C,EAAS5C,MAAQ,SAAU3E,EAAK2wC,EAAKgT,EAAMC,GACvC,GAAqB,UAAjBR,QAAQzS,GACR,MAAO/1C,GAAMoF,EAAK2wC,EAAK,2BAA4ByS,QAAQzS,GAG/D,IAAIgT,EAAKluD,QAAUk7C,EAAIl7C,SAAWkuD,EAAKluD,OACnC,MAAOmF,GAAMoF,EAAK2wC,EAAK,4CAA6CgT,EAAKluD,OAAQk7C,EAAIl7C,OAGzF,IAAI4D,IACAkD,KAAQonD,EAAKtqD,MAGbtF,GAAM0wD,QAAU,IAChBprD,EAAAA,YAAiBsqD,EAAAA,aAGO,WAAxBP,QAAQO,EAAKtqD,SACbA,EAAQsqD,EAAKtqD,MAGjB,KAAK,GAAI7D,GAAI,EAAGA,EAAIm7C,EAAIl7C,OAAQD,KAC3BouD,GAAar8C,GAAUvH,EAAM,IAAMxK,EAAI,IAAKm7C,EAAIn7C,GAAI6D,IAI7DkO,EAAS1O,OAAS,SAASmH,EAAK2wC,GAC5B,GAAIp0C,EAEJ,IAAqB,UAAjB6mD,QAAQzS,GACR,MAAO/1C,GAAMoF,EAAK2wC,EAAK,2BAA4ByS,QAAQzS,GAG/D,IAAIA,EAAIl7C,OAAS,EACb,MAAOmF,GAAMoF,EAAK2wC,EAAK,4CAK3B,QAFAppC,EAAAA,QAAcvH,EAAM,MAAO2wC,EAAI,GAAI7I,EAAU4c,iBAErCpB,SAAS3S,EAAI,KACjB,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KACGA,EAAIl7C,QAAU,GAAe,SAAVk7C,EAAI,IACvB/1C,EAAMoF,EAAK2wC,EAAK,2CAA4CA,EAAI,GAGxE,KAAK,KACL,IAAK,KACiB,GAAdA,EAAIl7C,QACJmF,EAAMoF,EAAK2wC,EAAK,sDAAuDA,EAAI,GAGnF,KAAK,KACL,IAAK,MACGA,EAAIl7C,QAAU,IACd8G,EAAO6mD,QAAQzS,EAAI,IACN,WAATp0C,EACA3B,EAAMoF,EAAM,MAAO2wC,EAAI,GAAI,4BAA6Bp0C,GACnC,MAAdo0C,EAAI,GAAG,IACd/1C,EAAMoF,EAAM,MAAO2wC,EAAI,GAAI,mCAGnC,KAAK,GAAIn7C,GAAI,EAAGA,EAAIm7C,EAAIl7C,OAAQD,IAC5B+G,EAAO6mD,QAAQzS,EAAIn7C,IACL,SAAVm7C,EAAI,GACJppC,EAAAA,QAAcvH,EAAM,IAAMxK,EAAI,IAAKm7C,EAAIn7C,GAAIsyC,EAAU6c,eACrC,WAATpoD,GAAmC,MAAdo0C,EAAIn7C,GAAG,GACnCoF,EAAMoF,EAAM,IAAMxK,EAAI,IAAKm7C,EAAIn7C,GAAI,qCACnB,WAAT+G,GAA8B,WAATA,GAA8B,YAATA,GACjD3B,EAAMoF,EAAM,IAAMxK,EAAI,IAAKm7C,EAAIn7C,GAAI,gDAAiD+G,EAG5F,MAEJ,KAAK,MACL,IAAK,MACL,IAAK,OACD,IAAK/G,EAAI,EAAGA,EAAIm7C,EAAIl7C,OAAQD,IACxB+R,EAAS1O,OAAOmH,EAAM,IAAMxK,EAAI,IAAKm7C,EAAIn7C,MAMzD+R,EAAAA,YAAoB,SAASvH,EAAK2wC,EAAKgT,GACnCp8C,EAASs8C,OAAO7jD,EAAK2wC,EAAK7I,EAAAA,aACtBT,MAAO,SAAUrnC,EAAK2wC,EAAKiU,GACvB,GAAIC,KAAY5hD,EAAAA,EAChBsE,GAAS5C,MAAM3E,EAAK2wC,EAAKiU,EAAW,SAAsB5kD,EAAK2wC,GAC3D,MAAqB,UAAjByS,QAAQzS,GACD/1C,EAAMoF,EAAK2wC,EAAK,2BAA4ByS,QAAQzS,IAG5C,IAAfA,EAAIl7C,OACGmF,EAAMoF,EAAK2wC,EAAK,4CAA6C,EAAGA,EAAIl7C,SAG/E8R,EAASvH,EAAM,MAAO2wC,EAAI,IAAKp0C,KAAM,WACrCgL,EAASvH,EAAM,MAAO2wC,EAAI,GAAIgT,QAEN,WAApBP,QAAQzS,EAAI,MACU,uBAAlBgT,EAAAA,aAA0ChT,EAAI,GAAK,IAAM,GACzD/1C,EAAMoF,EAAM,MAAO2wC,EAAI,GAAI,kEAG3BA,EAAI,GAAKkU,GACTjqD,EAAMoF,EAAM,MAAO2wC,EAAI,GAAI,8CAG/BkU,EAAWlU,EAAI,QAIF,UAAjByS,QAAQzS,IAAmC,IAAfA,EAAIl7C,QAChCmF,EAAMoF,EAAK2wC,EAAK,yCAMhCppC,EAAAA,QAAgB,SAAUvH,EAAK2wC,EAAKgT,GACW,KAAvCA,EAAKt4B,OAAOlf,QAAQm3C,SAAS3S,KAC7B/1C,EAAMoF,EAAK2wC,EAAK,iCAAkCgT,EAAKt4B,OAAO/rB,KAAK,MAAOqxC,IAIlFppC,EAAS4iB,MAAQ,SAASnqB,EAAK2wC,GAC3B,GAAIp0C,GAAO6mD,QAAQzS,EACN,YAATp0C,EACA3B,EAAMoF,EAAK2wC,EAAK,2BAA4Bp0C,GACd,OAAvBmsC,cAAciI,IACrB/1C,EAAMoF,EAAK2wC,EAAK,6BAA8BA,IAqBtDppC,EAAS29B,OAAS4e,EAAc,UAChCv8C,EAASu9C,OAAShB,EAAc,UAChCv8C,EAAAA,WAAmBu8C,EAAc,WAEjCv8C,EAAS,KAAO,aAEhBA,EAAS,GAAIxT,EAAO+zC,EAAUid,OAEvBrB;;AD1WXl3D,OAAOC,QAAUE,QAAQ;;ArFAzB;;AoFAA,YAWA,SAASmiD,QAAOr5C,GACZ,GAAIw5C,EACAx5C,IAAUA,EAAOA,SACjBw5C,EAAMx5C,EACNA,EAASw5C,EAAIx5C,OAEjB,IAAIo5C,GAAM,GAAIviB,YAAW72B,GAAU,EAiBnC,OAhBIw5C,IAAKJ,EAAI5gD,IAAIghD,GAEjBJ,EAAIkC,aAAesR,cAActR,aACjClC,EAAI+D,cAAgByP,cAAczP,cAClC/D,EAAIoC,YAAcoR,cAAcpR,YAChCpC,EAAIgE,aAAewP,cAAcxP,aACjChE,EAAIwC,YAAcgR,cAAchR,YAChCxC,EAAIqE,aAAemP,cAAcnP,aACjCrE,EAAI0C,aAAe8Q,cAAc9Q,aACjC1C,EAAIsE,cAAgBkP,cAAclP,cAClCtE,EAAIvK,SAAW+d,cAAc/d,SAC7BuK,EAAIoE,MAAQoP,cAAcpP,MAC1BpE,EAAIpiC,MAAQ41C,cAAc51C,MAC1BoiC,EAAIvd,KAAO+wB,cAAc/wB,KAEzBud,EAAIyT,WAAY,EACTzT,EAsFX,QAAS0T,cAAavQ,GAIlB,IAAK,GAAW1sC,GAAGk9C,EAHf/sD,EAASu8C,EAAIv8C,OACb08B,KAEK38B,EAAI,EAAgBC,EAAJD,EAAYA,IAAK,CAGtC,GAFA8P,EAAI0sC,EAAIyQ,WAAWjtD,GAEf8P,EAAI,OAAc,MAAJA,EAAY,CAE1B,IAAIk9C,EAWG,CACCl9C,EAAI,OAAW9P,EAAI,IAAMC,EAAS08B,EAAM9yB,KAAK,IAAM,IAAM,KACxDmjD,EAAOl9C,CAEZ,UAdA,GAAQ,MAAJA,EAAY,CACZ6sB,EAAM9yB,KAAK,IAAM,IAAM,KACvBmjD,EAAOl9C,CACP,UAGAA,EAAIk9C,EAAO,OAAU,GAAKl9C,EAAI,MAAS,MACvCk9C,EAAO,SAURA,KACPrwB,EAAM9yB,KAAK,IAAM,IAAM,KACvBmjD,EAAO,KAGH,KAAJl9C,EAAU6sB,EAAM9yB,KAAKiG,GACZ,KAAJA,EAAW6sB,EAAM9yB,KAAKiG,GAAK,EAAM,IAAU,GAAJA,EAAW,KAC9C,MAAJA,EAAa6sB,EAAM9yB,KAAKiG,GAAK,GAAM,IAAMA,GAAK,EAAM,GAAO,IAAU,GAAJA,EAAW,KAChF6sB,EAAM9yB,KAAKiG,GAAK,GAAO,IAAMA,GAAK,GAAM,GAAO,IAAMA,GAAK,EAAM,GAAO,IAAU,GAAJA,EAAW,KAEjG,MAAO6sB,GAxJX3lC,OAAOC,QAAUqiD,MAEjB,IAAI4T,SAAU/1D,QAAQ,WAElB01D,cA4BAM,QAASC,cAEbP,gBACItR,aAAc,SAASv2C,GACnB,OAASnM,KAAKmM,GACTnM,KAAKmM,EAAM,IAAM,EACjBnM,KAAKmM,EAAM,IAAM,IACD,SAAhBnM,KAAKmM,EAAM,IAGpBo4C,cAAe,SAASjC,EAAKn2C,GACzBnM,KAAKmM,GAAOm2C,EACZtiD,KAAKmM,EAAM,GAAMm2C,IAAQ,EACzBtiD,KAAKmM,EAAM,GAAMm2C,IAAQ,GACzBtiD,KAAKmM,EAAM,GAAMm2C,IAAQ,IAG7BM,YAAa,SAASz2C,GAClB,OAASnM,KAAKmM,GACTnM,KAAKmM,EAAM,IAAM,EACjBnM,KAAKmM,EAAM,IAAM,KACjBnM,KAAKmM,EAAM,IAAM,KAG1B62C,YAAc,SAAS72C,GAAO,MAAOkoD,SAAQG,KAAKx0D,KAAMmM,GAAK,EAAM,GAAI,IACvE+2C,aAAc,SAAS/2C,GAAO,MAAOkoD,SAAQG,KAAKx0D,KAAMmM,GAAK,EAAM,GAAI,IAEvE04C,aAAe,SAASvC,EAAKn2C,GAAO,MAAOkoD,SAAQzP,MAAM5kD,KAAMsiD,EAAKn2C,GAAK,EAAM,GAAI,IACnF24C,cAAe,SAASxC,EAAKn2C,GAAO,MAAOkoD,SAAQzP,MAAM5kD,KAAMsiD,EAAKn2C,GAAK,EAAM,GAAI,IAEnF8pC,SAAU,SAASwe,EAAUnvC,EAAOk1B,GAChC,GAAImJ,GAAM,GACN+Q,EAAM,EAEVpvC,GAAQA,GAAS,EACjBk1B,EAAM94C,KAAKgU,IAAI1V,KAAKoH,OAAQozC,GAAOx6C,KAAKoH,OAExC,KAAK,GAAID,GAAIme,EAAWk1B,EAAJrzC,EAASA,IAAK,CAC9B,GAAIwtD,GAAK30D,KAAKmH,EACJ,MAANwtD,GACAhR,GAAOiR,mBAAmBF,GAAOhQ,OAAOmQ,aAAaF,GACrDD,EAAM,IAENA,GAAO,IAAMC,EAAG1e,SAAS,IAMjC,MAFA0N,IAAOiR,mBAAmBF,IAK9B9P,MAAO,SAASjB,EAAKx3C,GAEjB,IAAK,GADD23B,GAAQ6f,IAAQ2Q,QAAUC,eAAiBL,aAAavQ,GACnDx8C,EAAI,EAAGA,EAAI28B,EAAM18B,OAAQD,IAC9BnH,KAAKmM,EAAMhF,GAAK28B,EAAM38B,IAI9BiX,MAAO,SAASkH,EAAOk1B,GACnB,MAAOx6C,MAAK80D,SAASxvC,EAAOk1B,IAGhCvX,KAAM,SAASud,EAAKr0C,GAChBA,EAAMA,GAAO,CACb,KAAK,GAAIhF,GAAI,EAAGA,EAAInH,KAAKoH,OAAQD,IAC7Bq5C,EAAIr0C,EAAMhF,GAAKnH,KAAKmH,KAKhC6sD,cAAcxP,aAAewP,cAAczP,cAE3C9D,OAAOkE,WAAa,SAAShB,GAGzB,MAFA2Q,SAAU3Q,EACV4Q,eAAiBL,aAAavQ,GACvB4Q,eAAentD,QAG1Bq5C,OAAOC,SAAW,SAASF,GACvB,SAAUA,IAAOA,EAAIyT;;;AbrHzB,YAMA,SAAS1T,KAAIC,GACTxgD,KAAKwgD,IAAOC,OAAOC,SAASF,GAA8BA,EAAvB,GAAIC,QAAOD,GAAO,GACrDxgD,KAAKmM,IAAM,EACXnM,KAAKoH,OAASpH,KAAKwgD,IAAIp5C,OAqZ3B,QAASu5C,mBAAkBC,EAAKrG,GAAS,IAAK,GAAIpzC,GAAI,EAAGA,EAAIy5C,EAAIx5C,OAAQD,IAAKozC,EAAIsG,YAAYD,EAAIz5C,IAClG,QAAS25C,oBAAmBF,EAAKrG,GAAQ,IAAK,GAAIpzC,GAAI,EAAGA,EAAIy5C,EAAIx5C,OAAQD,IAAKozC,EAAIwG,aAAaH,EAAIz5C,IACnG,QAAS65C,kBAAiBJ,EAAKrG,GAAU,IAAK,GAAIpzC,GAAI,EAAGA,EAAIy5C,EAAIx5C,OAAQD,IAAKozC,EAAI0G,WAAWL,EAAIz5C,IACjG,QAAS+5C,mBAAkBN,EAAKrG,GAAS,IAAK,GAAIpzC,GAAI,EAAGA,EAAIy5C,EAAIx5C,OAAQD,IAAKozC,EAAI4G,YAAYP,EAAIz5C,IAClG,QAASi6C,oBAAmBR,EAAKrG,GAAQ,IAAK,GAAIpzC,GAAI,EAAGA,EAAIy5C,EAAIx5C,OAAQD,IAAKozC,EAAI8G,aAAaT,EAAIz5C,IACnG,QAASm6C,oBAAmBV,EAAKrG,GAAQ,IAAK,GAAIpzC,GAAI,EAAGA,EAAIy5C,EAAIx5C,OAAQD,IAAKozC,EAAIgH,aAAaX,EAAIz5C,IACnG,QAASq6C,qBAAoBZ,EAAKrG,GAAO,IAAK,GAAIpzC,GAAI,EAAGA,EAAIy5C,EAAIx5C,OAAQD,IAAKozC,EAAIkH,cAAcb,EAAIz5C,IACpG,QAASu6C,oBAAmBd,EAAKrG,GAAQ,IAAK,GAAIpzC,GAAI,EAAGA,EAAIy5C,EAAIx5C,OAAQD,IAAKozC,EAAIoH,aAAaf,EAAIz5C,IACnG,QAASy6C,qBAAoBhB,EAAKrG,GAAO,IAAK,GAAIpzC,GAAI,EAAGA,EAAIy5C,EAAIx5C,OAAQD,IAAKozC,EAAIsH,cAAcjB,EAAIz5C,IApapGhJ,OAAOC,QAAUmiD,GAEjB,IAAIE,QAAS1G,OAAO0G,QAAUniD,QAAQ,WAQtCiiD,KAAIuB,OAAU,EACdvB,IAAIwB,QAAU,EACdxB,IAAIyB,MAAU,EACdzB,IAAI0B,QAAU,CAEd,IAAIC,eAAgB,WAChBC,eAAiB,EAAID,cACrBE,SAAW1gD,KAAKqS,IAAI,EAAG,GAE3BwsC,KAAItgD,WAEA26B,QAAS,WACL56B,KAAKwgD,IAAM,MAKf/F,WAAY,SAAS4H,EAAW5mC,EAAQ++B,GAGpC,IAFAA,EAAMA,GAAOx6C,KAAKoH,OAEXpH,KAAKmM,IAAMquC,GAAK,CACnB,GAAI8H,GAAMtiD,KAAKg7C,aACXL,EAAM2H,GAAO,EACbC,EAAWviD,KAAKmM,GAEpBk2C,GAAU1H,EAAKl/B,EAAQzb,MAEnBA,KAAKmM,MAAQo2C,GAAUviD,KAAKwiD,KAAKF,GAEzC,MAAO7mC,IAGXm/B,YAAa,SAASyH,EAAW5mC,GAC7B,MAAOzb,MAAKy6C,WAAW4H,EAAW5mC,EAAQzb,KAAKg7C,aAAeh7C,KAAKmM,MAGvEs2C,YAAa,WACT,GAAIH,GAAMtiD,KAAKwgD,IAAIkC,aAAa1iD,KAAKmM,IAErC,OADAnM,MAAKmM,KAAO,EACLm2C,GAGXK,aAAc,WACV,GAAIL,GAAMtiD,KAAKwgD,IAAIoC,YAAY5iD,KAAKmM,IAEpC,OADAnM,MAAKmM,KAAO,EACLm2C,GAKXO,YAAa,WACT,GAAIP,GAAMtiD,KAAKwgD,IAAIkC,aAAa1iD,KAAKmM,KAAOnM,KAAKwgD,IAAIkC,aAAa1iD,KAAKmM,IAAM,GAAK+1C,aAElF,OADAliD,MAAKmM,KAAO,EACLm2C,GAGXQ,aAAc,WACV,GAAIR,GAAMtiD,KAAKwgD,IAAIkC,aAAa1iD,KAAKmM,KAAOnM,KAAKwgD,IAAIoC,YAAY5iD,KAAKmM,IAAM,GAAK+1C,aAEjF,OADAliD,MAAKmM,KAAO,EACLm2C,GAGXS,UAAW,WACP,GAAIT,GAAMtiD,KAAKwgD,IAAIwC,YAAYhjD,KAAKmM,IAEpC,OADAnM,MAAKmM,KAAO,EACLm2C,GAGXW,WAAY,WACR,GAAIX,GAAMtiD,KAAKwgD,IAAI0C,aAAaljD,KAAKmM,IAErC,OADAnM,MAAKmM,KAAO,EACLm2C,GAGXtH,WAAY,WACR,GACIsH,GAAKlgD,EAAG+gD,EAAIC,EAAIC,EAAIC,EADpB9C,EAAMxgD,KAAKwgD,GAGO,IAAtB2C,EAAK3C,EAAIxgD,KAAKmM,OAAiB,IAALg3C,EAAW,MAAOA,EACtB,IAD0CA,EAAU,IAALA,EACrEC,EAAK5C,EAAIxgD,KAAKmM,OAAiB,IAALi3C,EAAW,MAAOD,GAAKC,GAAM,CACjC,IAD0CA,GAAW,IAALA,IAAc,EACpFC,EAAK7C,EAAIxgD,KAAKmM,OAAiB,IAALk3C,EAAW,MAAOF,GAAKC,EAAKC,GAAM,EACtC,IAD0CA,GAAW,IAALA,IAAc,GACpFC,EAAK9C,EAAIxgD,KAAKmM,OAAiB,IAALm3C,EAAW,MAAOH,GAAKC,EAAKC,EAAKC,GAAM,EAIJ,IAF7DhB,EAAMa,EAAKC,EAAKC,GAAW,IAALC,IAAc,GAEpClhD,EAAIo+C,EAAIxgD,KAAKmM,OAAQm2C,GAAoB,WAAR,IAAJlgD,GAAwC,IAAJA,EAAU,MAAOkgD,EACrB,IAA7DlgD,EAAIo+C,EAAIxgD,KAAKmM,OAAQm2C,GAAoB,aAAR,IAAJlgD,GAAwC,IAAJA,EAAU,MAAOkgD,EACrB,IAA7DlgD,EAAIo+C,EAAIxgD,KAAKmM,OAAQm2C,GAAoB,eAAR,IAAJlgD,GAAwC,IAAJA,EAAU,MAAOkgD,EACrB,IAA7DlgD,EAAIo+C,EAAIxgD,KAAKmM,OAAQm2C,GAAoB,iBAAR,IAAJlgD,GAAwC,IAAJA,EAAU,MAAOkgD,EACrB,IAA7DlgD,EAAIo+C,EAAIxgD,KAAKmM,OAAQm2C,GAAoB,mBAAR,IAAJlgD,GAAwC,IAAJA,EAAU,MAAOkgD,EACrB,IAA7DlgD,EAAIo+C,EAAIxgD,KAAKmM,OAAQm2C,GAAoB,oBAAR,IAAJlgD,GAAwC,IAAJA,EAAU,MAAOkgD,EAElF,MAAM,IAAInpC,OAAM,2CAGpBoqC,aAAc,WACV,GAAIhB,GAAWviD,KAAKmM,IAChBm2C,EAAMtiD,KAAKg7C,YAEf,IAAUoH,SAANE,EAAgB,MAAOA,EAG3B,KADA,GAAIn2C,GAAMnM,KAAKmM,IAAM,EACI,MAAlBnM,KAAKwgD,IAAIr0C,IAAeA,GACrBo2C,GAANp2C,IAAgBA,EAAMo2C,GAE1BD,EAAM,CACN,KAAK,GAAIn7C,GAAI,EAAOgF,EAAMo2C,EAAW,EAArBp7C,EAAwBA,IAAK,CACzC,GAAI/E,GAA8B,KAAzBpC,KAAKwgD,IAAI+B,EAAWp7C,EAC7Bm7C,IAAW,EAAJn7C,EAAQ/E,GAAS,EAAJ+E,EAAQ/E,EAAIV,KAAKqS,IAAI,EAAO,EAAJ5M,GAGhD,OAAQm7C,EAAM,GAGlBpH,YAAa,WACT,GAAIsI,GAAMxjD,KAAKg7C,YACf,OAAOwI,GAAM,IAAM,GAAKA,EAAM,GAAK,GAAKA,EAAM,GAGlDC,YAAa,WACT,MAAOC,SAAQ1jD,KAAKg7C,eAGxBF,WAAY,WACR,GAAIN,GAAMx6C,KAAKg7C,aAAeh7C,KAAKmM,IAC/Bw3C,EAAM3jD,KAAKwgD,IAAIvK,SAAS,OAAQj2C,KAAKmM,IAAKquC,EAE9C,OADAx6C,MAAKmM,IAAMquC,EACJmJ,GAGX1I,UAAW,WACP,GAAIT,GAAMx6C,KAAKg7C,aAAeh7C,KAAKmM,IAC/B8F,EAASjS,KAAKwgD,IAAIpiC,MAAMpe,KAAKmM,IAAKquC,EAEtC,OADAx6C,MAAKmM,IAAMquC,EACJvoC,GAKX2xC,iBAAkB,WAEd,IADA,GAAIpJ,GAAMx6C,KAAKg7C,aAAeh7C,KAAKmM,IAAKy0C,KACjC5gD,KAAKmM,IAAMquC,GAAKoG,EAAI5vC,KAAKhR,KAAKg7C,aACrC,OAAO4F,IAEXiD,kBAAmB,WAEf,IADA,GAAIrJ,GAAMx6C,KAAKg7C,aAAeh7C,KAAKmM,IAAKy0C,KACjC5gD,KAAKmM,IAAMquC,GAAKoG,EAAI5vC,KAAKhR,KAAKk7C,cACrC,OAAO0F,IAEXkD,kBAAmB,WAEf,IADA,GAAItJ,GAAMx6C,KAAKg7C,aAAeh7C,KAAKmM,IAAKy0C,KACjC5gD,KAAKmM,IAAMquC,GAAKoG,EAAI5vC,KAAKhR,KAAKyjD,cACrC,OAAO7C,IAEXmD,gBAAiB,WAEb,IADA,GAAIvJ,GAAMx6C,KAAKg7C,aAAeh7C,KAAKmM,IAAKy0C,KACjC5gD,KAAKmM,IAAMquC,GAAKoG,EAAI5vC,KAAKhR,KAAK+iD,YACrC,OAAOnC,IAEXoD,iBAAkB,WAEd,IADA,GAAIxJ,GAAMx6C,KAAKg7C,aAAeh7C,KAAKmM,IAAKy0C,KACjC5gD,KAAKmM,IAAMquC,GAAKoG,EAAI5vC,KAAKhR,KAAKijD,aACrC,OAAOrC,IAEXqD,kBAAmB,WAEf,IADA,GAAIzJ,GAAMx6C,KAAKg7C,aAAeh7C,KAAKmM,IAAKy0C,KACjC5gD,KAAKmM,IAAMquC,GAAKoG,EAAI5vC,KAAKhR,KAAKyiD,cACrC,OAAO7B,IAEXsD,mBAAoB,WAEhB,IADA,GAAI1J,GAAMx6C,KAAKg7C,aAAeh7C,KAAKmM,IAAKy0C,KACjC5gD,KAAKmM,IAAMquC,GAAKoG,EAAI5vC,KAAKhR,KAAK2iD,eACrC,OAAO/B,IAEXuD,kBAAmB,WAEf,IADA,GAAI3J,GAAMx6C,KAAKg7C,aAAeh7C,KAAKmM,IAAKy0C,KACjC5gD,KAAKmM,IAAMquC,GAAKoG,EAAI5vC,KAAKhR,KAAK6iD,cACrC,OAAOjC,IAEXwD,mBAAoB,WAEhB,IADA,GAAI5J,GAAMx6C,KAAKg7C,aAAeh7C,KAAKmM,IAAKy0C,KACjC5gD,KAAKmM,IAAMquC,GAAKoG,EAAI5vC,KAAKhR,KAAK8iD,eACrC,OAAOlC,IAGX4B,KAAM,SAASF,GACX,GAAIp0C,GAAa,EAANo0C,CACX,IAAIp0C,IAASqyC,IAAIuB,OAAQ,KAAO9hD,KAAKwgD,IAAIxgD,KAAKmM,OAAS,UAClD,IAAI+B,IAASqyC,IAAIyB,MAAOhiD,KAAKmM,IAAMnM,KAAKg7C,aAAeh7C,KAAKmM,QAC5D,IAAI+B,IAASqyC,IAAI0B,QAASjiD,KAAKmM,KAAO,MACtC,CAAA,GAAI+B,IAASqyC,IAAIwB,QACjB,KAAM,IAAI5oC,OAAM,uBAAyBjL,EADflO,MAAKmM,KAAO,IAM/Ck4C,SAAU,SAAS1J,EAAKzsC,GACpBlO,KAAK6gD,YAAalG,GAAO,EAAKzsC,IAGlCo2C,QAAS,SAAS5uC,GAGd,IAFA,GAAItO,GAASpH,KAAKoH,QAAU,GAErBA,EAASpH,KAAKmM,IAAMuJ,GAAKtO,GAAU,CAE1C,IAAIA,IAAWpH,KAAKoH,OAAQ,CACxB,GAAIo5C,GAAM,GAAIC,QAAOr5C,EACrBpH,MAAKwgD,IAAIvd,KAAKud,GACdxgD,KAAKwgD,IAAMA,EACXxgD,KAAKoH,OAASA,IAItByvB,OAAQ,WAGJ,MAFA72B,MAAKoH,OAASpH,KAAKmM,IACnBnM,KAAKmM,IAAM,EACJnM,KAAKwgD,IAAIpiC,MAAM,EAAGpe,KAAKoH,SAGlCm6C,aAAc,SAASe,GACnBtiD,KAAKskD,QAAQ,GACbtkD,KAAKwgD,IAAI+D,cAAcjC,EAAKtiD,KAAKmM,KACjCnM,KAAKmM,KAAO,GAGhBs1C,cAAe,SAASa,GACpBtiD,KAAKskD,QAAQ,GACbtkD,KAAKwgD,IAAIgE,aAAalC,EAAKtiD,KAAKmM,KAChCnM,KAAKmM,KAAO,GAGhBw1C,aAAc,SAASW,GACnBtiD,KAAKskD,QAAQ,GACbtkD,KAAKwgD,IAAIgE,aAAmB,GAANlC,EAAUtiD,KAAKmM,KACrCnM,KAAKwgD,IAAI+D,cAAc7iD,KAAKqU,MAAMusC,EAAMH,gBAAiBniD,KAAKmM,IAAM,GACpEnM,KAAKmM,KAAO,GAGhB01C,cAAe,SAASS,GACpBtiD,KAAKskD,QAAQ,GACbtkD,KAAKwgD,IAAIgE,aAAmB,GAANlC,EAAUtiD,KAAKmM,KACrCnM,KAAKwgD,IAAIgE,aAAa9iD,KAAKqU,MAAMusC,EAAMH,gBAAiBniD,KAAKmM,IAAM,GACnEnM,KAAKmM,KAAO,GAGhB00C,YAAa,SAASyB,GAGlB,GAFAA,GAAOA,EAEI,KAAPA,EACAtiD,KAAKskD,QAAQ,GACbtkD,KAAKwgD,IAAIxgD,KAAKmM,OAASm2C,MAEpB,IAAW,OAAPA,EACPtiD,KAAKskD,QAAQ,GACbtkD,KAAKwgD,IAAIxgD,KAAKmM,OAAWm2C,IAAQ,EAAK,IAAQ,IAC9CtiD,KAAKwgD,IAAIxgD,KAAKmM,OAAWm2C,IAAQ,EAAK,QAEnC,IAAW,SAAPA,EACPtiD,KAAKskD,QAAQ,GACbtkD,KAAKwgD,IAAIxgD,KAAKmM,OAAWm2C,IAAQ,EAAK,IAAQ,IAC9CtiD,KAAKwgD,IAAIxgD,KAAKmM,OAAWm2C,IAAQ,EAAK,IAAQ,IAC9CtiD,KAAKwgD,IAAIxgD,KAAKmM,OAAWm2C,IAAQ,GAAM,QAEpC,IAAW,WAAPA,EACPtiD,KAAKskD,QAAQ,GACbtkD,KAAKwgD,IAAIxgD,KAAKmM,OAAWm2C,IAAQ,EAAK,IAAQ,IAC9CtiD,KAAKwgD,IAAIxgD,KAAKmM,OAAWm2C,IAAQ,EAAK,IAAQ,IAC9CtiD,KAAKwgD,IAAIxgD,KAAKmM,OAAWm2C,IAAQ,GAAM,IAAQ,IAC/CtiD,KAAKwgD,IAAIxgD,KAAKmM,OAAWm2C,IAAQ,GAAM,QAEpC,CAEH,IADA,GAAIn2C,GAAMnM,KAAKmM,IACRm2C,GAAO,KACVtiD,KAAKskD,QAAQ,GACbtkD,KAAKwgD,IAAIxgD,KAAKmM,OAAgB,IAANm2C,EAAc,IACtCA,GAAO,GAIX,IAFAtiD,KAAKskD,QAAQ,GACbtkD,KAAKwgD,IAAIxgD,KAAKmM,OAAe,EAANm2C,EACnBtiD,KAAKmM,IAAMA,EAAM,GAAI,KAAM,IAAIgN,OAAM,4CAIjD4nC,aAAc,SAASuB,GACnBtiD,KAAK6gD,YAAkB,EAANyB,EAAiB,GAANA,EAAU,EAAU,EAANA,IAG9CjB,aAAc,SAASiB,GACnBtiD,KAAK6gD,YAAY6C,QAAQpB,KAG7BmC,YAAa,SAASd,GAClBA,EAAMe,OAAOf,EACb,IAAI7f,GAAQ2c,OAAOkE,WAAWhB,EAC9B3jD,MAAK6gD,YAAY/c,GACjB9jC,KAAKskD,QAAQxgB,GACb9jC,KAAKwgD,IAAIoE,MAAMjB,EAAK3jD,KAAKmM,KACzBnM,KAAKmM,KAAO23B,GAGhBmd,WAAY,SAASqB,GACjBtiD,KAAKskD,QAAQ,GACbtkD,KAAKwgD,IAAIqE,aAAavC,EAAKtiD,KAAKmM,KAChCnM,KAAKmM,KAAO,GAGhBg1C,YAAa,SAASmB,GAClBtiD,KAAKskD,QAAQ,GACbtkD,KAAKwgD,IAAIsE,cAAcxC,EAAKtiD,KAAKmM,KACjCnM,KAAKmM,KAAO,GAGhB44C,WAAY,SAAS9yC,GACjB,GAAI8K,GAAM9K,EAAO7K,MACjBpH,MAAK6gD,YAAY9jC,GACjB/c,KAAKskD,QAAQvnC,EACb,KAAK,GAAI5V,GAAI,EAAO4V,EAAJ5V,EAASA,IAAKnH,KAAKwgD,IAAIxgD,KAAKmM,OAAS8F,EAAO9K,IAGhE69C,aAAc,SAASrK,EAAKj9B,EAAIV,GAC5Bhd,KAAKqkD,SAAS1J,EAAK4F,IAAIyB,OAEvBhiD,KAAKmM,KAGL,IAAIo2C,GAAWviD,KAAKmM,GACpBuR,GAAGV,EAAKhd,KACR,IAAI+c,GAAM/c,KAAKmM,IAAMo2C,EAEjB0C,EACO,KAAPloC,EAAc,EACP,OAAPA,EAAgB,EACT,SAAPA,EAAkB,EACX,WAAPA,EAAmB,EAAIrb,KAAKqwB,KAAKrwB,KAAKsU,IAAI+G,IAAmB,EAAXrb,KAAKuU,KAG3D,IAAIgvC,EAAY,EAAG,CACfjlD,KAAKskD,QAAQW,EAAY,EACzB,KAAK,GAAI99C,GAAInH,KAAKmM,IAAM,EAAGhF,GAAKo7C,EAAUp7C,IAAKnH,KAAKwgD,IAAIr5C,EAAI89C,EAAY,GAAKjlD,KAAKwgD,IAAIr5C,GAI1FnH,KAAKmM,IAAMo2C,EAAW,EACtBviD,KAAK6gD,YAAY9jC,GACjB/c,KAAKmM,KAAO4Q,GAGhB4jC,kBAAqB,SAAShG,EAAKiG,GAAO5gD,KAAKglD,aAAarK,EAAKgG,kBAAmBC,IACpFE,mBAAqB,SAASnG,EAAKiG,GAAO5gD,KAAKglD,aAAarK,EAAKmG,mBAAoBF,IACrFQ,mBAAqB,SAASzG,EAAKiG,GAAO5gD,KAAKglD,aAAarK,EAAKyG,mBAAoBR,IACrFI,iBAAqB,SAASrG,EAAKiG,GAAO5gD,KAAKglD,aAAarK,EAAKqG,iBAAkBJ,IACnFM,kBAAqB,SAASvG,EAAKiG,GAAO5gD,KAAKglD,aAAarK,EAAKuG,kBAAmBN,IACpFU,mBAAqB,SAAS3G,EAAKiG,GAAO5gD,KAAKglD,aAAarK,EAAK2G,mBAAoBV,IACrFY,oBAAqB,SAAS7G,EAAKiG,GAAO5gD,KAAKglD,aAAarK,EAAK6G,oBAAqBZ,IACtFc,mBAAqB,SAAS/G,EAAKiG,GAAO5gD,KAAKglD,aAAarK,EAAK+G,mBAAoBd,IACrFgB,oBAAqB,SAASjH,EAAKiG,GAAO5gD,KAAKglD,aAAarK,EAAKiH,oBAAqBhB,IAEtFsE,gBAAiB,SAASvK,EAAK1oC,GAC3BjS,KAAKqkD,SAAS1J,EAAK4F,IAAIyB,OACvBhiD,KAAK+kD,WAAW9yC,IAEpBkzC,kBAAmB,SAASxK,EAAK2H,GAC7BtiD,KAAKqkD,SAAS1J,EAAK4F,IAAI0B,SACvBjiD,KAAKuhD,aAAae,IAEtB8C,mBAAoB,SAASzK,EAAK2H,GAC9BtiD,KAAKqkD,SAAS1J,EAAK4F,IAAI0B,SACvBjiD,KAAKyhD,cAAca,IAEvB+C,kBAAmB,SAAS1K,EAAK2H,GAC7BtiD,KAAKqkD,SAAS1J,EAAK4F,IAAIwB,SACvB/hD,KAAK2hD,aAAaW,IAEtBgD,mBAAoB,SAAS3K,EAAK2H,GAC9BtiD,KAAKqkD,SAAS1J,EAAK4F,IAAIwB,SACvB/hD,KAAK6hD,cAAcS,IAEvBiD,iBAAkB,SAAS5K,EAAK2H,GAC5BtiD,KAAKqkD,SAAS1J,EAAK4F,IAAIuB,QACvB9hD,KAAK6gD,YAAYyB,IAErBkD,kBAAmB,SAAS7K,EAAK2H,GAC7BtiD,KAAKqkD,SAAS1J,EAAK4F,IAAIuB,QACvB9hD,KAAK+gD,aAAauB,IAEtBmD,iBAAkB,SAAS9K,EAAKgJ,GAC5B3jD,KAAKqkD,SAAS1J,EAAK4F,IAAIyB,OACvBhiD,KAAKykD,YAAYd,IAErB+B,gBAAiB,SAAS/K,EAAK2H,GAC3BtiD,KAAKqkD,SAAS1J,EAAK4F,IAAI0B,SACvBjiD,KAAKihD,WAAWqB,IAEpBqD,iBAAkB,SAAShL,EAAK2H,GAC5BtiD,KAAKqkD,SAAS1J,EAAK4F,IAAIwB,SACvB/hD,KAAKmhD,YAAYmB,IAErBsD,kBAAmB,SAASjL,EAAK2H,GAC7BtiD,KAAKulD,iBAAiB5K,EAAK+I,QAAQpB;;;;AsB1Z3ClkD,QAAQo2D,KAAO,SAAUviD,EAAQkd,EAAQguC,EAAMC,EAAMC,GACnD,GAAIpvD,GAAGhN,EACHq8D,EAAgB,EAATD,EAAaD,EAAO,EAC3BG,GAAQ,GAAKD,GAAQ,EACrBE,EAAQD,GAAQ,EAChBE,EAAQ,GACRt2D,EAAIg2D,EAAQE,EAAS,EAAK,EAC1Bj+C,EAAI+9C,EAAO,GAAK,EAChBl1C,EAAIhW,EAAOkd,EAAShoB,EAOxB,KALAA,GAAKiY,EAELnR,EAAIga,GAAM,IAAOw1C,GAAU,EAC3Bx1C,KAAQw1C,EACRA,GAASH,EACFG,EAAQ,EAAGxvD,EAAQ,IAAJA,EAAUgE,EAAOkd,EAAShoB,GAAIA,GAAKiY,EAAGq+C,GAAS,GAKrE,IAHAx8D,EAAIgN,GAAM,IAAOwvD,GAAU,EAC3BxvD,KAAQwvD,EACRA,GAASL,EACFK,EAAQ,EAAGx8D,EAAQ,IAAJA,EAAUgR,EAAOkd,EAAShoB,GAAIA,GAAKiY,EAAGq+C,GAAS,GAErE,GAAU,IAANxvD,EACFA,EAAI,EAAIuvD,MACH,CAAA,GAAIvvD,IAAMsvD,EACf,MAAOt8D,GAAIy8D,KAAQz1C,EAAI,GAAK,IAAKrT,EAAAA,EAEjC3T,IAAQS,KAAKqS,IAAI,EAAGqpD,GACpBnvD,GAAQuvD,EAEV,OAAQv1C,EAAI,GAAK,GAAKhnB,EAAIS,KAAKqS,IAAI,EAAG9F,EAAImvD,IAG5Ch/D,QAAQwmD,MAAQ,SAAU3yC,EAAQjH,EAAOmkB,EAAQguC,EAAMC,EAAMC,GAC3D,GAAIpvD,GAAGhN,EAAGgW,EACNqmD,EAAgB,EAATD,EAAaD,EAAO,EAC3BG,GAAQ,GAAKD,GAAQ,EACrBE,EAAQD,GAAQ,EAChBI,EAAe,KAATP,EAAc17D,KAAKqS,IAAI,EAAG,KAAOrS,KAAKqS,IAAI,EAAG,KAAO,EAC1D5M,EAAIg2D,EAAO,EAAKE,EAAS,EACzBj+C,EAAI+9C,EAAO,EAAI,GACfl1C,EAAY,EAARjd,GAAwB,IAAVA,GAA2B,EAAZ,EAAIA,EAAa,EAAI,CAmC1D,KAjCAA,EAAQtJ,KAAK8yB,IAAIxpB,GAEb0R,MAAM1R,IAAUA,IAAU4J,EAAAA,GAC5B3T,EAAIyb,MAAM1R,GAAS,EAAI,EACvBiD,EAAIsvD,IAEJtvD,EAAIvM,KAAKqU,MAAMrU,KAAKsU,IAAIhL,GAAStJ,KAAKuU,KAClCjL,GAASiM,EAAIvV,KAAKqS,IAAI,GAAI9F,IAAM,IAClCA,IACAgJ,GAAK,GAGLjM,GADEiD,EAAIuvD,GAAS,EACNG,EAAK1mD,EAEL0mD,EAAKj8D,KAAKqS,IAAI,EAAG,EAAIypD,GAE5BxyD,EAAQiM,GAAK,IACfhJ,IACAgJ,GAAK,GAGHhJ,EAAIuvD,GAASD,GACft8D,EAAI,EACJgN,EAAIsvD,GACKtvD,EAAIuvD,GAAS,GACtBv8D,GAAK+J,EAAQiM,EAAI,GAAKvV,KAAKqS,IAAI,EAAGqpD,GAClCnvD,GAAQuvD,IAERv8D,EAAI+J,EAAQtJ,KAAKqS,IAAI,EAAGypD,EAAQ,GAAK97D,KAAKqS,IAAI,EAAGqpD,GACjDnvD,EAAI,IAIDmvD,GAAQ,EAAGnrD,EAAOkd,EAAShoB,GAAS,IAAJlG,EAAUkG,GAAKiY,EAAGne,GAAK,IAAKm8D,GAAQ,GAI3E,IAFAnvD,EAAKA,GAAKmvD,EAAQn8D,EAClBq8D,GAAQF,EACDE,EAAO,EAAGrrD,EAAOkd,EAAShoB,GAAS,IAAJ8G,EAAU9G,GAAKiY,EAAGnR,GAAK,IAAKqvD,GAAQ,GAE1ErrD,EAAOkd,EAAShoB,EAAIiY,IAAU,IAAJ6I;;A3FlF5B,YAIA,SAASjpB,OAAMc,EAAGC,GACdC,KAAKF,EAAIA,EACTE,KAAKD,EAAIA,EAJb5B,OAAOC,QAAUY,MAOjBA,MAAMiB,WACFC,MAAO,WAAa,MAAO,IAAIlB,OAAMgB,KAAKF,EAAGE,KAAKD,IAElDI,IAAS,SAASC,GAAK,MAAOJ,MAAKE,QAAQG,KAAKD,IAChDE,IAAS,SAASF,GAAK,MAAOJ,MAAKE,QAAQK,KAAKH,IAChDI,KAAS,SAASC,GAAK,MAAOT,MAAKE,QAAQQ,MAAMD,IACjDE,IAAS,SAASF,GAAK,MAAOT,MAAKE,QAAQU,KAAKH,IAChDI,OAAS,SAASC,GAAK,MAAOd,MAAKE,QAAQa,QAAQD,IACnDE,QAAS,SAASC,GAAK,MAAOjB,MAAKE,QAAQgB,SAASD,IACpDE,KAAS,WAAa,MAAOnB,MAAKE,QAAQkB,SAC1CC,KAAS,WAAa,MAAOrB,MAAKE,QAAQoB,SAC1CC,MAAS,WAAa,MAAOvB,MAAKE,QAAQsB,UAE1CC,IAAK,WACD,MAAOC,MAAKC,KAAK3B,KAAKF,EAAIE,KAAKF,EAAIE,KAAKD,EAAIC,KAAKD,IAGrD6B,OAAQ,SAASxB,GACb,MAAOJ,MAAKF,IAAMM,EAAEN,GACbE,KAAKD,IAAMK,EAAEL,GAGxB8B,KAAM,SAASzB,GACX,MAAOsB,MAAKC,KAAK3B,KAAK8B,QAAQ1B,KAGlC0B,QAAS,SAAS1B,GACd,GAAI2B,GAAK3B,EAAEN,EAAIE,KAAKF,EAChBkC,EAAK5B,EAAEL,EAAIC,KAAKD,CACpB,OAAOgC,GAAKA,EAAKC,EAAKA,GAG1BC,MAAO,WACH,MAAOP,MAAKQ,MAAMlC,KAAKD,EAAGC,KAAKF,IAGnCqC,QAAS,SAASC,GACd,MAAOV,MAAKQ,MAAMlC,KAAKD,EAAIqC,EAAErC,EAAGC,KAAKF,EAAIsC,EAAEtC,IAG/CuC,UAAW,SAASD,GAChB,MAAOpC,MAAKsC,aAAaF,EAAEtC,EAAGsC,EAAErC,IAIpCuC,aAAc,SAASxC,EAAGC,GACtB,MAAO2B,MAAKQ,MACRlC,KAAKF,EAAIC,EAAIC,KAAKD,EAAID,EACtBE,KAAKF,EAAIA,EAAIE,KAAKD,EAAIA,IAG9BmB,SAAU,SAASD,GACf,GAAInB,GAAImB,EAAE,GAAKjB,KAAKF,EAAImB,EAAE,GAAKjB,KAAKD,EAChCA,EAAIkB,EAAE,GAAKjB,KAAKF,EAAImB,EAAE,GAAKjB,KAAKD,CAGpC,OAFAC,MAAKF,EAAIA,EACTE,KAAKD,EAAIA,EACFC,MAGXK,KAAM,SAASD,GAGX,MAFAJ,MAAKF,GAAKM,EAAEN,EACZE,KAAKD,GAAKK,EAAEL,EACLC,MAGXO,KAAM,SAASH,GAGX,MAFAJ,MAAKF,GAAKM,EAAEN,EACZE,KAAKD,GAAKK,EAAEL,EACLC,MAGXU,MAAO,SAASD,GAGZ,MAFAT,MAAKF,GAAKW,EACVT,KAAKD,GAAKU,EACHT,MAGXY,KAAM,SAASH,GAGX,MAFAT,MAAKF,GAAKW,EACVT,KAAKD,GAAKU,EACHT,MAGXoB,MAAO,WAEH,MADApB,MAAKY,KAAKZ,KAAKyB,OACRzB,MAGXsB,MAAO,WACH,GAAIvB,GAAIC,KAAKD,CAGb,OAFAC,MAAKD,EAAIC,KAAKF,EACdE,KAAKF,GAAKC,EACHC,MAGXe,QAAS,SAASkB,GACd,GAAIM,GAAMb,KAAKa,IAAIN,GACfO,EAAMd,KAAKc,IAAIP,GACfnC,EAAIyC,EAAMvC,KAAKF,EAAI0C,EAAMxC,KAAKD,EAC9BA,EAAIyC,EAAMxC,KAAKF,EAAIyC,EAAMvC,KAAKD,CAGlC,OAFAC,MAAKF,EAAIA,EACTE,KAAKD,EAAIA,EACFC,MAGXwB,OAAQ,WAGJ,MAFAxB,MAAKF,EAAI4B,KAAKH,MAAMvB,KAAKF,GACzBE,KAAKD,EAAI2B,KAAKH,MAAMvB,KAAKD,GAClBC,OAKfhB,MAAMyD,QAAU,SAAU3B,GACtB,MAAIA,aAAa9B,OACN8B,EAEP4B,MAAMC,QAAQ7B,GACP,GAAI9B,OAAM8B,EAAE,GAAIA,EAAE,IAEtBA;;C6H3HX,WAAe,YAEf,SAASq2E,GAAMwK,EAAYxsB,GAGvB,MAAMn1D,gBAAgBm3E,IAGtBn3E,KAAK4hF,YAAclgF,KAAKmU,IAAI,EAAG8rE,GAAc,GAC7C3hF,KAAK6hF,YAAcngF,KAAKmU,IAAI,EAAGnU,KAAKqwB,KAAwB,GAAnB/xB,KAAK4hF,cAE1CzsB,GACAn1D,KAAK8hF,YAAY3sB,OAGrBn1D,MAAK0qB,SAVgC,GAAIysD,GAAMwK,EAAYxsB,GAkd/D,QAASqf,GAAS3jE,EAAMkxE,GACpBlxE,EAAK83D,KAAOqZ,EAASnxE,EAAM,EAAGA,EAAK4nB,SAASrxB,OAAQ26E,GAIxD,QAASC,GAASnxE,EAAMpQ,EAAGL,EAAG2hF,GAG1B,IAAK,GAAW3xE,GAFZu4D,EAAOsZ,IAEF96E,EAAI1G,EAAcL,EAAJ+G,EAAOA,IAC1BiJ,EAAQS,EAAK4nB,SAAStxB,GACtBrB,EAAO6iE,EAAM93D,EAAKqxE,KAAOH,EAAO3xE,GAASA,EAAMu4D,KAGnD,OAAOA,GAGX,QAASsZ,KAAU,OAAQrtE,EAAAA,EAAUA,EAAAA,IAAWA,EAAAA,KAAWA,EAAAA,IAE3D,QAAS9O,GAAOhF,EAAGsB,GAKf,MAJAtB,GAAE,GAAKY,KAAKgU,IAAI5U,EAAE,GAAIsB,EAAE,IACxBtB,EAAE,GAAKY,KAAKgU,IAAI5U,EAAE,GAAIsB,EAAE,IACxBtB,EAAE,GAAKY,KAAKmU,IAAI/U,EAAE,GAAIsB,EAAE,IACxBtB,EAAE,GAAKY,KAAKmU,IAAI/U,EAAE,GAAIsB,EAAE,IACjBtB,EAGX,QAASqhF,GAAgBrhF,EAAGsB,GAAK,MAAOtB,GAAE6nE,KAAK,GAAKvmE,EAAEumE,KAAK,GAC3D,QAASyZ,GAAgBthF,EAAGsB,GAAK,MAAOtB,GAAE6nE,KAAK,GAAKvmE,EAAEumE,KAAK,GAE3D,QAAS0Z,GAASvhF,GAAO,OAAQA,EAAE,GAAKA,EAAE,KAAOA,EAAE,GAAKA,EAAE,IAC1D,QAASwhF,GAAWxhF,GAAK,MAAQA,GAAE,GAAKA,EAAE,IAAOA,EAAE,GAAKA,EAAE,IAE1D,QAASyhF,GAAazhF,EAAGsB,GACrB,OAAQV,KAAKmU,IAAIzT,EAAE,GAAItB,EAAE,IAAMY,KAAKgU,IAAItT,EAAE,GAAItB,EAAE,MACxCY,KAAKmU,IAAIzT,EAAE,GAAItB,EAAE,IAAMY,KAAKgU,IAAItT,EAAE,GAAItB,EAAE,KAGpD,QAAS0hF,GAAiB1hF,EAAGsB,GACzB,GAAIkT,GAAO5T,KAAKmU,IAAI/U,EAAE,GAAIsB,EAAE,IACxBmT,EAAO7T,KAAKmU,IAAI/U,EAAE,GAAIsB,EAAE,IACxBoT,EAAO9T,KAAKgU,IAAI5U,EAAE,GAAIsB,EAAE,IACxBqT,EAAO/T,KAAKgU,IAAI5U,EAAE,GAAIsB,EAAE,GAE5B,OAAOV,MAAKmU,IAAI,EAAGL,EAAOF,GACnB5T,KAAKmU,IAAI,EAAGJ,EAAOF,GAG9B,QAASktE,GAAS3hF,EAAGsB,GACjB,MAAOtB,GAAE,IAAMsB,EAAE,IACVtB,EAAE,IAAMsB,EAAE,IACVA,EAAE,IAAMtB,EAAE,IACVsB,EAAE,IAAMtB,EAAE,GAGrB,QAAS4hF,GAAW5hF,EAAGsB,GACnB,MAAOA,GAAE,IAAMtB,EAAE,IACVsB,EAAE,IAAMtB,EAAE,IACVsB,EAAE,IAAMtB,EAAE,IACVsB,EAAE,IAAMtB,EAAE,GAMrB,QAAS6hF,GAAY/hC,EAAKnvC,EAAMC,EAAOyN,EAAGyjE,GAItC,IAHA,GACIC,GADAxjD,GAAS5tB,EAAMC,GAGZ2tB,EAAMj4B,QACTsK,EAAQ2tB,EAAM3R,MACdjc,EAAO4tB,EAAM3R,MAEOvO,GAAhBzN,EAAQD,IAEZoxE,EAAMpxE,EAAO/P,KAAKqwB,MAAMrgB,EAAQD,GAAQ0N,EAAI,GAAKA,EACjD2jE,EAAOliC,EAAKnvC,EAAMC,EAAOmxE,EAAKD,GAE9BvjD,EAAMruB,KAAKS,EAAMoxE,EAAKA,EAAKnxE,IAMnC,QAASoxE,GAAOliC,EAAKnvC,EAAMC,EAAOjR,EAAGmiF,GAGjC,IAFA,GAAIzjE,GAAGhY,EAAG2M,EAAGmU,EAAG86D,EAAIC,EAASC,EAAU1kE,EAAGwiB,EAEnCrvB,EAAQD,GAAM,CAmBjB,IAlBIC,EAAQD,EAAO,MACf0N,EAAIzN,EAAQD,EAAO,EACnBtK,EAAI1G,EAAIgR,EAAO,EACfqC,EAAIpS,KAAKsU,IAAImJ,GACb8I,EAAI,GAAMvmB,KAAKutB,IAAI,EAAInb,EAAI,GAC3BivE,EAAK,GAAMrhF,KAAKC,KAAKmS,EAAImU,GAAK9I,EAAI8I,GAAK9I,IAAkB,EAAZhY,EAAIgY,EAAI,EAAQ,GAAK,GAClE6jE,EAAUthF,KAAKmU,IAAIpE,EAAM/P,KAAKqU,MAAMtV,EAAI0G,EAAI8gB,EAAI9I,EAAI4jE,IACpDE,EAAWvhF,KAAKgU,IAAIhE,EAAOhQ,KAAKqU,MAAMtV,GAAK0e,EAAIhY,GAAK8gB,EAAI9I,EAAI4jE,IAC5DD,EAAOliC,EAAKoiC,EAASC,EAAUxiF,EAAGmiF,IAGtCrkE,EAAIqiC,EAAIngD,GACR0G,EAAIsK,EACJsvB,EAAIrvB,EAEJwxE,EAAKtiC,EAAKnvC,EAAMhR,GACZmiF,EAAQhiC,EAAIlvC,GAAQ6M,GAAK,GAAG2kE,EAAKtiC,EAAKnvC,EAAMC,GAErCqvB,EAAJ55B,GAAO,CAIV,IAHA+7E,EAAKtiC,EAAKz5C,EAAG45B,GACb55B,IACA45B,IACO6hD,EAAQhiC,EAAIz5C,GAAIoX,GAAK,GAAGpX,GAC/B,MAAOy7E,EAAQhiC,EAAI7f,GAAIxiB,GAAK,GAAGwiB,IAGL,IAA1B6hD,EAAQhiC,EAAInvC,GAAO8M,GAAU2kE,EAAKtiC,EAAKnvC,EAAMsvB,IAE7CA,IACAmiD,EAAKtiC,EAAK7f,EAAGrvB,IAGRjR,GAALsgC,IAAQtvB,EAAOsvB,EAAI,GACdA,GAALtgC,IAAQiR,EAAQqvB,EAAI,IAIhC,QAASmiD,GAAKtiC,EAAKz5C,EAAG45B,GAClB,GAAI2zB,GAAM9T,EAAIz5C,EACdy5C,GAAIz5C,GAAKy5C,EAAI7f,GACb6f,EAAI7f,GAAK2zB,EApkBbyiB,EAAMl3E,WAEFkjF,IAAK,WACD,MAAOnjF,MAAKojF,KAAKpjF,KAAK8R,UAG1B+lE,OAAQ,SAAUlP,GAEd,GAAI93D,GAAO7Q,KAAK8R,KACZ2J,KACAsmE,EAAS/hF,KAAK+hF,MAElB,KAAKW,EAAW/Z,EAAM93D,EAAK83D,MAAO,MAAOltD,EAKzC,KAHA,GACItU,GAAG4V,EAAK3M,EAAOizE,EADfC,KAGGzyE,GAAM,CACT,IAAK1J,EAAI,EAAG4V,EAAMlM,EAAK4nB,SAASrxB,OAAY2V,EAAJ5V,EAASA,IAE7CiJ,EAAQS,EAAK4nB,SAAStxB,GACtBk8E,EAAYxyE,EAAKqxE,KAAOH,EAAO3xE,GAASA,EAAMu4D,KAE1C+Z,EAAW/Z,EAAM0a,KACbxyE,EAAKqxE,KAAMzmE,EAAOzK,KAAKZ,GAClBqyE,EAAS9Z,EAAM0a,GAAYrjF,KAAKojF,KAAKhzE,EAAOqL,GAChD6nE,EAActyE,KAAKZ,GAGhCS,GAAOyyE,EAAc51D,MAGzB,MAAOjS,IAGX8nE,SAAU,SAAU5a,GAEhB,GAAI93D,GAAO7Q,KAAK8R,KACZiwE,EAAS/hF,KAAK+hF,MAElB,KAAKW,EAAW/Z,EAAM93D,EAAK83D,MAAO,OAAO,CAKzC,KAHA,GACIxhE,GAAG4V,EAAK3M,EAAOizE,EADfC,KAGGzyE,GAAM,CACT,IAAK1J,EAAI,EAAG4V,EAAMlM,EAAK4nB,SAASrxB,OAAY2V,EAAJ5V,EAASA,IAK7C,GAHAiJ,EAAQS,EAAK4nB,SAAStxB,GACtBk8E,EAAYxyE,EAAKqxE,KAAOH,EAAO3xE,GAASA,EAAMu4D,KAE1C+Z,EAAW/Z,EAAM0a,GAAY,CAC7B,GAAIxyE,EAAKqxE,MAAQO,EAAS9Z,EAAM0a,GAAY,OAAO,CACnDC,GAActyE,KAAKZ,GAG3BS,EAAOyyE,EAAc51D,MAGzB,OAAO,GAGXnb,KAAM,SAAUT,GACZ,IAAMA,IAAQA,EAAK1K,OAAS,MAAOpH,KAEnC,IAAI8R,EAAK1K,OAASpH,KAAK6hF,YAAa,CAChC,IAAK,GAAI16E,GAAI,EAAG4V,EAAMjL,EAAK1K,OAAY2V,EAAJ5V,EAASA,IACxCnH,KAAK0oE,OAAO52D,EAAK3K,GAErB,OAAOnH,MAIX,GAAI6Q,GAAO7Q,KAAKwjF,OAAO1xE,EAAKsM,QAAS,EAAGtM,EAAK1K,OAAS,EAAG,EAEzD,IAAKpH,KAAK8R,KAAK2mB,SAASrxB,OAIjB,GAAIpH,KAAK8R,KAAKrK,SAAWoJ,EAAKpJ,OAEjCzH,KAAKyjF,WAAWzjF,KAAK8R,KAAMjB,OAExB,CACH,GAAI7Q,KAAK8R,KAAKrK,OAASoJ,EAAKpJ,OAAQ,CAEhC,GAAIi8E,GAAU1jF,KAAK8R,IACnB9R,MAAK8R,KAAOjB,EACZA,EAAO6yE,EAIX1jF,KAAK2jF,QAAQ9yE,EAAM7Q,KAAK8R,KAAKrK,OAASoJ,EAAKpJ,OAAS,GAAG,OAfvDzH,MAAK8R,KAAOjB,CAkBhB,OAAO7Q,OAGX0oE,OAAQ,SAAUkb,GAEd,MADIA,IAAM5jF,KAAK2jF,QAAQC,EAAM5jF,KAAK8R,KAAKrK,OAAS,GACzCzH,MAGX0qB,MAAO,WAOH,MANA1qB,MAAK8R,MACD2mB,YACAhxB,OAAQ,EACRkhE,KAAMsZ,IACNC,MAAM,GAEHliF,MAGX8N,OAAQ,SAAU81E,GACd,IAAKA,EAAM,MAAO5jF,KASlB,KAPA,GAIImH,GAAG6Y,EAAQ8f,EAAO+jD,EAJlBhzE,EAAO7Q,KAAK8R,KACZ62D,EAAO3oE,KAAK+hF,OAAO6B,GACnBE,KACAC,KAIGlzE,GAAQizE,EAAK18E,QAAQ,CASxB,GAPKyJ,IACDA,EAAOizE,EAAKp2D,MACZ1N,EAAS8jE,EAAKA,EAAK18E,OAAS,GAC5BD,EAAI48E,EAAQr2D,MACZm2D,GAAU,GAGVhzE,EAAKqxE,OACLpiD,EAAQjvB,EAAK4nB,SAAS3a,QAAQ8lE,GAEhB,KAAV9jD,GAKA,MAHAjvB,GAAK4nB,SAAS1a,OAAO+hB,EAAO,GAC5BgkD,EAAK9yE,KAAKH,GACV7Q,KAAKgkF,UAAUF,GACR9jF,IAIV6jF,IAAYhzE,EAAKqxE,OAAQO,EAAS5xE,EAAK83D,KAAMA,GAOvC3oD,GACP7Y,IACA0J,EAAOmP,EAAOyY,SAAStxB,GACvB08E,GAAU,GAEPhzE,EAAO,MAXVizE,EAAK9yE,KAAKH,GACVkzE,EAAQ/yE,KAAK7J,GACbA,EAAI,EACJ6Y,EAASnP,EACTA,EAAOA,EAAK4nB,SAAS,IAU7B,MAAOz4B,OAGX+hF,OAAQ,SAAU6B,GAAQ,MAAOA,IAEjCK,YAAa,SAAUnjF,EAAGsB,GAAK,MAAOtB,GAAE,GAAKsB,EAAE,IAC/C8hF,YAAa,SAAUpjF,EAAGsB,GAAK,MAAOtB,GAAE,GAAKsB,EAAE,IAE/Cg8B,OAAQ,WAAc,MAAOp+B,MAAK8R,MAElCqyE,SAAU,SAAUryE,GAEhB,MADA9R,MAAK8R,KAAOA,EACL9R,MAGXojF,KAAM,SAAUvyE,EAAM4K,GAElB,IADA,GAAI6nE,MACGzyE,GACCA,EAAKqxE,KAAMzmE,EAAOzK,KAAK8P,MAAMrF,EAAQ5K,EAAK4nB,UACzC6qD,EAActyE,KAAK8P,MAAMwiE,EAAezyE,EAAK4nB,UAElD5nB,EAAOyyE,EAAc51D,KAEzB,OAAOjS,IAGX+nE,OAAQ,SAAUY,EAAO3yE,EAAMC,EAAOjK,GAElC,GAEIoJ,GAFAqqD,EAAIxpD,EAAQD,EAAO,EACnBwpD,EAAIj7D,KAAK4hF,WAGb,IAAS3mB,GAALC,EASA,MAPArqD,IACI4nB,SAAU2rD,EAAMhmE,MAAM3M,EAAMC,EAAQ,GACpCjK,OAAQ,EACRkhE,KAAM,KACNuZ,MAAM,GAEV1N,EAAS3jE,EAAM7Q,KAAK+hF,QACblxE,CAGNpJ,KAEDA,EAAS/F,KAAKqwB,KAAKrwB,KAAKsU,IAAIklD,GAAKx5D,KAAKsU,IAAIilD,IAG1CA,EAAIv5D,KAAKqwB,KAAKmpC,EAAIx5D,KAAKqS,IAAIknD,EAAGxzD,EAAS,KAK3CoJ,GACI4nB,YACAhxB,OAAQA,EACRkhE,KAAM,KAKV,IAEIxhE,GAAG45B,EAAGsjD,EAAQC,EAFdC,EAAK7iF,KAAKqwB,KAAKmpC,EAAID,GACnBupB,EAAKD,EAAK7iF,KAAKqwB,KAAKrwB,KAAKC,KAAKs5D,GAKlC,KAFA0nB,EAAYyB,EAAO3yE,EAAMC,EAAO8yE,EAAIxkF,KAAKikF,aAEpC98E,EAAIsK,EAAWC,GAALvK,EAAYA,GAAKq9E,EAM5B,IAJAH,EAAS3iF,KAAKgU,IAAIvO,EAAIq9E,EAAK,EAAG9yE,GAE9BixE,EAAYyB,EAAOj9E,EAAGk9E,EAAQE,EAAIvkF,KAAKkkF,aAElCnjD,EAAI55B,EAAQk9E,GAALtjD,EAAaA,GAAKwjD,EAE1BD,EAAS5iF,KAAKgU,IAAIqrB,EAAIwjD,EAAK,EAAGF,GAG9BxzE,EAAK4nB,SAASznB,KAAKhR,KAAKwjF,OAAOY,EAAOrjD,EAAGujD,EAAQ78E,EAAS,GAMlE,OAFA+sE,GAAS3jE,EAAM7Q,KAAK+hF,QAEblxE,GAGX4zE,eAAgB,SAAU9b,EAAM93D,EAAM6zE,EAAOZ,GAIzC,IAFA,GAAI38E,GAAG4V,EAAK3M,EAAOu0E,EAAY7P,EAAM8P,EAAaC,EAASC,IAE9C,CAGT,GAFAhB,EAAK9yE,KAAKH,GAENA,EAAKqxE,MAAQ4B,EAAK18E,OAAS,IAAMs9E,EAAO,KAI5C,KAFAG,EAAUC,EAAiBlwE,EAAAA,EAEtBzN,EAAI,EAAG4V,EAAMlM,EAAK4nB,SAASrxB,OAAY2V,EAAJ5V,EAASA,IAC7CiJ,EAAQS,EAAK4nB,SAAStxB,GACtB2tE,EAAOuN,EAASjyE,EAAMu4D,MACtBic,EAAcrC,EAAa5Z,EAAMv4D,EAAMu4D,MAAQmM,EAG7BgQ,EAAdF,GACAE,EAAiBF,EACjBC,EAAiBA,EAAP/P,EAAiBA,EAAO+P,EAClCF,EAAav0E,GAENw0E,IAAgBE,GAEZD,EAAP/P,IACA+P,EAAU/P,EACV6P,EAAav0E,EAKzBS,GAAO8zE,EAGX,MAAO9zE,IAGX8yE,QAAS,SAAUC,EAAMc,EAAOK,GAE5B,GAAIhD,GAAS/hF,KAAK+hF,OACdpZ,EAAOoc,EAASnB,EAAKjb,KAAOoZ,EAAO6B,GACnCoB,KAGAn0E,EAAO7Q,KAAKykF,eAAe9b,EAAM3oE,KAAK8R,KAAM4yE,EAAOM,EAOvD,KAJAn0E,EAAK4nB,SAASznB,KAAK4yE,GACnB99E,EAAO+K,EAAK83D,KAAMA,GAGX+b,GAAS,GACRM,EAAWN,GAAOjsD,SAASrxB,OAASpH,KAAK4hF,aACzC5hF,KAAKilF,OAAOD,EAAYN,GACxBA,GAKR1kF,MAAKklF,oBAAoBvc,EAAMqc,EAAYN,IAI/CO,OAAQ,SAAUD,EAAYN,GAE1B,GAAI7zE,GAAOm0E,EAAWN,GAClBzpB,EAAIpqD,EAAK4nB,SAASrxB,OAClBnG,EAAIjB,KAAK6hF,WAEb7hF,MAAKmlF,iBAAiBt0E,EAAM5P,EAAGg6D,EAE/B,IAAImqB,IACA3sD,SAAU5nB,EAAK4nB,SAAS1a,OAAO/d,KAAKqlF,kBAAkBx0E,EAAM5P,EAAGg6D,IAC/DxzD,OAAQoJ,EAAKpJ,OAGboJ,GAAKqxE,OAAMkD,EAAQlD,MAAO,GAE9B1N,EAAS3jE,EAAM7Q,KAAK+hF,QACpBvN,EAAS4Q,EAASplF,KAAK+hF,QAEnB2C,EAAOM,EAAWN,EAAQ,GAAGjsD,SAASznB,KAAKo0E,GAC1CplF,KAAKyjF,WAAW5yE,EAAMu0E,IAG/B3B,WAAY,SAAU5yE,EAAMu0E,GAExBplF,KAAK8R,MACD2mB,UAAW5nB,EAAMu0E,GACjB39E,OAAQoJ,EAAKpJ,OAAS,GAE1B+sE,EAASx0E,KAAK8R,KAAM9R,KAAK+hF,SAG7BsD,kBAAmB,SAAUx0E,EAAM5P,EAAGg6D,GAElC,GAAI9zD,GAAGm+E,EAAOC,EAAOC,EAAS1Q,EAAM2Q,EAAYZ,EAAS/kD,CAIzD,KAFA2lD,EAAaZ,EAAUjwE,EAAAA,EAElBzN,EAAIlG,EAAQg6D,EAAIh6D,GAATkG,EAAYA,IACpBm+E,EAAQtD,EAASnxE,EAAM,EAAG1J,EAAGnH,KAAK+hF,QAClCwD,EAAQvD,EAASnxE,EAAM1J,EAAG8zD,EAAGj7D,KAAK+hF,QAElCyD,EAAUhD,EAAiB8C,EAAOC,GAClCzQ,EAAOuN,EAASiD,GAASjD,EAASkD,GAGpBE,EAAVD,GACAC,EAAaD,EACb1lD,EAAQ34B,EAER09E,EAAiBA,EAAP/P,EAAiBA,EAAO+P,GAE3BW,IAAYC,GAERZ,EAAP/P,IACA+P,EAAU/P,EACVh1C,EAAQ34B,EAKpB,OAAO24B,IAIXqlD,iBAAkB,SAAUt0E,EAAM5P,EAAGg6D,GAEjC,GAAIgpB,GAAcpzE,EAAKqxE,KAAOliF,KAAKikF,YAAc9B,EAC7C+B,EAAcrzE,EAAKqxE,KAAOliF,KAAKkkF,YAAc9B,EAC7CsD,EAAU1lF,KAAK2lF,eAAe90E,EAAM5P,EAAGg6D,EAAGgpB,GAC1C2B,EAAU5lF,KAAK2lF,eAAe90E,EAAM5P,EAAGg6D,EAAGipB,EAIhC0B,GAAVF,GAAmB70E,EAAK4nB,SAASf,KAAKusD,IAI9C0B,eAAgB,SAAU90E,EAAM5P,EAAGg6D,EAAG2nB,GAElC/xE,EAAK4nB,SAASf,KAAKkrD,EAEnB,IAIIz7E,GAAGiJ,EAJH2xE,EAAS/hF,KAAK+hF,OACd8D,EAAW7D,EAASnxE,EAAM,EAAG5P,EAAG8gF,GAChC+D,EAAY9D,EAASnxE,EAAMoqD,EAAIh6D,EAAGg6D,EAAG8mB,GACrCgE,EAASzD,EAAWuD,GAAYvD,EAAWwD,EAG/C,KAAK3+E,EAAIlG,EAAOg6D,EAAIh6D,EAARkG,EAAWA,IACnBiJ,EAAQS,EAAK4nB,SAAStxB,GACtBrB,EAAO+/E,EAAUh1E,EAAKqxE,KAAOH,EAAO3xE,GAASA,EAAMu4D,MACnDod,GAAUzD,EAAWuD,EAGzB,KAAK1+E,EAAI8zD,EAAIh6D,EAAI,EAAGkG,GAAKlG,EAAGkG,IACxBiJ,EAAQS,EAAK4nB,SAAStxB,GACtBrB,EAAOggF,EAAWj1E,EAAKqxE,KAAOH,EAAO3xE,GAASA,EAAMu4D,MACpDod,GAAUzD,EAAWwD,EAGzB,OAAOC,IAGXb,oBAAqB,SAAUvc,EAAMmb,EAAMY,GAEvC,IAAK,GAAIv9E,GAAIu9E,EAAOv9E,GAAK,EAAGA,IACxBrB,EAAOg+E,EAAK38E,GAAGwhE,KAAMA,IAI7Bqb,UAAW,SAAUF,GAEjB,IAAK,GAAyBkC,GAArB7+E,EAAI28E,EAAK18E,OAAS,EAAaD,GAAK,EAAGA,IACZ,IAA5B28E,EAAK38E,GAAGsxB,SAASrxB,OACbD,EAAI,GACJ6+E,EAAWlC,EAAK38E,EAAI,GAAGsxB,SACvButD,EAASjoE,OAAOioE,EAASloE,QAAQgmE,EAAK38E,IAAK,IAExCnH,KAAK0qB,QAET8pD,EAASsP,EAAK38E,GAAInH,KAAK+hF,SAItCD,YAAa,SAAU3sB,GASnB,GAAI8wB,IAAc,WAAY,OAAQ,IAEtCjmF,MAAKikF,YAAc,GAAIp+D,UAAS,IAAK,IAAKogE,EAAWh1E,KAAKkkD,EAAO,KACjEn1D,KAAKkkF,YAAc,GAAIr+D,UAAS,IAAK,IAAKogE,EAAWh1E,KAAKkkD,EAAO,KAEjEn1D,KAAK+hF,OAAS,GAAIl8D,UAAS,IAAK,YAAcsvC,EAAOlkD,KAAK,OAAS,QA0IrD,kBAAXk2B,SAAyBA,OAAOC,IAAKD,OAAO,QAAS,WAAa,MAAOgwC,KACzD,mBAAXh5E,QAAwBA,OAAOC,QAAU+4E,EAChC,mBAATrxB,MAAsBA,KAAKqxB,MAAQA,EAC9C1yE,OAAO0yE,MAAQA;;IxFjmBd,UAASlwC,EAAMC,GACG,kBAAXC,SAAyBA,OAAOC,IACzCD,OAAOD,GACqB,gBAAZ9oC,SAChBD,OAAOC,QAAU8oC,IAEjBD,EAAKI,WAAaH,KAEpBlnC,KAAM,WAEN,QAASqnC,KACP,GAAIC,GAAUhoB,UAAUlY,MAExB,IAAgB,IAAZkgC,EACF,KAAM,IAAInuB,OAAM,uDAGlB,IAAI4kB,GAAOryB,SAAS4E,cAAc,OAGlC,IAFAytB,EAAKxqB,KAAO+L,UAAU,GAEN,IAAZgoB,EACF,MAAOvJ,GAAKxqB,IAGd,IAAIg0B,GAAO77B,SAAS87B,qBAAqB,QAAQ,EACjDD,GAAK5lB,aAAaoc,EAAMwJ,EAAK/2B,WAK7B,KAAK,GAFDi3B,GADA3mC,EAAI4K,SAAS4E,cAAc,KAGtBwvB,EAAQ,EAAWwH,EAARxH,EAAiBA,IACnCh/B,EAAEyS,KAAO+L,UAAUwgB,GACnB2H,EAAW3mC,EAAEyS,KACbwqB,EAAKxqB,KAAOk0B,CAKd,OAFAF,GAAK/3B,YAAYuuB,GAEV0J,EAGT,MAAOJ;;ACdT,QAAShpB,YAAWM,EAAKC,EAAKC,EAAKC,GAE/B9e,KAAK0nC,GAAK,EAAM/oB,EAChB3e,KAAK2nC,GAAK,GAAO9oB,EAAMF,GAAO3e,KAAK0nC,GACnC1nC,KAAK4nC,GAAK,EAAM5nC,KAAK0nC,GAAK1nC,KAAK2nC,GAE/B3nC,KAAK6nC,GAAK,EAAMjpB,EAChB5e,KAAK8nC,GAAK,GAAOhpB,EAAMF,GAAO5e,KAAK6nC,GACnC7nC,KAAK+nC,GAAK,EAAM/nC,KAAK6nC,GAAK7nC,KAAK8nC,GAE/B9nC,KAAK2e,IAAMA,EACX3e,KAAK4e,IAAME,EACX9e,KAAK6e,IAAMA,EACX7e,KAAK8e,IAAMA,EAff3gB,OAAOC,QAAUigB,WAkBjBA,WAAWpe,UAAU+nC,aAAe,SAASzpB,GAEzC,QAASve,KAAK4nC,GAAKrpB,EAAIve,KAAK2nC,IAAMppB,EAAIve,KAAK0nC,IAAMnpB,GAGrDF,WAAWpe,UAAUgoC,aAAe,SAAS1pB,GACzC,QAASve,KAAK+nC,GAAKxpB,EAAIve,KAAK8nC,IAAMvpB,EAAIve,KAAK6nC,IAAMtpB,GAGrDF,WAAWpe,UAAUioC,uBAAyB,SAAS3pB,GACnD,OAAQ,EAAMve,KAAK4nC,GAAKrpB,EAAI,EAAMve,KAAK2nC,IAAMppB,EAAIve,KAAK0nC,IAG1DrpB,WAAWpe,UAAUkoC,YAAc,SAASroC,EAAGsoC,GACpB,mBAAZA,KAAyBA,EAAU,KAE9C,IAAIC,GAAIC,EAAI9pB,EAAI0S,EAAI/pB,CAGpB,KAAKqX,EAAK1e,EAAGqH,EAAI,EAAO,EAAJA,EAAOA,IAAK,CAG5B,GADA+pB,EAAKlxB,KAAKgoC,aAAaxpB,GAAM1e,EACzB4B,KAAK8yB,IAAItD,GAAMkX,EAAS,MAAO5pB,EAEnC,IAAI+pB,GAAKvoC,KAAKkoC,uBAAuB1pB,EACrC,IAAI9c,KAAK8yB,IAAI+T,GAAM,KAAM,KAEzB/pB,IAAU0S,EAAKqX,EAQnB,GAJAF,EAAK,EACLC,EAAK,EACL9pB,EAAK1e,EAEIuoC,EAAL7pB,EAAS,MAAO6pB,EACpB,IAAI7pB,EAAK8pB,EAAI,MAAOA,EAEpB,MAAYA,EAALD,GAAS,CAGZ,GADAnX,EAAKlxB,KAAKgoC,aAAaxpB,GACnB9c,KAAK8yB,IAAItD,EAAKpxB,GAAKsoC,EAAS,MAAO5pB,EAEnC1e,GAAIoxB,EACJmX,EAAK7pB,EAEL8pB,EAAK9pB,EAGTA,EAAiB,IAAX8pB,EAAKD,GAAYA,EAI3B,MAAO7pB,IAGXH,WAAWpe,UAAU8e,MAAQ,SAASjf,EAAGsoC,GACrC,MAAOpoC,MAAKioC,aAAajoC,KAAKmoC,YAAYroC,EAAGsoC;;AkEvGjDjqC,OAAOC,QAAQkoD,WAAahoD,QAAQ,uBACpCH,OAAOC,QAAQorE,kBAAoBlrE,QAAQ,8BAC3CH,OAAOC,QAAQ+xE,gBAAkB7xE,QAAQ;;AIFzC,YAMA,SAASgoD,YAAW/L,EAAKC,GACrBx6C,KAAKgX,OAASujC,EAAIE,WAAW84B,YAAc/4B,GAG/C,QAAS+4B,UAAS54B,EAAK3jC,EAAQujC,GAC3B,GAAY,IAARI,EAAW,CACX,GAAIvwC,GAAQ,GAAI+lE,iBAAgB51B,EAAKA,EAAIS,aAAeT,EAAIpuC,IACxD/B,GAAMhD,SAAQ4P,EAAO5M,EAAMW,MAAQX,IAX/C,GAAI+lE,iBAAkB7xE,QAAQ,oBAE9BH,QAAOC,QAAUkoD;;ACJjB,YAMA,SAASkjB,mBAAkBjvB,EAAKC,EAAK/f,EAAQlzB,EAAMy1B,GAE/Ch9B,KAAKqgB,cACLrgB,KAAKy6B,OAASA,EACdz6B,KAAKkO,KAAO,EAGZlO,KAAKwzE,KAAOj5B,EACZv6C,KAAKyzE,UAAY,GACjBzzE,KAAK0zE,MAAQnsE,EACbvH,KAAK05C,QAAU1c,EAEfud,EAAIE,WAAWk5B,YAAa3zE,KAAMw6C,GAGtC,QAASm5B,aAAYh5B,EAAKh/B,EAAS4+B,GACpB,GAAPI,EAAUh/B,EAAQi4D,IAAMr5B,EAAIS,aAChB,GAAPL,EAAUk5B,QAAQt5B,EAAK5+B,GAChB,GAAPg/B,EAAUh/B,EAAQzN,KAAOqsC,EAAIS,aACtB,GAAPL,IAAUh/B,EAAQ83D,UAAYl5B,EAAIpuC,KAG/C,QAAS0nE,SAAQt5B,EAAK5+B,GAGlB,IAFA,GAAI6+B,GAAMD,EAAIS,aAAeT,EAAIpuC,IAE1BouC,EAAIpuC,IAAMquC,GAAK,CAClB,GAAI7oC,GAAMgK,EAAQ+3D,MAAMn5B,EAAIS,cACxBhwC,EAAQ2Q,EAAQ+9B,QAAQa,EAAIS,aAChCr/B,GAAQ0E,WAAW1O,GAAO3G,GAhClC,GAAIhM,OAAQV,QAAQ,iBAEpBH,QAAOC,QAAUorE,kBAkCjBA,kBAAkBsK,OAAS,UAAW,QAAS,aAAc,WAE7DtK,kBAAkBvpE,UAAUwpE,aAAe,WACvC,GAAIlvB,GAAMv6C,KAAKwzE,IACfj5B,GAAIpuC,IAAMnM,KAAKyzE,SAUf,KARA,GAMIpnD,GANAmuB,EAAMD,EAAIS,aAAeT,EAAIpuC,IAC7B4nE,EAAM,EACN3sE,EAAS,EACTtH,EAAI,EACJC,EAAI,EACJi0E,KAGGz5B,EAAIpuC,IAAMquC,GAAK,CAClB,IAAKpzC,EAAQ,CACT,GAAI6sE,GAAS15B,EAAIS,YACjB+4B,GAAe,EAATE,EACN7sE,EAAS6sE,GAAU,EAKvB,GAFA7sE,IAEY,IAAR2sE,GAAqB,IAARA,EACbj0E,GAAKy6C,EAAIW,cACTn7C,GAAKw6C,EAAIW,cAEG,IAAR64B,IACI1nD,GAAM2nD,EAAMhjE,KAAKqb,GACrBA,MAGJA,EAAKrb,KAAK,GAAIhS,OAAMc,EAAGC,QAEpB,CAAA,GAAY,IAARg0E,EAQP,KAAM,IAAI56D,OAAM,mBAAqB46D,EALjC1nD,IACAA,EAAKrb,KAAKqb,EAAK,GAAGnsB,UAU9B,MAFImsB,IAAM2nD,EAAMhjE,KAAKqb,GAEd2nD,GAGXxK,kBAAkBvpE,UAAU0oE,KAAO,WAC/B,GAAIpuB,GAAMv6C,KAAKwzE,IACfj5B,GAAIpuC,IAAMnM,KAAKyzE,SAYf,KAVA,GAAIj5B,GAAMD,EAAIS,aAAeT,EAAIpuC,IAC7B4nE,EAAM,EACN3sE,EAAS,EACTtH,EAAI,EACJC,EAAI,EACJwwB,EAAK3b,EAAAA,EACLsc,IAAMtc,EAAAA,GACN6b,EAAK7b,EAAAA,EACLma,IAAMna,EAAAA,GAEH2lC,EAAIpuC,IAAMquC,GAAK,CAClB,IAAKpzC,EAAQ,CACT,GAAI6sE,GAAS15B,EAAIS,YACjB+4B,GAAe,EAATE,EACN7sE,EAAS6sE,GAAU,EAKvB,GAFA7sE,IAEY,IAAR2sE,GAAqB,IAARA,EACbj0E,GAAKy6C,EAAIW,cACTn7C,GAAKw6C,EAAIW,cACD3qB,EAAJzwB,IAAQywB,EAAKzwB,GACbA,EAAIoxB,IAAIA,EAAKpxB,GACT2wB,EAAJ1wB,IAAQ0wB,EAAK1wB,GACbA,EAAIgvB,IAAIA,EAAKhvB,OAEd,IAAY,IAARg0E,EACP,KAAM,IAAI56D,OAAM,mBAAqB46D,GAI7C,OAAQxjD,EAAIE,EAAIS,EAAInC,IAGxBy6C,kBAAkBvpE,UAAU4pE,UAAY,SAAS/pE,EAAGC,EAAG+T,GAOnD,IAAK,GAND3L,GAAOnI,KAAKy6B,OAAS/4B,KAAKqS,IAAI,EAAGD,GACjCwc,EAAKtwB,KAAKy6B,OAAS36B,EACnB0wB,EAAKxwB,KAAKy6B,OAAS16B,EACnBoV,EAASnV,KAAKypE,eACdv7D,EAAOs7D,kBAAkBsK,MAAM9zE,KAAKkO,MAE/B/G,EAAI,EAAGA,EAAIgO,EAAO/N,OAAQD,IAE/B,IAAK,GADDklB,GAAOlX,EAAOhO,GACT45B,EAAI,EAAGA,EAAI1U,EAAKjlB,OAAQ25B,IAAK,CAClC,GAAI3gC,GAAIisB,EAAK0U,GAAIhS,EAAK,IAAmB,KAAZ3uB,EAAEL,EAAIywB,GAAYroB,CAC/CkkB,GAAK0U,IACY,KAAZ3gC,EAAEN,EAAIwwB,GAAYnoB,EAAO,IAC1B,IAAMzG,KAAK+hB,GAAK/hB,KAAKstB,KAAKttB,KAAKutB,IAAIF,EAAKrtB,KAAK+hB,GAAK,MAAQ,IAgBtE,MAXa,UAATvV,GAAsC,IAAlBiH,EAAO/N,OAC3B+N,EAASA,EAAO,GAAG,GACH,UAATjH,GACPiH,EAASA,EAAO,GAChBjH,EAAO,cACS,eAATA,GAA2C,IAAlBiH,EAAO/N,OACvC+N,EAASA,EAAO,GACA,eAATjH,IACPA,EAAO,oBAIPA,KAAM,UACNo7D,UACIp7D,KAAMA,EACNoG,YAAaa,GAEjBkL,WAAYrgB,KAAKqgB;;ACnKzB,YAMA,SAAS8vD,iBAAgB51B,EAAKC,GAE1Bx6C,KAAKo2D,QAAU,EACfp2D,KAAK+K,KAAO,KACZ/K,KAAKy6B,OAAS,KACdz6B,KAAKoH,OAAS,EAGdpH,KAAKwzE,KAAOj5B,EACZv6C,KAAK0zE,SACL1zE,KAAK05C,WACL15C,KAAKk0E,aAEL35B,EAAIE,WAAW05B,UAAWn0E,KAAMw6C,GAEhCx6C,KAAKoH,OAASpH,KAAKk0E,UAAU9sE,OAGjC,QAAS+sE,WAAUx5B,EAAKvwC,EAAOmwC,GACf,KAARI,EAAYvwC,EAAMgsD,QAAU7b,EAAIS,aACnB,IAARL,EAAWvwC,EAAMW,KAAOwvC,EAAIO,aACpB,IAARH,EAAWvwC,EAAMqwB,OAAS8f,EAAIS,aACtB,IAARL,EAAWvwC,EAAM8pE,UAAUljE,KAAKupC,EAAIpuC,KAC5B,IAARwuC,EAAWvwC,EAAMspE,MAAM1iE,KAAKupC,EAAIO,cACxB,IAARH,GAAWvwC,EAAMsvC,QAAQ1oC,KAAKojE,iBAAiB75B,IAG5D,QAAS65B,kBAAiB75B,GAItB,IAHA,GAAIvvC,GAAQ,KACRwvC,EAAMD,EAAIS,aAAeT,EAAIpuC,IAE1BouC,EAAIpuC,IAAMquC,GAAK,CAClB,GAAIG,GAAMJ,EAAIS,cAAgB,CAE9BhwC,GAAgB,IAAR2vC,EAAYJ,EAAIO,aACZ,IAARH,EAAYJ,EAAIwI,YACR,IAARpI,EAAYJ,EAAI0I,aACR,IAARtI,EAAYJ,EAAIgJ,eACR,IAAR5I,EAAYJ,EAAIS,aACR,IAARL,EAAYJ,EAAIW,cACR,IAARP,EAAYJ,EAAIkJ,cAAgB,KAGxC,MAAOz4C,GA/CX,GAAIw+D,mBAAoBlrE,QAAQ,yBAEhCH,QAAOC,QAAU+xE,gBAiDjBA,gBAAgBlwE,UAAU0b,QAAU,SAASxU,GACzC,GAAQ,EAAJA,GAASA,GAAKnH,KAAKk0E,UAAU9sE,OAAQ,KAAM,IAAI+R,OAAM,8BAEzDnZ,MAAKwzE,KAAKrnE,IAAMnM,KAAKk0E,UAAU/sE,EAE/B,IAAIqzC,GAAMx6C,KAAKwzE,KAAKx4B,aAAeh7C,KAAKwzE,KAAKrnE,GAC7C,OAAO,IAAIq9D,mBAAkBxpE,KAAKwzE,KAAMh5B,EAAKx6C,KAAKy6B,OAAQz6B,KAAK0zE,MAAO1zE,KAAK05C;;AzB3D/E,GAAIid,UAAWr3C,UAAU,GACrBja,QAAUia,UAAU,GACpBs3C,MAAQt3C,UAAU,GAElBu3C,UAAYtwC,KAAKswC,SAErB14D,QAAOC,QAAU,SAAUsf,GAKvB,IAAK,GAHDo5C,GACAC,EAAYv3D,OAAO+H,KAAKqvD,OAEnBzvD,EAAI,EAAGurD,EAAIqE,EAAU3vD,OAAYsrD,EAAJvrD,EAAOA,IAAK,CAC9C,GAAIwK,GAAMolD,EAAU5vD,EACpB,IAAIyvD,MAAMjlD,GAAKvT,UAAYsf,EAAI,CAC3Bo5C,EAAOnlD,CACP,QAIR,IAAKmlD,EAAM,CACPA,EAAOp1D,KAAKqU,MAAMrU,KAAKqS,IAAI,GAAI,GAAKrS,KAAKimD,UAAU1R,SAAS,GAE5D,KAAK,GADD+gB,MACK7vD,EAAI,EAAGurD,EAAIqE,EAAU3vD,OAAYsrD,EAAJvrD,EAAOA,IAAK,CAC9C,GAAIwK,GAAMolD,EAAU5vD,EACpB6vD,GAAOrlD,GAAOA,EAElBtM,QAAQyxD,IACJjxC,UAAU,UAAU,SAAS,WAAY,IAAMnI,EAAK,WACpDs5C,GAGR,GAAIC,GAAOv1D,KAAKqU,MAAMrU,KAAKqS,IAAI,GAAI,GAAKrS,KAAKimD,UAAU1R,SAAS,IAE5DihB,IAAaA,GAAOJ,GAAQA,EAChCzxD,QAAQ4xD,IACJpxC,UAAU,WAAW,WAAagxC,UAAUC,GAAQ,WACpDI,EAGJ,IAAIp3C,GAAM,IAAM62C,SAAW,MACrBn3D,OAAO+H,KAAKlC,SAAS6J,IAAI,SAAUyC,GACjC,MAAOklD,WAAUllD,GAAO,KAClBtM,QAAQsM,GAAK,GACb,IAAMklD,UAAUxxD,QAAQsM,GAAK,IAAM,MAE1CV,KAAK,KACN,SAAW4lD,UAAUI,GAAQ,KAG/BE,EAAM1yD,OAAO0yD,KAAO1yD,OAAO2yD,WAAa3yD,OAAO4yD,QAAU5yD,OAAO6yD,KAEpE,OAAO,IAAIzR,QAAOsR,EAAII,gBAClB,GAAIC,OAAM13C,IAAQ5R,KAAM","file":"bundle.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o`.\"},\"tiles\":{\"type\":\"array\",\"value\":\"string\",\"doc\":\"An array of one or more tile source URLs, as in the TileJSON spec.\"},\"minzoom\":{\"type\":\"number\",\"default\":0,\"doc\":\"Minimum zoom level for which tiles are available, as in the TileJSON spec.\"},\"maxzoom\":{\"type\":\"number\",\"default\":22,\"doc\":\"Maximum zoom level for which tiles are available, as in the TileJSON spec. Data from tiles at the maxzoom are used when displaying the map at higher zoom levels.\"},\"tileSize\":{\"type\":\"number\",\"default\":512,\"units\":\"pixels\",\"doc\":\"The minimum visual size to display tiles for this layer. Only configurable for raster layers.\"},\"*\":{\"type\":\"*\",\"doc\":\"Other keys to configure the data source.\"}},\"source_geojson\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":[\"geojson\"]},\"data\":{\"type\":\"*\"}},\"source_video\":{\"type\":{\"required\":true,\"type\":\"enum\",\"values\":[\"video\"]},\"url\":{\"required\":true,\"type\":\"array\",\"value\":\"string\",\"doc\":\"URLs to video content in order of preferred format.\"},\"coordinates\":{\"required\":true,\"type\":\"array\",\"length\":4,\"value\":{\"type\":\"array\",\"length\":2,\"value\":\"number\"}}},\"layer\":{\"id\":{\"type\":\"string\",\"doc\":\"Unique layer name.\"},\"type\":{\"type\":\"enum\",\"values\":[\"fill\",\"line\",\"symbol\",\"raster\",\"background\"],\"doc\":\"Rendering type of this layer.\"},\"ref\":{\"type\":\"string\",\"doc\":\"References another layer to copy `type`, `source`, `source-layer`, `minzoom`, `maxzoom`, `filter`, and `layout` properties from. This allows the layers to share processing and be more efficient.\"},\"source\":{\"type\":\"string\",\"doc\":\"Name of a source description to be used for this layer.\"},\"source-layer\":{\"type\":\"string\",\"doc\":\"Layer to use from a vector tile source. Required if the source supports multiple layers.\"},\"minzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":22,\"doc\":\"The minimum zoom level on which the layer gets parsed and appears on.\"},\"maxzoom\":{\"type\":\"number\",\"minimum\":0,\"maximum\":22,\"doc\":\"The maximum zoom level on which the layer gets parsed and appears on.\"},\"interactive\":{\"type\":\"boolean\",\"doc\":\"Enable querying of feature data from this layer for interactivity.\",\"default\":false},\"filter\":{\"type\":\"filter\",\"doc\":\"A expression specifying conditions on source features. Only features that match the filter are displayed.\"},\"layout\":{\"type\":\"layout\",\"doc\":\"Layout properties for the layer.\"},\"paint\":{\"type\":\"paint\",\"doc\":\"Default paint properties for this layer.\"},\"paint.*\":{\"type\":\"paint\",\"doc\":\"Class-specific paint properties for this layer. The class name is the part after the first dot.\"}},\"layout\":[\"layout_fill\",\"layout_line\",\"layout_symbol\",\"layout_raster\",\"layout_background\"],\"layout_background\":{\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"visible\",\"none\"],\"default\":\"visible\",\"doc\":\"The display of this layer. `none` hides this layer.\"}},\"layout_fill\":{\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"visible\",\"none\"],\"default\":\"visible\",\"doc\":\"The display of this layer. `none` hides this layer.\"}},\"layout_line\":{\"line-cap\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"butt\",\"round\",\"square\"],\"default\":\"butt\",\"doc\":\"The display of line endings.\"},\"line-join\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"bevel\",\"round\",\"miter\"],\"default\":\"miter\",\"doc\":\"The display of lines when joining.\"},\"line-miter-limit\":{\"type\":\"number\",\"default\":2,\"function\":\"interpolated\",\"doc\":\"Used to automatically convert miter joins to bevel joins for sharp angles.\",\"requires\":[{\"line-join\":\"miter\"}]},\"line-round-limit\":{\"type\":\"number\",\"default\":1,\"function\":\"interpolated\",\"doc\":\"Used to automatically convert round joins to miter joins for shallow angles.\",\"requires\":[{\"line-join\":\"round\"}]},\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"visible\",\"none\"],\"default\":\"visible\",\"doc\":\"The display of this layer. `none` hides this layer.\"}},\"layout_symbol\":{\"symbol-placement\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"point\",\"line\"],\"default\":\"point\",\"doc\":\"Label placement relative to its geometry. `line` can only be used on LineStrings and Polygons.\"},\"symbol-min-distance\":{\"type\":\"number\",\"default\":250,\"minimum\":1,\"function\":\"interpolated\",\"units\":\"pixels\",\"doc\":\"Minimum distance between two symbol anchors.\",\"requires\":[{\"symbol-placement\":\"line\"}]},\"symbol-avoid-edges\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"default\":false,\"doc\":\"If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer.\"},\"icon-allow-overlap\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"default\":false,\"doc\":\"If true, the icon will be visible even if it collides with other icons and text.\",\"requires\":[\"icon-image\"]},\"icon-ignore-placement\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"default\":false,\"doc\":\"If true, the icon won't affect placement of other icons and text.\",\"requires\":[\"icon-image\"]},\"icon-optional\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"default\":false,\"doc\":\"If true, the symbol will appear without its icon, in spaces where the icon would make it too large to fit.\",\"requires\":[\"icon-image\",\"text-field\"]},\"icon-rotation-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"map\",\"viewport\"],\"default\":\"viewport\",\"doc\":\"Orientation of icon when map is rotated.\",\"requires\":[\"icon-image\"]},\"icon-max-size\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"doc\":\"The maximum factor to scale the icon.\",\"requires\":[\"icon-image\"]},\"icon-image\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"doc\":\"A string with {tokens} replaced, referencing the data property to pull from.\",\"tokens\":true},\"icon-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"units\":\"degrees\",\"doc\":\"Rotates the icon clockwise.\",\"requires\":[\"icon-image\"]},\"icon-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"function\":\"interpolated\",\"units\":\"pixels\",\"doc\":\"Padding value around icon bounding box to avoid icon collisions.\",\"requires\":[\"icon-image\"]},\"icon-keep-upright\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"default\":false,\"doc\":\"If true, the icon may be flipped to prevent it from being rendered upside-down\",\"requires\":[\"icon-image\",{\"icon-rotation-alignment\":\"map\"}]},\"icon-offset\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"doc\":\"Icon's offset distance. Values are [x, y] where negatives indicate left and up, respectively.\",\"requires\":[\"icon-image\"]},\"text-rotation-alignment\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"map\",\"viewport\"],\"default\":\"viewport\",\"doc\":\"Orientation of icon or text when map is rotated.\",\"requires\":[\"text-field\"]},\"text-field\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"default\":\"\",\"tokens\":true,\"doc\":\"Value to use for a text label. Feature properties are specified using tokens like {field_name}.\"},\"text-font\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"default\":\"Open Sans Regular, Arial Unicode MS Regular\",\"doc\":\"Font stack to use for displaying text.\",\"requires\":[\"text-field\"]},\"text-max-size\":{\"type\":\"number\",\"default\":16,\"minimum\":0,\"units\":\"pixels\",\"function\":\"interpolated\",\"doc\":\"The maximum size text will be laid out, to calculate collisions with.\",\"requires\":[\"text-field\"]},\"text-max-width\":{\"type\":\"number\",\"default\":15,\"minimum\":0,\"units\":\"em\",\"function\":\"interpolated\",\"doc\":\"The maximum line width for text wrapping.\",\"requires\":[\"text-field\"]},\"text-line-height\":{\"type\":\"number\",\"default\":1.2,\"units\":\"em\",\"function\":\"interpolated\",\"doc\":\"Text leading value for multi-line text.\",\"requires\":[\"text-field\"]},\"text-letter-spacing\":{\"type\":\"number\",\"default\":0,\"units\":\"em\",\"function\":\"interpolated\",\"doc\":\"Text kerning value.\",\"requires\":[\"text-field\"]},\"text-justify\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"left\",\"center\",\"right\"],\"default\":\"center\",\"doc\":\"Text justification options.\",\"requires\":[\"text-field\"]},\"text-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"center\",\"left\",\"right\",\"top\",\"bottom\",\"top-left\",\"top-right\",\"bottom-left\",\"bottom-right\"],\"default\":\"center\",\"doc\":\"Which part of the text to place closest to the anchor.\",\"requires\":[\"text-field\"]},\"text-max-angle\":{\"type\":\"number\",\"default\":45,\"units\":\"degrees\",\"function\":\"interpolated\",\"doc\":\"Maximum angle change between adjacent characters.\",\"requires\":[\"text-field\",{\"symbol-placement\":\"line\"}]},\"text-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"units\":\"degrees\",\"function\":\"interpolated\",\"doc\":\"Rotates the text clockwise.\",\"requires\":[\"text-field\"]},\"text-padding\":{\"type\":\"number\",\"default\":2,\"minimum\":0,\"units\":\"pixels\",\"function\":\"interpolated\",\"doc\":\"Padding value around text bounding box to avoid label collisions.\",\"requires\":[\"text-field\"]},\"text-keep-upright\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"default\":true,\"doc\":\"If true, the text may be flipped vertically to prevent it from being rendered upside-down.\",\"requires\":[\"text-field\",{\"text-rotation-alignment\":\"map\"}]},\"text-transform\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"none\",\"uppercase\",\"lowercase\"],\"default\":\"none\",\"doc\":\"Specifies how to capitalize text, similar to the CSS `text-transform` property.\",\"requires\":[\"text-field\"]},\"text-offset\":{\"type\":\"array\",\"doc\":\"Specifies the distance that text is offset from its anchor horizontally and vertically.\",\"value\":\"number\",\"units\":\"ems\",\"function\":\"interpolated\",\"length\":2,\"default\":[0,0],\"requires\":[\"text-field\"]},\"text-allow-overlap\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"default\":false,\"doc\":\"If true, the text will be visible even if it collides with other icons and labels.\",\"requires\":[\"text-field\"]},\"text-ignore-placement\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"default\":false,\"doc\":\"If true, the text won't affect placement of other icons and labels.\",\"requires\":[\"text-field\"]},\"text-optional\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"default\":false,\"doc\":\"If true, the symbol will appear without its text, in spaces where the text would make it too large to fit.\",\"requires\":[\"text-field\",\"icon-image\"]},\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"visible\",\"none\"],\"default\":\"visible\",\"doc\":\"The display of this layer. `none` hides this layer.\"}},\"layout_raster\":{\"visibility\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"visible\",\"none\"],\"default\":\"visible\",\"doc\":\"The display of this layer. `none` hides this layer.\"}},\"filter\":{\"type\":\"array\",\"value\":\"*\"},\"filter_operator\":{\"type\":\"enum\",\"values\":[\"==\",\"!=\",\">\",\">=\",\"<\",\"<=\",\"in\",\"!in\",\"all\",\"any\",\"none\"]},\"geometry_type\":{\"type\":\"enum\",\"values\":[\"Point\",\"LineString\",\"Polygon\"]},\"function\":{\"stops\":{\"type\":\"array\",\"required\":true,\"doc\":\"An array of stops.\",\"value\":\"function_stop\"},\"base\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"doc\":\"The exponential base of the interpolation curve. It controls the rate at which the result increases. Higher values make the result increase more towards the high end of the range. With `1` the stops are interpolated linearly.\"}},\"function_stop\":{\"type\":\"array\",\"minimum\":0,\"maximum\":22,\"value\":[\"number\",\"color\"],\"length\":2,\"doc\":\"Zoom level and value pair.\"},\"paint\":[\"paint_fill\",\"paint_line\",\"paint_symbol\",\"paint_raster\",\"paint_background\"],\"paint_fill\":{\"fill-antialias\":{\"type\":\"boolean\",\"function\":\"piecewise-constant\",\"default\":true,\"doc\":\"Whether or not the fill should be antialiased.\"},\"fill-opacity\":{\"type\":\"number\",\"function\":\"interpolated\",\"default\":1,\"minimum\":0,\"maximum\":1,\"doc\":\"The opacity given to the fill color.\",\"transition\":true},\"fill-color\":{\"type\":\"color\",\"default\":\"#000000\",\"doc\":\"The color of the fill.\",\"function\":\"interpolated\",\"transition\":true,\"requires\":[{\"!\":\"fill-image\"}]},\"fill-outline-color\":{\"type\":\"color\",\"doc\":\"The outline color of the fill. Matches the value of `fill-color` if unspecified.\",\"function\":\"interpolated\",\"transition\":true,\"requires\":[{\"!\":\"fill-image\"},{\"fill-antialias\":true}]},\"fill-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"transition\":true,\"units\":\"pixels\",\"doc\":\"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\"},\"fill-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"map\",\"viewport\"],\"doc\":\"Control whether the translation is relative to the map (north) or viewport (screen)\",\"default\":\"map\",\"requires\":[\"fill-translate\"]},\"fill-image\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"transition\":true,\"doc\":\"Name of image in sprite to use for drawing image fills.\"}},\"paint_line\":{\"line-opacity\":{\"type\":\"number\",\"doc\":\"The opacity at which the line will be drawn.\",\"function\":\"interpolated\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"line-color\":{\"type\":\"color\",\"doc\":\"The color with which the line will be drawn.\",\"default\":\"#000000\",\"function\":\"interpolated\",\"transition\":true,\"requires\":[{\"!\":\"line-image\"}]},\"line-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"transition\":true,\"units\":\"pixels\",\"doc\":\"The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively.\"},\"line-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"map\",\"viewport\"],\"doc\":\"Control whether the translation is relative to the map (north) or viewport (screen)\",\"default\":\"map\",\"requires\":[\"line-translate\"]},\"line-width\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"function\":\"interpolated\",\"transition\":true,\"units\":\"pixels\",\"doc\":\"Stroke thickness.\"},\"line-gap-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"doc\":\"Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap.\",\"function\":\"interpolated\",\"transition\":true,\"units\":\"pixels\"},\"line-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"transition\":true,\"units\":\"pixels\",\"doc\":\"Blur applied to the line, in pixels.\"},\"line-dasharray\":{\"type\":\"array\",\"function\":\"piecewise-constant\",\"value\":\"number\",\"doc\":\"Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to pixels, multiply the length by the current line width.\",\"minimum\":0,\"transition\":true,\"units\":\"line widths\",\"requires\":[{\"!\":\"line-image\"}]},\"line-image\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"transition\":true,\"doc\":\"Name of image in sprite to use for drawing image lines.\"}},\"paint_symbol\":{\"icon-opacity\":{\"doc\":\"The opacity at which the icon will be drawn.\",\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"transition\":true,\"requires\":[\"icon-image\"]},\"icon-size\":{\"type\":\"number\",\"default\":1,\"function\":\"interpolated\",\"transition\":true,\"doc\":\"Scale factor for icon. 1 is original size, 3 triples the size.\",\"requires\":[\"icon-image\"]},\"icon-color\":{\"type\":\"color\",\"default\":\"#000000\",\"function\":\"interpolated\",\"transition\":true,\"doc\":\"The color of the icon. This can only be used with sdf icons.\",\"requires\":[\"icon-image\"]},\"icon-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"transition\":true,\"doc\":\"The color of the icon's halo. Icon halos can only be used with sdf icons.\",\"requires\":[\"icon-image\"]},\"icon-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"transition\":true,\"units\":\"pixels\",\"doc\":\"Distance of halo to the icon outline.\",\"requires\":[\"icon-image\"]},\"icon-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"transition\":true,\"units\":\"pixels\",\"doc\":\"Fade out the halo towards the outside.\",\"requires\":[\"icon-image\"]},\"icon-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"transition\":true,\"units\":\"pixels\",\"doc\":\"An icon's offset distance. Values are [x, y] where negatives indicate left and up, respectively.\",\"requires\":[\"icon-image\"]},\"icon-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"map\",\"viewport\"],\"doc\":\"Control whether the translation is relative to the map (north) or viewport (screen)\",\"default\":\"map\",\"requires\":[\"icon-image\",\"icon-translate\"]},\"text-opacity\":{\"type\":\"number\",\"doc\":\"The opacity at which the text will be drawn.\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"transition\":true,\"requires\":[\"text-field\"]},\"text-size\":{\"type\":\"number\",\"default\":16,\"minimum\":0,\"function\":\"interpolated\",\"transition\":true,\"units\":\"pixels\",\"doc\":\"Font size. If unspecified, the text will be as big as allowed by the layer definition.\",\"requires\":[\"text-field\"]},\"text-color\":{\"type\":\"color\",\"doc\":\"The color with which the text will be drawn.\",\"default\":\"#000000\",\"function\":\"interpolated\",\"transition\":true,\"requires\":[\"text-field\"]},\"text-halo-color\":{\"type\":\"color\",\"default\":\"rgba(0, 0, 0, 0)\",\"function\":\"interpolated\",\"transition\":true,\"doc\":\"The color of the text's halo, which helps it stand out from backgrounds.\",\"requires\":[\"text-field\"]},\"text-halo-width\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"transition\":true,\"units\":\"pixels\",\"doc\":\"Distance of halo to the font outline. Max text halo width is 1/4 of the font-size.\",\"requires\":[\"text-field\"]},\"text-halo-blur\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"function\":\"interpolated\",\"transition\":true,\"units\":\"pixels\",\"doc\":\"The halo's fadeout distance towards the outside.\",\"requires\":[\"text-field\"]},\"text-translate\":{\"type\":\"array\",\"value\":\"number\",\"length\":2,\"default\":[0,0],\"function\":\"interpolated\",\"transition\":true,\"units\":\"pixels\",\"doc\":\"Label offset. Values are [x, y] where negatives indicate left and up, respectively.\",\"requires\":[\"text-field\"]},\"text-translate-anchor\":{\"type\":\"enum\",\"function\":\"piecewise-constant\",\"values\":[\"map\",\"viewport\"],\"doc\":\"Control whether the translation is relative to the map (north) or viewport (screen)\",\"default\":\"map\",\"requires\":[\"text-field\",\"text-translate\"]}},\"paint_raster\":{\"raster-opacity\":{\"type\":\"number\",\"doc\":\"The opacity at which the image will be drawn.\",\"default\":1,\"minimum\":0,\"maximum\":1,\"function\":\"interpolated\",\"transition\":true},\"raster-hue-rotate\":{\"type\":\"number\",\"default\":0,\"period\":360,\"function\":\"interpolated\",\"transition\":true,\"units\":\"degrees\",\"doc\":\"Rotates hues around the color wheel.\"},\"raster-brightness-min\":{\"type\":\"number\",\"function\":\"interpolated\",\"doc\":\"Increase or reduce the brightness of the image. The value is the minimum brightness.\",\"default\":0,\"minimum\":0,\"maximum\":1,\"transition\":true},\"raster-brightness-max\":{\"type\":\"number\",\"function\":\"interpolated\",\"doc\":\"Increase or reduce the brightness of the image. The value is the maximum brightness.\",\"default\":1,\"minimum\":0,\"maximum\":1,\"transition\":true},\"raster-saturation\":{\"type\":\"number\",\"doc\":\"Increase or reduce the saturation of the image.\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"transition\":true},\"raster-contrast\":{\"type\":\"number\",\"doc\":\"Increase or reduce the contrast of the image.\",\"default\":0,\"minimum\":-1,\"maximum\":1,\"function\":\"interpolated\",\"transition\":true},\"raster-fade-duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"function\":\"interpolated\",\"transition\":true,\"units\":\"milliseconds\",\"doc\":\"Fade duration when a new tile is added.\"}},\"paint_background\":{\"background-color\":{\"type\":\"color\",\"default\":\"#000000\",\"doc\":\"The color with which the background will be drawn.\",\"function\":\"interpolated\",\"transition\":true,\"requires\":[{\"!\":\"background-image\"}]},\"background-image\":{\"type\":\"string\",\"function\":\"piecewise-constant\",\"transition\":true,\"doc\":\"Optionally an image which is drawn as the background.\"},\"background-opacity\":{\"type\":\"number\",\"default\":1,\"minimum\":0,\"maximum\":1,\"doc\":\"The opacity at which the background will be drawn.\",\"function\":\"interpolated\",\"transition\":true}},\"transition\":{\"duration\":{\"type\":\"number\",\"default\":300,\"minimum\":0,\"units\":\"milliseconds\",\"doc\":\"Time allotted for transitions to complete.\"},\"delay\":{\"type\":\"number\",\"default\":0,\"minimum\":0,\"units\":\"milliseconds\",\"doc\":\"Length of time before a transition begins.\"}}}","'use strict';\n\n/**\n * mapboxgl is a A WebGL JavaScript interactive maps library that can render\n * [Mapbox vector tiles](https://www.mapbox.com/blog/vector-tiles/).\n *\n * @module mapboxgl\n * @summary WebGL JavaScript map library\n */\n\n// jshint -W079\nvar mapboxgl = module.exports = {};\n\nmapboxgl.Map = require('./ui/map');\nmapboxgl.Control = require('./ui/control/control');\nmapboxgl.Navigation = require('./ui/control/navigation');\nmapboxgl.Attribution = require('./ui/control/attribution');\nmapboxgl.Popup = require('./ui/popup');\n\nmapboxgl.GeoJSONSource = require('./source/geojson_source');\nmapboxgl.VideoSource = require('./source/video_source');\n\nmapboxgl.Style = require('./style/style');\n\nmapboxgl.LatLng = require('./geo/lat_lng');\nmapboxgl.LatLngBounds = require('./geo/lat_lng_bounds');\nmapboxgl.Point = require('point-geometry');\n\nmapboxgl.Evented = require('./util/evented');\nmapboxgl.util = require('./util/util');\n\nmapboxgl.supported = require('./util/browser').supported;\n\nvar ajax = require('./util/ajax');\nmapboxgl.util.getJSON = ajax.getJSON;\nmapboxgl.util.getArrayBuffer = ajax.getArrayBuffer;\n\nvar config = require('./util/config');\nmapboxgl.config = config;\n\nObject.defineProperty(mapboxgl, 'accessToken', {\n get: function() { return config.ACCESS_TOKEN; },\n set: function(token) { config.ACCESS_TOKEN = token; }\n});\n","'use strict';\n\nmodule.exports = Point;\n\nfunction Point(x, y) {\n this.x = x;\n this.y = y;\n}\n\nPoint.prototype = {\n clone: function() { return new Point(this.x, this.y); },\n\n add: function(p) { return this.clone()._add(p); },\n sub: function(p) { return this.clone()._sub(p); },\n mult: function(k) { return this.clone()._mult(k); },\n div: function(k) { return this.clone()._div(k); },\n rotate: function(a) { return this.clone()._rotate(a); },\n matMult: function(m) { return this.clone()._matMult(m); },\n unit: function() { return this.clone()._unit(); },\n perp: function() { return this.clone()._perp(); },\n round: function() { return this.clone()._round(); },\n\n mag: function() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n },\n\n equals: function(p) {\n return this.x === p.x &&\n this.y === p.y;\n },\n\n dist: function(p) {\n return Math.sqrt(this.distSqr(p));\n },\n\n distSqr: function(p) {\n var dx = p.x - this.x,\n dy = p.y - this.y;\n return dx * dx + dy * dy;\n },\n\n angle: function() {\n return Math.atan2(this.y, this.x);\n },\n\n angleTo: function(b) {\n return Math.atan2(this.y - b.y, this.x - b.x);\n },\n\n angleWith: function(b) {\n return this.angleWithSep(b.x, b.y);\n },\n\n // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(θ) for θ.\n angleWithSep: function(x, y) {\n return Math.atan2(\n this.x * y - this.y * x,\n this.x * x + this.y * y);\n },\n\n _matMult: function(m) {\n var x = m[0] * this.x + m[1] * this.y,\n y = m[2] * this.x + m[3] * this.y;\n this.x = x;\n this.y = y;\n return this;\n },\n\n _add: function(p) {\n this.x += p.x;\n this.y += p.y;\n return this;\n },\n\n _sub: function(p) {\n this.x -= p.x;\n this.y -= p.y;\n return this;\n },\n\n _mult: function(k) {\n this.x *= k;\n this.y *= k;\n return this;\n },\n\n _div: function(k) {\n this.x /= k;\n this.y /= k;\n return this;\n },\n\n _unit: function() {\n this._div(this.mag());\n return this;\n },\n\n _perp: function() {\n var y = this.y;\n this.y = this.x;\n this.x = -y;\n return this;\n },\n\n _rotate: function(angle) {\n var cos = Math.cos(angle),\n sin = Math.sin(angle),\n x = cos * this.x - sin * this.y,\n y = sin * this.x + cos * this.y;\n this.x = x;\n this.y = y;\n return this;\n },\n\n _round: function() {\n this.x = Math.round(this.x);\n this.y = Math.round(this.y);\n return this;\n }\n};\n\n// constructs Point from an array if necessary\nPoint.convert = function (a) {\n if (a instanceof Point) {\n return a;\n }\n if (Array.isArray(a)) {\n return new Point(a[0], a[1]);\n }\n return a;\n};\n","'use strict';\n\nvar Canvas = require('../util/canvas');\nvar util = require('../util/util');\nvar browser = require('../util/browser');\nvar Evented = require('../util/evented');\nvar DOM = require('../util/dom');\n\nvar Style = require('../style/style');\nvar AnimationLoop = require('../style/animation_loop');\nvar Painter = require('../render/painter');\n\nvar Transform = require('../geo/transform');\nvar Hash = require('./hash');\n\nvar Interaction = require('./interaction');\n\nvar Camera = require('./camera');\nvar LatLng = require('../geo/lat_lng');\nvar LatLngBounds = require('../geo/lat_lng_bounds');\nvar Point = require('point-geometry');\nvar Attribution = require('./control/attribution');\n\n/**\n * Options common to Map#addClass, Map#removeClass, and Map#setClasses, controlling\n * whether or not to smoothly transition property changes triggered by the class change.\n *\n * @typedef {Object} StyleOptions\n * @property {boolean} transition\n */\n\n/**\n * Creates a map instance.\n * @class Map\n * @param {Object} options\n * @param {string} options.container HTML element to initialize the map in (or element id as string)\n * @param {number} [options.minZoom=0] Minimum zoom of the map\n * @param {number} [options.maxZoom=20] Maximum zoom of the map\n * @param {Object} options.style Map style and data source definition (either a JSON object or a JSON URL), described in the [style reference](https://mapbox.com/mapbox-gl-style-spec/)\n * @param {boolean} [options.hash=false] If `true`, the map will track and update the page URL according to map position\n * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners are attached to the map, so it will not respond to input\n * @param {number} [options.bearingSnap=7] Snap to north threshold in degrees.\n * @param {Array} options.classes Style class names with which to initialize the map\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the implementation determines that the performance of the created WebGL context would be dramatically lower than expected.\n * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, The maps canvas can be exported to a PNG using `map.getCanvas().toDataURL();`. This is false by default as a performance optimization.\n * @example\n * var map = new mapboxgl.Map({\n * container: 'map',\n * center: [37.772537, -122.420679],\n * zoom: 13,\n * style: style_object,\n * hash: true\n * });\n */\nvar Map = module.exports = function(options) {\n\n options = this.options = util.inherit(this.options, options);\n\n this.animationLoop = new AnimationLoop();\n this.transform = new Transform(options.minZoom, options.maxZoom);\n\n if (options.maxBounds) {\n var b = LatLngBounds.convert(options.maxBounds);\n this.transform.latRange = [b.getSouth(), b.getNorth()];\n this.transform.lngRange = [b.getWest(), b.getEast()];\n }\n\n util.bindAll([\n '_forwardStyleEvent',\n '_forwardSourceEvent',\n '_forwardLayerEvent',\n '_forwardTileEvent',\n '_onStyleLoad',\n '_onStyleChange',\n '_onSourceAdd',\n '_onSourceRemove',\n '_onSourceUpdate',\n 'update',\n 'render'\n ], this);\n\n this._setupContainer();\n this._setupPainter();\n\n this.on('move', this.update);\n this.on('zoom', this.update.bind(this, true));\n this.on('moveend', function() {\n this.animationLoop.set(300); // text fading\n this._rerender();\n }.bind(this));\n\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', function () {\n this.stop().resize().update();\n }.bind(this), false);\n }\n\n this.interaction = new Interaction(this);\n\n if (options.interactive) {\n this.interaction.enable();\n }\n\n this._hash = options.hash && (new Hash()).addTo(this);\n // don't set position from options if set through hash\n if (!this._hash || !this._hash._onHashChange()) {\n this.jumpTo(options);\n }\n\n this.sources = {};\n this.stacks = {};\n this._classes = {};\n\n this.resize();\n\n if (options.classes) this.setClasses(options.classes);\n if (options.style) this.setStyle(options.style);\n if (options.attributionControl) this.addControl(new Attribution());\n};\n\nutil.extend(Map.prototype, Evented);\nutil.extend(Map.prototype, Camera.prototype);\nutil.extend(Map.prototype, /** @lends Map.prototype */{\n\n options: {\n center: [0, 0],\n zoom: 0,\n bearing: 0,\n pitch: 0,\n\n minZoom: 0,\n maxZoom: 20,\n\n interactive: true,\n\n scrollZoom: true,\n boxZoom: true,\n dragRotate: true,\n dragPan: true,\n keyboard: true,\n doubleClickZoom: true,\n pinch: true,\n\n bearingSnap: 7,\n\n hash: false,\n\n attributionControl: true,\n\n failIfMajorPerformanceCaveat: false,\n preserveDrawingBuffer: false\n },\n\n addControl: function(control) {\n control.addTo(this);\n return this;\n },\n\n /**\n * Adds a style class to a map\n *\n * @param {string} klass name of style class\n * @param {StyleOptions} [options]\n * @fires change\n * @returns {Map} `this`\n */\n addClass: function(klass, options) {\n if (this._classes[klass]) return;\n this._classes[klass] = true;\n if (this.style) this.style._cascade(this._classes, options);\n },\n\n /**\n * Removes a style class from a map\n *\n * @param {string} klass name of style class\n * @param {StyleOptions} [options]\n * @fires change\n * @returns {Map} `this`\n */\n removeClass: function(klass, options) {\n if (!this._classes[klass]) return;\n delete this._classes[klass];\n if (this.style) this.style._cascade(this._classes, options);\n },\n\n /**\n * Helper method to add more than one class\n *\n * @param {Array} klasses An array of class names\n * @param {StyleOptions} [options]\n * @fires change\n * @returns {Map} `this`\n */\n setClasses: function(klasses, options) {\n this._classes = {};\n for (var i = 0; i < klasses.length; i++) {\n this._classes[klasses[i]] = true;\n }\n if (this.style) this.style._cascade(this._classes, options);\n },\n\n /**\n * Check whether a style class is active\n *\n * @param {string} klass Name of style class\n * @returns {boolean}\n */\n hasClass: function(klass) {\n return !!this._classes[klass];\n },\n\n /**\n * Return an array of the current active style classes\n *\n * @returns {boolean}\n */\n getClasses: function() {\n return Object.keys(this._classes);\n },\n\n /**\n * Detect the map's new width and height and resize it.\n *\n * @returns {Map} `this`\n */\n resize: function() {\n var width = 0, height = 0;\n\n if (this._container) {\n width = this._container.offsetWidth || 400;\n height = this._container.offsetHeight || 300;\n }\n\n this._canvas.resize(width, height);\n\n this.transform.width = width;\n this.transform.height = height;\n this.transform._constrain();\n\n this.painter.resize(width, height);\n\n return this\n .fire('movestart')\n .fire('move')\n .fire('resize')\n .fire('moveend');\n },\n\n /**\n * Get the map's geographical bounds\n *\n * @returns {LatLngBounds}\n */\n getBounds: function() {\n return new LatLngBounds(\n this.transform.pointLocation(new Point(0, 0)),\n this.transform.pointLocation(this.transform.size));\n },\n\n /**\n * Get pixel coordinates (relative to map container) given a geographical location\n *\n * @param {LatLng} latlng\n * @returns {Object} `x` and `y` coordinates\n */\n project: function(latlng) {\n return this.transform.locationPoint(LatLng.convert(latlng));\n },\n\n /**\n * Get geographical coordinates given pixel coordinates\n *\n * @param {Array} point [x, y] pixel coordinates\n * @returns {LatLng}\n */\n unproject: function(point) {\n return this.transform.pointLocation(Point.convert(point));\n },\n\n /**\n * Get all features at a point ([x, y])\n *\n * @param {Array} point [x, y] pixel coordinates\n * @param {Object} params\n * @param {number} [params.radius=0] Optional. Radius in pixels to search in\n * @param {string} params.layer Optional. Only return features from a given layer\n * @param {string} params.type Optional. Either `raster` or `vector`\n * @param {boolean} [params.includeGeometry=false] Optional. If `true`, geometry of features will be included in the results at the expense of a much slower query time.\n * @param {featuresAtCallback} callback function that returns the response\n *\n * @callback featuresAtCallback\n * @param {Object|null} err Error _If any_\n * @param {Array} features Displays a JSON array of features given the passed parameters of `featuresAt`\n *\n * @returns {Map} `this`\n *\n * @example\n * map.featuresAt([10, 20], { radius: 10 }, function(err, features) {\n * console.log(features);\n * });\n */\n featuresAt: function(point, params, callback) {\n var location = this.unproject(point).wrap();\n var coord = this.transform.locationCoordinate(location);\n this.style.featuresAt(coord, params, callback);\n return this;\n },\n\n /**\n * Apply multiple style mutations in a batch\n *\n * map.batch(function (batch) {\n * batch.addLayer(layer1);\n * batch.addLayer(layer2);\n * ...\n * batch.addLayer(layerN);\n * });\n *\n * @param {function} work Function which accepts the StyleBatch interface\n */\n batch: function(work) {\n this.style.batch(work);\n\n this.style._cascade(this._classes);\n this.update(true);\n },\n\n /**\n * Replaces the map's style object\n *\n * @param {Object} style A style object formatted as JSON\n * @returns {Map} `this`\n */\n setStyle: function(style) {\n if (this.style) {\n this.style\n .off('load', this._onStyleLoad)\n .off('error', this._forwardStyleEvent)\n .off('change', this._onStyleChange)\n .off('source.add', this._onSourceAdd)\n .off('source.remove', this._onSourceRemove)\n .off('source.load', this._onSourceUpdate)\n .off('source.error', this._forwardSourceEvent)\n .off('source.change', this._onSourceUpdate)\n .off('layer.add', this._forwardLayerEvent)\n .off('layer.remove', this._forwardLayerEvent)\n .off('tile.add', this._forwardTileEvent)\n .off('tile.remove', this._forwardTileEvent)\n .off('tile.load', this.update)\n .off('tile.error', this._forwardTileEvent)\n ._remove();\n\n this.off('rotate', this.style._redoPlacement);\n this.off('pitch', this.style._redoPlacement);\n }\n\n if (!style) {\n this.style = null;\n return this;\n } else if (style instanceof Style) {\n this.style = style;\n } else {\n this.style = new Style(style, this.animationLoop);\n }\n\n this.style\n .on('load', this._onStyleLoad)\n .on('error', this._forwardStyleEvent)\n .on('change', this._onStyleChange)\n .on('source.add', this._onSourceAdd)\n .on('source.remove', this._onSourceRemove)\n .on('source.load', this._onSourceUpdate)\n .on('source.error', this._forwardSourceEvent)\n .on('source.change', this._onSourceUpdate)\n .on('layer.add', this._forwardLayerEvent)\n .on('layer.remove', this._forwardLayerEvent)\n .on('tile.add', this._forwardTileEvent)\n .on('tile.remove', this._forwardTileEvent)\n .on('tile.load', this.update)\n .on('tile.error', this._forwardTileEvent);\n\n this.on('rotate', this.style._redoPlacement);\n this.on('pitch', this.style._redoPlacement);\n\n return this;\n },\n\n /**\n * Add a source to the map style.\n *\n * @param {string} id ID of the source. Must not be used by any existing source.\n * @param {Object} source source specification, following the\n * [Mapbox GL Style Reference](https://www.mapbox.com/mapbox-gl-style-spec/#sources)\n * @fires source.add\n * @returns {Map} `this`\n */\n addSource: function(id, source) {\n this.style.addSource(id, source);\n return this;\n },\n\n /**\n * Remove an existing source from the map style.\n *\n * @param {string} id ID of the source to remove\n * @fires source.remove\n * @returns {Map} `this`\n */\n removeSource: function(id) {\n this.style.removeSource(id);\n return this;\n },\n\n /**\n * Return the style source object with the given `id`.\n *\n * @param {string} id source ID\n * @returns {Object}\n */\n getSource: function(id) {\n return this.style.getSource(id);\n },\n\n /**\n * Add a layer to the map style. The layer will be inserted before the layer with\n * ID `before`, or appended if `before` is omitted.\n * @param {StyleLayer|Object} layer\n * @param {string=} before ID of an existing layer to insert before\n * @fires layer.add\n * @returns {Map} `this`\n */\n addLayer: function(layer, before) {\n this.style.addLayer(layer, before);\n this.style._cascade(this._classes);\n return this;\n },\n\n /**\n * Remove the layer with the given `id` from the map. Any layers which refer to the\n * specified layer via a `ref` property are also removed.\n *\n * @param {string} id layer id\n * @fires layer.remove\n * @returns {Map} this\n */\n removeLayer: function(id) {\n this.style.removeLayer(id);\n this.style._cascade(this._classes);\n return this;\n },\n\n /**\n * Set the filter for a given style layer.\n *\n * @param {string} layer ID of a layer\n * @param {Array} filter filter specification, as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#filter)\n * @returns {Map} `this`\n */\n setFilter: function(layer, filter) {\n this.style.setFilter(layer, filter);\n return this;\n },\n\n /**\n * Set the zoom extent for a given style layer.\n *\n * @param {string} layerId ID of a layer\n * @param {number} minzoom minimum zoom extent\n * @param {number} maxzoom maximum zoom extent\n * @returns {Map} `this`\n */\n setLayerZoomRange: function(layerId, minzoom, maxzoom) {\n this.style.setLayerZoomRange(layerId, minzoom, maxzoom);\n return this;\n },\n\n /**\n * Get the filter for a given style layer.\n *\n * @param {string} layer ID of a layer\n * @returns {Array} filter specification, as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#filter)\n */\n getFilter: function(layer) {\n return this.style.getFilter(layer);\n },\n\n /**\n * Set the value of a paint property in a given style layer.\n *\n * @param {string} layer ID of a layer\n * @param {string} name name of a paint property\n * @param {*} value value for the paint propery; must have the type appropriate for the property as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/)\n * @param {string=} klass optional class specifier for the property\n * @returns {Map} `this`\n */\n setPaintProperty: function(layer, name, value, klass) {\n this.style.setPaintProperty(layer, name, value, klass);\n this.style._cascade(this._classes);\n this.update(true);\n return this;\n },\n\n /**\n * Get the value of a paint property in a given style layer.\n *\n * @param {string} layer ID of a layer\n * @param {string} name name of a paint property\n * @param {string=} klass optional class specifier for the property\n * @returns {*} value for the paint propery\n */\n getPaintProperty: function(layer, name, klass) {\n return this.style.getPaintProperty(layer, name, klass);\n },\n\n /**\n * Set the value of a layout property in a given style layer.\n *\n * @param {string} layer ID of a layer\n * @param {string} name name of a layout property\n * @param {*} value value for the layout propery; must have the type appropriate for the property as defined in the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/)\n * @returns {Map} `this`\n */\n setLayoutProperty: function(layer, name, value) {\n this.style.setLayoutProperty(layer, name, value);\n return this;\n },\n\n /**\n * Get the value of a layout property in a given style layer.\n *\n * @param {string} layer ID of a layer\n * @param {string} name name of a layout property\n * @param {string=} klass optional class specifier for the property\n * @returns {*} value for the layout propery\n */\n getLayoutProperty: function(layer, name) {\n return this.style.getLayoutProperty(layer, name);\n },\n\n /**\n * Get the Map's container as an HTML element\n * @returns {HTMLElement} container\n */\n getContainer: function() {\n return this._container;\n },\n\n /**\n * Get the container for the map `canvas` element.\n *\n * If you want to add non-GL overlays to the map, you should append them to this element. This\n * is the element to which event bindings for map interactivity such as panning and zooming are\n * attached. It will receive bubbled events for child elements such as the `canvas`, but not for\n * map controls.\n *\n * @returns {HTMLElement} container\n */\n getCanvasContainer: function() {\n return this._canvasContainer;\n },\n\n /**\n * Get the Map's canvas as an HTML canvas\n * @returns {HTMLElement} canvas\n */\n getCanvas: function() {\n return this._canvas.getElement();\n },\n\n _setupContainer: function() {\n var id = this.options.container;\n\n var container = this._container = typeof id === 'string' ? document.getElementById(id) : id;\n container.classList.add('mapboxgl-map');\n\n var canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container);\n if (this.options.interactive) {\n canvasContainer.classList.add('mapboxgl-interactive');\n }\n this._canvas = new Canvas(this, canvasContainer);\n\n var controlContainer = DOM.create('div', 'mapboxgl-control-container', container);\n var corners = this._controlCorners = {};\n ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach(function (pos) {\n corners[pos] = DOM.create('div', 'mapboxgl-ctrl-' + pos, controlContainer);\n });\n },\n\n _setupPainter: function() {\n var gl = this._canvas.getWebGLContext({\n failIfMajorPerformanceCaveat: this.options.failIfMajorPerformanceCaveat,\n preserveDrawingBuffer: this.options.preserveDrawingBuffer\n });\n\n if (!gl) {\n console.error('Failed to initialize WebGL');\n return;\n }\n\n this.painter = new Painter(gl, this.transform);\n },\n\n _contextLost: function(event) {\n event.preventDefault();\n if (this._frameId) {\n browser.cancelFrame(this._frameId);\n }\n },\n\n _contextRestored: function() {\n this._setupPainter();\n this.resize();\n this.update();\n },\n\n /**\n * Is this map fully loaded? If the style isn't loaded\n * or it has a change to the sources or style that isn't\n * propagated to its style, return false.\n *\n * @returns {boolean} whether the map is loaded\n */\n loaded: function() {\n if (this._styleDirty || this._sourcesDirty)\n return false;\n if (this.style && !this.style.loaded())\n return false;\n return true;\n },\n\n /**\n * Update this map's style and re-render the map.\n *\n * @param {Object} updateStyle new style\n * @returns {Map} this\n */\n update: function(updateStyle) {\n if (!this.style) return this;\n\n this._styleDirty = this._styleDirty || updateStyle;\n this._sourcesDirty = true;\n\n this._rerender();\n\n return this;\n },\n\n /**\n * Call when a (re-)render of the map is required, e.g. when the\n * user panned or zoomed,f or new data is available.\n * @returns {Map} this\n */\n render: function() {\n if (this.style && this._styleDirty) {\n this._styleDirty = false;\n this.style._recalculate(this.transform.zoom);\n }\n\n if (this.style && this._sourcesDirty && !this._sourcesDirtyTimeout) {\n this._sourcesDirty = false;\n this._sourcesDirtyTimeout = setTimeout(function() {\n this._sourcesDirtyTimeout = null;\n }.bind(this), 50);\n this.style._updateSources(this.transform);\n }\n\n this.painter.render(this.style, {\n debug: this.debug,\n vertices: this.vertices,\n rotating: this.rotating,\n zooming: this.zooming\n });\n\n this.fire('render');\n\n if (this.loaded() && !this._loaded) {\n this._loaded = true;\n this.fire('load');\n }\n\n this._frameId = null;\n\n if (!this.animationLoop.stopped()) {\n this._styleDirty = true;\n }\n\n if (this._sourcesDirty || this._repaint || !this.animationLoop.stopped()) {\n this._rerender();\n }\n\n return this;\n },\n\n /**\n * Destroys the map's underlying resources, including web workers.\n * @returns {Map} this\n */\n remove: function() {\n if (this._hash) this._hash.remove();\n browser.cancelFrame(this._frameId);\n clearTimeout(this._sourcesDirtyTimeout);\n this.setStyle(null);\n return this;\n },\n\n _rerender: function() {\n if (this.style && !this._frameId) {\n this._frameId = browser.frame(this.render);\n }\n },\n\n _forwardStyleEvent: function(e) {\n this.fire('style.' + e.type, util.extend({style: e.target}, e));\n },\n\n _forwardSourceEvent: function(e) {\n this.fire(e.type, util.extend({style: e.target}, e));\n },\n\n _forwardLayerEvent: function(e) {\n this.fire(e.type, util.extend({style: e.target}, e));\n },\n\n _forwardTileEvent: function(e) {\n this.fire(e.type, util.extend({style: e.target}, e));\n },\n\n _onStyleLoad: function(e) {\n this.style._cascade(this._classes, {transition: false});\n this._forwardStyleEvent(e);\n },\n\n _onStyleChange: function(e) {\n this.update(true);\n this._forwardStyleEvent(e);\n },\n\n _onSourceAdd: function(e) {\n var source = e.source;\n if (source.onAdd)\n source.onAdd(this);\n this._forwardSourceEvent(e);\n },\n\n _onSourceRemove: function(e) {\n var source = e.source;\n if (source.onRemove)\n source.onRemove(this);\n this._forwardSourceEvent(e);\n },\n\n _onSourceUpdate: function(e) {\n this.update();\n this._forwardSourceEvent(e);\n }\n});\n\nutil.extendAll(Map.prototype, /** @lends Map.prototype */{\n\n /**\n * Enable debugging mode\n *\n * @name debug\n * @type {boolean}\n */\n _debug: false,\n get debug() { return this._debug; },\n set debug(value) { this._debug = value; this.update(); },\n\n /**\n * Show collision boxes: useful for debugging label placement\n * in styles.\n *\n * @name collisionDebug\n * @type {boolean}\n */\n _collisionDebug: false,\n get collisionDebug() { return this._collisionDebug; },\n set collisionDebug(value) {\n this._collisionDebug = value;\n for (var i in this.style.sources) {\n this.style.sources[i].reload();\n }\n this.update();\n },\n\n /**\n * Enable continuous repaint to analyze performance\n *\n * @name repaint\n * @type {boolean}\n */\n _repaint: false,\n get repaint() { return this._repaint; },\n set repaint(value) { this._repaint = value; this.update(); },\n\n // show vertices\n _vertices: false,\n get vertices() { return this._vertices; },\n set vertices(value) { this._vertices = value; this.update(); }\n});\n","'use strict';\n\nmodule.exports = Popup;\n\nvar util = require('../util/util');\nvar Evented = require('../util/evented');\nvar DOM = require('../util/dom');\nvar LatLng = require('../geo/lat_lng');\n\n/**\n * Creates a popup component\n * @class Popup\n * @param {Object} options\n * @param {boolean} options.closeButton\n * @param {boolean} options.closeOnClick\n * @example\n * var tooltip = new mapboxgl.Popup()\n * .setLatLng(map.unproject(e.point))\n * .setHTML(\"

Hello World!

\")\n * .addTo(map);\n */\nfunction Popup(options) {\n util.setOptions(this, options);\n util.bindAll([\n '_updatePosition',\n '_onClickClose'],\n this);\n}\n\nPopup.prototype = util.inherit(Evented, /** @lends Popup.prototype */{\n options: {\n closeButton: true,\n closeOnClick: true\n },\n\n /**\n * Attaches the popup to a map\n * @param {Map} map\n * @returns {Popup} `this`\n */\n addTo: function(map) {\n this._map = map;\n this._map.on('move', this._updatePosition);\n if (this.options.closeOnClick) {\n this._map.on('click', this._onClickClose);\n }\n this._update();\n return this;\n },\n\n /**\n * Removes the popup from the map\n * @example\n * var popup = new mapboxgl.Popup().addTo(map);\n * popup.remove();\n * @returns {Popup} `this`\n */\n remove: function() {\n if (this._container) {\n this._container.parentNode.removeChild(this._container);\n }\n\n if (this._map) {\n this._map.off('move', this._updatePosition);\n this._map.off('click', this._onClickClose);\n delete this._map;\n }\n\n return this;\n },\n\n /**\n * Get the current coordinates of popup element relative to map\n * @returns {LatLng}\n */\n getLatLng: function() {\n return this._latLng;\n },\n\n /**\n * Set the coordinates of a popup element to a map\n * @param {LatLng} latlng\n * @returns {Popup} `this`\n */\n setLatLng: function(latlng) {\n this._latLng = LatLng.convert(latlng);\n this._update();\n return this;\n },\n\n /**\n * Fill a popup element with text only content\n * @param {string} text\n * @returns {Popup} `this`\n */\n setText: function(text) {\n this._content = document.createTextNode(text);\n this._updateContent();\n return this;\n },\n\n /**\n * Fill a popup element with HTML content\n * @param {string} html\n * @returns {Popup} `this`\n */\n setHTML: function(html) {\n this._content = document.createDocumentFragment();\n\n var temp = document.createElement('body'), child;\n temp.innerHTML = html;\n while (true) {\n child = temp.firstChild;\n if (!child) break;\n this._content.appendChild(child);\n }\n\n this._updateContent();\n return this;\n },\n\n _update: function() {\n if (!this._map) { return; }\n\n if (!this._container) {\n this._container = DOM.create('div', 'mapboxgl-popup', this._map.getContainer());\n\n this._tip = DOM.create('div', 'mapboxgl-popup-tip', this._container);\n this._wrapper = DOM.create('div', 'mapboxgl-popup-content', this._container);\n\n if (this.options.closeButton) {\n this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', this._wrapper);\n this._closeButton.innerHTML = '×';\n this._closeButton.addEventListener('click', this._onClickClose);\n }\n }\n\n this._updateContent();\n this._updatePosition();\n },\n\n _updateContent: function() {\n if (!this._content || !this._container) { return; }\n\n var node = this._wrapper;\n\n while (node.hasChildNodes()) {\n node.removeChild(node.firstChild);\n }\n\n if (this.options.closeButton) {\n node.appendChild(this._closeButton);\n }\n\n node.appendChild(this._content);\n },\n\n _updatePosition: function() {\n if (!this._latLng || !this._container) { return; }\n\n var pos = this._map.project(this._latLng).round(),\n anchor = this.options.anchor;\n\n if (!anchor) {\n var width = this._container.offsetWidth,\n height = this._container.offsetHeight;\n\n if (pos.y < height) {\n anchor = ['top'];\n } else if (pos.y > this._map.transform.height - height) {\n anchor = ['bottom'];\n } else {\n anchor = [];\n }\n\n if (pos.x < width / 2) {\n anchor.push('left');\n } else if (pos.x > this._map.transform.width - width / 2) {\n anchor.push('right');\n }\n\n if (anchor.length === 0) {\n anchor = 'bottom';\n } else {\n anchor = anchor.join('-');\n }\n\n this.options.anchor = anchor;\n }\n\n var anchorTranslate = {\n 'top': 'translate(-50%,0)',\n 'top-left': 'translate(0,0)',\n 'top-right': 'translate(-100%,0)',\n 'bottom': 'translate(-50%,-100%)',\n 'bottom-left': 'translate(0,-100%)',\n 'bottom-right': 'translate(-100%,-100%)',\n 'left': 'translate(0,-50%)',\n 'right': 'translate(-100%,-50%)'\n };\n\n var classList = this._container.classList;\n for (var key in anchorTranslate) {\n classList.remove('mapboxgl-popup-anchor-' + key);\n }\n classList.add('mapboxgl-popup-anchor-' + anchor);\n\n DOM.setTransform(this._container, anchorTranslate[anchor] + ' translate(' + pos.x + 'px,' + pos.y + 'px)');\n },\n\n _onClickClose: function() {\n this.remove();\n }\n});\n","'use strict';\n\nvar util = require('../util/util');\nvar Evented = require('../util/evented');\nvar TilePyramid = require('./tile_pyramid');\nvar Source = require('./source');\nvar urlResolve = require('resolve-url');\n\nmodule.exports = GeoJSONSource;\n\n/**\n * Create a GeoJSON data source instance given an options object\n * @class GeoJSONSource\n * @param {Object} [options]\n * @param {Object|string} options.data A GeoJSON data object or URL to it. The latter is preferable in case of large GeoJSON files.\n * @param {number} [options.maxzoom=14] Maximum zoom to preserve detail at.\n * @param {number} [options.buffer] Tile buffer on each side.\n * @param {number} [options.tolerance] Simplification tolerance (higher means simpler).\n * @example\n * var sourceObj = new mapboxgl.GeoJSONSource({\n * data: {\n * \"type\": \"FeatureCollection\",\n * \"features\": [{\n * \"type\": \"Feature\",\n * \"geometry\": {\n * \"type\": \"Point\",\n * \"coordinates\": [\n * -76.53063297271729,\n * 39.18174077994108\n * ]\n * }\n * }]\n * }\n * });\n * map.addSource('some id', sourceObj); // add\n * map.removeSource('some id'); // remove\n */\nfunction GeoJSONSource(options) {\n options = options || {};\n\n this._data = options.data;\n\n if (options.maxzoom !== undefined) this.maxzoom = options.maxzoom;\n\n this.geojsonVtOptions = { maxZoom: this.maxzoom };\n if (options.buffer !== undefined) this.geojsonVtOptions.buffer = options.buffer;\n if (options.tolerance !== undefined) this.geojsonVtOptions.tolerance = options.tolerance;\n\n this._pyramid = new TilePyramid({\n tileSize: 512,\n minzoom: this.minzoom,\n maxzoom: this.maxzoom,\n cacheSize: 20,\n load: this._loadTile.bind(this),\n abort: this._abortTile.bind(this),\n unload: this._unloadTile.bind(this),\n add: this._addTile.bind(this),\n remove: this._removeTile.bind(this)\n });\n}\n\nGeoJSONSource.prototype = util.inherit(Evented, /** @lends GeoJSONSource.prototype */{\n minzoom: 0,\n maxzoom: 14,\n _dirty: true,\n\n /**\n * Update source geojson data and rerender map\n *\n * @param {Object|string} data A GeoJSON data object or URL to it. The latter is preferable in case of large GeoJSON files.\n * @returns {GeoJSONSource} this\n */\n setData: function(data) {\n this._data = data;\n this._dirty = true;\n\n this.fire('change');\n\n if (this.map)\n this.update(this.map.transform);\n\n return this;\n },\n\n onAdd: function(map) {\n this.map = map;\n },\n\n loaded: function() {\n return this._loaded && this._pyramid.loaded();\n },\n\n update: function(transform) {\n if (this._dirty) {\n this._updateData();\n }\n\n if (this._loaded) {\n this._pyramid.update(this.used, transform);\n }\n },\n\n reload: function() {\n if (this._loaded) {\n this._pyramid.reload();\n }\n },\n\n render: Source._renderTiles,\n featuresAt: Source._vectorFeaturesAt,\n\n _updateData: function() {\n this._dirty = false;\n var data = this._data;\n if (typeof data === 'string') {\n data = urlResolve(window.location.href, data);\n }\n this.workerID = this.dispatcher.send('parse geojson', {\n data: data,\n tileSize: 512,\n source: this.id,\n geojsonVtOptions: this.geojsonVtOptions\n }, function(err) {\n\n if (err) {\n this.fire('error', {error: err});\n return;\n }\n this._loaded = true;\n this._pyramid.reload();\n\n this.fire('change');\n }.bind(this));\n },\n\n _loadTile: function(tile) {\n var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1;\n var params = {\n uid: tile.uid,\n coord: tile.coord,\n zoom: tile.coord.z,\n maxZoom: this.maxzoom,\n tileSize: 512,\n source: this.id,\n overscaling: overscaling,\n angle: this.map.transform.angle,\n pitch: this.map.transform.pitch,\n collisionDebug: this.map.collisionDebug\n };\n\n tile.workerID = this.dispatcher.send('load geojson tile', params, function(err, data) {\n\n tile.unloadVectorData(this.map.painter);\n\n if (tile.aborted)\n return;\n\n if (err) {\n this.fire('tile.error', {tile: tile});\n return;\n }\n\n tile.loadVectorData(data);\n this.fire('tile.load', {tile: tile});\n\n }.bind(this), this.workerID);\n },\n\n _abortTile: function(tile) {\n tile.aborted = true;\n },\n\n _addTile: function(tile) {\n this.fire('tile.add', {tile: tile});\n },\n\n _removeTile: function(tile) {\n this.fire('tile.remove', {tile: tile});\n },\n\n _unloadTile: function(tile) {\n tile.unloadVectorData(this.map.painter);\n this.glyphAtlas.removeGlyphs(tile.uid);\n this.dispatcher.send('remove tile', { uid: tile.uid, source: this.id }, null, tile.workerID);\n }\n});\n","'use strict';\n\nvar util = require('../util/util');\nvar Tile = require('./tile');\nvar LatLng = require('../geo/lat_lng');\nvar Point = require('point-geometry');\nvar Evented = require('../util/evented');\nvar Coordinate = require('../geo/coordinate');\nvar ajax = require('../util/ajax');\n\nmodule.exports = VideoSource;\n\n/**\n * Create a Video data source instance given an options object\n * @class VideoSource\n * @param {Object} [options]\n * @param {string|Array} options.url A string or array of URL(s) to video files\n * @param {Array} options.coordinates lat,lng coordinates in order clockwise starting at the top left: tl, tr, br, bl\n * @example\n * var sourceObj = new mapboxgl.VideoSource({\n * url: [\n * 'https://www.mapbox.com/videos/baltimore-smoke.mp4',\n * 'https://www.mapbox.com/videos/baltimore-smoke.webm'\n * ],\n * coordinates: [\n * [39.18579907229748, -76.54335737228394],\n * [39.1838364847587, -76.52803659439087],\n * [39.17683392507606, -76.5295386314392],\n * [39.17876344106642, -76.54520273208618]\n * ]\n * });\n * map.addSource('some id', sourceObj); // add\n * map.removeSource('some id'); // remove\n */\nfunction VideoSource(options) {\n this.coordinates = options.coordinates;\n\n ajax.getVideo(options.url, function(err, video) {\n // @TODO handle errors via event.\n if (err) return;\n\n this.video = video;\n this.video.loop = true;\n\n var loopID;\n\n // start repainting when video starts playing\n this.video.addEventListener('playing', function() {\n loopID = this.map.style.animationLoop.set(Infinity);\n this.map._rerender();\n }.bind(this));\n\n // stop repainting when video stops\n this.video.addEventListener('pause', function() {\n this.map.style.animationLoop.cancel(loopID);\n }.bind(this));\n\n this._loaded = true;\n\n if (this.map) {\n this.video.play();\n this.createTile();\n this.fire('change');\n }\n }.bind(this));\n}\n\nVideoSource.prototype = util.inherit(Evented, /** @lends VideoSource.prototype */{\n roundZoom: true,\n\n /**\n * Return the HTML video element.\n *\n * @returns {Object}\n */\n getVideo: function() {\n return this.video;\n },\n\n onAdd: function(map) {\n this.map = map;\n if (this.video) {\n this.video.play();\n this.createTile();\n }\n },\n\n createTile: function() {\n /*\n * Calculate which mercator tile is suitable for rendering the video in\n * and create a buffer with the corner coordinates. These coordinates\n * may be outside the tile, because raster tiles aren't clipped when rendering.\n */\n var map = this.map;\n var coords = this.coordinates.map(function(latlng) {\n var loc = LatLng.convert(latlng);\n return map.transform.locationCoordinate(loc).zoomTo(0);\n });\n\n var minX = Infinity;\n var minY = Infinity;\n var maxX = -Infinity;\n var maxY = -Infinity;\n\n for (var i = 0; i < coords.length; i++) {\n minX = Math.min(minX, coords[i].column);\n minY = Math.min(minY, coords[i].row);\n maxX = Math.max(maxX, coords[i].column);\n maxY = Math.max(maxY, coords[i].row);\n }\n\n var dx = maxX - minX;\n var dy = maxY - minY;\n var dMax = Math.max(dx, dy);\n var center = new Coordinate((minX + maxX) / 2, (minY + maxY) / 2, 0)\n .zoomTo(Math.floor(-Math.log(dMax) / Math.LN2));\n\n var tileExtent = 4096;\n var tileCoords = coords.map(function(coord) {\n var zoomedCoord = coord.zoomTo(center.zoom);\n return new Point(\n Math.round((zoomedCoord.column - center.column) * tileExtent),\n Math.round((zoomedCoord.row - center.row) * tileExtent));\n });\n\n var gl = map.painter.gl;\n var maxInt16 = 32767;\n var array = new Int16Array([\n tileCoords[0].x, tileCoords[0].y, 0, 0,\n tileCoords[1].x, tileCoords[1].y, maxInt16, 0,\n tileCoords[3].x, tileCoords[3].y, 0, maxInt16,\n tileCoords[2].x, tileCoords[2].y, maxInt16, maxInt16\n ]);\n\n this.tile = new Tile();\n this.tile.buckets = {};\n\n this.tile.boundsBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.tile.boundsBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, array, gl.STATIC_DRAW);\n\n this.center = center;\n },\n\n loaded: function() {\n return this.video && this.video.readyState >= 2;\n },\n\n update: function() {\n // noop\n },\n\n reload: function() {\n // noop\n },\n\n render: function(layers, painter) {\n if (!this._loaded) return;\n if (this.video.readyState < 2) return; // not enough data for current position\n\n var c = this.center;\n this.tile.calculateMatrices(c.zoom, c.column, c.row, this.map.transform, painter);\n\n var gl = painter.gl;\n if (!this.tile.texture) {\n this.tile.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.video);\n } else {\n gl.bindTexture(gl.TEXTURE_2D, this.tile.texture);\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video);\n }\n\n painter.drawLayers(layers, this.tile.posMatrix, this.tile);\n },\n\n featuresAt: function(point, params, callback) {\n return callback(null, []);\n }\n});\n","'use strict';\n\nvar Evented = require('../util/evented');\nvar styleBatch = require('./style_batch');\nvar StyleLayer = require('./style_layer');\nvar ImageSprite = require('./image_sprite');\nvar GlyphSource = require('../symbol/glyph_source');\nvar GlyphAtlas = require('../symbol/glyph_atlas');\nvar SpriteAtlas = require('../symbol/sprite_atlas');\nvar LineAtlas = require('../render/line_atlas');\nvar util = require('../util/util');\nvar ajax = require('../util/ajax');\nvar normalizeURL = require('../util/mapbox').normalizeStyleURL;\nvar browser = require('../util/browser');\nvar Dispatcher = require('../util/dispatcher');\nvar AnimationLoop = require('./animation_loop');\nvar validate = require('mapbox-gl-style-spec/lib/validate/latest');\n\nmodule.exports = Style;\n\nfunction Style(stylesheet, animationLoop) {\n this.animationLoop = animationLoop || new AnimationLoop();\n this.dispatcher = new Dispatcher(Math.max(browser.hardwareConcurrency - 1, 1), this);\n this.glyphAtlas = new GlyphAtlas(1024, 1024);\n this.spriteAtlas = new SpriteAtlas(512, 512);\n this.spriteAtlas.resize(browser.devicePixelRatio);\n this.lineAtlas = new LineAtlas(256, 512);\n\n this._layers = {};\n this._order = [];\n this._groups = [];\n this.sources = {};\n\n this.zoomHistory = {};\n\n util.bindAll([\n '_forwardSourceEvent',\n '_forwardTileEvent',\n '_redoPlacement'\n ], this);\n\n var loaded = function(err, stylesheet) {\n if (err) {\n this.fire('error', {error: err});\n return;\n }\n\n var valid = validate(stylesheet);\n if (valid.length) {\n valid.forEach(function(e) {\n throw new Error(e.message);\n });\n }\n\n this._loaded = true;\n this.stylesheet = stylesheet;\n\n var sources = stylesheet.sources;\n for (var id in sources) {\n this.addSource(id, sources[id]);\n }\n\n if (stylesheet.sprite) {\n this.sprite = new ImageSprite(stylesheet.sprite);\n this.sprite.on('load', this.fire.bind(this, 'change'));\n }\n\n this.glyphSource = new GlyphSource(stylesheet.glyphs, this.glyphAtlas);\n this._resolve();\n this.fire('load');\n }.bind(this);\n\n if (typeof stylesheet === 'string') {\n ajax.getJSON(normalizeURL(stylesheet), loaded);\n } else {\n browser.frame(loaded.bind(this, null, stylesheet));\n }\n}\n\nStyle.prototype = util.inherit(Evented, {\n _loaded: false,\n\n loaded: function() {\n if (!this._loaded)\n return false;\n\n for (var id in this.sources)\n if (!this.sources[id].loaded())\n return false;\n\n if (this.sprite && !this.sprite.loaded())\n return false;\n\n return true;\n },\n\n _resolve: function() {\n var id, layer;\n\n this._layers = {};\n this._order = [];\n\n for (var i = 0; i < this.stylesheet.layers.length; i++) {\n layer = new StyleLayer(this.stylesheet.layers[i], this.stylesheet.constants || {});\n this._layers[layer.id] = layer;\n this._order.push(layer.id);\n }\n\n // Resolve layout properties.\n for (id in this._layers) {\n this._layers[id].resolveLayout();\n }\n\n // Resolve reference and paint properties.\n for (id in this._layers) {\n this._layers[id].resolveReference(this._layers);\n this._layers[id].resolvePaint();\n }\n\n this._groupLayers();\n this._broadcastLayers();\n },\n\n _groupLayers: function() {\n var group;\n\n this._groups = [];\n\n // Split into groups of consecutive top-level layers with the same source.\n for (var i = 0; i < this._order.length; ++i) {\n var layer = this._layers[this._order[i]];\n\n if (!group || layer.source !== group.source) {\n group = [];\n group.source = layer.source;\n this._groups.push(group);\n }\n\n group.push(layer);\n }\n },\n\n _broadcastLayers: function() {\n var ordered = [];\n\n for (var id in this._layers) {\n ordered.push(this._layers[id].json());\n }\n\n this.dispatcher.broadcast('set layers', ordered);\n },\n\n _cascade: function(classes, options) {\n if (!this._loaded) return;\n\n options = options || {\n transition: true\n };\n\n for (var id in this._layers) {\n this._layers[id].cascade(classes, options,\n this.stylesheet.transition || {},\n this.animationLoop);\n }\n\n this.fire('change');\n },\n\n _recalculate: function(z) {\n for (var id in this.sources)\n this.sources[id].used = false;\n\n this._updateZoomHistory(z);\n\n this.rasterFadeDuration = 300;\n for (id in this._layers) {\n var layer = this._layers[id];\n\n if (layer.recalculate(z, this.zoomHistory) && layer.source) {\n this.sources[layer.source].used = true;\n }\n }\n\n var maxZoomTransitionDuration = 300;\n if (Math.floor(this.z) !== Math.floor(z)) {\n this.animationLoop.set(maxZoomTransitionDuration);\n }\n\n this.z = z;\n this.fire('zoom');\n },\n\n _updateZoomHistory: function(z) {\n\n var zh = this.zoomHistory;\n\n if (zh.lastIntegerZoom === undefined) {\n // first time\n zh.lastIntegerZoom = Math.floor(z);\n zh.lastIntegerZoomTime = 0;\n zh.lastZoom = z;\n }\n\n // check whether an integer zoom level as passed since the last frame\n // and if yes, record it with the time. Used for transitioning patterns.\n if (Math.floor(zh.lastZoom) < Math.floor(z)) {\n zh.lastIntegerZoom = Math.floor(z);\n zh.lastIntegerZoomTime = Date.now();\n\n } else if (Math.floor(zh.lastZoom) > Math.floor(z)) {\n zh.lastIntegerZoom = Math.floor(z + 1);\n zh.lastIntegerZoomTime = Date.now();\n }\n\n zh.lastZoom = z;\n },\n\n /**\n * Apply multiple style mutations in a batch\n * @param {function} work Function which accepts the StyleBatch interface\n * @private\n */\n batch: function(work) {\n styleBatch(this, work);\n },\n\n addSource: function(id, source) {\n this.batch(function(batch) {\n batch.addSource(id, source);\n });\n\n return this;\n },\n\n /**\n * Remove a source from this stylesheet, given its id.\n * @param {string} id id of the source to remove\n * @returns {Style} this style\n * @throws {Error} if no source is found with the given ID\n * @private\n */\n removeSource: function(id) {\n this.batch(function(batch) {\n batch.removeSource(id);\n });\n\n return this;\n },\n\n /**\n * Get a source by id.\n * @param {string} id id of the desired source\n * @returns {Object} source\n * @private\n */\n getSource: function(id) {\n return this.sources[id];\n },\n\n /**\n * Add a layer to the map style. The layer will be inserted before the layer with\n * ID `before`, or appended if `before` is omitted.\n * @param {StyleLayer|Object} layer\n * @param {string=} before ID of an existing layer to insert before\n * @fires layer.add\n * @returns {Style} `this`\n * @private\n */\n addLayer: function(layer, before) {\n this.batch(function(batch) {\n batch.addLayer(layer, before);\n });\n\n return this;\n },\n\n /**\n * Remove a layer from this stylesheet, given its id.\n * @param {string} id id of the layer to remove\n * @returns {Style} this style\n * @throws {Error} if no layer is found with the given ID\n * @private\n */\n removeLayer: function(id) {\n this.batch(function(batch) {\n batch.removeLayer(id);\n });\n\n return this;\n },\n\n /**\n * Get a layer by id.\n * @param {string} id id of the desired layer\n * @returns {Layer} layer\n * @private\n */\n getLayer: function(id) {\n return this._layers[id];\n },\n\n /**\n * If a layer has a `ref` property that makes it derive some values\n * from another layer, return that referent layer. Otherwise,\n * returns the layer itself.\n * @param {string} id the layer's id\n * @returns {Layer} the referent layer or the layer itself\n * @private\n */\n getReferentLayer: function(id) {\n var layer = this.getLayer(id);\n if (layer.ref) {\n layer = this.getLayer(layer.ref);\n }\n return layer;\n },\n\n setFilter: function(layer, filter) {\n this.batch(function(batch) {\n batch.setFilter(layer, filter);\n });\n\n return this;\n },\n\n setLayerZoomRange: function(layerId, minzoom, maxzoom) {\n this.batch(function(batch) {\n batch.setLayerZoomRange(layerId, minzoom, maxzoom);\n });\n\n return this;\n },\n\n /**\n * Get a layer's filter object\n * @param {string} layer the layer to inspect\n * @returns {*} the layer's filter, if any\n * @private\n */\n getFilter: function(layer) {\n return this.getReferentLayer(layer).filter;\n },\n\n setLayoutProperty: function(layer, name, value) {\n this.batch(function(batch) {\n batch.setLayoutProperty(layer, name, value);\n });\n\n return this;\n },\n\n /**\n * Get a layout property's value from a given layer\n * @param {string} layer the layer to inspect\n * @param {string} name the name of the layout property\n * @returns {*} the property value\n * @private\n */\n getLayoutProperty: function(layer, name) {\n return this.getReferentLayer(layer).getLayoutProperty(name);\n },\n\n setPaintProperty: function(layer, name, value, klass) {\n this.batch(function(batch) {\n batch.setPaintProperty(layer, name, value, klass);\n });\n\n return this;\n },\n\n getPaintProperty: function(layer, name, klass) {\n return this.getLayer(layer).getPaintProperty(name, klass);\n },\n\n featuresAt: function(coord, params, callback) {\n var features = [];\n var error = null;\n\n if (params.layer) {\n params.layer = { id: params.layer };\n }\n\n util.asyncEach(Object.keys(this.sources), function(id, callback) {\n var source = this.sources[id];\n source.featuresAt(coord, params, function(err, result) {\n if (result) features = features.concat(result);\n if (err) error = err;\n callback();\n });\n }.bind(this), function() {\n if (error) return callback(error);\n\n callback(null, features\n .filter(function(feature) {\n return this._layers[feature.layer] !== undefined;\n }.bind(this))\n .map(function(feature) {\n feature.layer = this._layers[feature.layer].json();\n return feature;\n }.bind(this)));\n }.bind(this));\n },\n\n _remove: function() {\n this.dispatcher.remove();\n },\n\n _reloadSource: function(id) {\n this.sources[id].reload();\n },\n\n _updateSources: function(transform) {\n for (var id in this.sources) {\n this.sources[id].update(transform);\n }\n },\n\n _redoPlacement: function() {\n for (var id in this.sources) {\n if (this.sources[id].redoPlacement) this.sources[id].redoPlacement();\n }\n },\n\n _forwardSourceEvent: function(e) {\n this.fire('source.' + e.type, util.extend({source: e.target}, e));\n },\n\n _forwardTileEvent: function(e) {\n this.fire(e.type, util.extend({source: e.target}, e));\n },\n\n // Callbacks from web workers\n\n 'get sprite json': function(params, callback) {\n var sprite = this.sprite;\n if (sprite.loaded()) {\n callback(null, { sprite: sprite.data, retina: sprite.retina });\n } else {\n sprite.on('load', function() {\n callback(null, { sprite: sprite.data, retina: sprite.retina });\n });\n }\n },\n\n 'get icons': function(params, callback) {\n var sprite = this.sprite;\n var spriteAtlas = this.spriteAtlas;\n if (sprite.loaded()) {\n spriteAtlas.setSprite(sprite);\n spriteAtlas.addIcons(params.icons, callback);\n } else {\n sprite.on('load', function() {\n spriteAtlas.setSprite(sprite);\n spriteAtlas.addIcons(params.icons, callback);\n });\n }\n },\n\n 'get glyphs': function(params, callback) {\n this.glyphSource.getSimpleGlyphs(params.fontstack, params.codepoints, params.uid, callback);\n }\n});\n","'use strict';\n\nmodule.exports = LatLng;\n\nvar wrap = require('../util/util').wrap;\n\n/**\n * Create a latitude, longitude object from a given latitude and longitude pair in degrees.\n *\n * @class LatLng\n * @classdesc A representation of a latitude and longitude point, in degrees.\n * @param {number} lat latitude\n * @param {number} lng longitude\n * @example\n * var latlng = new mapboxgl.LatLng(37.76, -122.44);\n */\nfunction LatLng(lat, lng) {\n if (isNaN(lat) || isNaN(lng)) {\n throw new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');\n }\n this.lat = +lat;\n this.lng = +lng;\n}\n\n/**\n * Return a new `LatLng` object whose longitude is wrapped to the range (-180, 180).\n *\n * @returns {LatLng} wrapped LatLng object\n * @example\n * var point = mapboxgl.LatLng(0, 200);\n * var wrapped = point.wrap();\n * wrapped.lng; // = -160\n */\nLatLng.prototype.wrap = function () {\n return new LatLng(this.lat, wrap(this.lng, -180, 180));\n};\n\n/**\n * Convert an array to a `LatLng` object, or return an existing `LatLng` object\n * unchanged.\n *\n * @param {Array|LatLng} input `input` to convert\n * @returns {LatLng} LatLng object or original input\n * @example\n * var ll = mapboxgl.LatLng.convert([10, 10]);\n * var ll2 = new mapboxgl.LatLng(10, 10);\n * ll // = ll2\n */\nLatLng.convert = function (input) {\n if (input instanceof LatLng) {\n return input;\n }\n if (Array.isArray(input)) {\n return new LatLng(input[0], input[1]);\n }\n return input;\n};\n","'use strict';\n\nmodule.exports = LatLngBounds;\n\nvar LatLng = require('./lat_lng');\n\n/**\n * Creates a bounding box from the given pair of points. If parameteres are omitted, a `null` bounding box is created.\n *\n * @class LatLngBounds\n * @classdesc A representation of rectangular box on the earth, defined by its southwest and northeast points in latitude and longitude.\n * @param {LatLng} sw southwest\n * @param {LatLng} ne northeast\n * @example\n * var sw = new mapboxgl.LatLng(0, 0);\n * var ne = new mapboxgl.LatLng(10, -10);\n * var bounds = new mapboxgl.LatLngBounds(sw, ne);\n *\n */\nfunction LatLngBounds(sw, ne) {\n if (!sw) return;\n\n var latlngs = ne ? [sw, ne] : sw;\n\n for (var i = 0, len = latlngs.length; i < len; i++) {\n this.extend(latlngs[i]);\n }\n}\n\nLatLngBounds.prototype = {\n\n /**\n * Extend the bounds to include a given LatLng or LatLngBounds.\n *\n * @param {LatLng|LatLngBounds} obj object to extend to\n * @returns {LatLngBounds} `this`\n */\n extend: function(obj) {\n var sw = this._sw,\n ne = this._ne,\n sw2, ne2;\n\n if (obj instanceof LatLng) {\n sw2 = obj;\n ne2 = obj;\n\n } else if (obj instanceof LatLngBounds) {\n sw2 = obj._sw;\n ne2 = obj._ne;\n\n if (!sw2 || !ne2) return this;\n\n } else {\n return obj ? this.extend(LatLng.convert(obj) || LatLngBounds.convert(obj)) : this;\n }\n\n if (!sw && !ne) {\n this._sw = new LatLng(sw2.lat, sw2.lng);\n this._ne = new LatLng(ne2.lat, ne2.lng);\n\n } else {\n sw.lat = Math.min(sw2.lat, sw.lat);\n sw.lng = Math.min(sw2.lng, sw.lng);\n ne.lat = Math.max(ne2.lat, ne.lat);\n ne.lng = Math.max(ne2.lng, ne.lng);\n }\n\n return this;\n },\n\n /**\n * Get the point equidistant from this box's corners\n * @returns {LatLng} centerpoint\n * @example\n * var bounds = new mapboxgl.LatLngBounds(\n * new mapboxgl.LatLng(10, 10),\n * new mapboxgl.LatLng(-10, -10);\n * bounds.getCenter(); // equals mapboxgl.LatLng(0, 0)\n */\n getCenter: function() {\n return new LatLng((this._sw.lat + this._ne.lat) / 2, (this._sw.lng + this._ne.lng) / 2);\n },\n\n /**\n * Get southwest corner\n * @returns {LatLng} southwest\n */\n getSouthWest: function() { return this._sw; },\n\n /**\n * Get northeast corner\n * @returns {LatLng} northeast\n */\n getNorthEast: function() { return this._ne; },\n\n /**\n * Get northwest corner\n * @returns {LatLng} northwest\n */\n getNorthWest: function() { return new LatLng(this.getNorth(), this.getWest()); },\n\n /**\n * Get southeast corner\n * @returns {LatLng} southeast\n */\n getSouthEast: function() { return new LatLng(this.getSouth(), this.getEast()); },\n\n /**\n * Get west edge longitude\n * @returns {number} west\n */\n getWest: function() { return this._sw.lng; },\n\n /**\n * Get south edge latitude\n * @returns {number} south\n */\n getSouth: function() { return this._sw.lat; },\n\n /**\n * Get east edge longitude\n * @returns {number} east\n */\n getEast: function() { return this._ne.lng; },\n\n /**\n * Get north edge latitude\n * @returns {number} north\n */\n getNorth: function() { return this._ne.lat; }\n};\n\n/**\n * constructs LatLngBounds from an array if necessary\n * @param {LatLngBounds|*} a any input\n * @returns {LatLngBounds|false}\n * @example\n * // calls LatLng.convert internally to\n * // support arrays as latlng values\n * LatLngBounds.convert([[-10, -10], [10, 10]]);\n */\nLatLngBounds.convert = function (a) {\n if (!a || a instanceof LatLngBounds) return a;\n return new LatLngBounds(a);\n};\n","'use strict';\n\nvar util = require('./util');\n\n/**\n * Methods mixed in to other classes for event capabilities.\n * @mixin Evented\n */\nvar Evented = {\n\n /**\n * Subscribe to a specified event with a listener function the latter gets the data object that was passed to `fire` and additionally `target` and `type` properties\n *\n * @param {string} type Event type\n * @param {Function} listener Function to be called when the event is fired\n */\n on: function(type, fn) {\n this._events = this._events || {};\n this._events[type] = this._events[type] || [];\n this._events[type].push(fn);\n\n return this;\n },\n\n /**\n * Remove a event listener\n *\n * @param {string} [type] Event type. If none is specified, remove all listeners\n * @param {Function} [listener] Function to be called when the event is fired. If none is specified all listeners are removed\n */\n off: function(type, fn) {\n if (!type) {\n // clear all listeners if no arguments specified\n delete this._events;\n return this;\n }\n\n if (!this.listens(type)) return this;\n\n if (fn) {\n var idx = this._events[type].indexOf(fn);\n if (idx >= 0) {\n this._events[type].splice(idx, 1);\n }\n if (!this._events[type].length) {\n delete this._events[type];\n }\n } else {\n delete this._events[type];\n }\n\n return this;\n },\n\n /**\n * Call a function once when an event has fired\n *\n * @param {string} type Event type.\n * @param {Function} listener Function to be called once when the event is fired\n */\n once: function(type, fn) {\n var wrapper = function(data) {\n this.off(type, wrapper);\n fn.call(this, data);\n }.bind(this);\n this.on(type, wrapper);\n return this;\n },\n\n /**\n * Fire event of a given string type with the given data object\n *\n * @param {string} type Event type\n * @param {Object} [data] Optional data passed down to the event object\n * @returns {Object} `this`\n */\n fire: function(type, data) {\n if (!this.listens(type)) return this;\n\n data = util.extend({}, data);\n util.extend(data, {type: type, target: this});\n\n // make sure adding/removing listeners inside other listeners won't cause infinite loop\n var listeners = this._events[type].slice();\n\n for (var i = 0; i < listeners.length; i++) {\n listeners[i].call(this, data);\n }\n\n return this;\n },\n\n /**\n * Check if an event is registered to a type\n * @param {string} type Event type\n * @returns {boolean} `true` if there is at least one registered listener for events of type `type`\n */\n listens: function(type) {\n return !!(this._events && this._events[type]);\n }\n};\n\nmodule.exports = Evented;\n","'use strict';\n\nvar UnitBezier = require('unitbezier');\n\n/**\n * Given a value `t` that varies between 0 and 1, return\n * an interpolation function that eases between 0 and 1 in a pleasing\n * cubic in-out fashion.\n *\n * @param {number} t input\n * @returns {number} input\n * @private\n */\nexports.easeCubicInOut = function (t) {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n var t2 = t * t,\n t3 = t2 * t;\n return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75);\n};\n\n/**\n * Given given (x, y), (x1, y1) control points for a bezier curve,\n * return a function that interpolates along that curve.\n *\n * @param {number} p1x control point 1 x coordinate\n * @param {number} p1y control point 1 y coordinate\n * @param {number} p2x control point 2 x coordinate\n * @param {number} p2y control point 2 y coordinate\n * @returns {Function} interpolator: receives number value, returns\n * number value.\n * @private\n */\nexports.bezier = function(p1x, p1y, p2x, p2y) {\n var bezier = new UnitBezier(p1x, p1y, p2x, p2y);\n return function(t) {\n return bezier.solve(t);\n };\n};\n\n/**\n * A default bezier-curve powered easing function with\n * control points (0.25, 0.1) and (0.25, 1)\n *\n * @param {number} t\n * @returns {number} output\n * @private\n */\nexports.ease = exports.bezier(0.25, 0.1, 0.25, 1);\n\n/**\n * Given a four-element array of numbers that represents a color in\n * RGBA, return a version for which the RGB components are multiplied\n * by the A (alpha) component\n *\n * @param {Array} c color array\n * @returns {Array} premultiplied color array\n * @private\n */\nexports.premultiply = function (c) {\n c[0] *= c[3];\n c[1] *= c[3];\n c[2] *= c[3];\n return c;\n};\n\n/**\n * constrain n to the given range via min + max\n *\n * @param {number} n value\n * @param {number} min the minimum value to be returned\n * @param {number} max the maximum value to be returned\n * @returns {number} the clamped value\n * @private\n */\nexports.clamp = function (n, min, max) {\n return Math.min(max, Math.max(min, n));\n};\n\n/*\n * constrain n to the given range via modular arithmetic\n * @param {number} n\n * @param {number} min\n * @param {number} max\n * @returns {number} constrained number\n * @private\n */\nexports.wrap = function (n, min, max) {\n var d = max - min;\n return n === max ? n : ((n - min) % d + d) % d + min;\n};\n\n/*\n * return the first non-null and non-undefined argument to this function.\n * @returns {*} argument\n * @private\n */\nexports.coalesce = function() {\n for (var i = 0; i < arguments.length; i++) {\n var arg = arguments[i];\n if (arg !== null && arg !== undefined)\n return arg;\n }\n};\n\n/*\n * Call an asynchronous function on an array of arguments,\n * calling `callback` once all calls complete.\n *\n * @param {Array<*>} array input to each call of the async function.\n * @param {Function} fn an async function with signature (data, callback)\n * @param {Function} callback a callback run after all async work is done.\n * called with no arguments\n * @returns {undefined}\n * @private\n */\nexports.asyncEach = function (array, fn, callback) {\n var remaining = array.length;\n if (remaining === 0) return callback();\n function check() { if (--remaining === 0) callback(); }\n for (var i = 0; i < array.length; i++) fn(array[i], check);\n};\n\n/*\n * Compute the difference between the keys in one object and the keys\n * in another object.\n *\n * @param {Object} obj\n * @param {Object} other\n * @returns {Array} keys difference\n * @private\n */\nexports.keysDifference = function (obj, other) {\n var difference = [];\n for (var i in obj) {\n if (!(i in other)) {\n difference.push(i);\n }\n }\n return difference;\n};\n\n/**\n * Given a destination object and optionally many source objects,\n * copy all properties from the source objects into the destination.\n * The last source object given overrides properties from previous\n * source objects.\n * @param {Object} dest destination object\n * @param {...Object} sources sources from which properties are pulled\n * @returns {Object} dest\n * @private\n */\nexports.extend = function (dest) {\n for (var i = 1; i < arguments.length; i++) {\n var src = arguments[i];\n for (var k in src) {\n dest[k] = src[k];\n }\n }\n return dest;\n};\n\n/**\n * Extend a destination object with all properties of the src object,\n * using defineProperty instead of simple assignment.\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n * @private\n */\nexports.extendAll = function (dest, src) {\n for (var i in src) {\n Object.defineProperty(dest, i, Object.getOwnPropertyDescriptor(src, i));\n }\n return dest;\n};\n\n/**\n * Extend a parent's prototype with all properties in a properties\n * object.\n *\n * @param {Object} parent\n * @param {Object} props\n * @returns {Object}\n * @private\n */\nexports.inherit = function (parent, props) {\n var parentProto = typeof parent === 'function' ? parent.prototype : parent,\n proto = Object.create(parentProto);\n exports.extendAll(proto, props);\n return proto;\n};\n\n/**\n * Given an object and a number of properties as strings, return version\n * of that object with only those properties.\n *\n * @param {Object} src the object\n * @param {Array} properties an array of property names chosen\n * to appear on the resulting object.\n * @returns {Object} object with limited properties.\n * @example\n * var foo = { name: 'Charlie', age: 10 };\n * var justName = pick(foo, ['name']);\n * // justName = { name: 'Charlie' }\n * @private\n */\nexports.pick = function (src, properties) {\n var result = {};\n for (var i = 0; i < properties.length; i++) {\n var k = properties[i];\n if (k in src) {\n result[k] = src[k];\n }\n }\n return result;\n};\n\nvar id = 1;\n\n/**\n * Return a unique numeric id, starting at 1 and incrementing with\n * each call.\n *\n * @returns {number} unique numeric id.\n * @private\n */\nexports.uniqueId = function () {\n return id++;\n};\n\n/**\n * Create a version of `fn` that only fires once every `time` millseconds.\n *\n * @param {Function} fn the function to be throttled\n * @param {number} time millseconds required between function calls\n * @param {*} context the value of `this` with which the function is called\n * @returns {Function} debounced function\n * @private\n */\nexports.throttle = function (fn, time, context) {\n var lock, args, wrapperFn, later;\n\n later = function () {\n // reset lock and call if queued\n lock = false;\n if (args) {\n wrapperFn.apply(context, args);\n args = false;\n }\n };\n\n wrapperFn = function () {\n if (lock) {\n // called too soon, queue to call later\n args = arguments;\n\n } else {\n // call and lock until later\n fn.apply(context, arguments);\n setTimeout(later, time);\n lock = true;\n }\n };\n\n return wrapperFn;\n};\n\n/**\n * Create a version of `fn` that is only called `time` milliseconds\n * after its last invocation\n *\n * @param {Function} fn the function to be debounced\n * @param {number} time millseconds after which the function will be invoked\n * @returns {Function} debounced function\n * @private\n */\nexports.debounce = function(fn, time) {\n var timer, args;\n\n return function() {\n args = arguments;\n clearTimeout(timer);\n\n timer = setTimeout(function() {\n fn.apply(null, args);\n }, time);\n };\n};\n\n/**\n * Given an array of member function names as strings, replace all of them\n * with bound versions that will always refer to `context` as `this`. This\n * is useful for classes where otherwise event bindings would reassign\n * `this` to the evented object or some other value: this lets you ensure\n * the `this` value always.\n *\n * @param {Array} fns list of member function names\n * @param {*} context the context value\n * @returns {undefined} changes functions in-place\n * @example\n * function MyClass() {\n * bindAll(['ontimer'], this);\n * this.name = 'Tom';\n * }\n * MyClass.prototype.ontimer = function() {\n * alert(this.name);\n * };\n * var myClass = new MyClass();\n * setTimeout(myClass.ontimer, 100);\n * @private\n */\nexports.bindAll = function(fns, context) {\n fns.forEach(function(fn) {\n context[fn] = context[fn].bind(context);\n });\n};\n\nexports.bindHandlers = function(context) {\n for (var i in context) {\n if (typeof context[i] === 'function' && i.indexOf('_on') === 0) {\n context[i] = context[i].bind(context);\n }\n }\n};\n\n/**\n * Set the 'options' property on `obj` with properties\n * from the `options` argument. Properties in the `options`\n * object will override existing properties.\n *\n * @param {Object} obj destination object\n * @param {Object} options object of override options\n * @returns {Object} derived options object.\n * @private\n */\nexports.setOptions = function(obj, options) {\n if (!obj.hasOwnProperty('options')) {\n obj.options = obj.options ? Object.create(obj.options) : {};\n }\n for (var i in options) {\n obj.options[i] = options[i];\n }\n return obj.options;\n};\n","'use strict';\n\nmodule.exports = {\n HTTP_URL: 'http://a.tiles.mapbox.com',\n HTTPS_URL: 'https://a.tiles.mapbox.com',\n FORCE_HTTPS: true,\n REQUIRE_ACCESS_TOKEN: true\n};\n","'use strict';\n\nmodule.exports = Control;\n\n/**\n * A base class for map-related interface elements.\n *\n * @class Control\n */\nfunction Control() {}\n\nControl.prototype = {\n /**\n * Add this control to the map, returning the control itself\n * for chaining. This will insert the control's DOM element into\n * the map's DOM element if the control has a `position` specified.\n *\n * @param {Map} map\n * @returns {Control} `this`\n */\n addTo: function(map) {\n this._map = map;\n var container = this._container = this.onAdd(map);\n if (this.options && this.options.position) {\n var pos = this.options.position;\n var corner = map._controlCorners[pos];\n container.className += ' mapboxgl-ctrl';\n if (pos.indexOf('bottom') !== -1) {\n corner.insertBefore(container, corner.firstChild);\n } else {\n corner.appendChild(container);\n }\n }\n\n return this;\n },\n\n /**\n * Remove this control from the map it has been added to.\n *\n * @returns {Control} `this`\n */\n remove: function() {\n this._container.parentNode.removeChild(this._container);\n if (this.onRemove) this.onRemove(this._map);\n this._map = null;\n return this;\n }\n};\n","'use strict';\n\nvar Control = require('./control');\nvar DOM = require('../../util/dom');\nvar util = require('../../util/util');\n\nmodule.exports = Navigation;\n\n/**\n * Creates a navigation control with zoom buttons and a compass\n * @class Navigation\n * @param {Object} [options]\n * @param {string} [options.position=top-right] A string indicating the control's position on the map. Options are `top-right`, `top-left`, `bottom-right`, `bottom-left`\n * @example\n * map.addControl(new mapboxgl.Navigation({position: 'top-left'})); // position is optional\n */\nfunction Navigation(options) {\n util.setOptions(this, options);\n}\n\nNavigation.prototype = util.inherit(Control, {\n options: {\n position: 'top-right'\n },\n\n onAdd: function(map) {\n var className = 'mapboxgl-ctrl';\n\n var container = this._container = DOM.create('div', className + '-group', map.getContainer());\n\n this._zoomInButton = this._createButton(className + '-icon ' + className + '-zoom-in', map.zoomIn.bind(map));\n this._zoomOutButton = this._createButton(className + '-icon ' + className + '-zoom-out', map.zoomOut.bind(map));\n this._compass = this._createButton(className + '-compass', map.resetNorth.bind(map));\n\n var compassCanvas = this._compassCanvas = DOM.create('canvas', className + '-compass-canvas', this._compass);\n compassCanvas.style.cssText = 'width:30px; height:30px;';\n compassCanvas.width = 26 * 2;\n compassCanvas.height = 26 * 2;\n\n this._compass.addEventListener('mousedown', this._onCompassDown.bind(this));\n this._onCompassMove = this._onCompassMove.bind(this);\n this._onCompassUp = this._onCompassUp.bind(this);\n\n this._compassCtx = compassCanvas.getContext('2d');\n\n map.on('rotate', this._drawNorth.bind(this));\n this._drawNorth();\n\n return container;\n },\n\n _onCompassDown: function(e) {\n DOM.disableDrag();\n\n document.addEventListener('mousemove', this._onCompassMove);\n document.addEventListener('mouseup', this._onCompassUp);\n this._prevX = e.screenX;\n\n e.stopPropagation();\n },\n\n _onCompassMove: function(e) {\n var x = e.screenX,\n d = x < 2 ? -5 : // left edge of the screen, continue rotating\n x > window.screen.width - 2 ? 5 : // right edge\n (x - this._prevX) / 4;\n\n this._map.setBearing(this._map.getBearing() - d);\n this._prevX = e.screenX;\n this._moved = true;\n\n e.preventDefault();\n },\n\n _onCompassUp: function() {\n document.removeEventListener('mousemove', this._onCompassMove);\n document.removeEventListener('mouseup', this._onCompassUp);\n DOM.enableDrag();\n\n if (this._moved) {\n this._moved = false;\n DOM.suppressClick();\n }\n\n this._map.snapToNorth();\n },\n\n _createButton: function(className, fn) {\n var a = DOM.create('button', className, this._container);\n a.addEventListener('click', function() { fn(); });\n return a;\n },\n\n _drawNorth: function() {\n var rad = 20,\n width = 8,\n center = 26,\n angle = this._map.transform.angle + (Math.PI / 2),\n ctx = this._compassCtx;\n\n this._compassCanvas.width = this._compassCanvas.width;\n\n ctx.translate(center, center);\n ctx.rotate(angle);\n\n ctx.beginPath();\n ctx.fillStyle = '#000';\n ctx.lineTo(0, -width);\n ctx.lineTo(-rad, 0);\n ctx.lineTo(0, width);\n ctx.fill();\n\n ctx.beginPath();\n ctx.fillStyle = '#bbb';\n ctx.moveTo(0, 0);\n ctx.lineTo(0, width);\n ctx.lineTo(rad, 0);\n ctx.lineTo(0, -width);\n ctx.fill();\n\n ctx.beginPath();\n ctx.strokeStyle = '#fff';\n ctx.lineWidth = 4;\n ctx.moveTo(0, -width);\n ctx.lineTo(0, width);\n ctx.stroke();\n }\n});\n","'use strict';\n\nvar Control = require('./control');\nvar DOM = require('../../util/dom');\nvar util = require('../../util/util');\n\nmodule.exports = Attribution;\n\n/**\n * Creates an attribution control\n * @class Attribution\n * @example\n * map.addControl(new mapboxgl.Attribution());\n */\nfunction Attribution() {}\n\nAttribution.prototype = util.inherit(Control, {\n options: {\n position: 'bottom-right'\n },\n\n onAdd: function(map) {\n var className = 'mapboxgl-ctrl-attrib',\n container = this._container = DOM.create('div', className, map.getContainer());\n\n this._update();\n map.on('source.load', this._update.bind(this));\n map.on('source.change', this._update.bind(this));\n map.on('source.remove', this._update.bind(this));\n map.on('moveend', this._updateEditLink.bind(this));\n\n return container;\n },\n\n _update: function() {\n var attributions = [];\n\n if (this._map.style) {\n for (var id in this._map.style.sources) {\n var source = this._map.style.sources[id];\n if (source.attribution && attributions.indexOf(source.attribution) < 0) {\n attributions.push(source.attribution);\n }\n }\n }\n\n this._container.innerHTML = attributions.join(' | ');\n this._editLink = this._container.getElementsByClassName('mapbox-improve-map')[0];\n this._updateEditLink();\n },\n\n _updateEditLink: function() {\n if (this._editLink) {\n var center = this._map.getCenter();\n this._editLink.href = 'https://www.mapbox.com/map-feedback/#/' +\n center.lng + '/' + center.lat + '/' + Math.round(this._map.getZoom() + 1);\n }\n }\n});\n","'use strict';\n\nvar Canvas = require('./canvas');\n\nvar frame = window.requestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.msRequestAnimationFrame;\n\nexports.frame = function(fn) {\n return frame(fn);\n};\n\nvar cancel = window.cancelAnimationFrame ||\n window.mozCancelAnimationFrame ||\n window.webkitCancelAnimationFrame ||\n window.msCancelAnimationFrame;\n\nexports.cancelFrame = function(id) {\n cancel(id);\n};\n\nexports.timed = function (fn, dur, ctx) {\n if (!dur) {\n fn.call(ctx, 1);\n return null;\n }\n\n var abort = false,\n start = window.performance ? window.performance.now() : Date.now();\n\n function tick(now) {\n if (abort) return;\n if (!window.performance) now = Date.now();\n\n if (now >= start + dur) {\n fn.call(ctx, 1);\n } else {\n fn.call(ctx, (now - start) / dur);\n exports.frame(tick);\n }\n }\n\n exports.frame(tick);\n\n return function() { abort = true; };\n};\n\n/**\n * Test whether the basic JavaScript and DOM features required for Mapbox GL are present.\n * @param {Object} options\n * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the implementation determines that the performance of the created WebGL context would be dramatically lower than expected.\n * @return {boolean} Returns true if Mapbox GL should be expected to work, and false if not.\n * @memberof mapboxgl\n * @static\n */\nexports.supported = function(options) {\n\n var supports = [\n\n function() { return typeof window !== 'undefined'; },\n\n function() { return typeof document !== 'undefined'; },\n\n function () {\n return !!(Array.prototype &&\n Array.prototype.every &&\n Array.prototype.filter &&\n Array.prototype.forEach &&\n Array.prototype.indexOf &&\n Array.prototype.lastIndexOf &&\n Array.prototype.map &&\n Array.prototype.some &&\n Array.prototype.reduce &&\n Array.prototype.reduceRight &&\n Array.isArray);\n },\n\n function() {\n return !!(Function.prototype && Function.prototype.bind) &&\n !!(Object.keys &&\n Object.create &&\n Object.getPrototypeOf &&\n Object.getOwnPropertyNames &&\n Object.isSealed &&\n Object.isFrozen &&\n Object.isExtensible &&\n Object.getOwnPropertyDescriptor &&\n Object.defineProperty &&\n Object.defineProperties &&\n Object.seal &&\n Object.freeze &&\n Object.preventExtensions);\n },\n\n function() {\n return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON;\n },\n\n function() {\n return new Canvas().supportsWebGLContext((options && options.failIfMajorPerformanceCaveat) || false);\n },\n\n function() { return 'Worker' in window; }\n ];\n\n for (var i = 0; i < supports.length; i++) {\n if (!supports[i]()) return false;\n }\n return true;\n};\n\nexports.hardwareConcurrency = navigator.hardwareConcurrency || 8;\n\nObject.defineProperty(exports, 'devicePixelRatio', {\n get: function() { return window.devicePixelRatio; }\n});\n","'use strict';\n\nexports.getJSON = function(url, callback) {\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onerror = function(e) {\n callback(e);\n };\n xhr.onload = function() {\n if (xhr.status >= 200 && xhr.status < 300 && xhr.response) {\n var data;\n try {\n data = JSON.parse(xhr.response);\n } catch (err) {\n return callback(err);\n }\n callback(null, data);\n } else {\n callback(new Error(xhr.statusText));\n }\n };\n xhr.send();\n return xhr;\n};\n\nexports.getArrayBuffer = function(url, callback) {\n var xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.responseType = 'arraybuffer';\n xhr.onerror = function(e) {\n callback(e);\n };\n xhr.onload = function() {\n if (xhr.status >= 200 && xhr.status < 300 && xhr.response) {\n callback(null, xhr.response);\n } else {\n callback(new Error(xhr.statusText));\n }\n };\n xhr.send();\n return xhr;\n};\n\nfunction sameOrigin(url) {\n var a = document.createElement('a');\n a.href = url;\n return a.protocol === document.location.protocol && a.host === document.location.host;\n}\n\nexports.getImage = function(url, callback) {\n var img = new Image();\n if (!sameOrigin(url)) {\n img.crossOrigin = 'Anonymous';\n }\n img.onload = function() {\n callback(null, img);\n };\n img.src = url;\n img.getData = function() {\n var canvas = document.createElement('canvas');\n var context = canvas.getContext('2d');\n canvas.width = img.width;\n canvas.height = img.height;\n context.drawImage(img, 0, 0);\n return context.getImageData(0, 0, img.width, img.height).data;\n };\n return img;\n};\n\nexports.getVideo = function(urls, callback) {\n var video = document.createElement('video');\n video.onloadstart = function() {\n callback(null, video);\n };\n for (var i = 0; i < urls.length; i++) {\n var s = document.createElement('source');\n if (!sameOrigin(urls[i])) {\n video.crossOrigin = 'Anonymous';\n }\n s.src = urls[i];\n video.appendChild(s);\n }\n video.getData = function() { return video; };\n return video;\n};\n","'use strict';\n\nmodule.exports = AnimationLoop;\n\nfunction AnimationLoop() {\n this.n = 0;\n this.times = [];\n}\n\n// Are all animations done?\nAnimationLoop.prototype.stopped = function() {\n this.times = this.times.filter(function(t) {\n return t.time >= (new Date()).getTime();\n });\n return !this.times.length;\n};\n\n// Add a new animation that will run t milliseconds\n// Returns an id that can be used to cancel it layer\nAnimationLoop.prototype.set = function(t) {\n this.times.push({ id: this.n, time: t + (new Date()).getTime() });\n return this.n++;\n};\n\n// Cancel an animation\nAnimationLoop.prototype.cancel = function(n) {\n this.times = this.times.filter(function(t) {\n return t.id !== n;\n });\n};\n","'use strict';\n\nvar glutil = require('./gl_util');\nvar browser = require('../util/browser');\nvar mat4 = require('gl-matrix').mat4;\nvar FrameHistory = require('./frame_history');\n\n/*\n * Initialize a new painter object.\n *\n * @param {Canvas} gl an experimental-webgl drawing context\n */\nmodule.exports = Painter;\nfunction Painter(gl, transform) {\n this.gl = glutil.extend(gl);\n this.transform = transform;\n\n this.reusableTextures = {};\n this.preFbos = {};\n\n this.frameHistory = new FrameHistory();\n\n this.setup();\n}\n\n/*\n * Update the GL viewport, projection matrix, and transforms to compensate\n * for a new width and height value.\n */\nPainter.prototype.resize = function(width, height) {\n var gl = this.gl;\n\n this.width = width * browser.devicePixelRatio;\n this.height = height * browser.devicePixelRatio;\n gl.viewport(0, 0, this.width, this.height);\n\n};\n\n\nPainter.prototype.setup = function() {\n var gl = this.gl;\n\n gl.verbose = true;\n\n // We are blending the new pixels *behind* the existing pixels. That way we can\n // draw front-to-back and use then stencil buffer to cull opaque pixels early.\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ONE);\n\n gl.enable(gl.STENCIL_TEST);\n\n // Initialize shaders\n this.debugShader = gl.initializeShader('debug',\n ['a_pos'],\n ['u_matrix', 'u_pointsize', 'u_color']);\n\n this.gaussianShader = gl.initializeShader('gaussian',\n ['a_pos'],\n ['u_matrix', 'u_image', 'u_offset']);\n\n this.rasterShader = gl.initializeShader('raster',\n ['a_pos', 'a_texture_pos'],\n ['u_matrix', 'u_brightness_low', 'u_brightness_high', 'u_saturation_factor', 'u_spin_weights', 'u_contrast_factor', 'u_opacity0', 'u_opacity1', 'u_image0', 'u_image1', 'u_tl_parent', 'u_scale_parent', 'u_buffer_scale']);\n\n this.lineShader = gl.initializeShader('line',\n ['a_pos', 'a_data', 'a_color', 'a_linewidth', 'a_blur'],\n ['u_matrix', 'u_ratio', 'u_extra', 'u_antialiasingmatrix']);\n\n this.linepatternShader = gl.initializeShader('linepattern',\n ['a_pos', 'a_data', 'a_linewidth', 'a_blur', 'a_opacity'],\n ['u_matrix', 'u_exmatrix', 'u_ratio', 'u_pattern_size_a', 'u_pattern_size_b', 'u_pattern_tl_a', 'u_pattern_br_a', 'u_pattern_tl_b', 'u_pattern_br_b', 'u_fade']);\n\n this.linesdfpatternShader = gl.initializeShader('linesdfpattern',\n ['a_pos', 'a_data', 'a_color', 'a_linewidth', 'a_blur'],\n ['u_matrix', 'u_exmatrix', 'u_ratio', 'u_patternscale_a', 'u_tex_y_a', 'u_patternscale_b', 'u_tex_y_b', 'u_image', 'u_sdfgamma', 'u_mix']);\n\n this.dotShader = gl.initializeShader('dot',\n ['a_pos'],\n ['u_matrix', 'u_size', 'u_color', 'u_blur']);\n\n this.sdfShader = gl.initializeShader('sdf',\n ['a_pos', 'a_offset', 'a_data1', 'a_data2', 'a_color', 'a_buffer', 'a_gamma'],\n ['u_matrix', 'u_exmatrix', 'u_texture', 'u_texsize', 'u_zoom', 'u_fadedist', 'u_minfadezoom', 'u_maxfadezoom', 'u_fadezoom', 'u_skewed', 'u_extra']);\n\n this.iconShader = gl.initializeShader('icon',\n ['a_pos', 'a_offset', 'a_data1', 'a_data2', 'a_opacity'],\n ['u_matrix', 'u_exmatrix', 'u_texture', 'u_texsize', 'u_zoom', 'u_fadedist', 'u_minfadezoom', 'u_maxfadezoom', 'u_fadezoom', 'u_skewed', 'u_extra']);\n\n this.outlineShader = gl.initializeShader('outline',\n ['a_pos', 'a_color'],\n ['u_matrix', 'u_world']\n );\n\n this.patternShader = gl.initializeShader('pattern',\n ['a_pos'],\n ['u_matrix', 'u_pattern_tl_a', 'u_pattern_br_a', 'u_pattern_tl_b', 'u_pattern_br_b', 'u_mix', 'u_patternmatrix_a', 'u_patternmatrix_b', 'u_opacity', 'u_image']\n );\n\n this.fillShader = gl.initializeShader('fill',\n ['a_pos', 'a_color'],\n ['u_matrix']\n );\n\n this.collisionBoxShader = gl.initializeShader('collisionbox',\n ['a_pos', 'a_extrude', 'a_data'],\n ['u_matrix', 'u_scale', 'u_zoom', 'u_maxzoom']\n );\n\n this.identityMatrix = mat4.create();\n\n // The backgroundBuffer is used when drawing to the full *canvas*\n this.backgroundBuffer = gl.createBuffer();\n this.backgroundBuffer.itemSize = 2;\n this.backgroundBuffer.itemCount = 4;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.backgroundBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Int16Array([-1, -1, 1, -1, -1, 1, 1, 1]), gl.STATIC_DRAW);\n\n this.setExtent(4096);\n\n // The debugTextBuffer is used to draw tile IDs for debugging\n this.debugTextBuffer = gl.createBuffer();\n this.debugTextBuffer.itemSize = 2;\n};\n\n/**\n * Rebind the necessary buffers to render at a different extent than\n * the current one. No-ops if the extent is not changing.\n *\n * @param {number} newExtent\n * @example\n * this.setExtent(4096);\n * @private\n */\nPainter.prototype.setExtent = function(newExtent) {\n if (!newExtent || newExtent === this.tileExtent) return;\n\n this.tileExtent = newExtent;\n\n var gl = this.gl;\n\n // The tileExtentBuffer is used when drawing to a full *tile*\n this.tileExtentBuffer = gl.createBuffer();\n this.tileExtentBuffer.itemSize = 4;\n this.tileExtentBuffer.itemCount = 4;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.tileExtentBuffer);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Int16Array([\n // tile coord x, tile coord y, texture coord x, texture coord y\n 0, 0, 0, 0,\n this.tileExtent, 0, 32767, 0,\n 0, this.tileExtent, 0, 32767,\n this.tileExtent, this.tileExtent, 32767, 32767\n ]),\n gl.STATIC_DRAW);\n\n // The debugBuffer is used to draw tile outlines for debugging\n this.debugBuffer = gl.createBuffer();\n this.debugBuffer.itemSize = 2;\n this.debugBuffer.itemCount = 5;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.debugBuffer);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Int16Array([\n 0, 0, this.tileExtent - 1, 0, this.tileExtent - 1, this.tileExtent - 1, 0, this.tileExtent - 1, 0, 0]),\n gl.STATIC_DRAW);\n};\n\n/*\n * Reset the color buffers of the drawing canvas.\n */\nPainter.prototype.clearColor = function() {\n var gl = this.gl;\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n};\n\n/*\n * Reset the drawing canvas by clearing the stencil buffer so that we can draw\n * new tiles at the same location, while retaining previously drawn pixels.\n */\nPainter.prototype.clearStencil = function() {\n var gl = this.gl;\n gl.clearStencil(0x0);\n gl.stencilMask(0xFF);\n gl.clear(gl.STENCIL_BUFFER_BIT);\n};\n\nPainter.prototype.drawClippingMask = function(tile) {\n var gl = this.gl;\n gl.switchShader(this.fillShader, tile.posMatrix);\n gl.colorMask(false, false, false, false);\n\n // Clear the entire stencil buffer, except for the 7th bit, which stores\n // the global clipping mask that allows us to avoid drawing in regions of\n // tiles we've already painted in.\n gl.clearStencil(0x0);\n gl.stencilMask(0xBF);\n gl.clear(gl.STENCIL_BUFFER_BIT);\n\n // The stencil test will fail always, meaning we set all pixels covered\n // by this geometry to 0x80. We use the highest bit 0x80 to mark the regions\n // we want to draw in. All pixels that have this bit *not* set will never be\n // drawn in.\n gl.stencilFunc(gl.EQUAL, 0xC0, 0x40);\n gl.stencilMask(0xC0);\n gl.stencilOp(gl.REPLACE, gl.KEEP, gl.KEEP);\n\n // Draw the clipping mask\n gl.disableVertexAttribArray(this.fillShader.a_color);\n gl.bindBuffer(gl.ARRAY_BUFFER, this.tileExtentBuffer);\n gl.vertexAttribPointer(this.fillShader.a_pos, this.tileExtentBuffer.itemSize, gl.SHORT, false, 8, 0);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.tileExtentBuffer.itemCount);\n\n gl.stencilFunc(gl.EQUAL, 0x80, 0x80);\n gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE);\n gl.stencilMask(0x00);\n gl.colorMask(true, true, true, true);\n gl.enableVertexAttribArray(this.fillShader.a_color);\n};\n\n// Overridden by headless tests.\nPainter.prototype.prepareBuffers = function() {};\nPainter.prototype.bindDefaultFramebuffer = function() {\n var gl = this.gl;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n};\n\nvar draw = {\n symbol: require('./draw_symbol'),\n line: require('./draw_line'),\n fill: require('./draw_fill'),\n raster: require('./draw_raster'),\n background: require('./draw_background'),\n debug: require('./draw_debug'),\n vertices: require('./draw_vertices')\n};\n\nPainter.prototype.render = function(style, options) {\n this.style = style;\n this.options = options;\n\n this.lineAtlas = style.lineAtlas;\n\n this.spriteAtlas = style.spriteAtlas;\n this.spriteAtlas.setSprite(style.sprite);\n\n this.glyphAtlas = style.glyphAtlas;\n this.glyphAtlas.bind(this.gl);\n\n this.frameHistory.record(this.transform.zoom);\n\n this.prepareBuffers();\n this.clearColor();\n\n for (var i = style._groups.length - 1; i >= 0; i--) {\n var group = style._groups[i];\n var source = style.sources[group.source];\n\n if (source) {\n this.clearStencil();\n source.render(group, this);\n\n } else if (group.source === undefined) {\n this.drawLayers(group, this.identityMatrix);\n }\n }\n};\n\nPainter.prototype.drawTile = function(tile, layers) {\n this.setExtent(tile.tileExtent);\n this.drawClippingMask(tile);\n this.drawLayers(layers, tile.posMatrix, tile);\n\n if (this.options.debug) {\n draw.debug(this, tile);\n }\n};\n\nPainter.prototype.drawLayers = function(layers, matrix, tile) {\n for (var i = layers.length - 1; i >= 0; i--) {\n var layer = layers[i];\n\n if (layer.hidden)\n continue;\n\n draw[layer.type](this, layer, matrix, tile);\n\n if (this.options.vertices) {\n draw.vertices(this, layer, matrix, tile);\n }\n }\n};\n\n// Draws non-opaque areas. This is for debugging purposes.\nPainter.prototype.drawStencilBuffer = function() {\n var gl = this.gl;\n gl.switchShader(this.fillShader, this.identityMatrix);\n\n // Blend to the front, not the back.\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.stencilMask(0x00);\n gl.stencilFunc(gl.EQUAL, 0x80, 0x80);\n\n // Drw the filling quad where the stencil buffer isn't set.\n gl.bindBuffer(gl.ARRAY_BUFFER, this.backgroundBuffer);\n gl.vertexAttribPointer(this.fillShader.a_pos, this.backgroundBuffer.itemSize, gl.SHORT, false, 0, 0);\n gl.disableVertexAttribArray(this.fillShader.a_color);\n gl.vertexAttrib4fv(this.fillShader.a_color, [0, 0, 0, 0.5]);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.tileExtentBuffer.itemCount);\n\n // Revert blending mode to blend to the back.\n gl.blendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ONE);\n};\n\nPainter.prototype.translateMatrix = function(matrix, tile, translate, anchor) {\n if (!translate[0] && !translate[1]) return matrix;\n\n if (anchor === 'viewport') {\n var sinA = Math.sin(-this.transform.angle);\n var cosA = Math.cos(-this.transform.angle);\n translate = [\n translate[0] * cosA - translate[1] * sinA,\n translate[0] * sinA + translate[1] * cosA\n ];\n }\n\n var tilePixelRatio = this.transform.scale / (1 << tile.coord.z) / (tile.tileExtent / tile.tileSize);\n var translation = [\n translate[0] / tilePixelRatio,\n translate[1] / tilePixelRatio,\n 0\n ];\n\n var translatedMatrix = new Float32Array(16);\n mat4.translate(translatedMatrix, matrix, translation);\n return translatedMatrix;\n};\n\nPainter.prototype.saveTexture = function(texture) {\n var textures = this.reusableTextures[texture.size];\n if (!textures) {\n this.reusableTextures[texture.size] = [texture];\n } else {\n textures.push(texture);\n }\n};\n\n\nPainter.prototype.getTexture = function(size) {\n var textures = this.reusableTextures[size];\n return textures && textures.length > 0 ? textures.pop() : null;\n};\n","'use strict';\n\nvar LatLng = require('./lat_lng'),\n Point = require('point-geometry'),\n Coordinate = require('./coordinate'),\n wrap = require('../util/util').wrap,\n interp = require('../util/interpolate'),\n vec4 = require('gl-matrix').vec4,\n mat4 = require('gl-matrix').mat4;\n\nmodule.exports = Transform;\n\n/*\n * A single transform, generally used for a single tile to be\n * scaled, rotated, and zoomed.\n *\n * @param {number} minZoom\n * @param {number} maxZoom\n * @private\n */\nfunction Transform(minZoom, maxZoom) {\n this.tileSize = 512; // constant\n\n this._minZoom = minZoom || 0;\n this._maxZoom = maxZoom || 22;\n\n this.latRange = [-85.05113, 85.05113];\n\n this.width = 0;\n this.height = 0;\n this.zoom = 0;\n this.center = new LatLng(0, 0);\n this.angle = 0;\n this._altitude = 1.5;\n this._pitch = 0;\n}\n\nTransform.prototype = {\n get minZoom() { return this._minZoom; },\n set minZoom(zoom) {\n this._minZoom = zoom;\n this.zoom = Math.max(this.zoom, zoom);\n },\n\n get maxZoom() { return this._maxZoom; },\n set maxZoom(zoom) {\n this._maxZoom = zoom;\n this.zoom = Math.min(this.zoom, zoom);\n },\n\n get worldSize() {\n return this.tileSize * this.scale;\n },\n\n get centerPoint() {\n return this.size._div(2);\n },\n\n get size() {\n return new Point(this.width, this.height);\n },\n\n get bearing() {\n return -this.angle / Math.PI * 180;\n },\n set bearing(bearing) {\n this.angle = -wrap(bearing, -180, 180) * Math.PI / 180;\n },\n\n get pitch() {\n return this._pitch / Math.PI * 180;\n },\n set pitch(pitch) {\n this._pitch = Math.min(60, pitch) / 180 * Math.PI;\n },\n\n get altitude() {\n return this._altitude;\n },\n set altitude(altitude) {\n this._altitude = Math.max(0.75, altitude);\n },\n\n get zoom() { return this._zoom; },\n set zoom(zoom) {\n zoom = Math.min(Math.max(zoom, this.minZoom), this.maxZoom);\n this._zoom = zoom;\n this.scale = this.zoomScale(zoom);\n this.tileZoom = Math.floor(zoom);\n this.zoomFraction = zoom - this.tileZoom;\n this._constrain();\n },\n\n zoomScale: function(zoom) { return Math.pow(2, zoom); },\n scaleZoom: function(scale) { return Math.log(scale) / Math.LN2; },\n\n project: function(latlng, worldSize) {\n return new Point(\n this.lngX(latlng.lng, worldSize),\n this.latY(latlng.lat, worldSize));\n },\n\n unproject: function(point, worldSize) {\n return new LatLng(\n this.yLat(point.y, worldSize),\n this.xLng(point.x, worldSize));\n },\n\n get x() { return this.lngX(this.center.lng); },\n get y() { return this.latY(this.center.lat); },\n\n get point() { return new Point(this.x, this.y); },\n\n /**\n * lat/lon <-> absolute pixel coords conversion\n * @param {number} lon\n * @param {number} [worldSize=this.worldSize]\n * @returns {number} pixel coordinate\n * @private\n */\n lngX: function(lon, worldSize) {\n return (180 + lon) * (worldSize || this.worldSize) / 360;\n },\n /**\n * latitude to absolute y coord\n *\n * @param {number} lat\n * @param {number} [worldSize=this.worldSize]\n * @returns {number} pixel coordinate\n * @private\n */\n latY: function(lat, worldSize) {\n var y = 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360));\n return (180 - y) * (worldSize || this.worldSize) / 360;\n },\n\n xLng: function(x, worldSize) {\n return x * 360 / (worldSize || this.worldSize) - 180;\n },\n yLat: function(y, worldSize) {\n var y2 = 180 - y * 360 / (worldSize || this.worldSize);\n return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90;\n },\n\n panBy: function(offset) {\n var point = this.centerPoint._add(offset);\n this.center = this.pointLocation(point);\n this._constrain();\n },\n\n setLocationAtPoint: function(latlng, point) {\n var c = this.locationCoordinate(latlng);\n var coordAtPoint = this.pointCoordinate(point);\n var coordCenter = this.pointCoordinate(this.centerPoint);\n\n var translate = coordAtPoint._sub(c);\n this.center = this.coordinateLocation(coordCenter._sub(translate));\n\n this._constrain();\n },\n\n setZoomAround: function(zoom, center) {\n var p;\n if (center) p = this.locationPoint(center);\n this.zoom = zoom;\n if (center) this.setLocationAtPoint(center, p);\n },\n\n setBearingAround: function(bearing, center) {\n var p;\n if (center) p = this.locationPoint(center);\n this.bearing = bearing;\n if (center) this.setLocationAtPoint(center, p);\n },\n\n /**\n * Given a location, return the screen point that corresponds to it\n * @param {LatLng} latlng location\n * @returns {Point} screen point\n * @private\n */\n locationPoint: function(latlng) {\n return this.coordinatePoint(this.locationCoordinate(latlng));\n },\n\n /**\n * Given a point on screen, return its latlng\n * @param {Point} p screen point\n * @returns {LatLng} latlng location\n * @private\n */\n pointLocation: function(p) {\n return this.coordinateLocation(this.pointCoordinate(p));\n },\n\n /**\n * Given a geographical latlng, return an unrounded\n * coordinate that represents it at this transform's zoom level and\n * worldsize.\n * @param {LatLng} latlng\n * @returns {Coordinate}\n * @private\n */\n locationCoordinate: function(latlng) {\n var k = this.zoomScale(this.tileZoom) / this.worldSize;\n return new Coordinate(\n this.lngX(latlng.lng) * k,\n this.latY(latlng.lat) * k,\n this.tileZoom);\n },\n\n /**\n * Given a Coordinate, return its geographical position.\n * @param {Coordinate} coord\n * @returns {LatLng} latlng\n * @private\n */\n coordinateLocation: function(coord) {\n var worldSize = this.zoomScale(coord.zoom);\n return new LatLng(\n this.yLat(coord.row, worldSize),\n this.xLng(coord.column, worldSize));\n },\n\n pointCoordinate: function(p, targetZ) {\n\n if (targetZ === undefined) targetZ = 0;\n\n var matrix = this.coordinatePointMatrix(this.tileZoom);\n var inverted = mat4.invert(new Float64Array(16), matrix);\n\n if (!inverted) throw \"failed to invert matrix\";\n\n // since we don't know the correct projected z value for the point,\n // unproject two points to get a line and then find the point on that\n // line with z=0\n\n var coord0 = vec4.transformMat4([], [p.x, p.y, 0, 1], inverted);\n var coord1 = vec4.transformMat4([], [p.x, p.y, 1, 1], inverted);\n\n var w0 = coord0[3];\n var w1 = coord1[3];\n var x0 = coord0[0] / w0;\n var x1 = coord1[0] / w1;\n var y0 = coord0[1] / w0;\n var y1 = coord1[1] / w1;\n var z0 = coord0[2] / w0;\n var z1 = coord1[2] / w1;\n\n\n var t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0);\n\n return new Coordinate(\n interp(x0, x1, t),\n interp(y0, y1, t),\n this.tileZoom);\n },\n\n /**\n * Given a coordinate, return the screen point that corresponds to it\n * @param {Coordinate} coord\n * @returns {Point} screen point\n * @private\n */\n coordinatePoint: function(coord) {\n var matrix = this.coordinatePointMatrix(coord.zoom);\n var p = vec4.transformMat4([], [coord.column, coord.row, 0, 1], matrix);\n return new Point(p[0] / p[3], p[1] / p[3]);\n },\n\n coordinatePointMatrix: function(z) {\n var proj = this.getProjMatrix();\n var scale = this.worldSize / this.zoomScale(z);\n mat4.scale(proj, proj, [scale, scale, 1]);\n mat4.multiply(proj, this.getPixelMatrix(), proj);\n return proj;\n },\n\n /**\n * converts gl coordinates -1..1 to pixels 0..width\n * @returns {Object} matrix\n * @private\n */\n getPixelMatrix: function() {\n var m = mat4.create();\n mat4.scale(m, m, [this.width / 2, -this.height / 2, 1]);\n mat4.translate(m, m, [1, -1, 0]);\n return m;\n },\n\n _constrain: function() {\n if (!this.center) return;\n\n var minY, maxY, minX, maxX, sy, sx, x2, y2,\n size = this.size;\n\n if (this.latRange) {\n minY = this.latY(this.latRange[1]);\n maxY = this.latY(this.latRange[0]);\n sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0;\n }\n\n if (this.lngRange) {\n minX = this.lngX(this.lngRange[0]);\n maxX = this.lngX(this.lngRange[1]);\n sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0;\n }\n\n // how much the map should scale to fit the screen into given latitude/longitude ranges\n var s = Math.max(sx || 0, sy || 0);\n\n if (s) {\n this.center = this.unproject(new Point(\n sx ? (maxX + minX) / 2 : this.x,\n sy ? (maxY + minY) / 2 : this.y));\n this.zoom += this.scaleZoom(s);\n return;\n }\n\n if (this.latRange) {\n var y = this.y,\n h2 = size.y / 2;\n\n if (y - h2 < minY) y2 = minY + h2;\n if (y + h2 > maxY) y2 = maxY - h2;\n }\n\n if (this.lngRange) {\n var x = this.x,\n w2 = size.x / 2;\n\n if (x - w2 < minX) x2 = minX + w2;\n if (x + w2 > maxX) x2 = maxX - w2;\n }\n\n // pan the map if the screen goes off the range\n if (x2 !== undefined || y2 !== undefined) {\n this.center = this.unproject(new Point(\n x2 !== undefined ? x2 : this.x,\n y2 !== undefined ? y2 : this.y));\n }\n },\n\n getProjMatrix: function() {\n var m = new Float64Array(16);\n\n // Find the distance from the center point to the center top in altitude units using law of sines.\n var halfFov = Math.atan(0.5 / this.altitude);\n var topHalfSurfaceDistance = Math.sin(halfFov) * this.altitude / Math.sin(Math.PI / 2 - this._pitch - halfFov);\n // Calculate z value of the farthest fragment that should be rendered.\n var farZ = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.altitude;\n\n mat4.perspective(m, 2 * Math.atan((this.height / 2) / this.altitude), this.width / this.height, 0.1, farZ);\n\n mat4.translate(m, m, [0, 0, -this.altitude]);\n\n // After the rotateX, z values are in pixel units. Convert them to\n // altitude unites. 1 altitude unit = the screen height.\n mat4.scale(m, m, [1, -1, 1 / this.height]);\n\n mat4.rotateX(m, m, this._pitch);\n mat4.rotateZ(m, m, this.angle);\n mat4.translate(m, m, [-this.x, -this.y, 0]);\n return m;\n }\n};\n","'use strict';\n\n/*\n * Adds positional coordinates to URL hashes. Passed as an option to the map object\n *\n * @class mapboxgl.Hash\n * @returns {Hash} `this`\n */\nmodule.exports = Hash;\n\nvar util = require('../util/util');\n\nfunction Hash() {\n util.bindAll([\n '_onHashChange',\n '_updateHash'\n ], this);\n}\n\nHash.prototype = {\n /* Map element to listen for coordinate changes\n *\n * @param {Object} map\n * @returns {Hash} `this`\n */\n addTo: function(map) {\n this._map = map;\n window.addEventListener('hashchange', this._onHashChange, false);\n this._map.on('moveend', this._updateHash);\n return this;\n },\n\n /* Removes hash\n *\n * @returns {Popup} `this`\n */\n remove: function() {\n window.removeEventListener('hashchange', this._onHashChange, false);\n this._map.off('moveend', this._updateHash);\n delete this._map;\n return this;\n },\n\n _onHashChange: function() {\n var loc = location.hash.replace('#', '').split('/');\n if (loc.length >= 3) {\n this._map.jumpTo({\n center: [+loc[1], +loc[2]],\n zoom: +loc[0],\n bearing: +(loc[3] || 0)\n });\n return true;\n }\n return false;\n },\n\n _updateHash: function() {\n var center = this._map.getCenter(),\n zoom = this._map.getZoom(),\n bearing = this._map.getBearing(),\n precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)),\n\n hash = '#' + (Math.round(zoom * 100) / 100) +\n '/' + center.lat.toFixed(precision) +\n '/' + center.lng.toFixed(precision) +\n (bearing ? '/' + (Math.round(bearing * 10) / 10) : '');\n\n window.history.replaceState('', '', hash);\n }\n};\n","'use strict';\n\nvar handlers = {\n scrollZoom: require('./handler/scroll_zoom'),\n boxZoom: require('./handler/box_zoom'),\n dragRotate: require('./handler/drag_rotate'),\n dragPan: require('./handler/drag_pan'),\n keyboard: require('./handler/keyboard'),\n doubleClickZoom: require('./handler/dblclick_zoom'),\n pinch: require('./handler/pinch')\n};\n\nvar DOM = require('../util/dom'),\n util = require('../util/util');\n\nmodule.exports = Interaction;\n\n/**\n * Mouse move event.\n *\n * @event mousemove\n * @memberof Map\n * @type {Object}\n * @property {Point} point the pixel location of the event\n * @property {LatLng} point the geographic location of the event\n * @property {Event} originalEvent the original DOM event\n */\n\n/**\n * Click event.\n *\n * @event click\n * @memberof Map\n * @type {Object}\n * @property {Point} point the pixel location of the event\n * @property {LatLng} point the geographic location of the event\n * @property {Event} originalEvent the original DOM event\n */\n\n/**\n * Double click event.\n *\n * @event dblclick\n * @memberof Map\n * @type {Object}\n * @property {Point} point the pixel location of the event\n * @property {LatLng} point the geographic location of the event\n * @property {Event} originalEvent the original DOM event\n */\n\nfunction Interaction(map) {\n this._map = map;\n this._el = map.getCanvasContainer();\n\n for (var name in handlers) {\n map[name] = new handlers[name](map);\n }\n\n util.bindHandlers(this);\n}\n\nInteraction.prototype = {\n enable: function () {\n var options = this._map.options,\n el = this._el;\n\n for (var name in handlers) {\n if (options[name]) this._map[name].enable();\n }\n\n el.addEventListener('mousedown', this._onMouseDown, false);\n el.addEventListener('touchstart', this._onTouchStart, false);\n el.addEventListener('click', this._onClick, false);\n el.addEventListener('mousemove', this._onMouseMove, false);\n el.addEventListener('dblclick', this._onDblClick, false);\n },\n\n disable: function () {\n var options = this._map.options,\n el = this._el;\n\n for (var name in handlers) {\n if (options[name]) this._map[name].disable();\n }\n\n el.removeEventListener('mousedown', this._onMouseDown);\n el.removeEventListener('touchstart', this._onTouchStart);\n el.removeEventListener('click', this._onClick);\n el.removeEventListener('mousemove', this._onMouseMove);\n el.removeEventListener('dblclick', this._onDblClick);\n },\n\n _onMouseDown: function (e) {\n this._startPos = DOM.mousePos(this._el, e);\n },\n\n _onTouchStart: function (e) {\n if (!e.touches || e.touches.length > 1) return;\n\n if (!this._tapped) {\n this._tapped = setTimeout(this._onTimeout, 300);\n\n } else {\n clearTimeout(this._tapped);\n this._tapped = null;\n this._fireEvent('dblclick', e);\n }\n },\n\n _onTimeout: function () {\n this._tapped = null;\n },\n\n _onMouseMove: function (e) {\n var map = this._map,\n el = this._el;\n\n if (map.dragPan.active || map.dragRotate.active) return;\n\n var target = e.toElement || e.target;\n while (target && target !== el) target = target.parentNode;\n if (target !== el) return;\n\n this._fireEvent('mousemove', e);\n },\n\n _onClick: function (e) {\n var pos = DOM.mousePos(this._el, e);\n\n if (pos.equals(this._startPos)) {\n this._fireEvent('click', e);\n }\n },\n\n _onDblClick: function (e) {\n this._fireEvent('dblclick', e);\n e.preventDefault();\n },\n\n _fireEvent: function (type, e) {\n var pos = DOM.mousePos(this._el, e);\n\n this._map.fire(type, {\n latLng: this._map.unproject(pos),\n point: pos,\n originalEvent: e\n });\n }\n};\n","'use strict';\n\nvar util = require('../util/util');\nvar interpolate = require('../util/interpolate');\nvar browser = require('../util/browser');\nvar LatLng = require('../geo/lat_lng');\nvar LatLngBounds = require('../geo/lat_lng_bounds');\nvar Point = require('point-geometry');\n\n/**\n * Options common to Map#jumpTo, Map#easeTo, and Map#flyTo, controlling the destination\n * location, zoom level, bearing and pitch. All properties are options; unspecified\n * options will default to the current value for that property.\n *\n * @typedef {Object} CameraOptions\n * @property {Array} center Latitude and longitude (passed as `[lat, lng]`)\n * @property {number} zoom Map zoom level\n * @property {number} bearing Map rotation bearing in degrees counter-clockwise from north\n * @property {number} pitch The angle at which the camera is looking at the ground\n */\n\n/**\n * Options common to map movement methods that involve animation, such as Map#panBy and\n * Map#easeTo, controlling the duration of the animation and easing function. All properties\n * are optional.\n *\n * @typedef {Object} AnimationOptions\n * @property {number} duration Number in milliseconds\n * @property {Function} easing\n * @property {Array} offset point, origin of movement relative to map center\n * @property {boolean} animate When set to false, no animation happens\n */\n\nvar Camera = module.exports = function() {};\n\nutil.extend(Camera.prototype, /** @lends Map.prototype */{\n /**\n * Get the current view geographical point.\n * @returns {LatLng}\n */\n getCenter: function() { return this.transform.center; },\n\n /**\n * Sets a map location. Equivalent to `jumpTo({center: center})`.\n *\n * @param {Array} center Latitude and longitude (passed as `[lat, lng]`)\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n * @example\n * map.setCenter([-74, 38]);\n */\n setCenter: function(center) {\n this.jumpTo({center: center});\n return this;\n },\n\n /**\n * Pan by a certain number of pixels\n *\n * @param {Array} offset [x, y]\n * @param {AnimationOptions} [options]\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n panBy: function(offset, options) {\n this.panTo(this.transform.center, util.extend({offset: Point.convert(offset).mult(-1)}, options));\n return this;\n },\n\n /**\n * Pan to a certain location with easing\n *\n * @param {Object} latlng a `LatLng` object\n * @param {AnimationOptions} [options]\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n panTo: function(latlng, options) {\n this.stop();\n\n latlng = LatLng.convert(latlng);\n\n options = util.extend({\n duration: 500,\n easing: util.ease,\n offset: [0, 0]\n }, options);\n\n var tr = this.transform,\n offset = Point.convert(options.offset).rotate(-tr.angle),\n from = tr.point,\n to = tr.project(latlng).sub(offset);\n\n if (!options.noMoveStart) {\n this.fire('movestart');\n }\n\n this._ease(function(k) {\n tr.center = tr.unproject(from.add(to.sub(from).mult(k)));\n this.fire('move');\n }, function() {\n this.fire('moveend');\n }, options);\n\n return this;\n },\n\n\n /**\n * Get the current zoom\n * @returns {number}\n */\n getZoom: function() { return this.transform.zoom; },\n\n /**\n * Sets a map zoom. Equivalent to `jumpTo({zoom: zoom})`.\n *\n * @param {number} zoom Map zoom level\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n * @example\n * // zoom the map to 5\n * map.setZoom(5);\n */\n setZoom: function(zoom) {\n this.jumpTo({zoom: zoom});\n return this;\n },\n\n /**\n * Zooms to a certain zoom level with easing.\n *\n * @param {number} zoom\n * @param {AnimationOptions} [options]\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n zoomTo: function(zoom, options) {\n this.stop();\n\n options = util.extend({\n duration: 500\n }, options);\n\n options.easing = this._updateEasing(options.duration, zoom, options.easing);\n\n var tr = this.transform,\n around = tr.center,\n startZoom = tr.zoom;\n\n if (options.around) {\n around = LatLng.convert(options.around);\n } else if (options.offset) {\n around = tr.pointLocation(tr.centerPoint.add(Point.convert(options.offset)));\n }\n\n if (options.animate === false) options.duration = 0;\n\n if (!this.zooming) {\n this.zooming = true;\n this.fire('movestart');\n }\n\n this._ease(function(k) {\n tr.setZoomAround(interpolate(startZoom, zoom, k), around);\n this.fire('move').fire('zoom');\n }, function() {\n this.ease = null;\n if (options.duration >= 200) {\n this.zooming = false;\n this.fire('moveend');\n }\n }, options);\n\n if (options.duration < 200) {\n clearTimeout(this._onZoomEnd);\n this._onZoomEnd = setTimeout(function() {\n this.zooming = false;\n this.fire('moveend');\n }.bind(this), 200);\n }\n\n return this;\n },\n\n /**\n * Zoom in by 1 level\n *\n * @param {AnimationOptions} [options]\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n zoomIn: function(options) {\n this.zoomTo(this.getZoom() + 1, options);\n return this;\n },\n\n /**\n * Zoom out by 1 level\n *\n * @param {AnimationOptions} [options]\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n zoomOut: function(options) {\n this.zoomTo(this.getZoom() - 1, options);\n return this;\n },\n\n\n /**\n * Get the current bearing in degrees\n * @returns {number}\n */\n getBearing: function() { return this.transform.bearing; },\n\n /**\n * Sets a map rotation. Equivalent to `jumpTo({bearing: bearing})`.\n *\n * @param {number} bearing Map rotation bearing in degrees counter-clockwise from north\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n * @example\n * // rotate the map to 90 degrees\n * map.setBearing(90);\n */\n setBearing: function(bearing) {\n this.jumpTo({bearing: bearing});\n return this;\n },\n\n /**\n * Rotate bearing by a certain number of degrees with easing\n *\n * @param {number} bearing\n * @param {AnimationOptions} [options]\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n rotateTo: function(bearing, options) {\n this.stop();\n\n options = util.extend({\n duration: 500,\n easing: util.ease\n }, options);\n\n var tr = this.transform,\n start = this.getBearing(),\n around = tr.center;\n\n if (options.around) {\n around = LatLng.convert(options.around);\n } else if (options.offset) {\n around = tr.pointLocation(tr.centerPoint.add(Point.convert(options.offset)));\n }\n\n bearing = this._normalizeBearing(bearing, start);\n\n this.rotating = true;\n this.fire('movestart');\n\n this._ease(function(k) {\n tr.setBearingAround(interpolate(start, bearing, k), around);\n this.fire('move').fire('rotate');\n }, function() {\n this.rotating = false;\n this.fire('moveend');\n }, options);\n\n return this;\n },\n\n /**\n * Sets map bearing to 0 (north) with easing\n *\n * @param {AnimationOptions} [options]\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n resetNorth: function(options) {\n this.rotateTo(0, util.extend({duration: 1000}, options));\n return this;\n },\n\n /**\n * Animates map bearing to 0 (north) if it's already close to it.\n *\n * @param {AnimationOptions} [options]\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n snapToNorth: function(options) {\n if (Math.abs(this.getBearing()) < this.options.bearingSnap) {\n return this.resetNorth(options);\n }\n return this;\n },\n\n /**\n * Get the current angle in degrees\n * @returns {number}\n */\n getPitch: function() { return this.transform.pitch; },\n\n /**\n * Sets a map angle. Equivalent to `jumpTo({pitch: pitch})`.\n *\n * @param {number} pitch The angle at which the camera is looking at the ground\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n setPitch: function(pitch) {\n this.jumpTo({pitch: pitch});\n return this;\n },\n\n\n /**\n * Zoom to contain certain geographical bounds\n *\n * @param {Array} bounds [[minLat, minLng], [maxLat, maxLng]]\n * @param {Object} options\n * @param {number} [options.speed=1.2] How fast animation occurs\n * @param {number} [options.curve=1.42] How much zooming out occurs during animation\n * @param {Function} options.easing\n * @param {number} options.padding how much padding there is around the given bounds on each side in pixels\n * @param {number} options.maxZoom\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n fitBounds: function(bounds, options) {\n\n options = util.extend({\n padding: 0,\n offset: [0, 0],\n maxZoom: Infinity\n }, options);\n\n bounds = LatLngBounds.convert(bounds);\n\n var offset = Point.convert(options.offset),\n tr = this.transform,\n nw = tr.project(bounds.getNorthWest()),\n se = tr.project(bounds.getSouthEast()),\n size = se.sub(nw),\n scaleX = (tr.width - options.padding * 2 - Math.abs(offset.x) * 2) / size.x,\n scaleY = (tr.height - options.padding * 2 - Math.abs(offset.y) * 2) / size.y;\n\n options.center = tr.unproject(nw.add(se).div(2));\n options.zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom);\n options.bearing = 0;\n\n return options.linear ?\n this.easeTo(options) :\n this.flyTo(options);\n },\n\n /**\n * Change any combination of center, zoom, bearing, and pitch, without\n * a transition. The map will retain the current values for any options\n * not included in `options`.\n *\n * @param {CameraOptions} options map view options\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n jumpTo: function(options) {\n this.stop();\n\n var tr = this.transform,\n zoomChanged = false,\n bearingChanged = false,\n pitchChanged = false;\n\n if ('center' in options) {\n tr.center = LatLng.convert(options.center);\n }\n\n if ('zoom' in options && tr.zoom !== +options.zoom) {\n zoomChanged = true;\n tr.zoom = +options.zoom;\n }\n\n if ('bearing' in options && tr.bearing !== +options.bearing) {\n bearingChanged = true;\n tr.bearing = +options.bearing;\n }\n\n if ('pitch' in options && tr.pitch !== +options.pitch) {\n pitchChanged = true;\n tr.pitch = +options.pitch;\n }\n\n this.fire('movestart')\n .fire('move');\n\n if (zoomChanged) {\n this.fire('zoom');\n }\n\n if (bearingChanged) {\n this.fire('rotate');\n }\n\n if (pitchChanged) {\n this.fire('pitch');\n }\n\n return this.fire('moveend');\n },\n\n /**\n * Easing animation to a specified location/zoom/bearing\n *\n * @param {CameraOptions~AnimationOptions} options map view and animation options\n * @fires movestart\n * @fires moveend\n * @returns {Map} `this`\n */\n easeTo: function(options) {\n this.stop();\n\n options = util.extend({\n offset: [0, 0],\n duration: 500,\n easing: util.ease\n }, options);\n\n var tr = this.transform,\n offset = Point.convert(options.offset).rotate(-tr.angle),\n from = tr.point,\n startZoom = this.getZoom(),\n startBearing = this.getBearing(),\n startPitch = this.getPitch(),\n\n zoom = 'zoom' in options ? +options.zoom : startZoom,\n bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing,\n pitch = 'pitch' in options ? +options.pitch : startPitch,\n\n scale = tr.zoomScale(zoom - startZoom),\n to = 'center' in options ? tr.project(LatLng.convert(options.center)).sub(offset.div(scale)) : from,\n around = LatLng.convert(options.around);\n\n if (zoom !== startZoom) {\n this.zooming = true;\n }\n if (startBearing !== bearing) {\n this.rotating = true;\n }\n\n if (this.zooming && !around) {\n around = tr.pointLocation(tr.centerPoint.add(to.sub(from).div(1 - 1 / scale)));\n }\n\n this.fire('movestart');\n\n this._ease(function (k) {\n if (this.zooming) {\n tr.setZoomAround(interpolate(startZoom, zoom, k), around);\n } else {\n tr.center = tr.unproject(from.add(to.sub(from).mult(k)));\n }\n\n if (this.rotating) {\n tr.bearing = interpolate(startBearing, bearing, k);\n }\n\n if (pitch !== startPitch) {\n tr.pitch = interpolate(startPitch, pitch, k);\n }\n\n this.fire('move');\n if (this.zooming) {\n this.fire('zoom');\n }\n if (this.rotating) {\n this.fire('rotate');\n }\n }, function() {\n this.zooming = false;\n this.rotating = false;\n this.fire('moveend');\n }, options);\n\n return this;\n },\n\n /**\n * Flying animation to a specified location/zoom/bearing with automatic curve\n *\n * @param {CameraOptions} options map view options\n * @param {number} [options.speed=1.2] How fast animation occurs\n * @param {number} [options.curve=1.42] How much zooming out occurs during animation\n * @param {Function} [options.easing]\n * @fires movestart\n * @fires moveend\n * @returns {this}\n * @example\n * // fly with default options to null island\n * map.flyTo({center: [0, 0], zoom: 9});\n * // using flyTo options\n * map.flyTo({\n * center: [0, 0],\n * zoom: 9,\n * speed: 0.2,\n * curve: 1,\n * easing: function(t) {\n * return t;\n * }\n * });\n */\n flyTo: function(options) {\n this.stop();\n\n options = util.extend({\n offset: [0, 0],\n speed: 1.2,\n curve: 1.42,\n easing: util.ease\n }, options);\n\n var tr = this.transform,\n offset = Point.convert(options.offset),\n startZoom = this.getZoom(),\n startBearing = this.getBearing();\n\n var center = 'center' in options ? LatLng.convert(options.center) : this.getCenter();\n var zoom = 'zoom' in options ? +options.zoom : startZoom;\n var bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing;\n\n var scale = tr.zoomScale(zoom - startZoom),\n from = tr.point,\n to = tr.project(center).sub(offset.div(scale));\n\n var startWorldSize = tr.worldSize,\n rho = options.curve,\n V = options.speed,\n\n w0 = Math.max(tr.width, tr.height),\n w1 = w0 / scale,\n u1 = to.sub(from).mag(),\n rho2 = rho * rho;\n\n function r(i) {\n var b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1);\n return Math.log(Math.sqrt(b * b + 1) - b);\n }\n\n function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; }\n function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; }\n function tanh(n) { return sinh(n) / cosh(n); }\n\n var r0 = r(0),\n w = function (s) { return (cosh(r0) / cosh(r0 + rho * s)); },\n u = function (s) { return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1; },\n S = (r(1) - r0) / rho;\n\n if (Math.abs(u1) < 0.000001) {\n if (Math.abs(w0 - w1) < 0.000001) return this;\n\n var k = w1 < w0 ? -1 : 1;\n S = Math.abs(Math.log(w1 / w0)) / rho;\n\n u = function() { return 0; };\n w = function(s) { return Math.exp(k * rho * s); };\n }\n\n options.duration = 1000 * S / V;\n\n this.zooming = true;\n if (startBearing !== bearing) this.rotating = true;\n\n this.fire('movestart');\n\n this._ease(function (k) {\n var s = k * S,\n us = u(s);\n\n tr.zoom = startZoom + tr.scaleZoom(1 / w(s));\n tr.center = tr.unproject(from.add(to.sub(from).mult(us)), startWorldSize);\n\n if (bearing !== startBearing) {\n tr.bearing = interpolate(startBearing, bearing, k);\n }\n\n this.fire('move').fire('zoom');\n if (bearing !== startBearing) {\n this.fire('rotate');\n }\n }, function() {\n this.zooming = false;\n this.rotating = false;\n this.fire('moveend');\n }, options);\n\n return this;\n },\n\n isEasing: function() {\n return !!this._abortFn;\n },\n\n /**\n * Stop current animation\n *\n * @returns {Map} `this`\n */\n stop: function() {\n if (this._abortFn) {\n this._abortFn.call(this);\n this._finishEase();\n }\n return this;\n },\n\n _ease: function(frame, finish, options) {\n this._finishFn = finish;\n this._abortFn = browser.timed(function (t) {\n frame.call(this, options.easing(t));\n if (t === 1) {\n this._finishEase();\n }\n }, options.animate === false ? 0 : options.duration, this);\n },\n\n _finishEase: function() {\n delete this._abortFn;\n // The finish function might emit events which trigger new eases, which\n // set a new _finishFn. Ensure we don't delete it unintentionally.\n var finish = this._finishFn;\n delete this._finishFn;\n finish.call(this);\n },\n\n // convert bearing so that it's numerically close to the current one so that it interpolates properly\n _normalizeBearing: function(bearing, currentBearing) {\n bearing = util.wrap(bearing, -180, 180);\n var diff = Math.abs(bearing - currentBearing);\n if (Math.abs(bearing - 360 - currentBearing) < diff) bearing -= 360;\n if (Math.abs(bearing + 360 - currentBearing) < diff) bearing += 360;\n return bearing;\n },\n\n _updateEasing: function(duration, zoom, bezier) {\n var easing;\n\n if (this.ease) {\n var ease = this.ease,\n t = (Date.now() - ease.start) / ease.duration,\n speed = ease.easing(t + 0.01) - ease.easing(t),\n\n // Quick hack to make new bezier that is continuous with last\n x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01,\n y = Math.sqrt(0.27 * 0.27 - x * x);\n\n easing = util.bezier(x, y, 0.25, 1);\n } else {\n easing = bezier ? util.bezier.apply(util, bezier) : util.ease;\n }\n\n // store information on current easing\n this.ease = {\n start: (new Date()).getTime(),\n to: Math.pow(2, zoom),\n duration: duration,\n easing: easing\n };\n\n return easing;\n }\n});\n","'use strict';\n\nvar Tile = require('./tile');\nvar TileCoord = require('./tile_coord');\nvar Point = require('point-geometry');\nvar Cache = require('../util/mru_cache');\nvar util = require('../util/util');\n\nmodule.exports = TilePyramid;\n\n/**\n * A tile pyramid is a specialized cache and datastructure\n * that contains tiles. It's used by sources to manage their\n * data.\n *\n * @param {Object} options\n * @param {number} options.tileSize\n * @param {number} options.minzoom\n * @param {number} options.maxzoom\n * @private\n */\nfunction TilePyramid(options) {\n this.tileSize = options.tileSize;\n this.minzoom = options.minzoom;\n this.maxzoom = options.maxzoom;\n this.roundZoom = options.roundZoom;\n this.reparseOverscaled = options.reparseOverscaled;\n\n this._load = options.load;\n this._abort = options.abort;\n this._unload = options.unload;\n this._add = options.add;\n this._remove = options.remove;\n this._redoPlacement = options.redoPlacement;\n\n this._tiles = {};\n this._cache = new Cache(options.cacheSize, function(tile) { return this._unload(tile); }.bind(this));\n}\n\nTilePyramid.prototype = {\n /**\n * Confirm that every tracked tile is loaded.\n * @returns {boolean} whether all tiles are loaded.\n * @private\n */\n loaded: function() {\n for (var t in this._tiles) {\n if (!this._tiles[t].loaded)\n return false;\n }\n return true;\n },\n\n /**\n * Return all tile ids ordered with z-order, and cast to numbers\n * @returns {Array} ids\n * @private\n */\n orderedIDs: function() {\n return Object.keys(this._tiles)\n .sort(function(a, b) { return (b % 32) - (a % 32); })\n .map(function(id) { return +id; });\n },\n\n renderedIDs: function() {\n return this.orderedIDs().filter(function(id) {\n return this._tiles[id].loaded && !this._coveredTiles[id];\n }.bind(this));\n },\n\n reload: function() {\n this._cache.reset();\n for (var i in this._tiles) {\n this._load(this._tiles[i]);\n }\n },\n\n /**\n * Get a specific tile by id\n * @param {string|number} id tile id\n * @returns {Object} tile\n * @private\n */\n getTile: function(id) {\n return this._tiles[id];\n },\n\n /**\n * get the zoom level adjusted for the difference in map and source tilesizes\n * @param {Object} transform\n * @returns {number} zoom level\n * @private\n */\n getZoom: function(transform) {\n return transform.zoom + Math.log(transform.tileSize / this.tileSize) / Math.LN2;\n },\n\n /**\n * Return a zoom level that will cover all tiles in a given transform\n * @param {Object} transform\n * @returns {number} zoom level\n * @private\n */\n coveringZoomLevel: function(transform) {\n return (this.roundZoom ? Math.round : Math.floor)(this.getZoom(transform));\n },\n\n /**\n * Given a transform, return all coordinates that could cover that\n * transform for a covering zoom level.\n * @param {Object} transform\n * @returns {Array} tiles\n * @private\n */\n coveringTiles: function(transform) {\n var z = this.coveringZoomLevel(transform);\n var actualZ = z;\n\n if (z < this.minzoom) return [];\n if (z > this.maxzoom) z = this.maxzoom;\n\n var tr = transform,\n tileCenter = tr.locationCoordinate(tr.center)._zoomTo(z),\n centerPoint = new Point(tileCenter.column - 0.5, tileCenter.row - 0.5);\n\n return TileCoord.cover(z, [\n tr.pointCoordinate(new Point(0, 0))._zoomTo(z),\n tr.pointCoordinate(new Point(tr.width, 0))._zoomTo(z),\n tr.pointCoordinate(new Point(tr.width, tr.height))._zoomTo(z),\n tr.pointCoordinate(new Point(0, tr.height))._zoomTo(z)\n ], this.reparseOverscaled ? actualZ : z).sort(function(a, b) {\n return centerPoint.dist(a) - centerPoint.dist(b);\n });\n },\n\n /**\n * Recursively find children of the given tile (up to maxCoveringZoom) that are already loaded;\n * adds found tiles to retain object; returns true if children completely cover the tile\n *\n * @param {Coordinate} coord\n * @param {number} maxCoveringZoom\n * @param {boolean} retain\n * @returns {boolean} whether the operation was complete\n * @private\n */\n findLoadedChildren: function(coord, maxCoveringZoom, retain) {\n var complete = true;\n var z = coord.z;\n var coords = coord.children(this.maxzoom);\n for (var i = 0; i < coords.length; i++) {\n var id = coords[i].id;\n if (this._tiles[id] && this._tiles[id].loaded) {\n retain[id] = true;\n } else {\n complete = false;\n if (z < maxCoveringZoom) {\n // Go further down the hierarchy to find more unloaded children.\n this.findLoadedChildren(coords[i], maxCoveringZoom, retain);\n }\n }\n }\n return complete;\n },\n\n /**\n * Find a loaded parent of the given tile (up to minCoveringZoom);\n * adds the found tile to retain object and returns the tile if found\n *\n * @param {Coordinate} coord\n * @param {number} minCoveringZoom\n * @param {boolean} retain\n * @returns {Tile} tile object\n * @private\n */\n findLoadedParent: function(coord, minCoveringZoom, retain) {\n for (var z = coord.z - 1; z >= minCoveringZoom; z--) {\n coord = coord.parent(this.maxzoom);\n var tile = this._tiles[coord.id];\n if (tile && tile.loaded) {\n retain[coord.id] = true;\n return tile;\n }\n }\n },\n\n /**\n * Removes tiles that are outside the viewport and adds new tiles that\n * are inside the viewport.\n * @private\n */\n update: function(used, transform, fadeDuration) {\n var i;\n var coord;\n var tile;\n\n // Determine the overzooming/underzooming amounts.\n var zoom = (this.roundZoom ? Math.round : Math.floor)(this.getZoom(transform));\n var minCoveringZoom = util.clamp(zoom - 10, this.minzoom, this.maxzoom);\n var maxCoveringZoom = util.clamp(zoom + 1, this.minzoom, this.maxzoom);\n\n // Retain is a list of tiles that we shouldn't delete, even if they are not\n // the most ideal tile for the current viewport. This may include tiles like\n // parent or child tiles that are *already* loaded.\n var retain = {};\n var now = new Date().getTime();\n\n // Covered is a list of retained tiles who's areas are full covered by other,\n // better, retained tiles. They are not drawn separately.\n this._coveredTiles = {};\n\n var required = used ? this.coveringTiles(transform) : [];\n for (i = 0; i < required.length; i++) {\n coord = required[i];\n tile = this.addTile(coord);\n\n retain[coord.id] = true;\n\n if (tile.loaded)\n continue;\n\n // The tile we require is not yet loaded.\n // Retain child or parent tiles that cover the same area.\n if (!this.findLoadedChildren(coord, maxCoveringZoom, retain)) {\n this.findLoadedParent(coord, minCoveringZoom, retain);\n }\n }\n\n for (var id in retain) {\n coord = TileCoord.fromID(id);\n tile = this._tiles[id];\n if (tile && tile.timeAdded > now - (fadeDuration || 0)) {\n // This tile is still fading in. Find tiles to cross-fade with it.\n if (this.findLoadedChildren(coord, maxCoveringZoom, retain)) {\n this._coveredTiles[id] = true;\n retain[id] = true;\n } else {\n this.findLoadedParent(coord, minCoveringZoom, retain);\n }\n }\n }\n\n // Remove the tiles we don't need anymore.\n var remove = util.keysDifference(this._tiles, retain);\n for (i = 0; i < remove.length; i++) {\n this.removeTile(+remove[i]);\n }\n },\n\n /**\n * Add a tile, given its coordinate, to the pyramid.\n * @param {Coordinate} coord\n * @returns {Coordinate} the coordinate.\n * @private\n */\n addTile: function(coord) {\n var tile = this._tiles[coord.id];\n if (tile)\n return tile;\n\n var wrapped = coord.wrapped();\n tile = this._tiles[wrapped.id];\n\n if (!tile) {\n tile = this._cache.get(wrapped.id);\n if (tile && this._redoPlacement) {\n this._redoPlacement(tile);\n }\n }\n\n if (!tile) {\n var zoom = coord.z;\n var overscaling = zoom > this.maxzoom ? Math.pow(2, zoom - this.maxzoom) : 1;\n tile = new Tile(wrapped, this.tileSize * overscaling);\n this._load(tile);\n }\n\n tile.uses++;\n this._tiles[coord.id] = tile;\n this._add(tile, coord);\n\n return tile;\n },\n\n /**\n * Remove a tile, given its id, from the pyramid\n * @param {string|number} id tile id\n * @returns {undefined} nothing\n * @private\n */\n removeTile: function(id) {\n var tile = this._tiles[id];\n if (!tile)\n return;\n\n tile.uses--;\n delete this._tiles[id];\n this._remove(tile);\n\n if (tile.uses > 0)\n return;\n\n if (tile.loaded) {\n this._cache.add(tile.coord.wrapped().id, tile);\n } else {\n this._abort(tile);\n this._unload(tile);\n }\n },\n\n /**\n * Remove all tiles from this pyramid\n * @private\n */\n clearTiles: function() {\n for (var id in this._tiles)\n this.removeTile(id);\n this._cache.reset();\n },\n\n /**\n * For a given coordinate, search through our current tiles and attempt\n * to find a tile at that point\n * @param {Coordinate} coord\n * @returns {Object} tile\n * @private\n */\n tileAt: function(coord) {\n var ids = this.orderedIDs();\n for (var i = 0; i < ids.length; i++) {\n var tile = this._tiles[ids[i]];\n var pos = tile.positionAt(coord, this.maxzoom);\n if (pos && pos.x >= 0 && pos.x < 4096 && pos.y >= 0 && pos.y < 4096) {\n // The click is within the viewport. There is only ever one tile in\n // a layer that has this property.\n return {\n tile: tile,\n x: pos.x,\n y: pos.y,\n scale: pos.scale\n };\n }\n }\n }\n};\n","'use strict';\n\nvar util = require('../util/util');\nvar ajax = require('../util/ajax');\nvar browser = require('../util/browser');\nvar TilePyramid = require('./tile_pyramid');\nvar TileCoord = require('./tile_coord');\nvar normalizeURL = require('../util/mapbox').normalizeSourceURL;\n\nexports._loadTileJSON = function(options) {\n var loaded = function(err, tileJSON) {\n if (err) {\n this.fire('error', {error: err});\n return;\n }\n\n util.extend(this, util.pick(tileJSON,\n ['tiles', 'minzoom', 'maxzoom', 'attribution']));\n\n this._pyramid = new TilePyramid({\n tileSize: this.tileSize,\n cacheSize: 20,\n minzoom: this.minzoom,\n maxzoom: this.maxzoom,\n roundZoom: this.roundZoom,\n reparseOverscaled: this.reparseOverscaled,\n load: this._loadTile.bind(this),\n abort: this._abortTile.bind(this),\n unload: this._unloadTile.bind(this),\n add: this._addTile.bind(this),\n remove: this._removeTile.bind(this),\n redoPlacement: this._redoTilePlacement ? this._redoTilePlacement.bind(this) : undefined\n });\n\n this.fire('load');\n }.bind(this);\n\n if (options.url) {\n ajax.getJSON(normalizeURL(options.url), loaded);\n } else {\n browser.frame(loaded.bind(this, null, options));\n }\n};\n\nexports._renderTiles = function(layers, painter) {\n if (!this._pyramid)\n return;\n\n var ids = this._pyramid.renderedIDs();\n for (var i = 0; i < ids.length; i++) {\n var tile = this._pyramid.getTile(ids[i]),\n // coord is different than tile.coord for wrapped tiles since the actual\n // tile object is shared between all the visible copies of that tile.\n coord = TileCoord.fromID(ids[i]),\n z = coord.z,\n x = coord.x,\n y = coord.y,\n w = coord.w;\n\n // if z > maxzoom then the tile is actually a overscaled maxzoom tile,\n // so calculate the matrix the maxzoom tile would use.\n z = Math.min(z, this.maxzoom);\n\n x += w * (1 << z);\n tile.calculateMatrices(z, x, y, painter.transform, painter);\n\n painter.drawTile(tile, layers);\n }\n};\n\nexports._vectorFeaturesAt = function(coord, params, callback) {\n if (!this._pyramid)\n return callback(null, []);\n\n var result = this._pyramid.tileAt(coord);\n if (!result)\n return callback(null, []);\n\n this.dispatcher.send('query features', {\n uid: result.tile.uid,\n x: result.x,\n y: result.y,\n scale: result.scale,\n source: this.id,\n params: params\n }, callback, result.tile.workerID);\n};\n\n/*\n * Create a tiled data source instance given an options object\n *\n * @param {Object} options\n * @param {string} options.type Either `raster` or `vector`.\n * @param {string} options.url A tile source URL. This should either be `mapbox://{mapid}` or a full `http[s]` url that points to a TileJSON endpoint.\n * @param {Array} options.tiles An array of tile sources. If `url` is not specified, `tiles` can be used instead to specify tile sources, as in the TileJSON spec. Other TileJSON keys such as `minzoom` and `maxzoom` can be specified in a source object if `tiles` is used.\n * @param {string} options.id An optional `id` to assign to the source\n * @param {number} [options.tileSize=512] Optional tile size (width and height in pixels, assuming tiles are square). This option is only configurable for raster sources\n * @param {number} options.cacheSize Optional max number of tiles to cache at any given time\n * @example\n * var sourceObj = new mapboxgl.Source.create({\n * type: 'vector',\n * url: 'mapbox://mapbox.mapbox-streets-v5'\n * });\n * map.addSource('some id', sourceObj); // add\n * map.removeSource('some id'); // remove\n */\nexports.create = function(source) {\n // This is not at file scope in order to avoid a circular require.\n var sources = {\n vector: require('./vector_tile_source'),\n raster: require('./raster_tile_source'),\n geojson: require('./geojson_source'),\n video: require('./video_source')\n };\n\n for (var type in sources) {\n if (source instanceof sources[type]) {\n return source;\n }\n }\n\n return new sources[source.type](source);\n};\n","'use strict';\n\nvar glmatrix = require('gl-matrix');\nvar mat2 = glmatrix.mat2;\nvar mat4 = glmatrix.mat4;\nvar util = require('../util/util');\nvar BufferSet = require('../data/buffer/buffer_set');\n\nmodule.exports = Tile;\n\n/**\n * A tile object is the combination of a Coordinate, which defines\n * its place, as well as a unique ID and data tracking for its content\n *\n * @param {Coordinate} coord\n * @param {number} size\n * @private\n */\nfunction Tile(coord, size) {\n this.coord = coord;\n this.uid = util.uniqueId();\n this.loaded = false;\n this.uses = 0;\n this.tileSize = size;\n}\n\nTile.prototype = {\n // todo unhardcode\n tileExtent: 4096,\n\n /**\n * Calculate the internal posMatrix that this tile uses to display\n * itself in a map, given a coordinate as (z, x, y) and a transform\n * @param {number} z\n * @param {number} x\n * @param {number} y\n * @param {Object} transform\n * @private\n */\n calculateMatrices: function(z, x, y, transform) {\n\n // Initialize model-view matrix that converts from the tile coordinates\n // to screen coordinates.\n var tileScale = Math.pow(2, z);\n var scale = transform.worldSize / tileScale;\n\n // TODO: remove\n this.scale = scale;\n\n // The position matrix\n this.posMatrix = new Float64Array(16);\n mat4.identity(this.posMatrix);\n mat4.translate(this.posMatrix, this.posMatrix, [x * scale, y * scale, 0]);\n\n mat4.scale(this.posMatrix, this.posMatrix, [ scale / this.tileExtent, scale / this.tileExtent, 1 ]);\n mat4.multiply(this.posMatrix, transform.getProjMatrix(), this.posMatrix);\n\n // The extrusion matrix.\n this.exMatrix = mat4.create();\n mat4.ortho(this.exMatrix, 0, transform.width, transform.height, 0, 0, -1);\n //mat4.rotateZ(this.exMatrix, this.exMatrix, -transform.angle);\n\n // 2x2 matrix for rotating points\n this.rotationMatrix = mat2.create();\n mat2.rotate(this.rotationMatrix, this.rotationMatrix, transform.angle);\n\n this.posMatrix = new Float32Array(this.posMatrix);\n },\n\n /**\n * Given a coordinate position, zoom that coordinate to my zoom and\n * scale and return a position in x, y, scale\n * @param {Coordinate} coord\n * @returns {Object} position\n * @private\n */\n positionAt: function(coord, sourceMaxZoom) {\n coord = coord.zoomTo(Math.min(this.coord.z, sourceMaxZoom));\n return {\n x: (coord.column - this.coord.x) * 4096,\n y: (coord.row - this.coord.y) * 4096,\n scale: this.scale\n };\n },\n\n /**\n * Given a data object with a 'buffers' property, load it into\n * this tile's elementGroups and buffers properties and set loaded\n * to true. If the data is null, like in the case of an empty\n * GeoJSON tile, no-op but still set loaded to true.\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n loadVectorData: function(data) {\n this.loaded = true;\n\n // empty GeoJSON tile\n if (!data) return;\n\n this.buffers = new BufferSet(data.buffers);\n this.elementGroups = data.elementGroups;\n this.tileExtent = data.extent;\n },\n\n /**\n * given a data object and a GL painter, destroy and re-create\n * all of its buffers.\n * @param {Object} data\n * @param {Object} painter\n * @returns {undefined}\n * @private\n */\n reloadSymbolData: function(data, painter) {\n\n if (!this.buffers) {\n // the tile has been destroyed\n return;\n }\n\n this.buffers.glyphVertex.destroy(painter.gl);\n this.buffers.glyphElement.destroy(painter.gl);\n this.buffers.iconVertex.destroy(painter.gl);\n this.buffers.iconElement.destroy(painter.gl);\n this.buffers.collisionBoxVertex.destroy(painter.gl);\n\n var buffers = new BufferSet(data.buffers);\n this.buffers.glyphVertex = buffers.glyphVertex;\n this.buffers.glyphElement = buffers.glyphElement;\n this.buffers.iconVertex = buffers.iconVertex;\n this.buffers.iconElement = buffers.iconElement;\n this.buffers.collisionBoxVertex = buffers.collisionBoxVertex;\n\n for (var id in data.elementGroups) {\n this.elementGroups[id] = data.elementGroups[id];\n }\n },\n\n /**\n * Make sure that this tile doesn't own any data within a given\n * painter, so that it doesn't consume any memory or maintain\n * any references to the painter.\n * @param {Object} painter gl painter object\n * @returns {undefined}\n * @private\n */\n unloadVectorData: function(painter) {\n for (var b in this.buffers) {\n this.buffers[b].destroy(painter.gl);\n }\n this.buffers = null;\n }\n};\n","'use strict';\n\nmodule.exports = Coordinate;\n\n/**\n * A coordinate is a column, row, zoom combination, often used\n * as the data component of a tile.\n *\n * @param {number} column\n * @param {number} row\n * @param {number} zoom\n * @private\n */\nfunction Coordinate(column, row, zoom) {\n this.column = column;\n this.row = row;\n this.zoom = zoom;\n}\n\nCoordinate.prototype = {\n\n /**\n * Create a clone of this coordinate that can be mutated without\n * changing the original coordinate\n *\n * @returns {Coordinate} clone\n * @private\n * var coord = new Coordinate(0, 0, 0);\n * var c2 = coord.clone();\n * // since coord is cloned, modifying a property of c2 does\n * // not modify it.\n * c2.zoom = 2;\n */\n clone: function() {\n return new Coordinate(this.column, this.row, this.zoom);\n },\n\n /**\n * Zoom this coordinate to a given zoom level. This returns a new\n * coordinate object, not mutating the old one.\n *\n * @param {number} zoom\n * @returns {Coordinate} zoomed coordinate\n * @private\n * @example\n * var coord = new Coordinate(0, 0, 0);\n * var c2 = coord.zoomTo(1);\n * c2 // equals new Coordinate(0, 0, 1);\n */\n zoomTo: function(zoom) { return this.clone()._zoomTo(zoom); },\n\n /**\n * Subtract the column and row values of this coordinate from those\n * of another coordinate. The other coordinat will be zoomed to the\n * same level as `this` before the subtraction occurs\n *\n * @param {Coordinate} c other coordinate\n * @returns {Coordinate} result\n * @private\n */\n sub: function(c) { return this.clone()._sub(c); },\n\n _zoomTo: function(zoom) {\n var scale = Math.pow(2, zoom - this.zoom);\n this.column *= scale;\n this.row *= scale;\n this.zoom = zoom;\n return this;\n },\n\n _sub: function(c) {\n c = c.zoomTo(this.zoom);\n this.column -= c.column;\n this.row -= c.row;\n return this;\n }\n};\n","'use strict';\n\nvar Source = require('../source/source');\nvar StyleLayer = require('./style_layer');\n\nfunction styleBatch(style, work) {\n if (!style._loaded) {\n throw new Error('Style is not done loading');\n }\n\n var batch = Object.create(styleBatch.prototype);\n\n batch._style = style;\n batch._groupLayers = false;\n batch._broadcastLayers = false;\n batch._reloadSources = {};\n batch._events = [];\n batch._change = false;\n\n work(batch);\n\n if (batch._groupLayers) {\n batch._style._groupLayers();\n }\n\n if (batch._broadcastLayers) {\n batch._style._broadcastLayers();\n }\n\n Object.keys(batch._reloadSources).forEach(function(sourceId) {\n batch._style._reloadSource(sourceId);\n });\n\n batch._events.forEach(function(args) {\n batch._style.fire.apply(batch._style, args);\n });\n\n if (batch._change) {\n batch._style.fire('change');\n }\n}\n\nstyleBatch.prototype = {\n\n addLayer: function(layer, before) {\n if (this._style._layers[layer.id] !== undefined) {\n throw new Error('There is already a layer with this ID');\n }\n if (!(layer instanceof StyleLayer)) {\n layer = new StyleLayer(layer, this._style.stylesheet.constants || {});\n }\n this._style._layers[layer.id] = layer;\n this._style._order.splice(before ? this._style._order.indexOf(before) : Infinity, 0, layer.id);\n layer.resolveLayout();\n layer.resolveReference(this._style._layers);\n layer.resolvePaint();\n\n this._groupLayers = true;\n this._broadcastLayers = true;\n if (layer.source) {\n this._reloadSources[layer.source] = true;\n }\n this._events.push(['layer.add', {layer: layer}]);\n this._change = true;\n\n return this;\n },\n\n removeLayer: function(id) {\n var layer = this._style._layers[id];\n if (layer === undefined) {\n throw new Error('There is no layer with this ID');\n }\n for (var i in this._style._layers) {\n if (this._style._layers[i].ref === id) {\n this.removeLayer(i);\n }\n }\n delete this._style._layers[id];\n this._style._order.splice(this._style._order.indexOf(id), 1);\n\n this._groupLayers = true;\n this._broadcastLayers = true;\n this._events.push(['layer.remove', {layer: layer}]);\n this._change = true;\n\n return this;\n },\n\n setPaintProperty: function(layer, name, value, klass) {\n this._style.getLayer(layer).setPaintProperty(name, value, klass);\n this._change = true;\n\n return this;\n },\n\n setLayoutProperty: function(layer, name, value) {\n layer = this._style.getReferentLayer(layer);\n layer.setLayoutProperty(name, value);\n\n this._broadcastLayers = true;\n if (layer.source) {\n this._reloadSources[layer.source] = true;\n }\n this._change = true;\n\n return this;\n },\n\n setFilter: function(layer, filter) {\n layer = this._style.getReferentLayer(layer);\n layer.filter = filter;\n\n this._broadcastLayers = true;\n if (layer.source) {\n this._reloadSources[layer.source] = true;\n }\n this._change = true;\n\n return this;\n },\n\n setLayerZoomRange: function(layerId, minzoom, maxzoom) {\n var layer = this._style.getReferentLayer(layerId);\n if (minzoom != null) {\n layer.minzoom = minzoom;\n }\n if (maxzoom != null) {\n layer.maxzoom = maxzoom;\n }\n\n this._broadcastLayers = true;\n if (layer.source) {\n this._reloadSources[layer.source] = true;\n }\n this._change = true;\n\n return this;\n },\n\n addSource: function(id, source) {\n if (!this._style._loaded) {\n throw new Error('Style is not done loading');\n }\n if (this._style.sources[id] !== undefined) {\n throw new Error('There is already a source with this ID');\n }\n source = Source.create(source);\n this._style.sources[id] = source;\n source.id = id;\n source.style = this._style;\n source.dispatcher = this._style.dispatcher;\n source.glyphAtlas = this._style.glyphAtlas;\n source\n .on('load', this._style._forwardSourceEvent)\n .on('error', this._style._forwardSourceEvent)\n .on('change', this._style._forwardSourceEvent)\n .on('tile.add', this._style._forwardTileEvent)\n .on('tile.load', this._style._forwardTileEvent)\n .on('tile.error', this._style._forwardTileEvent)\n .on('tile.remove', this._style._forwardTileEvent);\n\n this._events.push(['source.add', {source: source}]);\n this._change = true;\n\n return this;\n },\n\n removeSource: function(id) {\n if (this._style.sources[id] === undefined) {\n throw new Error('There is no source with this ID');\n }\n var source = this._style.sources[id];\n delete this._style.sources[id];\n source\n .off('load', this._style._forwardSourceEvent)\n .off('error', this._style._forwardSourceEvent)\n .off('change', this._style._forwardSourceEvent)\n .off('tile.add', this._style._forwardTileEvent)\n .off('tile.load', this._style._forwardTileEvent)\n .off('tile.error', this._style._forwardTileEvent)\n .off('tile.remove', this._style._forwardTileEvent);\n\n this._events.push(['source.remove', {source: source}]);\n this._change = true;\n\n return this;\n }\n};\n\nmodule.exports = styleBatch;\n","'use strict';\n\nvar util = require('../util/util');\nvar StyleConstant = require('./style_constant');\nvar StyleTransition = require('./style_transition');\nvar StyleDeclarationSet = require('./style_declaration_set');\nvar LayoutProperties = require('./layout_properties');\nvar PaintProperties = require('./paint_properties');\n\nmodule.exports = StyleLayer;\n\nfunction StyleLayer(layer, constants) {\n this._layer = layer;\n this._constants = constants;\n\n this.id = layer.id;\n this.ref = layer.ref;\n\n // Resolved and cascaded paint properties.\n this._resolved = {}; // class name -> StyleDeclarationSet\n this._cascaded = {}; // property name -> StyleTransition\n\n this.assign(layer);\n}\n\nStyleLayer.prototype = {\n resolveLayout: function() {\n if (!this.ref) {\n this.layout = new LayoutProperties[this.type](\n StyleConstant.resolveAll(this._layer.layout, this._constants));\n\n if (this.layout['symbol-placement'] === 'line') {\n if (!this.layout.hasOwnProperty('text-rotation-alignment')) {\n this.layout['text-rotation-alignment'] = 'map';\n }\n if (!this.layout.hasOwnProperty('icon-rotation-alignment')) {\n this.layout['icon-rotation-alignment'] = 'map';\n }\n this.layout['symbol-avoid-edges'] = true;\n }\n }\n },\n\n setLayoutProperty: function(name, value) {\n this.layout[name] = StyleConstant.resolve(value, this._constants);\n },\n\n getLayoutProperty: function(name) {\n return this.layout[name];\n },\n\n resolveReference: function(layers) {\n if (this.ref) {\n this.assign(layers[this.ref]);\n }\n },\n\n resolvePaint: function() {\n for (var p in this._layer) {\n var match = p.match(/^paint(?:\\.(.*))?$/);\n if (!match)\n continue;\n this._resolved[match[1] || ''] =\n new StyleDeclarationSet('paint', this.type, this._layer[p], this._constants);\n }\n },\n\n setPaintProperty: function(name, value, klass) {\n var declarations = this._resolved[klass || ''];\n if (!declarations) {\n declarations = this._resolved[klass || ''] =\n new StyleDeclarationSet('paint', this.type, {}, this._constants);\n }\n declarations[name] = value;\n },\n\n getPaintProperty: function(name, klass) {\n var declarations = this._resolved[klass || ''];\n if (!declarations)\n return undefined;\n return declarations[name];\n },\n\n cascade: function(classes, options, globalTrans, animationLoop) {\n for (var klass in this._resolved) {\n if (klass !== \"\" && !classes[klass])\n continue;\n\n var declarations = this._resolved[klass],\n values = declarations.values();\n\n for (var k in values) {\n var newDeclaration = values[k];\n var oldTransition = options.transition ? this._cascaded[k] : undefined;\n\n // Only create a new transition if the declaration changed\n if (!oldTransition || oldTransition.declaration.json !== newDeclaration.json) {\n var newStyleTrans = declarations.transition(k, globalTrans);\n var newTransition = this._cascaded[k] =\n new StyleTransition(newDeclaration, oldTransition, newStyleTrans);\n\n // Run the animation loop until the end of the transition\n if (!newTransition.instant()) {\n newTransition.loopID = animationLoop.set(newTransition.endTime - (new Date()).getTime());\n }\n\n if (oldTransition) {\n animationLoop.cancel(oldTransition.loopID);\n }\n }\n }\n }\n },\n\n recalculate: function(z, zoomHistory) {\n var type = this.type,\n calculated = this.paint = new PaintProperties[type]();\n\n for (var k in this._cascaded) {\n calculated[k] = this._cascaded[k].at(z, zoomHistory);\n }\n\n this.hidden = (this.minzoom && z < this.minzoom) ||\n (this.maxzoom && z >= this.maxzoom) ||\n // include visibility check for non-bucketed background layers\n (this.layout.visibility === 'none');\n\n if (type === 'symbol') {\n if ((calculated['text-opacity'] === 0 || !this.layout['text-field']) &&\n (calculated['icon-opacity'] === 0 || !this.layout['icon-image'])) {\n this.hidden = true;\n } else {\n premultiplyLayer(calculated, 'text');\n premultiplyLayer(calculated, 'icon');\n }\n\n } else if (calculated[type + '-opacity'] === 0) {\n this.hidden = true;\n } else {\n premultiplyLayer(calculated, type);\n }\n\n if (this._cascaded['line-dasharray']) {\n // If the line is dashed, scale the dash lengths by the line\n // width at the previous round zoom level.\n var dashArray = calculated['line-dasharray'];\n var lineWidth = this._cascaded['line-width'] ?\n this._cascaded['line-width'].at(Math.floor(z), Infinity) :\n calculated['line-width'];\n\n dashArray.fromScale *= lineWidth;\n dashArray.toScale *= lineWidth;\n }\n\n return !this.hidden;\n },\n\n assign: function(layer) {\n util.extend(this, util.pick(layer,\n ['type', 'source', 'source-layer',\n 'minzoom', 'maxzoom', 'filter',\n 'layout']));\n },\n\n json: function() {\n return util.extend({},\n this._layer,\n util.pick(this,\n ['type', 'source', 'source-layer',\n 'minzoom', 'maxzoom', 'filter',\n 'layout', 'paint']));\n }\n};\n\nfunction premultiplyLayer(layer, type) {\n var colorProp = type + '-color',\n haloProp = type + '-halo-color',\n outlineProp = type + '-outline-color',\n color = layer[colorProp],\n haloColor = layer[haloProp],\n outlineColor = layer[outlineProp],\n opacity = layer[type + '-opacity'];\n\n var colorOpacity = color && (opacity * color[3]);\n var haloOpacity = haloColor && (opacity * haloColor[3]);\n var outlineOpacity = outlineColor && (opacity * outlineColor[3]);\n\n if (colorOpacity !== undefined && colorOpacity < 1) {\n layer[colorProp] = util.premultiply([color[0], color[1], color[2], colorOpacity]);\n }\n if (haloOpacity !== undefined && haloOpacity < 1) {\n layer[haloProp] = util.premultiply([haloColor[0], haloColor[1], haloColor[2], haloOpacity]);\n }\n if (outlineOpacity !== undefined && outlineOpacity < 1) {\n layer[outlineProp] = util.premultiply([outlineColor[0], outlineColor[1], outlineColor[2], outlineOpacity]);\n }\n}\n","'use strict';\n\nvar Evented = require('../util/evented');\nvar ajax = require('../util/ajax');\nvar browser = require('../util/browser');\n\nmodule.exports = ImageSprite;\n\nfunction ImageSprite(base) {\n this.base = base;\n this.retina = browser.devicePixelRatio > 1;\n\n base = this.base + (this.retina ? '@2x' : '');\n\n ajax.getJSON(base + '.json', function(err, data) {\n if (err) {\n this.fire('error', {error: err});\n return;\n }\n\n this.data = data;\n if (this.img) this.fire('load');\n }.bind(this));\n\n ajax.getImage(base + '.png', function(err, img) {\n if (err) {\n this.fire('error', {error: err});\n return;\n }\n\n // premultiply the sprite\n var data = img.getData();\n var newdata = img.data = new Uint8Array(data.length);\n for (var i = 0; i < data.length; i += 4) {\n var alpha = data[i + 3] / 255;\n newdata[i + 0] = data[i + 0] * alpha;\n newdata[i + 1] = data[i + 1] * alpha;\n newdata[i + 2] = data[i + 2] * alpha;\n newdata[i + 3] = data[i + 3];\n }\n\n this.img = img;\n if (this.data) this.fire('load');\n }.bind(this));\n}\n\nImageSprite.prototype = Object.create(Evented);\n\nImageSprite.prototype.toJSON = function() {\n return this.base;\n};\n\nImageSprite.prototype.loaded = function() {\n return !!(this.data && this.img);\n};\n\nImageSprite.prototype.resize = function(/*gl*/) {\n if (browser.devicePixelRatio > 1 !== this.retina) {\n var newSprite = new ImageSprite(this.base);\n newSprite.on('load', function() {\n this.img = newSprite.img;\n this.data = newSprite.data;\n this.retina = newSprite.retina;\n }.bind(this));\n }\n};\n\nfunction SpritePosition() {}\nSpritePosition.prototype = { x: 0, y: 0, width: 0, height: 0, pixelRatio: 1, sdf: false };\n\nImageSprite.prototype.getSpritePosition = function(name) {\n if (!this.loaded()) return new SpritePosition();\n\n var pos = this.data && this.data[name];\n if (pos && this.img) return pos;\n\n return new SpritePosition();\n};\n","'use strict';\n\nvar normalizeURL = require('../util/mapbox').normalizeGlyphsURL;\nvar getArrayBuffer = require('../util/ajax').getArrayBuffer;\nvar Glyphs = require('../util/glyphs');\nvar Protobuf = require('pbf');\n\nmodule.exports = GlyphSource;\n\n/**\n * A glyph source has a URL from which to load new glyphs and owns a GlyphAtlas\n * that stores currently-loaded glyphs.\n *\n * @param {string} url glyph template url\n * @param {Object} glyphAtlas glyph atlas object\n * @private\n */\nfunction GlyphSource(url, glyphAtlas) {\n this.url = url && normalizeURL(url);\n this.glyphAtlas = glyphAtlas;\n this.stacks = [];\n this.loading = {};\n}\n\nGlyphSource.prototype.getSimpleGlyphs = function(fontstack, glyphIDs, uid, callback) {\n\n if (this.stacks[fontstack] === undefined) this.stacks[fontstack] = {};\n\n var glyphs = {};\n\n var stack = this.stacks[fontstack];\n var glyphAtlas = this.glyphAtlas;\n\n // the number of pixels the sdf bitmaps are padded by\n var buffer = 3;\n\n var missing = {};\n var remaining = 0;\n var range;\n\n for (var i = 0; i < glyphIDs.length; i++) {\n var glyphID = glyphIDs[i];\n range = Math.floor(glyphID / 256);\n\n if (stack[range]) {\n var glyph = stack[range].glyphs[glyphID];\n var rect = glyphAtlas.addGlyph(uid, fontstack, glyph, buffer);\n if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer);\n } else {\n if (missing[range] === undefined) {\n missing[range] = [];\n remaining++;\n }\n missing[range].push(glyphID);\n }\n }\n\n if (!remaining) callback(undefined, glyphs);\n\n var onRangeLoaded = function(err, range, data) {\n // TODO not be silent about errors\n if (!err) {\n var stack = this.stacks[fontstack][range] = data.stacks[0];\n for (var i = 0; i < missing[range].length; i++) {\n var glyphID = missing[range][i];\n var glyph = stack.glyphs[glyphID];\n var rect = glyphAtlas.addGlyph(uid, fontstack, glyph, buffer);\n if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer);\n }\n }\n remaining--;\n if (!remaining) callback(undefined, glyphs);\n }.bind(this);\n\n for (var r in missing) {\n this.loadRange(fontstack, r, onRangeLoaded);\n }\n};\n\n// A simplified representation of the glyph containing only the properties needed for shaping.\nfunction SimpleGlyph(glyph, rect, buffer) {\n var padding = 1;\n this.advance = glyph.advance;\n this.left = glyph.left - buffer - padding;\n this.top = glyph.top + buffer + padding;\n this.rect = rect;\n}\n\nGlyphSource.prototype.loadRange = function(fontstack, range, callback) {\n\n if (range * 256 > 65535) return callback('gyphs > 65535 not supported');\n\n if (this.loading[fontstack] === undefined) this.loading[fontstack] = {};\n var loading = this.loading[fontstack];\n\n if (loading[range]) {\n loading[range].push(callback);\n } else {\n loading[range] = [callback];\n\n var rangeName = (range * 256) + '-' + (range * 256 + 255);\n var url = glyphUrl(fontstack, rangeName, this.url);\n\n getArrayBuffer(url, function(err, data) {\n var glyphs = !err && new Glyphs(new Protobuf(new Uint8Array(data)));\n for (var i = 0; i < loading[range].length; i++) {\n loading[range][i](err, range, glyphs);\n }\n delete loading[range];\n });\n }\n};\n\n/**\n * Use CNAME sharding to load a specific glyph range over a randomized\n * but consistent subdomain.\n * @param {string} fontstack comma-joined fonts\n * @param {string} range comma-joined range\n * @param {url} url templated url\n * @param {string} [subdomains=abc] subdomains as a string where each letter is one.\n * @returns {string} a url to load that section of glyphs\n * @private\n */\nfunction glyphUrl(fontstack, range, url, subdomains) {\n subdomains = subdomains || 'abc';\n\n return url\n .replace('{s}', subdomains[fontstack.length % subdomains.length])\n .replace('{fontstack}', fontstack)\n .replace('{range}', range);\n}\n","'use strict';\n\nvar BinPack = require('./bin_pack');\n\nmodule.exports = GlyphAtlas;\nfunction GlyphAtlas(width, height) {\n this.width = width;\n this.height = height;\n\n this.bin = new BinPack(width, height);\n this.index = {};\n this.ids = {};\n this.data = new Uint8Array(width * height);\n}\n\nGlyphAtlas.prototype = {\n get debug() {\n return 'canvas' in this;\n },\n set debug(value) {\n if (value && !this.canvas) {\n this.canvas = document.createElement('canvas');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n document.body.appendChild(this.canvas);\n this.ctx = this.canvas.getContext('2d');\n } else if (!value && this.canvas) {\n this.canvas.parentNode.removeChild(this.canvas);\n delete this.ctx;\n delete this.canvas;\n }\n }\n};\n\nGlyphAtlas.prototype.getGlyphs = function() {\n var glyphs = {},\n split,\n name,\n id;\n\n for (var key in this.ids) {\n split = key.split('#');\n name = split[0];\n id = split[1];\n\n if (!glyphs[name]) glyphs[name] = [];\n glyphs[name].push(id);\n }\n\n return glyphs;\n};\n\nGlyphAtlas.prototype.getRects = function() {\n var rects = {},\n split,\n name,\n id;\n\n for (var key in this.ids) {\n split = key.split('#');\n name = split[0];\n id = split[1];\n\n if (!rects[name]) rects[name] = {};\n rects[name][id] = this.index[key];\n }\n\n return rects;\n};\n\nGlyphAtlas.prototype.removeGlyphs = function(id) {\n for (var key in this.ids) {\n\n var ids = this.ids[key];\n\n var pos = ids.indexOf(id);\n if (pos >= 0) ids.splice(pos, 1);\n this.ids[key] = ids;\n\n if (!ids.length) {\n var rect = this.index[key];\n\n var target = this.data;\n for (var y = 0; y < rect.h; y++) {\n var y1 = this.width * (rect.y + y) + rect.x;\n for (var x = 0; x < rect.w; x++) {\n target[y1 + x] = 0;\n }\n }\n\n this.dirty = true;\n\n this.bin.release(rect);\n\n delete this.index[key];\n delete this.ids[key];\n }\n }\n\n\n this.updateTexture(this.gl);\n};\n\nGlyphAtlas.prototype.addGlyph = function(id, name, glyph, buffer) {\n if (!glyph) {\n // console.warn('missing glyph', code, String.fromCharCode(code));\n return null;\n }\n var key = name + \"#\" + glyph.id;\n\n // The glyph is already in this texture.\n if (this.index[key]) {\n if (this.ids[key].indexOf(id) < 0) {\n this.ids[key].push(id);\n }\n return this.index[key];\n }\n\n // The glyph bitmap has zero width.\n if (!glyph.bitmap) {\n return null;\n }\n\n var bufferedWidth = glyph.width + buffer * 2;\n var bufferedHeight = glyph.height + buffer * 2;\n\n // Add a 1px border around every image.\n var padding = 1;\n var packWidth = bufferedWidth + 2 * padding;\n var packHeight = bufferedHeight + 2 * padding;\n\n // Increase to next number divisible by 4, but at least 1.\n // This is so we can scale down the texture coordinates and pack them\n // into 2 bytes rather than 4 bytes.\n packWidth += (4 - packWidth % 4);\n packHeight += (4 - packHeight % 4);\n\n var rect = this.bin.allocate(packWidth, packHeight);\n if (rect.x < 0) {\n console.warn('glyph bitmap overflow');\n return { glyph: glyph, rect: null };\n }\n\n this.index[key] = rect;\n this.ids[key] = [id];\n\n var target = this.data;\n var source = glyph.bitmap;\n for (var y = 0; y < bufferedHeight; y++) {\n var y1 = this.width * (rect.y + y + padding) + rect.x + padding;\n var y2 = bufferedWidth * y;\n for (var x = 0; x < bufferedWidth; x++) {\n target[y1 + x] = source[y2 + x];\n }\n }\n\n this.dirty = true;\n\n return rect;\n};\n\nGlyphAtlas.prototype.bind = function(gl) {\n this.gl = gl;\n if (!this.texture) {\n this.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, this.width, this.height, 0, gl.ALPHA, gl.UNSIGNED_BYTE, null);\n\n } else {\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n }\n};\n\nGlyphAtlas.prototype.updateTexture = function(gl) {\n this.bind(gl);\n if (this.dirty) {\n\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.ALPHA, gl.UNSIGNED_BYTE, this.data);\n\n // DEBUG\n if (this.ctx) {\n var data = this.ctx.getImageData(0, 0, this.width, this.height);\n for (var i = 0, j = 0; i < this.data.length; i++, j += 4) {\n data.data[j] = this.data[i];\n data.data[j + 1] = this.data[i];\n data.data[j + 2] = this.data[i];\n data.data[j + 3] = 255;\n }\n this.ctx.putImageData(data, 0, 0);\n\n this.ctx.strokeStyle = 'red';\n for (var k = 0; k < this.bin.free.length; k++) {\n var free = this.bin.free[k];\n this.ctx.strokeRect(free.x, free.y, free.w, free.h);\n }\n }\n // END DEBUG\n\n this.dirty = false;\n }\n};\n","'use strict';\n\nvar BinPack = require('./bin_pack');\n\nmodule.exports = SpriteAtlas;\nfunction SpriteAtlas(width, height) {\n this.width = width;\n this.height = height;\n\n this.bin = new BinPack(width, height);\n this.images = {};\n this.data = false;\n this.texture = 0; // WebGL ID\n this.filter = 0; // WebGL ID\n this.pixelRatio = 1;\n this.dirty = true;\n}\n\nSpriteAtlas.prototype = {\n get debug() {\n return 'canvas' in this;\n },\n set debug(value) {\n if (value && !this.canvas) {\n this.canvas = document.createElement('canvas');\n this.canvas.width = this.width * this.pixelRatio;\n this.canvas.height = this.height * this.pixelRatio;\n this.canvas.style.width = this.width + 'px';\n this.canvas.style.width = this.width + 'px';\n document.body.appendChild(this.canvas);\n this.ctx = this.canvas.getContext('2d');\n } else if (!value && this.canvas) {\n this.canvas.parentNode.removeChild(this.canvas);\n delete this.ctx;\n delete this.canvas;\n }\n }\n};\n\nSpriteAtlas.prototype.resize = function(newRatio) {\n if (this.pixelRatio === newRatio) return false;\n\n var oldRatio = this.pixelRatio;\n this.pixelRatio = newRatio;\n\n if (this.canvas) {\n this.canvas.width = this.width * this.pixelRatio;\n this.canvas.height = this.height * this.pixelRatio;\n }\n\n if (this.data) {\n var oldData = this.data;\n\n this.data = false;\n this.allocate();\n this.texture = false;\n\n var oldWidth = this.width * oldRatio;\n var oldHeight = this.height * oldRatio;\n var newWidth = this.width * newRatio;\n var newHeight = this.height * newRatio;\n\n // Basic image scaling. TODO: Replace this with better image scaling.\n var newImage = this.data;\n var oldImage = oldData;\n\n for (var y = 0; y < newHeight; y++) {\n var oldYOffset = Math.floor((y * oldHeight) / newHeight) * oldWidth;\n var newYOffset = y * newWidth;\n for (var x = 0; x < newWidth; x++) {\n var oldX = Math.floor((x * oldWidth) / newWidth);\n newImage[newYOffset + x] = oldImage[oldYOffset + oldX];\n }\n }\n\n oldData = null;\n this.dirty = true;\n }\n\n return this.dirty;\n};\n\nfunction copyBitmap(src, srcStride, srcX, srcY, dst, dstStride, dstX, dstY, width, height, wrap) {\n var srcI = srcY * srcStride + srcX;\n var dstI = dstY * dstStride + dstX;\n var x, y;\n\n if (wrap) {\n // add 1 pixel wrapped padding on each side of the image\n dstI -= dstStride;\n for (y = -1; y <= height; y++, srcI = ((y + height) % height + srcY) * srcStride + srcX, dstI += dstStride) {\n for (x = -1; x <= width; x++) {\n dst[dstI + x] = src[srcI + ((x + width) % width)];\n }\n }\n\n } else {\n for (y = 0; y < height; y++, srcI += srcStride, dstI += dstStride) {\n for (x = 0; x < width; x++) {\n dst[dstI + x] = src[srcI + x];\n }\n }\n }\n}\n\nSpriteAtlas.prototype.allocateImage = function(pixelWidth, pixelHeight) {\n\n // Increase to next number divisible by 4, but at least 1.\n // This is so we can scale down the texture coordinates and pack them\n // into 2 bytes rather than 4 bytes.\n // Pad icons to prevent them from polluting neighbours during linear interpolation\n var padding = 2;\n var packWidth = pixelWidth + padding + (4 - (pixelWidth + padding) % 4);\n var packHeight = pixelHeight + padding + (4 - (pixelHeight + padding) % 4);// + 4;\n\n // We have to allocate a new area in the bin, and store an empty image in it.\n // Add a 1px border around every image.\n var rect = this.bin.allocate(packWidth, packHeight);\n if (rect.w === 0) {\n return rect;\n }\n\n rect.originalWidth = pixelWidth;\n rect.originalHeight = pixelHeight;\n\n return rect;\n};\n\nSpriteAtlas.prototype.getImage = function(name, wrap) {\n if (this.images[name]) {\n return this.images[name];\n }\n\n if (!this.sprite) {\n return null;\n }\n\n var pos = this.sprite.getSpritePosition(name);\n if (!pos.width || !pos.height) {\n return null;\n }\n\n var width = pos.width / pos.pixelRatio;\n var height = pos.height / pos.pixelRatio;\n var rect = this.allocateImage(width, height);\n if (rect.w === 0) {\n return rect;\n }\n\n var image = new AtlasImage(rect, width, height, pos.sdf);\n this.images[name] = image;\n\n this.copy(rect, pos, wrap);\n\n return image;\n};\n\n\nSpriteAtlas.prototype.getPosition = function(name, repeating) {\n var image = this.getImage(name, repeating);\n var rect = image && image.rect;\n\n if (!rect) {\n return null;\n }\n\n // When the image is repeating, get the correct position of the image, rather than the\n // one rounded up to 4 pixels.\n var width = repeating ? image.width : rect.w;\n var height = repeating ? image.height : rect.h;\n var padding = 1;\n\n return {\n size: [width, height],\n tl: [(rect.x + padding) / this.width, (rect.y + padding) / this.height],\n br: [(rect.x + padding + width) / this.width, (rect.y + padding + height) / this.height]\n };\n};\n\n\nSpriteAtlas.prototype.allocate = function() {\n if (!this.data) {\n var w = Math.floor(this.width * this.pixelRatio);\n var h = Math.floor(this.height * this.pixelRatio);\n this.data = new Uint32Array(w * h);\n for (var i = 0; i < this.data.length; i++) {\n this.data[i] = 0;\n }\n }\n};\n\n\nSpriteAtlas.prototype.copy = function(dst, src, wrap) {\n // if (!sprite->raster) return;\n if (!this.sprite.img.data) return;\n var srcImg = new Uint32Array(this.sprite.img.data.buffer);\n\n this.allocate();\n var dstImg = this.data;\n\n var padding = 1;\n\n copyBitmap(\n /* source buffer */ srcImg,\n /* source stride */ this.sprite.img.width,\n /* source x */ src.x,\n /* source y */ src.y,\n /* dest buffer */ dstImg,\n /* dest stride */ this.width * this.pixelRatio,\n /* dest x */ (dst.x + padding) * this.pixelRatio,\n /* dest y */ (dst.y + padding) * this.pixelRatio,\n /* icon dimension */ src.width,\n /* icon dimension */ src.height,\n /* wrap */ wrap\n );\n\n this.dirty = true;\n};\n\nSpriteAtlas.prototype.setSprite = function(sprite) {\n this.sprite = sprite;\n};\n\nSpriteAtlas.prototype.addIcons = function(icons, callback) {\n for (var i = 0; i < icons.length; i++) {\n this.getImage(icons[i]);\n }\n\n callback(null, this.images);\n};\n\nSpriteAtlas.prototype.bind = function(gl, linear) {\n var first = false;\n if (!this.texture) {\n this.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n first = true;\n } else {\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n }\n\n var filterVal = linear ? gl.LINEAR : gl.NEAREST;\n if (filterVal !== this.filter) {\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterVal);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterVal);\n this.filter = filterVal;\n }\n\n if (this.dirty) {\n this.allocate();\n\n if (first) {\n gl.texImage2D(\n gl.TEXTURE_2D, // enum target\n 0, // ind level\n gl.RGBA, // ind internalformat\n this.width * this.pixelRatio, // GLsizei width\n this.height * this.pixelRatio, // GLsizei height\n 0, // ind border\n gl.RGBA, // enum format\n gl.UNSIGNED_BYTE, // enum type\n new Uint8Array(this.data.buffer) // Object data\n );\n } else {\n gl.texSubImage2D(\n gl.TEXTURE_2D, // enum target\n 0, // int level\n 0, // int xoffset\n 0, // int yoffset\n this.width * this.pixelRatio, // long width\n this.height * this.pixelRatio, // long height\n gl.RGBA, // enum format\n gl.UNSIGNED_BYTE, // enum type\n new Uint8Array(this.data.buffer) // Object pixels\n );\n }\n\n this.dirty = false;\n\n // DEBUG\n if (this.ctx) {\n var data = this.ctx.getImageData(0, 0, this.width * this.pixelRatio, this.height * this.pixelRatio);\n data.data.set(new Uint8ClampedArray(this.data.buffer));\n this.ctx.putImageData(data, 0, 0);\n\n this.ctx.strokeStyle = 'red';\n for (var k = 0; k < this.bin.free.length; k++) {\n var free = this.bin.free[k];\n this.ctx.strokeRect(free.x * this.pixelRatio, free.y * this.pixelRatio, free.w * this.pixelRatio, free.h * this.pixelRatio);\n }\n }\n // END DEBUG\n }\n};\n\nfunction AtlasImage(rect, width, height, sdf) {\n this.rect = rect;\n this.width = width;\n this.height = height;\n this.sdf = sdf;\n}\n","'use strict';\n\nmodule.exports = LineAtlas;\n\n/**\n * Much like a GlyphAtlas, a LineAtlas lets us reuse rendered dashed lines\n * by writing many of them to a texture and then fetching their positions\n * using .getDash.\n *\n * @param {number} width\n * @param {number} height\n * @private\n */\nfunction LineAtlas(width, height) {\n this.width = width;\n this.height = height;\n this.nextRow = 0;\n\n this.bytes = 4;\n this.data = new Uint8Array(this.width * this.height * this.bytes);\n\n this.positions = {};\n}\n\nLineAtlas.prototype.setSprite = function(sprite) {\n this.sprite = sprite;\n};\n\n/**\n * Get or create a dash line pattern.\n *\n * @param {Array} dasharray\n * @param {boolean} round whether to add circle caps in between dash segments\n * @returns {Object} position of dash texture in { y, height, width }\n * @private\n */\nLineAtlas.prototype.getDash = function(dasharray, round) {\n var key = dasharray.join(\",\") + round;\n\n if (!this.positions[key]) {\n this.positions[key] = this.addDash(dasharray, round);\n }\n return this.positions[key];\n};\n\nLineAtlas.prototype.addDash = function(dasharray, round) {\n\n var n = round ? 7 : 0;\n var height = 2 * n + 1;\n var offset = 128;\n\n if (this.nextRow + height > this.height) {\n console.warn('LineAtlas out of space');\n return null;\n }\n\n var length = 0;\n for (var i = 0; i < dasharray.length; i++) {\n length += dasharray[i];\n }\n\n var stretch = this.width / length;\n var halfWidth = stretch / 2;\n\n // If dasharray has an odd length, both the first and last parts\n // are dashes and should be joined seamlessly.\n var oddLength = dasharray.length % 2 === 1;\n\n for (var y = -n; y <= n; y++) {\n var row = this.nextRow + n + y;\n var index = this.width * row;\n\n var left = oddLength ? -dasharray[dasharray.length - 1] : 0;\n var right = dasharray[0];\n var partIndex = 1;\n\n for (var x = 0; x < this.width; x++) {\n\n while (right < x / stretch) {\n left = right;\n right = right + dasharray[partIndex];\n\n if (oddLength && partIndex === dasharray.length - 1) {\n right += dasharray[0];\n }\n\n partIndex++;\n }\n\n var distLeft = Math.abs(x - left * stretch);\n var distRight = Math.abs(x - right * stretch);\n var dist = Math.min(distLeft, distRight);\n var inside = (partIndex % 2) === 1;\n var signedDistance;\n\n if (round) {\n // Add circle caps\n var distMiddle = n ? y / n * (halfWidth + 1) : 0;\n if (inside) {\n var distEdge = halfWidth - Math.abs(distMiddle);\n signedDistance = Math.sqrt(dist * dist + distEdge * distEdge);\n } else {\n signedDistance = halfWidth - Math.sqrt(dist * dist + distMiddle * distMiddle);\n }\n } else {\n signedDistance = (inside ? 1 : -1) * dist;\n }\n\n this.data[3 + (index + x) * 4] = Math.max(0, Math.min(255, signedDistance + offset));\n }\n }\n\n var pos = {\n y: (this.nextRow + n + 0.5) / this.height,\n height: 2 * n / this.height,\n width: length\n };\n\n this.nextRow += height;\n this.dirty = true;\n\n return pos;\n};\n\nLineAtlas.prototype.bind = function(gl) {\n if (!this.texture) {\n this.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.data);\n\n } else {\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\n\n if (this.dirty) {\n this.dirty = false;\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.RGBA, gl.UNSIGNED_BYTE, this.data);\n }\n }\n};\n\nLineAtlas.prototype.debug = function() {\n\n var canvas = document.createElement('canvas');\n\n document.body.appendChild(canvas);\n canvas.style.position = 'absolute';\n canvas.style.top = 0;\n canvas.style.left = 0;\n canvas.style.background = '#ff0';\n\n canvas.width = this.width;\n canvas.height = this.height;\n\n var ctx = canvas.getContext('2d');\n var data = ctx.getImageData(0, 0, this.width, this.height);\n for (var i = 0; i < this.data.length; i++) {\n if (this.sdf) {\n var k = i * 4;\n data.data[k] = data.data[k + 1] = data.data[k + 2] = 0;\n data.data[k + 3] = this.data[i];\n } else {\n data.data[i] = this.data[i];\n }\n }\n ctx.putImageData(data, 0, 0);\n};\n","'use strict';\n\nvar config = require('./config');\nvar browser = require('./browser');\n\nfunction normalizeURL(url, pathPrefix, accessToken) {\n accessToken = accessToken || config.ACCESS_TOKEN;\n\n if (!accessToken && config.REQUIRE_ACCESS_TOKEN) {\n throw new Error('An API access token is required to use Mapbox GL. ' +\n 'See https://www.mapbox.com/developers/api/#access-tokens');\n }\n\n var https = config.FORCE_HTTPS ||\n (typeof document !== 'undefined' && document.location.protocol === 'https:');\n\n url = url.replace(/^mapbox:\\/\\//, (https ? config.HTTPS_URL : config.HTTP_URL) + pathPrefix);\n url += url.indexOf('?') !== -1 ? '&access_token=' : '?access_token=';\n\n if (config.REQUIRE_ACCESS_TOKEN) {\n if (accessToken[0] === 's') {\n throw new Error('Use a public access token (pk.*) with Mapbox GL JS, not a secret access token (sk.*). ' +\n 'See https://www.mapbox.com/developers/api/#access-tokens');\n }\n\n url += accessToken;\n }\n\n return url;\n}\n\nmodule.exports.normalizeStyleURL = function(url, accessToken) {\n var user = url.match(/^mapbox:\\/\\/([^.]+)/);\n if (!user)\n return url;\n\n return normalizeURL(url, '/styles/v1/' + user[1] + '/', accessToken);\n};\n\nmodule.exports.normalizeSourceURL = function(url, accessToken) {\n if (!url.match(/^mapbox:\\/\\//))\n return url;\n\n url = normalizeURL(url + '.json', '/v4/', accessToken);\n\n // TileJSON requests need a secure flag appended to their URLs so\n // that the server knows to send SSL-ified resource references.\n if (url.indexOf('https') === 0)\n url += '&secure';\n\n return url;\n};\n\nmodule.exports.normalizeGlyphsURL = function(url, accessToken) {\n if (!url.match(/^mapbox:\\/\\//))\n return url;\n\n if (url.match(/^mapbox:\\/\\/fontstack/))\n return normalizeURL(url, '/v4/', accessToken);\n\n return normalizeURL(url, '/', accessToken);\n};\n\nmodule.exports.normalizeTileURL = function(url, sourceUrl) {\n if (!sourceUrl || !sourceUrl.match(/^mapbox:\\/\\//))\n return url;\n return url.replace(/\\.((?:png|jpg)\\d*)(?=$|\\?)/, browser.devicePixelRatio >= 2 ? '@2x.$1' : '.$1');\n};\n","'use strict';\n\nvar util = require('../util');\n\nmodule.exports = Canvas;\n\nfunction Canvas(parent, container) {\n this.canvas = document.createElement('canvas');\n\n if (parent && container) {\n this.canvas.style.position = 'absolute';\n this.canvas.classList.add('mapboxgl-canvas');\n this.canvas.addEventListener('webglcontextlost', parent._contextLost.bind(parent), false);\n this.canvas.addEventListener('webglcontextrestored', parent._contextRestored.bind(parent), false);\n this.canvas.setAttribute('tabindex', 0);\n container.appendChild(this.canvas);\n }\n}\n\nCanvas.prototype.resize = function(width, height) {\n var pixelRatio = window.devicePixelRatio || 1;\n\n // Request the required canvas size taking the pixelratio into account.\n this.canvas.width = pixelRatio * width;\n this.canvas.height = pixelRatio * height;\n\n // Maintain the same canvas size, potentially downscaling it for HiDPI displays\n this.canvas.style.width = width + 'px';\n this.canvas.style.height = height + 'px';\n};\n\nvar requiredContextAttributes = {\n antialias: false,\n alpha: true,\n stencil: true,\n depth: false\n};\n\nCanvas.prototype.getWebGLContext = function(attributes) {\n attributes = util.extend({}, attributes, requiredContextAttributes);\n\n return this.canvas.getContext('webgl', attributes) ||\n this.canvas.getContext('experimental-webgl', attributes);\n};\n\nCanvas.prototype.supportsWebGLContext = function(failIfMajorPerformanceCaveat) {\n var attributes = util.extend({\n failIfMajorPerformanceCaveat: failIfMajorPerformanceCaveat\n }, requiredContextAttributes);\n\n if ('probablySupportsContext' in this.canvas) {\n return this.canvas.probablySupportsContext('webgl', attributes) ||\n this.canvas.probablySupportsContext('experimental-webgl', attributes);\n } else if ('supportsContext' in this.canvas) {\n return this.canvas.supportsContext('webgl', attributes) ||\n this.canvas.supportsContext('experimental-webgl', attributes);\n }\n\n return !!window.WebGLRenderingContext && !!this.getWebGLContext(failIfMajorPerformanceCaveat);\n};\n\nCanvas.prototype.getElement = function() {\n return this.canvas;\n};\n","'use strict';\n\nvar Point = require('point-geometry');\n\nexports.create = function (tagName, className, container) {\n var el = document.createElement(tagName);\n if (className) el.className = className;\n if (container) container.appendChild(el);\n return el;\n};\n\nvar docStyle = document.documentElement.style;\n\nfunction testProp(props) {\n for (var i = 0; i < props.length; i++) {\n if (props[i] in docStyle) {\n return props[i];\n }\n }\n}\n\nvar selectProp = testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']),\n userSelect;\nexports.disableDrag = function () {\n if (selectProp) {\n userSelect = docStyle[selectProp];\n docStyle[selectProp] = 'none';\n }\n};\nexports.enableDrag = function () {\n if (selectProp) {\n docStyle[selectProp] = userSelect;\n }\n};\n\nvar transformProp = testProp(['transform', 'WebkitTransform']);\nexports.setTransform = function(el, value) {\n el.style[transformProp] = value;\n};\n\n// Suppress the next click, but only if it's immediate.\nfunction suppressClick(e) {\n e.preventDefault();\n e.stopPropagation();\n window.removeEventListener('click', suppressClick, true);\n}\nexports.suppressClick = function() {\n window.addEventListener('click', suppressClick, true);\n window.setTimeout(function() {\n window.removeEventListener('click', suppressClick, true);\n }, 0);\n};\n\nexports.mousePos = function (el, e) {\n var rect = el.getBoundingClientRect();\n e = e.touches ? e.touches[0] : e;\n return new Point(\n e.clientX - rect.left - el.clientLeft,\n e.clientY - rect.top - el.clientTop);\n};\n","'use strict';\n\nvar Actor = require('../actor');\nvar WebWorkify = require('webworkify');\n\nmodule.exports = Dispatcher;\n\nfunction Dispatcher(length, parent) {\n this.actors = [];\n this.currentActor = 0;\n for (var i = 0; i < length; i++) {\n var worker = new WebWorkify(require('../../source/worker'));\n var actor = new Actor(worker, parent);\n actor.name = \"Worker \" + i;\n this.actors.push(actor);\n }\n}\n\nDispatcher.prototype = {\n broadcast: function(type, data) {\n for (var i = 0; i < this.actors.length; i++) {\n this.actors[i].send(type, data);\n }\n },\n\n send: function(type, data, callback, targetID, buffers) {\n if (typeof targetID !== 'number' || isNaN(targetID)) {\n // Use round robin to send requests to web workers.\n targetID = this.currentActor = (this.currentActor + 1) % this.actors.length;\n }\n\n this.actors[targetID].send(type, data, callback, buffers);\n return targetID;\n },\n\n remove: function() {\n for (var i = 0; i < this.actors.length; i++) {\n this.actors[i].target.terminate();\n }\n this.actors = [];\n }\n};\n","// Copyright 2014 Simon Lydell\r\n// X11 (“MIT”) Licensed. (See LICENSE.)\r\n\r\nvoid (function(root, factory) {\r\n if (typeof define === \"function\" && define.amd) {\r\n define(factory)\r\n } else if (typeof exports === \"object\") {\r\n module.exports = factory()\r\n } else {\r\n root.resolveUrl = factory()\r\n }\r\n}(this, function() {\r\n\r\n function resolveUrl(/* ...urls */) {\r\n var numUrls = arguments.length\r\n\r\n if (numUrls === 0) {\r\n throw new Error(\"resolveUrl requires at least one argument; got none.\")\r\n }\r\n\r\n var base = document.createElement(\"base\")\r\n base.href = arguments[0]\r\n\r\n if (numUrls === 1) {\r\n return base.href\r\n }\r\n\r\n var head = document.getElementsByTagName(\"head\")[0]\r\n head.insertBefore(base, head.firstChild)\r\n\r\n var a = document.createElement(\"a\")\r\n var resolved\r\n\r\n for (var index = 1; index < numUrls; index++) {\r\n a.href = arguments[index]\r\n resolved = a.href\r\n base.href = resolved\r\n }\r\n\r\n head.removeChild(base)\r\n\r\n return resolved\r\n }\r\n\r\n return resolveUrl\r\n\r\n}));\r\n","/*\n * Copyright (C) 2008 Apple Inc. All Rights Reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Ported from Webkit\n * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h\n */\n\nmodule.exports = UnitBezier;\n\nfunction UnitBezier(p1x, p1y, p2x, p2y) {\n // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).\n this.cx = 3.0 * p1x;\n this.bx = 3.0 * (p2x - p1x) - this.cx;\n this.ax = 1.0 - this.cx - this.bx;\n\n this.cy = 3.0 * p1y;\n this.by = 3.0 * (p2y - p1y) - this.cy;\n this.ay = 1.0 - this.cy - this.by;\n\n this.p1x = p1x;\n this.p1y = p2y;\n this.p2x = p2x;\n this.p2y = p2y;\n}\n\nUnitBezier.prototype.sampleCurveX = function(t) {\n // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.\n return ((this.ax * t + this.bx) * t + this.cx) * t;\n};\n\nUnitBezier.prototype.sampleCurveY = function(t) {\n return ((this.ay * t + this.by) * t + this.cy) * t;\n};\n\nUnitBezier.prototype.sampleCurveDerivativeX = function(t) {\n return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx;\n};\n\nUnitBezier.prototype.solveCurveX = function(x, epsilon) {\n if (typeof epsilon === 'undefined') epsilon = 1e-6;\n\n var t0, t1, t2, x2, i;\n\n // First try a few iterations of Newton's method -- normally very fast.\n for (t2 = x, i = 0; i < 8; i++) {\n\n x2 = this.sampleCurveX(t2) - x;\n if (Math.abs(x2) < epsilon) return t2;\n\n var d2 = this.sampleCurveDerivativeX(t2);\n if (Math.abs(d2) < 1e-6) break;\n\n t2 = t2 - x2 / d2;\n }\n\n // Fall back to the bisection method for reliability.\n t0 = 0.0;\n t1 = 1.0;\n t2 = x;\n\n if (t2 < t0) return t0;\n if (t2 > t1) return t1;\n\n while (t0 < t1) {\n\n x2 = this.sampleCurveX(t2);\n if (Math.abs(x2 - x) < epsilon) return t2;\n\n if (x > x2) {\n t0 = t2;\n } else {\n t1 = t2;\n }\n\n t2 = (t1 - t0) * 0.5 + t0;\n }\n\n // Failure.\n return t2;\n};\n\nUnitBezier.prototype.solve = function(x, epsilon) {\n return this.sampleCurveY(this.solveCurveX(x, epsilon));\n};\n","'use strict';\n\nvar shaders = require('./shaders');\nvar util = require('../util/util');\n\nexports.extend = function(context) {\n var origLineWidth = context.lineWidth,\n lineWidthRange = context.getParameter(context.ALIASED_LINE_WIDTH_RANGE);\n\n context.lineWidth = function(width) {\n origLineWidth.call(context, util.clamp(width, lineWidthRange[0], lineWidthRange[1]));\n };\n\n context.getShader = function(name, type) {\n var kind = type === this.FRAGMENT_SHADER ? 'fragment' : 'vertex';\n if (!shaders[name] || !shaders[name][kind]) {\n throw new Error(\"Could not find shader \" + name);\n }\n\n var shader = this.createShader(type);\n var shaderSource = shaders[name][kind];\n\n if (typeof orientation === 'undefined') {\n // only use highp precision on mobile browsers\n shaderSource = shaderSource.replace(/ highp /g, ' ');\n }\n\n this.shaderSource(shader, shaderSource);\n this.compileShader(shader);\n if (!this.getShaderParameter(shader, this.COMPILE_STATUS)) {\n throw new Error(this.getShaderInfoLog(shader));\n }\n return shader;\n };\n\n context.initializeShader = function(name, attributes, uniforms) {\n var shader = {\n program: this.createProgram(),\n fragment: this.getShader(name, this.FRAGMENT_SHADER),\n vertex: this.getShader(name, this.VERTEX_SHADER),\n attributes: []\n };\n this.attachShader(shader.program, shader.vertex);\n this.attachShader(shader.program, shader.fragment);\n\n // Disabling attrib location 0 causes weird behaviour. To avoid the problem, we assign\n // 'a_pos' to attrib location 0 making the assumptions that\n //\n // - `a_pos` is never disabled\n // - every shader has an `a_pos` attribute\n //\n // see: https://developer.mozilla.org/en-US/docs/Web/WebGL/WebGL_best_practices\n this.bindAttribLocation(shader.program, 0, 'a_pos');\n\n this.linkProgram(shader.program);\n\n if (!this.getProgramParameter(shader.program, this.LINK_STATUS)) {\n console.error(this.getProgramInfoLog(shader.program));\n } else {\n for (var i = 0; i < attributes.length; i++) {\n shader[attributes[i]] = this.getAttribLocation(shader.program, attributes[i]);\n shader.attributes.push(shader[attributes[i]]);\n }\n for (var k = 0; k < uniforms.length; k++) {\n shader[uniforms[k]] = this.getUniformLocation(shader.program, uniforms[k]);\n }\n }\n\n return shader;\n };\n\n // Switches to a different shader program.\n context.switchShader = function(shader, posMatrix, exMatrix) {\n if (!posMatrix) {\n console.trace('posMatrix does not have required argument');\n }\n\n if (this.currentShader !== shader) {\n this.useProgram(shader.program);\n\n // Disable all attribute arrays used by the previous shader and enable all the attribute\n // arrays used by the next shader. Ideally we would do a better job diffing these to\n // minimize operations (as we did in previously) but it is hard to keep track of state\n // in spaghetti shader boilerplate code and hard to debug when things go wrong.\n var previous = this.currentShader ? this.currentShader.attributes : [];\n for (var i = 0; i < previous.length; i++) {\n this.disableVertexAttribArray(previous[i]);\n }\n var next = shader.attributes;\n for (var j = 0; j < next.length; j++) {\n this.enableVertexAttribArray(next[j]);\n }\n\n this.currentShader = shader;\n }\n\n // Update the matrices if necessary. Note: This relies on object identity!\n // This means changing the matrix values without the actual matrix object\n // will FAIL to update the matrix properly.\n if (shader.posMatrix !== posMatrix) {\n this.uniformMatrix4fv(shader.u_matrix, false, posMatrix);\n shader.posMatrix = posMatrix;\n }\n if (exMatrix && shader.exMatrix !== exMatrix && shader.u_exmatrix) {\n this.uniformMatrix4fv(shader.u_exmatrix, false, exMatrix);\n shader.exMatrix = exMatrix;\n }\n };\n\n context.vertexAttrib2fv = function(attribute, values) {\n context.vertexAttrib2f(attribute, values[0], values[1]);\n };\n\n context.vertexAttrib3fv = function(attribute, values) {\n context.vertexAttrib3f(attribute, values[0], values[1], values[2]);\n };\n\n context.vertexAttrib4fv = function(attribute, values) {\n context.vertexAttrib4f(attribute, values[0], values[1], values[2], values[3]);\n };\n\n return context;\n};\n","'use strict';\n\nmodule.exports = FrameHistory;\n\nfunction FrameHistory() {\n this.frameHistory = [];\n}\n\nFrameHistory.prototype.getFadeProperties = function(duration) {\n if (duration === undefined) duration = 300;\n var currentTime = (new Date()).getTime();\n\n // Remove frames until only one is outside the duration, or until there are only three\n while (this.frameHistory.length > 3 && this.frameHistory[1].time + duration < currentTime) {\n this.frameHistory.shift();\n }\n\n if (this.frameHistory[1].time + duration < currentTime) {\n this.frameHistory[0].z = this.frameHistory[1].z;\n }\n\n var frameLen = this.frameHistory.length;\n if (frameLen < 3) console.warn('there should never be less than three frames in the history');\n\n // Find the range of zoom levels we want to fade between\n var startingZ = this.frameHistory[0].z,\n lastFrame = this.frameHistory[frameLen - 1],\n endingZ = lastFrame.z,\n lowZ = Math.min(startingZ, endingZ),\n highZ = Math.max(startingZ, endingZ);\n\n // Calculate the speed of zooming, and how far it would zoom in terms of zoom levels in one duration\n var zoomDiff = lastFrame.z - this.frameHistory[1].z,\n timeDiff = lastFrame.time - this.frameHistory[1].time;\n var fadedist = zoomDiff / (timeDiff / duration);\n\n if (isNaN(fadedist)) console.warn('fadedist should never be NaN');\n\n // At end of a zoom when the zoom stops changing continue pretending to zoom at that speed\n // bump is how much farther it would have been if it had continued zooming at the same rate\n var bump = (currentTime - lastFrame.time) / duration * fadedist;\n\n return {\n fadedist: fadedist,\n minfadezoom: lowZ,\n maxfadezoom: highZ,\n bump: bump\n };\n};\n\n// Record frame history that will be used to calculate fading params\nFrameHistory.prototype.record = function(zoom) {\n var currentTime = (new Date()).getTime();\n\n // first frame ever\n if (!this.frameHistory.length) {\n this.frameHistory.push({time: 0, z: zoom }, {time: 0, z: zoom });\n }\n\n if (this.frameHistory.length === 2 || this.frameHistory[this.frameHistory.length - 1].z !== zoom) {\n this.frameHistory.push({\n time: currentTime,\n z: zoom\n });\n }\n};\n","'use strict';\n\nvar browser = require('../util/browser');\nvar mat4 = require('gl-matrix').mat4;\n\nvar drawCollisionDebug = require('./draw_collision_debug');\n\nmodule.exports = drawSymbols;\n\nfunction drawSymbols(painter, layer, posMatrix, tile) {\n // No data\n if (!tile.buffers) return;\n var elementGroups = tile.elementGroups[layer.ref || layer.id];\n if (!elementGroups) return;\n\n var drawAcrossEdges = !(layer.layout['text-allow-overlap'] || layer.layout['icon-allow-overlap'] ||\n layer.layout['text-ignore-placement'] || layer.layout['icon-ignore-placement']);\n\n var gl = painter.gl;\n\n if (drawAcrossEdges) {\n // Disable the stencil test so that labels aren't clipped to tile boundaries.\n //\n // Layers with features that may be drawn overlapping aren't clipped. These\n // layers are sorted in the y direction, and to draw the correct ordering near\n // tile edges the icons are included in both tiles and clipped when drawing.\n gl.disable(gl.STENCIL_TEST);\n }\n\n if (elementGroups.text.groups.length) {\n drawSymbol(painter, layer, posMatrix, tile, elementGroups.text, 'text', true);\n }\n if (elementGroups.icon.groups.length) {\n drawSymbol(painter, layer, posMatrix, tile, elementGroups.icon, 'icon', elementGroups.sdfIcons);\n }\n\n drawCollisionDebug(painter, layer, posMatrix, tile);\n\n if (drawAcrossEdges) {\n gl.enable(gl.STENCIL_TEST);\n }\n}\n\nvar defaultSizes = {\n icon: 1,\n text: 24\n};\n\nfunction drawSymbol(painter, layer, posMatrix, tile, elementGroups, prefix, sdf) {\n var gl = painter.gl;\n\n posMatrix = painter.translateMatrix(posMatrix, tile, layer.paint[prefix + '-translate'], layer.paint[prefix + '-translate-anchor']);\n\n var tr = painter.transform;\n var alignedWithMap = layer.layout[prefix + '-rotation-alignment'] === 'map';\n var skewed = alignedWithMap;\n var exMatrix, s, gammaScale;\n\n if (skewed) {\n exMatrix = mat4.create();\n s = tile.tileExtent / tile.tileSize / Math.pow(2, painter.transform.zoom - tile.coord.z);\n gammaScale = 1 / Math.cos(tr._pitch);\n } else {\n exMatrix = mat4.clone(tile.exMatrix);\n s = painter.transform.altitude;\n gammaScale = 1;\n }\n mat4.scale(exMatrix, exMatrix, [s, s, 1]);\n\n // If layer.paint.size > layer.layout[prefix + '-max-size'] then labels may collide\n var fontSize = layer.paint[prefix + '-size'];\n var fontScale = fontSize / defaultSizes[prefix];\n mat4.scale(exMatrix, exMatrix, [ fontScale, fontScale, 1 ]);\n\n // calculate how much longer the real world distance is at the top of the screen\n // than at the middle of the screen.\n var topedgelength = Math.sqrt(tr.height * tr.height / 4 * (1 + tr.altitude * tr.altitude));\n var x = tr.height / 2 * Math.tan(tr._pitch);\n var extra = (topedgelength + x) / topedgelength - 1;\n\n var text = prefix === 'text';\n var shader, vertex, elements, texsize;\n\n if (!text && !painter.style.sprite.loaded())\n return;\n\n gl.activeTexture(gl.TEXTURE0);\n\n if (sdf) {\n shader = painter.sdfShader;\n } else {\n shader = painter.iconShader;\n }\n\n if (text) {\n painter.glyphAtlas.updateTexture(gl);\n vertex = tile.buffers.glyphVertex;\n elements = tile.buffers.glyphElement;\n texsize = [painter.glyphAtlas.width / 4, painter.glyphAtlas.height / 4];\n } else {\n painter.spriteAtlas.bind(gl, alignedWithMap || painter.options.rotating ||\n painter.options.zooming || fontScale !== 1 || sdf || painter.transform.pitch);\n vertex = tile.buffers.iconVertex;\n elements = tile.buffers.iconElement;\n texsize = [painter.spriteAtlas.width / 4, painter.spriteAtlas.height / 4];\n }\n\n gl.switchShader(shader, posMatrix, exMatrix);\n gl.uniform1i(shader.u_texture, 0);\n gl.uniform2fv(shader.u_texsize, texsize);\n gl.uniform1i(shader.u_skewed, skewed);\n gl.uniform1f(shader.u_extra, extra);\n\n // adjust min/max zooms for variable font sies\n var zoomAdjust = Math.log(fontSize / layer.layout[prefix + '-max-size']) / Math.LN2 || 0;\n\n gl.uniform1f(shader.u_zoom, (painter.transform.zoom - zoomAdjust) * 10); // current zoom level\n\n var f = painter.frameHistory.getFadeProperties(300);\n gl.uniform1f(shader.u_fadedist, f.fadedist * 10);\n gl.uniform1f(shader.u_minfadezoom, Math.floor(f.minfadezoom * 10));\n gl.uniform1f(shader.u_maxfadezoom, Math.floor(f.maxfadezoom * 10));\n gl.uniform1f(shader.u_fadezoom, (painter.transform.zoom + f.bump) * 10);\n\n var group, offset, count, elementOffset;\n\n elements.bind(gl);\n\n if (sdf) {\n var sdfPx = 8;\n var blurOffset = 1.19;\n var haloOffset = 6;\n var gamma = 0.105 * defaultSizes[prefix] / fontSize / browser.devicePixelRatio;\n\n gl.disableVertexAttribArray(shader.a_gamma);\n gl.vertexAttrib1f(shader.a_gamma, gamma * gammaScale);\n\n gl.disableVertexAttribArray(shader.a_color);\n gl.vertexAttrib4fv(shader.a_color, layer.paint[prefix + '-color']);\n\n gl.disableVertexAttribArray(shader.a_buffer);\n gl.vertexAttrib1f(shader.a_buffer, (256 - 64) / 256);\n\n for (var i = 0; i < elementGroups.groups.length; i++) {\n group = elementGroups.groups[i];\n offset = group.vertexStartIndex * vertex.itemSize;\n vertex.bind(gl, shader, offset);\n\n count = group.elementLength * 3;\n elementOffset = group.elementStartIndex * elements.itemSize;\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset);\n }\n\n if (layer.paint[prefix + '-halo-color']) {\n\n // vertex attrib arrays disabled above\n gl.vertexAttrib4fv(shader.a_color, layer.paint[prefix + '-halo-color']);\n gl.vertexAttrib1f(shader.a_buffer, (haloOffset - layer.paint[prefix + '-halo-width'] / fontScale) / sdfPx);\n gl.vertexAttrib1f(shader.a_gamma, (layer.paint[prefix + '-halo-blur'] * blurOffset / fontScale / sdfPx + gamma) * gammaScale);\n\n for (var j = 0; j < elementGroups.groups.length; j++) {\n group = elementGroups.groups[j];\n offset = group.vertexStartIndex * vertex.itemSize;\n vertex.bind(gl, shader, offset);\n\n count = group.elementLength * 3;\n elementOffset = group.elementStartIndex * elements.itemSize;\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset);\n }\n }\n } else {\n gl.disableVertexAttribArray(shader.a_opacity);\n gl.vertexAttrib1f(shader.a_opacity, layer.paint['icon-opacity']);\n\n for (var k = 0; k < elementGroups.groups.length; k++) {\n group = elementGroups.groups[k];\n offset = group.vertexStartIndex * vertex.itemSize;\n vertex.bind(gl, shader, offset);\n\n count = group.elementLength * 3;\n elementOffset = group.elementStartIndex * elements.itemSize;\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset);\n }\n }\n}\n","'use strict';\n\nvar browser = require('../util/browser');\nvar mat2 = require('gl-matrix').mat2;\n\n/**\n * Draw a line. Under the hood this will read elements from\n * a tile, dash textures from a lineAtlas, and style properties from a layer.\n * @param {Object} painter\n * @param {Object} layer\n * @param {Object} posMatrix\n * @param {Tile} tile\n * @returns {undefined} draws with the painter\n * @private\n */\nmodule.exports = function drawLine(painter, layer, posMatrix, tile) {\n // No data\n if (!tile.buffers) return;\n var elementGroups = tile.elementGroups[layer.ref || layer.id];\n if (!elementGroups) return;\n\n var gl = painter.gl;\n\n // don't draw zero-width lines\n if (layer.paint['line-width'] <= 0) return;\n\n // the distance over which the line edge fades out.\n // Retina devices need a smaller distance to avoid aliasing.\n var antialiasing = 1 / browser.devicePixelRatio;\n\n var blur = layer.paint['line-blur'] + antialiasing;\n var edgeWidth = layer.paint['line-width'] / 2;\n var inset = -1;\n var offset = 0;\n var shift = 0;\n\n if (layer.paint['line-gap-width'] > 0) {\n inset = layer.paint['line-gap-width'] / 2 + antialiasing * 0.5;\n edgeWidth = layer.paint['line-width'];\n\n // shift outer lines half a pixel towards the middle to eliminate the crack\n offset = inset - antialiasing / 2;\n }\n\n var outset = offset + edgeWidth + antialiasing / 2 + shift;\n\n var color = layer.paint['line-color'];\n var ratio = painter.transform.scale / (1 << tile.coord.z) / (tile.tileExtent / tile.tileSize);\n var vtxMatrix = painter.translateMatrix(posMatrix, tile, layer.paint['line-translate'], layer.paint['line-translate-anchor']);\n\n var tr = painter.transform;\n\n\n var antialiasingMatrix = mat2.create();\n mat2.scale(antialiasingMatrix, antialiasingMatrix, [1, Math.cos(tr._pitch)]);\n mat2.rotate(antialiasingMatrix, antialiasingMatrix, painter.transform.angle);\n\n // calculate how much longer the real world distance is at the top of the screen\n // than at the middle of the screen.\n var topedgelength = Math.sqrt(tr.height * tr.height / 4 * (1 + tr.altitude * tr.altitude));\n var x = tr.height / 2 * Math.tan(tr._pitch);\n var extra = (topedgelength + x) / topedgelength - 1;\n\n // how much the tile is overscaled by\n var overscaling = tile.tileSize / painter.transform.tileSize;\n\n var shader;\n\n\n var dasharray = layer.paint['line-dasharray'];\n var image = layer.paint['line-image'];\n\n if (dasharray) {\n\n shader = painter.linesdfpatternShader;\n gl.switchShader(shader, vtxMatrix, tile.exMatrix);\n\n gl.uniform1f(shader.u_ratio, ratio);\n\n var posA = painter.lineAtlas.getDash(dasharray.from, layer.layout['line-cap'] === 'round');\n var posB = painter.lineAtlas.getDash(dasharray.to, layer.layout['line-cap'] === 'round');\n painter.lineAtlas.bind(gl);\n\n var patternratio = Math.pow(2, Math.floor(Math.log(painter.transform.scale) / Math.LN2) - tile.coord.z) / 8 * overscaling;\n var scaleA = [patternratio / posA.width / dasharray.fromScale, -posA.height / 2];\n var gammaA = painter.lineAtlas.width / (dasharray.fromScale * posA.width * 256 * browser.devicePixelRatio) / 2;\n var scaleB = [patternratio / posB.width / dasharray.toScale, -posB.height / 2];\n var gammaB = painter.lineAtlas.width / (dasharray.toScale * posB.width * 256 * browser.devicePixelRatio) / 2;\n\n gl.uniform2fv(shader.u_patternscale_a, scaleA);\n gl.uniform1f(shader.u_tex_y_a, posA.y);\n gl.uniform2fv(shader.u_patternscale_b, scaleB);\n gl.uniform1f(shader.u_tex_y_b, posB.y);\n\n gl.uniform1i(shader.u_image, 0);\n gl.uniform1f(shader.u_sdfgamma, Math.max(gammaA, gammaB));\n gl.uniform1f(shader.u_mix, dasharray.t);\n\n } else if (image) {\n var imagePosA = painter.spriteAtlas.getPosition(image.from, true);\n var imagePosB = painter.spriteAtlas.getPosition(image.to, true);\n if (!imagePosA || !imagePosB) return;\n var factor = tile.tileExtent / tile.tileSize / Math.pow(2, painter.transform.tileZoom - tile.coord.z) * overscaling;\n\n painter.spriteAtlas.bind(gl, true);\n\n shader = painter.linepatternShader;\n gl.switchShader(shader, vtxMatrix, tile.exMatrix);\n\n gl.uniform1f(shader.u_ratio, ratio);\n\n gl.uniform2fv(shader.u_pattern_size_a, [imagePosA.size[0] * factor * image.fromScale, imagePosB.size[1] ]);\n gl.uniform2fv(shader.u_pattern_size_b, [imagePosB.size[0] * factor * image.toScale, imagePosB.size[1] ]);\n gl.uniform2fv(shader.u_pattern_tl_a, imagePosA.tl);\n gl.uniform2fv(shader.u_pattern_br_a, imagePosA.br);\n gl.uniform2fv(shader.u_pattern_tl_b, imagePosB.tl);\n gl.uniform2fv(shader.u_pattern_br_b, imagePosB.br);\n gl.uniform1f(shader.u_fade, image.t);\n\n gl.disableVertexAttribArray(shader.a_opacity);\n gl.vertexAttrib1f(shader.a_opacity, layer.paint['line-opacity']);\n\n } else {\n shader = painter.lineShader;\n gl.switchShader(shader, vtxMatrix, tile.exMatrix);\n\n gl.uniform1f(shader.u_ratio, ratio);\n gl.uniform1f(shader.u_extra, extra);\n gl.uniformMatrix2fv(shader.u_antialiasingmatrix, false, antialiasingMatrix);\n }\n\n // linepattern does not have a color attribute\n if (shader.a_color !== undefined) {\n gl.disableVertexAttribArray(shader.a_color);\n gl.vertexAttrib4fv(shader.a_color, color);\n }\n\n gl.disableVertexAttribArray(shader.a_linewidth);\n gl.vertexAttrib2f(shader.a_linewidth, outset, inset);\n\n gl.disableVertexAttribArray(shader.a_blur);\n gl.vertexAttrib1f(shader.a_blur, blur);\n\n var vertex = tile.buffers.lineVertex;\n vertex.bind(gl);\n var element = tile.buffers.lineElement;\n element.bind(gl);\n\n for (var i = 0; i < elementGroups.groups.length; i++) {\n var group = elementGroups.groups[i];\n var vtxOffset = group.vertexStartIndex * vertex.itemSize;\n gl.vertexAttribPointer(shader.a_pos, 2, gl.SHORT, false, 8, vtxOffset + 0);\n gl.vertexAttribPointer(shader.a_data, 4, gl.BYTE, false, 8, vtxOffset + 4);\n\n var count = group.elementLength * 3;\n var elementOffset = group.elementStartIndex * element.itemSize;\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset);\n }\n};\n","'use strict';\n\nvar browser = require('../util/browser');\nvar mat3 = require('gl-matrix').mat3;\n\nmodule.exports = drawFill;\n\nfunction drawFill(painter, layer, posMatrix, tile) {\n // No data\n if (!tile.buffers) return;\n var elementGroups = tile.elementGroups[layer.ref || layer.id];\n if (!elementGroups) return;\n\n var gl = painter.gl;\n var translatedPosMatrix = painter.translateMatrix(posMatrix, tile, layer.paint['fill-translate'], layer.paint['fill-translate-anchor']);\n\n var color = layer.paint['fill-color'];\n\n var vertex, elements, group, count;\n\n // Draw the stencil mask.\n\n // We're only drawing to the first seven bits (== support a maximum of\n // 127 overlapping polygons in one place before we get rendering errors).\n gl.stencilMask(0x3F);\n gl.clear(gl.STENCIL_BUFFER_BIT);\n\n // Draw front facing triangles. Wherever the 0x80 bit is 1, we are\n // increasing the lower 7 bits by one if the triangle is a front-facing\n // triangle. This means that all visible polygons should be in CCW\n // orientation, while all holes (see below) are in CW orientation.\n gl.stencilFunc(gl.NOTEQUAL, 0x80, 0x80);\n\n // When we do a nonzero fill, we count the number of times a pixel is\n // covered by a counterclockwise polygon, and subtract the number of\n // times it is \"uncovered\" by a clockwise polygon.\n gl.stencilOpSeparate(gl.FRONT, gl.INCR_WRAP, gl.KEEP, gl.KEEP);\n gl.stencilOpSeparate(gl.BACK, gl.DECR_WRAP, gl.KEEP, gl.KEEP);\n\n // When drawing a shape, we first draw all shapes to the stencil buffer\n // and incrementing all areas where polygons are\n gl.colorMask(false, false, false, false);\n\n // Draw the actual triangle fan into the stencil buffer.\n gl.switchShader(painter.fillShader, translatedPosMatrix);\n\n // Draw all buffers\n vertex = tile.buffers.fillVertex;\n vertex.bind(gl);\n elements = tile.buffers.fillElement;\n elements.bind(gl);\n\n var offset, elementOffset;\n\n gl.disableVertexAttribArray(painter.fillShader.a_color);\n\n for (var i = 0; i < elementGroups.groups.length; i++) {\n group = elementGroups.groups[i];\n offset = group.vertexStartIndex * vertex.itemSize;\n gl.vertexAttribPointer(painter.fillShader.a_pos, 2, gl.SHORT, false, 4, offset + 0);\n\n count = group.elementLength * 3;\n elementOffset = group.elementStartIndex * elements.itemSize;\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_SHORT, elementOffset);\n }\n\n // Now that we have the stencil mask in the stencil buffer, we can start\n // writing to the color buffer.\n gl.colorMask(true, true, true, true);\n\n // From now on, we don't want to update the stencil buffer anymore.\n gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);\n gl.stencilMask(0x0);\n\n var strokeColor = layer.paint['fill-outline-color'];\n\n // Because we're drawing top-to-bottom, and we update the stencil mask\n // below, we have to draw the outline first (!)\n if (layer.paint['fill-antialias'] === true && !(layer.paint['fill-image'] && !strokeColor)) {\n gl.switchShader(painter.outlineShader, translatedPosMatrix);\n gl.lineWidth(2 * browser.devicePixelRatio);\n\n if (strokeColor) {\n // If we defined a different color for the fill outline, we are\n // going to ignore the bits in 0x3F and just care about the global\n // clipping mask.\n gl.stencilFunc(gl.EQUAL, 0x80, 0x80);\n } else {\n // Otherwise, we only want to draw the antialiased parts that are\n // *outside* the current shape. This is important in case the fill\n // or stroke color is translucent. If we wouldn't clip to outside\n // the current shape, some pixels from the outline stroke overlapped\n // the (non-antialiased) fill.\n gl.stencilFunc(gl.EQUAL, 0x80, 0xBF);\n }\n\n gl.uniform2f(painter.outlineShader.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n // Draw all buffers\n vertex = tile.buffers.fillVertex;\n elements = tile.buffers.outlineElement;\n elements.bind(gl);\n\n gl.disableVertexAttribArray(painter.outlineShader.a_color);\n gl.vertexAttrib4fv(painter.outlineShader.a_color, strokeColor ? strokeColor : color);\n\n for (var k = 0; k < elementGroups.groups.length; k++) {\n group = elementGroups.groups[k];\n offset = group.vertexStartIndex * vertex.itemSize;\n gl.vertexAttribPointer(painter.outlineShader.a_pos, 2, gl.SHORT, false, 4, offset + 0);\n\n count = group.secondElementLength * 2;\n elementOffset = group.secondElementStartIndex * elements.itemSize;\n gl.drawElements(gl.LINES, count, gl.UNSIGNED_SHORT, elementOffset);\n }\n }\n\n var image = layer.paint['fill-image'];\n var opacity = layer.paint['fill-opacity'] || 1;\n var shader;\n\n if (image) {\n // Draw texture fill\n var imagePosA = painter.spriteAtlas.getPosition(image.from, true);\n var imagePosB = painter.spriteAtlas.getPosition(image.to, true);\n if (!imagePosA || !imagePosB) return;\n\n shader = painter.patternShader;\n gl.switchShader(shader, posMatrix);\n gl.uniform1i(shader.u_image, 0);\n gl.uniform2fv(shader.u_pattern_tl_a, imagePosA.tl);\n gl.uniform2fv(shader.u_pattern_br_a, imagePosA.br);\n gl.uniform2fv(shader.u_pattern_tl_b, imagePosB.tl);\n gl.uniform2fv(shader.u_pattern_br_b, imagePosB.br);\n gl.uniform1f(shader.u_opacity, opacity);\n gl.uniform1f(shader.u_mix, image.t);\n\n var factor = (tile.tileExtent / tile.tileSize) / Math.pow(2, painter.transform.tileZoom - tile.coord.z);\n\n var matrixA = mat3.create();\n mat3.scale(matrixA, matrixA, [\n 1 / (imagePosA.size[0] * factor * image.fromScale),\n 1 / (imagePosA.size[1] * factor * image.fromScale)\n ]);\n\n var matrixB = mat3.create();\n mat3.scale(matrixB, matrixB, [\n 1 / (imagePosB.size[0] * factor * image.toScale),\n 1 / (imagePosB.size[1] * factor * image.toScale)\n ]);\n\n gl.uniformMatrix3fv(shader.u_patternmatrix_a, false, matrixA);\n gl.uniformMatrix3fv(shader.u_patternmatrix_b, false, matrixB);\n\n painter.spriteAtlas.bind(gl, true);\n\n } else {\n // Draw filling rectangle.\n shader = painter.fillShader;\n gl.switchShader(shader, posMatrix);\n gl.disableVertexAttribArray(shader.a_color);\n gl.vertexAttrib4fv(shader.a_color, color);\n }\n\n // Only draw regions that we marked\n gl.stencilFunc(gl.NOTEQUAL, 0x0, 0x3F);\n gl.bindBuffer(gl.ARRAY_BUFFER, painter.tileExtentBuffer);\n gl.vertexAttribPointer(shader.a_pos, painter.tileExtentBuffer.itemSize, gl.SHORT, false, 0, 0);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, painter.tileExtentBuffer.itemCount);\n\n gl.stencilMask(0x00);\n gl.stencilFunc(gl.EQUAL, 0x80, 0x80);\n}\n","'use strict';\n\nvar mat3 = require('gl-matrix').mat3;\n\nmodule.exports = drawBackground;\n\nfunction drawBackground(painter, layer, posMatrix) {\n var gl = painter.gl;\n var color = layer.paint['background-color'];\n var image = layer.paint['background-image'];\n var opacity = layer.paint['background-opacity'];\n var shader;\n\n var imagePosA = image ? painter.spriteAtlas.getPosition(image.from, true) : null;\n var imagePosB = image ? painter.spriteAtlas.getPosition(image.to, true) : null;\n\n if (imagePosA && imagePosB) {\n // Draw texture fill\n shader = painter.patternShader;\n gl.switchShader(shader, posMatrix);\n gl.uniform1i(shader.u_image, 0);\n gl.uniform2fv(shader.u_pattern_tl_a, imagePosA.tl);\n gl.uniform2fv(shader.u_pattern_br_a, imagePosA.br);\n gl.uniform2fv(shader.u_pattern_tl_b, imagePosB.tl);\n gl.uniform2fv(shader.u_pattern_br_b, imagePosB.br);\n gl.uniform1f(shader.u_opacity, opacity);\n\n var transform = painter.transform;\n var sizeA = imagePosA.size;\n var sizeB = imagePosB.size;\n var center = transform.locationCoordinate(transform.center);\n var scale = 1 / Math.pow(2, transform.zoomFraction);\n\n gl.uniform1f(shader.u_mix, image.t);\n\n var matrixA = mat3.create();\n mat3.scale(matrixA, matrixA, [\n 1 / (sizeA[0] * image.fromScale),\n 1 / (sizeA[1] * image.fromScale)\n ]);\n mat3.translate(matrixA, matrixA, [\n (center.column * transform.tileSize) % (sizeA[0] * image.fromScale),\n (center.row * transform.tileSize) % (sizeA[1] * image.fromScale)\n ]);\n mat3.rotate(matrixA, matrixA, -transform.angle);\n mat3.scale(matrixA, matrixA, [\n scale * transform.width / 2,\n -scale * transform.height / 2\n ]);\n\n var matrixB = mat3.create();\n mat3.scale(matrixB, matrixB, [\n 1 / (sizeB[0] * image.toScale),\n 1 / (sizeB[1] * image.toScale)\n ]);\n mat3.translate(matrixB, matrixB, [\n (center.column * transform.tileSize) % (sizeB[0] * image.toScale),\n (center.row * transform.tileSize) % (sizeB[1] * image.toScale)\n ]);\n mat3.rotate(matrixB, matrixB, -transform.angle);\n mat3.scale(matrixB, matrixB, [\n scale * transform.width / 2,\n -scale * transform.height / 2\n ]);\n\n gl.uniformMatrix3fv(shader.u_patternmatrix_a, false, matrixA);\n gl.uniformMatrix3fv(shader.u_patternmatrix_b, false, matrixB);\n\n painter.spriteAtlas.bind(gl, true);\n\n } else {\n // Draw filling rectangle.\n shader = painter.fillShader;\n gl.switchShader(shader, posMatrix);\n gl.disableVertexAttribArray(shader.a_color);\n gl.vertexAttrib4fv(shader.a_color, color);\n }\n\n gl.disable(gl.STENCIL_TEST);\n gl.bindBuffer(gl.ARRAY_BUFFER, painter.backgroundBuffer);\n gl.vertexAttribPointer(shader.a_pos, painter.backgroundBuffer.itemSize, gl.SHORT, false, 0, 0);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, painter.backgroundBuffer.itemCount);\n gl.enable(gl.STENCIL_TEST);\n\n gl.stencilMask(0x00);\n gl.stencilFunc(gl.EQUAL, 0x80, 0x80);\n}\n","'use strict';\n\nvar util = require('../util/util');\n\nmodule.exports = drawRaster;\n\nfunction drawRaster(painter, layer, posMatrix, tile) {\n var gl = painter.gl;\n\n gl.disable(gl.STENCIL_TEST);\n\n var shader = painter.rasterShader;\n gl.switchShader(shader, posMatrix);\n\n // color parameters\n gl.uniform1f(shader.u_brightness_low, layer.paint['raster-brightness-min']);\n gl.uniform1f(shader.u_brightness_high, layer.paint['raster-brightness-max']);\n gl.uniform1f(shader.u_saturation_factor, saturationFactor(layer.paint['raster-saturation']));\n gl.uniform1f(shader.u_contrast_factor, contrastFactor(layer.paint['raster-contrast']));\n gl.uniform3fv(shader.u_spin_weights, spinWeights(layer.paint['raster-hue-rotate']));\n\n var parentTile = tile.source && tile.source._pyramid.findLoadedParent(tile.coord, 0, {}),\n opacities = getOpacities(tile, parentTile, layer, painter.transform);\n\n var parentScaleBy, parentTL;\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n\n if (parentTile) {\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, parentTile.texture);\n\n parentScaleBy = Math.pow(2, parentTile.coord.z - tile.coord.z);\n parentTL = [tile.coord.x * parentScaleBy % 1, tile.coord.y * parentScaleBy % 1];\n } else {\n opacities[1] = 0;\n }\n\n // cross-fade parameters\n gl.uniform2fv(shader.u_tl_parent, parentTL || [0, 0]);\n gl.uniform1f(shader.u_scale_parent, parentScaleBy || 1);\n gl.uniform1f(shader.u_buffer_scale, 1);\n gl.uniform1f(shader.u_opacity0, opacities[0]);\n gl.uniform1f(shader.u_opacity1, opacities[1]);\n gl.uniform1i(shader.u_image0, 0);\n gl.uniform1i(shader.u_image1, 1);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, tile.boundsBuffer || painter.tileExtentBuffer);\n\n gl.vertexAttribPointer(shader.a_pos, 2, gl.SHORT, false, 8, 0);\n gl.vertexAttribPointer(shader.a_texture_pos, 2, gl.SHORT, false, 8, 4);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\n gl.enable(gl.STENCIL_TEST);\n}\n\nfunction spinWeights(angle) {\n angle *= Math.PI / 180;\n var s = Math.sin(angle);\n var c = Math.cos(angle);\n return [\n (2 * c + 1) / 3,\n (-Math.sqrt(3) * s - c + 1) / 3,\n (Math.sqrt(3) * s - c + 1) / 3\n ];\n}\n\nfunction contrastFactor(contrast) {\n return contrast > 0 ?\n 1 / (1 - contrast) :\n 1 + contrast;\n}\n\nfunction saturationFactor(saturation) {\n return saturation > 0 ?\n 1 - 1 / (1.001 - saturation) :\n -saturation;\n}\n\nfunction getOpacities(tile, parentTile, layer, transform) {\n if (!tile.source) return [1, 0];\n\n var now = new Date().getTime();\n\n var fadeDuration = layer.paint['raster-fade-duration'];\n var sinceTile = (now - tile.timeAdded) / fadeDuration;\n var sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1;\n\n var idealZ = tile.source._pyramid.coveringZoomLevel(transform);\n var parentFurther = parentTile ? Math.abs(parentTile.coord.z - idealZ) > Math.abs(tile.coord.z - idealZ) : false;\n\n var opacity = [];\n if (!parentTile || parentFurther) {\n // if no parent or parent is older\n opacity[0] = util.clamp(sinceTile, 0, 1);\n opacity[1] = 1 - opacity[0];\n } else {\n // parent is younger, zooming out\n opacity[0] = util.clamp(1 - sinceParent, 0, 1);\n opacity[1] = 1 - opacity[0];\n }\n\n var op = layer.paint['raster-opacity'];\n opacity[0] *= op;\n opacity[1] *= op;\n\n return opacity;\n}\n","'use strict';\n\nvar textVertices = require('../lib/debugtext');\nvar browser = require('../util/browser');\n\nmodule.exports = drawDebug;\n\nfunction drawDebug(painter, tile) {\n var gl = painter.gl;\n\n // Blend to the front, not the back.\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\n gl.switchShader(painter.debugShader, tile.posMatrix);\n\n // draw bounding rectangle\n gl.bindBuffer(gl.ARRAY_BUFFER, painter.debugBuffer);\n gl.vertexAttribPointer(painter.debugShader.a_pos, painter.debugBuffer.itemSize, gl.SHORT, false, 0, 0);\n gl.uniform4f(painter.debugShader.u_color, 1, 0, 0, 1);\n gl.lineWidth(4);\n gl.drawArrays(gl.LINE_STRIP, 0, painter.debugBuffer.itemCount);\n\n var vertices = textVertices(tile.coord.toString(), 50, 200, 5);\n\n gl.bindBuffer(gl.ARRAY_BUFFER, painter.debugTextBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Int16Array(vertices), gl.STREAM_DRAW);\n gl.vertexAttribPointer(painter.debugShader.a_pos, painter.debugTextBuffer.itemSize, gl.SHORT, false, 0, 0);\n gl.lineWidth(8 * browser.devicePixelRatio);\n gl.uniform4f(painter.debugShader.u_color, 1, 1, 1, 1);\n gl.drawArrays(gl.LINES, 0, vertices.length / painter.debugTextBuffer.itemSize);\n gl.lineWidth(2 * browser.devicePixelRatio);\n gl.uniform4f(painter.debugShader.u_color, 0, 0, 0, 1);\n gl.drawArrays(gl.LINES, 0, vertices.length / painter.debugTextBuffer.itemSize);\n\n // Revert blending mode to blend to the back.\n gl.blendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ONE);\n}\n","'use strict';\n\nvar browser = require('../util/browser');\nvar mat4 = require('gl-matrix').mat4;\n\nmodule.exports = drawVertices;\n\nfunction drawVertices(painter, layer, posMatrix, tile) {\n var gl = painter.gl;\n\n if (!tile || !tile.buffers) return;\n var elementGroups = tile.elementGroups[layer.ref || layer.id];\n if (!elementGroups) return;\n\n // Blend to the front, not the back.\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n\n // Draw all buffers\n if (layer.type === 'fill') {\n drawPoints(tile.buffers.fillVertex, elementGroups.groups, posMatrix, 4);\n } else if (layer.type === 'symbol') {\n drawPoints(tile.buffers.iconVertex, elementGroups.icon.groups, posMatrix, 16);\n drawPoints(tile.buffers.glyphVertex, elementGroups.text.groups, posMatrix, 16);\n } else if (layer.type === 'line') {\n var newPosMatrix = mat4.clone(posMatrix);\n mat4.scale(newPosMatrix, newPosMatrix, [0.5, 0.5, 1]);\n drawPoints(tile.buffers.lineVertex, elementGroups.groups, newPosMatrix, 8);\n }\n\n function drawPoints(vertex, groups, matrix, stride) {\n gl.switchShader(painter.dotShader, matrix);\n\n gl.uniform1f(painter.dotShader.u_size, 4 * browser.devicePixelRatio);\n gl.uniform1f(painter.dotShader.u_blur, 0.25);\n gl.uniform4fv(painter.dotShader.u_color, [0.1, 0, 0, 0.1]);\n\n vertex.bind(gl, painter.dotShader, 0);\n for (var i = 0; i < groups.length; i++) {\n var group = groups[i];\n var begin = group.vertexStartIndex;\n var count = group.vertexLength;\n gl.vertexAttribPointer(painter.dotShader.a_pos, 2, gl.SHORT, false, stride, 0);\n gl.drawArrays(gl.POINTS, begin, count);\n }\n }\n\n // Revert blending mode to blend to the back.\n gl.blendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ONE);\n}\n","'use strict';\n\nmodule.exports = interpolate;\n\nfunction interpolate(a, b, t) {\n return (a * (1 - t)) + (b * t);\n}\n\ninterpolate.number = interpolate;\n\ninterpolate.vec2 = function(from, to, t) {\n return [\n interpolate(from[0], to[0], t),\n interpolate(from[1], to[1], t)\n ];\n};\n\n/*\n * Interpolate between two colors given as 4-element arrays.\n *\n * @param {Color} from\n * @param {Color} to\n * @param {number} t interpolation factor between 0 and 1\n * @returns {Color} interpolated color\n */\ninterpolate.color = function(from, to, t) {\n return [\n interpolate(from[0], to[0], t),\n interpolate(from[1], to[1], t),\n interpolate(from[2], to[2], t),\n interpolate(from[3], to[3], t)\n ];\n};\n\ninterpolate.array = function(from, to, t) {\n return from.map(function(d, i) {\n return interpolate(d, to[i], t);\n });\n};\n","'use strict';\n\nmodule.exports = TileCoord;\n\nfunction TileCoord(z, x, y, w) {\n if (w === undefined) w = 0;\n this.z = z;\n this.x = x;\n this.y = y;\n this.w = w;\n\n // calculate id\n w *= 2;\n if (w < 0) w = w * -1 - 1;\n var dim = 1 << this.z;\n this.id = ((dim * dim * w + dim * this.y + this.x) * 32) + this.z;\n}\n\nTileCoord.prototype.toString = function() {\n return this.z + \"/\" + this.x + \"/\" + this.y;\n};\n\n// Parse a packed integer id into a TileCoord object\nTileCoord.fromID = function(id) {\n var z = id % 32, dim = 1 << z;\n var xy = ((id - z) / 32);\n var x = xy % dim, y = ((xy - x) / dim) % dim;\n var w = Math.floor(xy / (dim * dim));\n if (w % 2 !== 0) w = w * -1 - 1;\n w /= 2;\n return new TileCoord(z, x, y, w);\n};\n\n// given a list of urls, choose a url template and return a tile URL\nTileCoord.prototype.url = function(urls, sourceMaxZoom) {\n return urls[(this.x + this.y) % urls.length]\n .replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16))\n .replace('{z}', Math.min(this.z, sourceMaxZoom || this.z))\n .replace('{x}', this.x)\n .replace('{y}', this.y);\n};\n\n// Return the coordinate of the parent tile\nTileCoord.prototype.parent = function(sourceMaxZoom) {\n if (this.z === 0) return null;\n\n // the id represents an overscaled tile, return the same coordinates with a lower z\n if (this.z > sourceMaxZoom) {\n return new TileCoord(this.z - 1, this.x, this.y, this.w);\n }\n\n return new TileCoord(this.z - 1, Math.floor(this.x / 2), Math.floor(this.y / 2), this.w);\n};\n\nTileCoord.prototype.wrapped = function() {\n return new TileCoord(this.z, this.x, this.y, 0);\n};\n\n// Return the coordinates of the tile's children\nTileCoord.prototype.children = function(sourceMaxZoom) {\n\n if (this.z >= sourceMaxZoom) {\n // return a single tile coord representing a an overscaled tile\n return [new TileCoord(this.z + 1, this.x, this.y, this.w)];\n }\n\n var z = this.z + 1;\n var x = this.x * 2;\n var y = this.y * 2;\n return [\n new TileCoord(z, x, y, this.w),\n new TileCoord(z, x + 1, y, this.w),\n new TileCoord(z, x, y + 1, this.w),\n new TileCoord(z, x + 1, y + 1, this.w)\n ];\n};\n\n// Taken from polymaps src/Layer.js\n// https://github.com/simplegeo/polymaps/blob/master/src/Layer.js#L333-L383\n\nfunction edge(a, b) {\n if (a.row > b.row) { var t = a; a = b; b = t; }\n return {\n x0: a.column,\n y0: a.row,\n x1: b.column,\n y1: b.row,\n dx: b.column - a.column,\n dy: b.row - a.row\n };\n}\n\nfunction scanSpans(e0, e1, ymin, ymax, scanLine) {\n var y0 = Math.max(ymin, Math.floor(e1.y0));\n var y1 = Math.min(ymax, Math.ceil(e1.y1));\n\n // sort edges by x-coordinate\n if ((e0.x0 === e1.x0 && e0.y0 === e1.y0) ?\n (e0.x0 + e1.dy / e0.dy * e0.dx < e1.x1) :\n (e0.x1 - e1.dy / e0.dy * e0.dx < e1.x0)) {\n var t = e0; e0 = e1; e1 = t;\n }\n\n // scan lines!\n var m0 = e0.dx / e0.dy;\n var m1 = e1.dx / e1.dy;\n var d0 = e0.dx > 0; // use y + 1 to compute x0\n var d1 = e1.dx < 0; // use y + 1 to compute x1\n for (var y = y0; y < y1; y++) {\n var x0 = m0 * Math.max(0, Math.min(e0.dy, y + d0 - e0.y0)) + e0.x0;\n var x1 = m1 * Math.max(0, Math.min(e1.dy, y + d1 - e1.y0)) + e1.x0;\n scanLine(Math.floor(x1), Math.ceil(x0), y);\n }\n}\n\nfunction scanTriangle(a, b, c, ymin, ymax, scanLine) {\n var ab = edge(a, b),\n bc = edge(b, c),\n ca = edge(c, a);\n\n var t;\n\n // sort edges by y-length\n if (ab.dy > bc.dy) { t = ab; ab = bc; bc = t; }\n if (ab.dy > ca.dy) { t = ab; ab = ca; ca = t; }\n if (bc.dy > ca.dy) { t = bc; bc = ca; ca = t; }\n\n // scan span! scan span!\n if (ab.dy) scanSpans(ca, ab, ymin, ymax, scanLine);\n if (bc.dy) scanSpans(ca, bc, ymin, ymax, scanLine);\n}\n\nTileCoord.cover = function(z, bounds, actualZ) {\n var tiles = 1 << z;\n var t = {};\n\n function scanLine(x0, x1, y) {\n var x, wx;\n if (y >= 0 && y <= tiles) {\n for (x = x0; x < x1; x++) {\n wx = (x + tiles) % tiles;\n var coord = new TileCoord(actualZ, wx, y, Math.floor(x / tiles));\n t[coord.id] = coord;\n }\n }\n }\n\n // Divide the screen up in two triangles and scan each of them:\n // +---/\n // | / |\n // /---+\n scanTriangle(bounds[0], bounds[1], bounds[2], 0, tiles, scanLine);\n scanTriangle(bounds[2], bounds[3], bounds[0], 0, tiles, scanLine);\n\n return Object.keys(t).map(function(id) {\n return t[id];\n });\n};\n","'use strict';\n\n/**\n * A [most-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms)\n * with hash lookup made possible by keeping a list of keys in parallel to\n * an array of dictionary of values\n *\n * @param {number} max number of permitted values\n * @param {Function} onRemove callback called with items when they expire\n * @private\n */\nmodule.exports = MRUCache;\nfunction MRUCache(max, onRemove) {\n this.max = max;\n this.onRemove = onRemove;\n this.reset();\n}\n\n/**\n * Clear the cache\n *\n * @returns {MRUCache} this cache\n * @private\n */\nMRUCache.prototype.reset = function() {\n for (var key in this.list) {\n this.onRemove(this.list[key]);\n }\n\n this.list = {};\n this.order = [];\n\n return this;\n};\n\n/**\n * Add a key, value combination to the cache, trimming its size if this pushes\n * it over max length.\n *\n * @param {string} key lookup key for the item\n * @param {*} data any value\n *\n * @returns {MRUCache} this cache\n * @private\n */\nMRUCache.prototype.add = function(key, data) {\n this.list[key] = data;\n this.order.push(key);\n\n if (this.order.length > this.max) {\n var removedData = this.get(this.order[0]);\n if (removedData) this.onRemove(removedData);\n }\n\n return this;\n};\n\n/**\n * Determine whether the value attached to `key` is present\n *\n * @param {string} key the key to be looked-up\n * @returns {boolean} whether the cache has this value\n * @private\n */\nMRUCache.prototype.has = function(key) {\n return key in this.list;\n};\n\n/**\n * List all keys in the cache\n *\n * @returns {Array} an array of keys in this cache.\n * @private\n */\nMRUCache.prototype.keys = function() {\n return this.order;\n};\n\n/**\n * Get the value attached to a specific key. If the key is not found,\n * returns `null`\n *\n * @param {string} key the key to look up\n * @returns {*} the data, or null if it isn't found\n * @private\n */\nMRUCache.prototype.get = function(key) {\n if (!this.has(key)) { return null; }\n\n var data = this.list[key];\n\n delete this.list[key];\n this.order.splice(this.order.indexOf(key), 1);\n\n return data;\n};\n","'use strict';\n\nvar util = require('../util/util');\nvar Evented = require('../util/evented');\nvar Source = require('./source');\n\nmodule.exports = VectorTileSource;\n\nfunction VectorTileSource(options) {\n util.extend(this, util.pick(options, ['url', 'tileSize']));\n\n if (this.tileSize !== 512) {\n throw new Error('vector tile sources must have a tileSize of 512');\n }\n\n Source._loadTileJSON.call(this, options);\n}\n\nVectorTileSource.prototype = util.inherit(Evented, {\n minzoom: 0,\n maxzoom: 22,\n tileSize: 512,\n reparseOverscaled: true,\n _loaded: false,\n\n onAdd: function(map) {\n this.map = map;\n },\n\n loaded: function() {\n return this._pyramid && this._pyramid.loaded();\n },\n\n update: function(transform) {\n if (this._pyramid) {\n this._pyramid.update(this.used, transform);\n }\n },\n\n reload: function() {\n if (this._pyramid) {\n this._pyramid.reload();\n }\n },\n\n redoPlacement: function() {\n if (!this._pyramid) {\n return;\n }\n\n var ids = this._pyramid.orderedIDs();\n for (var i = 0; i < ids.length; i++) {\n var tile = this._pyramid.getTile(ids[i]);\n this._redoTilePlacement(tile);\n }\n },\n\n render: Source._renderTiles,\n featuresAt: Source._vectorFeaturesAt,\n\n _loadTile: function(tile) {\n var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1;\n var params = {\n url: tile.coord.url(this.tiles, this.maxzoom),\n uid: tile.uid,\n coord: tile.coord,\n zoom: tile.coord.z,\n maxZoom: this.maxzoom,\n tileSize: this.tileSize * overscaling,\n source: this.id,\n overscaling: overscaling,\n angle: this.map.transform.angle,\n pitch: this.map.transform.pitch,\n collisionDebug: this.map.collisionDebug\n };\n\n if (tile.workerID) {\n this.dispatcher.send('reload tile', params, this._tileLoaded.bind(this, tile), tile.workerID);\n } else {\n tile.workerID = this.dispatcher.send('load tile', params, this._tileLoaded.bind(this, tile));\n }\n },\n\n _tileLoaded: function(tile, err, data) {\n if (tile.aborted)\n return;\n\n if (err) {\n this.fire('tile.error', {tile: tile});\n return;\n }\n\n tile.loadVectorData(data);\n\n if (tile.redoWhenDone) {\n tile.redoWhenDone = false;\n this._redoTilePlacement(tile);\n }\n\n this.fire('tile.load', {tile: tile});\n },\n\n _abortTile: function(tile) {\n tile.aborted = true;\n this.dispatcher.send('abort tile', { uid: tile.uid, source: this.id }, null, tile.workerID);\n },\n\n _addTile: function(tile) {\n this.fire('tile.add', {tile: tile});\n },\n\n _removeTile: function(tile) {\n this.fire('tile.remove', {tile: tile});\n },\n\n _unloadTile: function(tile) {\n tile.unloadVectorData(this.map.painter);\n this.glyphAtlas.removeGlyphs(tile.uid);\n this.dispatcher.send('remove tile', { uid: tile.uid, source: this.id }, null, tile.workerID);\n },\n\n _redoTilePlacement: function(tile) {\n\n if (!tile.loaded || tile.redoingPlacement) {\n tile.redoWhenDone = true;\n return;\n }\n\n tile.redoingPlacement = true;\n\n this.dispatcher.send('redo placement', {\n uid: tile.uid,\n source: this.id,\n angle: this.map.transform.angle,\n pitch: this.map.transform.pitch,\n collisionDebug: this.map.collisionDebug\n }, done.bind(this), tile.workerID);\n\n function done(_, data) {\n tile.reloadSymbolData(data, this.map.painter);\n this.fire('tile.load', {tile: tile});\n\n tile.redoingPlacement = false;\n if (tile.redoWhenDone) {\n this._redoTilePlacement(tile);\n tile.redoWhenDone = false;\n }\n }\n }\n});\n","'use strict';\n\nvar util = require('../util/util');\nvar ajax = require('../util/ajax');\nvar Evented = require('../util/evented');\nvar Source = require('./source');\nvar normalizeURL = require('../util/mapbox').normalizeTileURL;\n\nmodule.exports = RasterTileSource;\n\nfunction RasterTileSource(options) {\n util.extend(this, util.pick(options, ['url', 'tileSize']));\n\n Source._loadTileJSON.call(this, options);\n}\n\nRasterTileSource.prototype = util.inherit(Evented, {\n minzoom: 0,\n maxzoom: 22,\n roundZoom: true,\n tileSize: 512,\n _loaded: false,\n\n onAdd: function(map) {\n this.map = map;\n },\n\n loaded: function() {\n return this._pyramid && this._pyramid.loaded();\n },\n\n update: function(transform) {\n if (this._pyramid) {\n this._pyramid.update(this.used, transform, this.map.style.rasterFadeDuration);\n }\n },\n\n reload: function() {\n // noop\n },\n\n render: Source._renderTiles,\n\n _loadTile: function(tile) {\n ajax.getImage(normalizeURL(tile.coord.url(this.tiles), this.url), function(err, img) {\n if (tile.aborted)\n return;\n\n if (err) {\n this.fire('tile.error', {tile: tile});\n return;\n }\n\n var gl = this.map.painter.gl;\n tile.texture = this.map.painter.getTexture(img.width);\n if (tile.texture) {\n gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, img);\n } else {\n tile.texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tile.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);\n tile.texture.size = img.width;\n }\n gl.generateMipmap(gl.TEXTURE_2D);\n\n tile.timeAdded = new Date().getTime();\n this.map.animationLoop.set(this.style.rasterFadeDuration);\n\n tile.source = this;\n tile.loaded = true;\n\n this.fire('tile.load', {tile: tile});\n }.bind(this));\n },\n\n _abortTile: function(tile) {\n tile.aborted = true;\n },\n\n _addTile: function(tile) {\n this.fire('tile.add', {tile: tile});\n },\n\n _removeTile: function(tile) {\n this.fire('tile.remove', {tile: tile});\n },\n\n _unloadTile: function(tile) {\n if (tile.texture) this.map.painter.saveTexture(tile.texture);\n },\n\n featuresAt: function(point, params, callback) {\n callback(null, []);\n }\n});\n","'use strict';\n\nvar util = require('../util/util');\n\nexports.resolve = function(value, constants) {\n function resolve(value) {\n return typeof value === 'string' && value[0] === '@' ? constants[value] : value;\n }\n\n var i;\n\n value = resolve(value);\n\n if (Array.isArray(value)) {\n value = value.slice();\n\n for (i = 0; i < value.length; i++) {\n if (value[i] in constants) {\n value[i] = resolve(value[i]);\n }\n }\n }\n\n if (value.stops) {\n value = util.extend({}, value);\n value.stops = value.stops.slice();\n\n for (i = 0; i < value.stops.length; i++) {\n if (value.stops[i][1] in constants) {\n value.stops[i] = [\n value.stops[i][0],\n resolve(value.stops[i][1])\n ];\n }\n }\n }\n\n return value;\n};\n\nexports.resolveAll = function (properties, constants) {\n if (!constants)\n return properties;\n\n var result = {};\n\n for (var key in properties) {\n result[key] = exports.resolve(properties[key], constants);\n }\n\n return result;\n};\n","'use strict';\n\nvar util = require('../util/util');\nvar interpolate = require('../util/interpolate');\n\nmodule.exports = StyleTransition;\n\n/*\n * Represents a transition between two declarations\n */\nfunction StyleTransition(declaration, oldTransition, value) {\n\n this.declaration = declaration;\n this.startTime = this.endTime = (new Date()).getTime();\n\n var type = declaration.type;\n if ((type === 'string' || type === 'array') && declaration.transitionable) {\n this.interp = interpZoomTransitioned;\n } else {\n this.interp = interpolate[type];\n }\n\n this.oldTransition = oldTransition;\n this.duration = value.duration || 0;\n this.delay = value.delay || 0;\n\n if (!this.instant()) {\n this.endTime = this.startTime + this.duration + this.delay;\n this.ease = util.easeCubicInOut;\n }\n\n if (oldTransition && oldTransition.endTime <= this.startTime) {\n // Old transition is done running, so we can\n // delete its reference to its old transition.\n\n delete oldTransition.oldTransition;\n }\n}\n\nStyleTransition.prototype.instant = function() {\n return !this.oldTransition || !this.interp || (this.duration === 0 && this.delay === 0);\n};\n\n/*\n * Return the value of the transitioning property at zoom level `z` and optional time `t`\n */\nStyleTransition.prototype.at = function(z, zoomHistory, t) {\n\n var value = this.declaration.calculate(z, zoomHistory, this.duration);\n\n if (this.instant()) return value;\n\n t = t || Date.now();\n\n if (t < this.endTime) {\n var oldValue = this.oldTransition.at(z, zoomHistory, this.startTime);\n var eased = this.ease((t - this.startTime - this.delay) / this.duration);\n value = this.interp(oldValue, value, eased);\n }\n\n return value;\n\n};\n\nfunction interpZoomTransitioned(from, to, t) {\n return {\n from: from.to,\n fromScale: from.toScale,\n to: to.to,\n toScale: to.toScale,\n t: t\n };\n}\n","'use strict';\n\nvar util = require('../util/util');\nvar reference = require('./reference');\nvar StyleConstant = require('./style_constant');\nvar StyleDeclaration = require('./style_declaration');\n\nvar lookup = {\n paint: {},\n layout: {}\n};\n\nreference.layer.type.values.forEach(function(type) {\n lookup.paint[type] = makeConstructor(reference['paint_' + type]);\n lookup.layout[type] = makeConstructor(reference['layout_' + type]);\n});\n\nfunction makeConstructor(reference) {\n function StyleDeclarationSet(properties, constants) {\n this._values = {};\n this._transitions = {};\n\n this._constants = constants;\n\n for (var k in properties) {\n this[k] = StyleConstant.resolve(properties[k], this._constants);\n }\n }\n\n Object.keys(reference).forEach(function(k) {\n var property = reference[k];\n\n Object.defineProperty(StyleDeclarationSet.prototype, k, {\n set: function(v) {\n this._values[k] = new StyleDeclaration(property, StyleConstant.resolve(v, this._constants));\n },\n get: function() {\n return this._values[k].value;\n }\n });\n\n if (property.transition) {\n Object.defineProperty(StyleDeclarationSet.prototype, k + '-transition', {\n set: function(v) {\n this._transitions[k] = v;\n },\n get: function() {\n return this._transitions[k];\n }\n });\n }\n });\n\n StyleDeclarationSet.prototype.values = function() {\n return this._values;\n };\n\n StyleDeclarationSet.prototype.transition = function(k, global) {\n var t = this._transitions[k] || {};\n return {\n duration: util.coalesce(t.duration, global.duration, 300),\n delay: util.coalesce(t.delay, global.delay, 0)\n };\n };\n\n StyleDeclarationSet.prototype.json = function() {\n var result = {};\n\n for (var v in this._values) {\n result[v] = this._values[v].value;\n }\n\n for (var t in this._transitions) {\n result[t + '-transition'] = this._transitions[v];\n }\n\n return result;\n };\n\n return StyleDeclarationSet;\n}\n\nmodule.exports = function(renderType, layerType, properties, constants) {\n return new lookup[renderType][layerType](properties, constants);\n};\n","'use strict';\n\nvar reference = require('./reference');\n\nmodule.exports = {};\n\nreference.layout.forEach(function(className) {\n var Properties = function(props) {\n for (var p in props) {\n this[p] = props[p];\n }\n };\n\n var properties = reference[className];\n for (var prop in properties) {\n if (properties[prop].default === undefined) continue;\n Properties.prototype[prop] = properties[prop].default;\n }\n module.exports[className.replace('layout_', '')] = Properties;\n});\n","'use strict';\n\nvar reference = require('./reference');\nvar parseCSSColor = require('csscolorparser').parseCSSColor;\n\nmodule.exports = {};\n\nreference.paint.forEach(function(className) {\n var Calculated = function() {};\n\n var properties = reference[className];\n for (var p in properties) {\n var prop = properties[p],\n value = prop.default;\n\n if (value === undefined) continue;\n if (prop.type === 'color') value = parseCSSColor(value);\n\n Calculated.prototype[p] = value;\n }\n\n Calculated.prototype.hidden = false;\n module.exports[className.replace('paint_', '')] = Calculated;\n});\n","'use strict';\n\nmodule.exports = Glyphs;\n\nfunction Glyphs(pbf, end) {\n this.stacks = pbf.readFields(readFontstacks, [], end);\n}\n\nfunction readFontstacks(tag, stacks, pbf) {\n if (tag === 1) {\n var fontstack = pbf.readMessage(readFontstack, {glyphs: {}});\n stacks.push(fontstack);\n }\n}\n\nfunction readFontstack(tag, fontstack, pbf) {\n if (tag === 1) fontstack.name = pbf.readString();\n else if (tag === 2) fontstack.range = pbf.readString();\n else if (tag === 3) {\n var glyph = pbf.readMessage(readGlyph, {});\n fontstack.glyphs[glyph.id] = glyph;\n }\n}\n\nfunction readGlyph(tag, glyph, pbf) {\n if (tag === 1) glyph.id = pbf.readVarint();\n else if (tag === 2) glyph.bitmap = pbf.readBytes();\n else if (tag === 3) glyph.width = pbf.readVarint();\n else if (tag === 4) glyph.height = pbf.readVarint();\n else if (tag === 5) glyph.left = pbf.readSVarint();\n else if (tag === 6) glyph.top = pbf.readSVarint();\n else if (tag === 7) glyph.advance = pbf.readVarint();\n}\n","'use strict';\n\nmodule.exports = BinPack;\nfunction BinPack(width, height) {\n this.width = width;\n this.height = height;\n this.free = [{ x: 0, y: 0, w: width, h: height }];\n}\n\n/**\n * Simple algorithm to recursively merge the newly released cell with its\n * neighbor. This doesn't merge more than two cells at a time, and fails\n * for complicated merges.\n * @private\n */\nBinPack.prototype.release = function(rect) {\n for (var i = 0; i < this.free.length; i++) {\n var free = this.free[i];\n\n if (free.y === rect.y && free.h === rect.h && free.x + free.w === rect.x) {\n free.w += rect.w;\n\n } else if (free.x === rect.x && free.w === rect.w && free.y + free.h === rect.y) {\n free.h += rect.h;\n\n } else if (rect.y === free.y && rect.h === free.h && rect.x + rect.w === free.x) {\n free.x = rect.x;\n free.w += rect.w;\n\n } else if (rect.x === free.x && rect.w === free.w && rect.y + rect.h === free.y) {\n free.y = rect.y;\n free.h += rect.h;\n\n } else continue;\n\n this.free.splice(i, 1);\n this.release(free);\n return;\n\n }\n this.free.push(rect);\n};\n\nBinPack.prototype.allocate = function(width, height) {\n // Find the smallest free rect angle\n var rect = { x: Infinity, y: Infinity, w: Infinity, h: Infinity };\n var smallest = -1;\n for (var i = 0; i < this.free.length; i++) {\n var ref = this.free[i];\n if (width <= ref.w && height <= ref.h && ref.y <= rect.y && ref.x <= rect.x) {\n rect = ref;\n smallest = i;\n }\n }\n\n if (smallest < 0) {\n // There's no space left for this char.\n return { x: -1, y: -1 };\n }\n\n this.free.splice(smallest, 1);\n\n // Shorter/Longer Axis Split Rule (SAS)\n // http://clb.demon.fi/files/RectangleBinPack.pdf p. 15\n // Ignore the dimension of R and just split long the shorter dimension\n // See Also: http://www.cs.princeton.edu/~chazelle/pubs/blbinpacking.pdf\n if (rect.w < rect.h) {\n // split horizontally\n // +--+---+\n // |__|___| <-- b1\n // +------+ <-- b2\n if (rect.w > width) this.free.push({ x: rect.x + width, y: rect.y, w: rect.w - width, h: height });\n if (rect.h > height) this.free.push({ x: rect.x, y: rect.y + height, w: rect.w, h: rect.h - height });\n } else {\n // split vertically\n // +--+---+\n // |__| | <-- b1\n // +--|---+ <-- b2\n if (rect.w > width) this.free.push({ x: rect.x + width, y: rect.y, w: rect.w - width, h: rect.h });\n if (rect.h > height) this.free.push({ x: rect.x, y: rect.y + height, w: width, h: rect.h - height });\n }\n\n return { x: rect.x, y: rect.y, w: width, h: height };\n};\n","'use strict';\n\nvar DOM = require('../../util/dom'),\n browser = require('../../util/browser'),\n util = require('../../util/util');\n\nmodule.exports = ScrollZoom;\n\n\nvar ua = typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase() : '',\n firefox = ua.indexOf('firefox') !== -1,\n safari = ua.indexOf('safari') !== -1 && ua.indexOf('chrom') === -1;\n\n\nfunction ScrollZoom(map) {\n this._map = map;\n this._el = map.getCanvasContainer();\n\n util.bindHandlers(this);\n}\n\nScrollZoom.prototype = {\n enable: function () {\n this._el.addEventListener('wheel', this._onWheel, false);\n this._el.addEventListener('mousewheel', this._onWheel, false);\n },\n\n disable: function () {\n this._el.removeEventListener('wheel', this._onWheel);\n this._el.removeEventListener('mousewheel', this._onWheel);\n },\n\n _onWheel: function (e) {\n var value;\n\n if (e.type === 'wheel') {\n value = e.deltaY;\n // Firefox doubles the values on retina screens...\n if (firefox && e.deltaMode === window.WheelEvent.DOM_DELTA_PIXEL) value /= browser.devicePixelRatio;\n if (e.deltaMode === window.WheelEvent.DOM_DELTA_LINE) value *= 40;\n\n } else if (e.type === 'mousewheel') {\n value = -e.wheelDeltaY;\n if (safari) value = value / 3;\n }\n\n var now = (window.performance || Date).now(),\n timeDelta = now - (this._time || 0);\n\n this._pos = DOM.mousePos(this._el, e);\n this._time = now;\n\n if (value !== 0 && (value % 4.000244140625) === 0) {\n // This one is definitely a mouse wheel event.\n this._type = 'wheel';\n // Normalize this value to match trackpad.\n value = Math.floor(value / 4);\n\n } else if (value !== 0 && Math.abs(value) < 4) {\n // This one is definitely a trackpad event because it is so small.\n this._type = 'trackpad';\n\n } else if (timeDelta > 400) {\n // This is likely a new scroll action.\n this._type = null;\n this._lastValue = value;\n\n // Start a timeout in case this was a singular event, and dely it by up to 40ms.\n this._timeout = setTimeout(this._onTimeout, 40);\n\n } else if (!this._type) {\n // This is a repeating event, but we don't know the type of event just yet.\n // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode.\n this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel';\n\n // Make sure our delayed event isn't fired again, because we accumulate\n // the previous event (which was less than 40ms ago) into this event.\n if (this._timeout) {\n clearTimeout(this._timeout);\n this._timeout = null;\n value += this._lastValue;\n }\n }\n\n // Slow down zoom if shift key is held for more precise zooming\n if (e.shiftKey && value) value = value / 4;\n\n // Only fire the callback if we actually know what type of scrolling device the user uses.\n if (this._type) this._zoom(-value);\n\n e.preventDefault();\n },\n\n _onTimeout: function () {\n this._type = 'wheel';\n this._zoom(-this._lastValue);\n },\n\n _zoom: function (delta) {\n var map = this._map;\n\n // Scale by sigmoid of scroll wheel delta.\n var scale = 2 / (1 + Math.exp(-Math.abs(delta / 100)));\n if (delta < 0 && scale !== 0) scale = 1 / scale;\n\n var fromScale = map.ease ? map.ease.to : map.transform.scale,\n targetZoom = map.transform.scaleZoom(fromScale * scale);\n\n map.zoomTo(targetZoom, {\n duration: 0,\n around: map.unproject(this._pos)\n });\n }\n};\n","'use strict';\n\nvar DOM = require('../../util/dom'),\n LatLngBounds = require('../../geo/lat_lng_bounds'),\n util = require('../../util/util');\n\nmodule.exports = BoxZoom;\n\n\nfunction BoxZoom(map) {\n this._map = map;\n this._el = map.getCanvasContainer();\n this._container = map.getContainer();\n\n util.bindHandlers(this);\n}\n\nBoxZoom.prototype = {\n enable: function () {\n this._el.addEventListener('mousedown', this._onMouseDown, false);\n },\n\n disable: function () {\n this._el.removeEventListener('mousedown', this._onMouseDown);\n },\n\n _onMouseDown: function (e) {\n if (e.shiftKey || (e.which === 1 && e.button === 1)) {\n document.addEventListener('mousemove', this._onMouseMove, false);\n document.addEventListener('keydown', this._onKeyDown, false);\n document.addEventListener('mouseup', this._onMouseUp, false);\n\n this._startPos = DOM.mousePos(this._el, e);\n this.active = true;\n }\n },\n\n _onMouseMove: function (e) {\n var p0 = this._startPos,\n p1 = DOM.mousePos(this._el, e);\n\n if (!this._box) {\n this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container);\n this._container.classList.add('mapboxgl-crosshair');\n\n DOM.disableDrag();\n\n this._map.fire('boxzoomstart');\n }\n\n var minX = Math.min(p0.x, p1.x),\n maxX = Math.max(p0.x, p1.x),\n minY = Math.min(p0.y, p1.y),\n maxY = Math.max(p0.y, p1.y);\n\n DOM.setTransform(this._box, 'translate(' + minX + 'px,' + minY + 'px)');\n\n this._box.style.width = (maxX - minX) + 'px';\n this._box.style.height = (maxY - minY) + 'px';\n },\n\n _onMouseUp: function (e) {\n var p0 = this._startPos,\n p1 = DOM.mousePos(this._el, e),\n bounds = new LatLngBounds(this._map.unproject(p0), this._map.unproject(p1));\n\n this._finish();\n\n this._map\n .fitBounds(bounds, {linear: true})\n .fire('boxzoomend', {boxZoomBounds: bounds});\n },\n\n _onKeyDown: function (e) {\n if (e.keyCode === 27) {\n this._finish();\n this._map.fire('boxzoomcancel');\n }\n },\n\n _finish: function () {\n if (!this._box) return;\n\n this.active = false;\n\n document.removeEventListener('mousemove', this._onMouseMove, false);\n document.removeEventListener('keydown', this._onKeyDown, false);\n document.removeEventListener('mouseup', this._onMouseUp, false);\n\n this._container.classList.remove('mapboxgl-crosshair');\n\n this._box.parentNode.removeChild(this._box);\n this._box = null;\n\n DOM.enableDrag();\n }\n};\n","'use strict';\n\nvar DOM = require('../../util/dom'),\n Point = require('point-geometry'),\n util = require('../../util/util');\n\nmodule.exports = DragRotate;\n\n\nfunction DragRotate(map) {\n this._map = map;\n this._el = map.getCanvasContainer();\n\n util.bindHandlers(this);\n}\n\nDragRotate.prototype = {\n enable: function () {\n this._el.addEventListener('contextmenu', this._onContextMenu, false);\n },\n\n disable: function () {\n this._el.removeEventListener('contextmenu', this._onContextMenu);\n },\n\n _onContextMenu: function (e) {\n this._map.stop();\n this.active = true;\n this._startPos = this._pos = DOM.mousePos(this._el, e);\n\n document.addEventListener('mousemove', this._onMouseMove, false);\n document.addEventListener('mouseup', this._onMouseUp, false);\n\n e.preventDefault();\n },\n\n _onMouseMove: function (e) {\n\n var p0 = this._startPos,\n p1 = this._pos,\n p2 = DOM.mousePos(this._el, e),\n\n map = this._map,\n center = map.transform.centerPoint, // Center of rotation\n startToCenter = p0.sub(center),\n startToCenterDist = startToCenter.mag();\n\n if (!map.rotating) {\n map.fire('movestart');\n map.rotating = true;\n }\n\n // If the first click was too close to the center, move the center of rotation by 200 pixels\n // in the direction of the click.\n if (startToCenterDist < 200) {\n center = p0.add(new Point(-200, 0)._rotate(startToCenter.angle()));\n }\n\n var bearingDiff = p1.sub(center).angleWith(p2.sub(center)) / Math.PI * 180;\n map.transform.bearing = map.getBearing() - bearingDiff;\n\n map.fire('move').fire('rotate');\n\n clearTimeout(this._timeout);\n this._timeout = setTimeout(this._onTimeout, 200);\n\n this._pos = p2;\n },\n\n _onTimeout: function () {\n var map = this._map;\n\n map.rotating = false;\n map.snapToNorth();\n\n if (!map.rotating) {\n map._rerender();\n map.fire('moveend');\n }\n },\n\n _onMouseUp: function () {\n this.active = false;\n\n document.removeEventListener('mousemove', this._onMouseMove, false);\n document.removeEventListener('mouseup', this._onMouseUp, false);\n }\n};\n","'use strict';\n\nvar DOM = require('../../util/dom'),\n util = require('../../util/util');\n\nmodule.exports = DragPan;\n\n\nvar inertiaLinearity = 0.25,\n inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1),\n inertiaMaxSpeed = 3000, // px/s\n inertiaDeceleration = 4000; // px/s^2\n\n\nfunction DragPan(map) {\n this._map = map;\n this._el = map.getCanvasContainer();\n\n util.bindHandlers(this);\n}\n\nDragPan.prototype = {\n enable: function () {\n this._el.addEventListener('mousedown', this._onDown, false);\n this._el.addEventListener('touchstart', this._onDown, false);\n },\n\n disable: function () {\n this._el.removeEventListener('mousedown', this._onDown);\n this._el.removeEventListener('touchstart', this._onDown);\n },\n\n _onDown: function (e) {\n this._startPos = this._pos = DOM.mousePos(this._el, e);\n\n this._inertia = [[Date.now(), this._pos]];\n\n if (!e.touches) {\n document.addEventListener('mousemove', this._onMove, false);\n document.addEventListener('mouseup', this._onMouseUp, false);\n\n } else if (e.touches.length === 1) {\n document.addEventListener('touchmove', this._onMove, false);\n document.addEventListener('touchend', this._onTouchEnd, false);\n }\n },\n\n _onMove: function (e) {\n var map = this._map;\n if (map.boxZoom.active || map.dragRotate.active || (e.touches && e.touches.length > 1)) return;\n\n var pos = DOM.mousePos(this._el, e),\n inertia = this._inertia,\n now = Date.now();\n\n inertia.push([now, pos]);\n while (inertia.length > 2 && now - inertia[0][0] > 50) inertia.shift();\n\n map.stop();\n map.transform.setLocationAtPoint(map.transform.pointLocation(this._pos), pos);\n map.fire('move');\n\n this._pos = pos;\n\n e.preventDefault();\n },\n\n _onUp: function () {\n var inertia = this._inertia;\n\n if (inertia.length < 2) {\n this._map.fire('moveend');\n return;\n }\n\n var last = inertia[inertia.length - 1],\n first = inertia[0],\n flingOffset = last[1].sub(first[1]),\n flingDuration = (last[0] - first[0]) / 1000,\n\n // calculate px/s velocity & adjust for increased initial animation speed when easing out\n velocity = flingOffset.mult(inertiaLinearity / flingDuration),\n speed = velocity.mag(); // px/s\n\n if (speed > inertiaMaxSpeed) {\n speed = inertiaMaxSpeed;\n velocity._unit()._mult(speed);\n }\n\n var duration = speed / (inertiaDeceleration * inertiaLinearity),\n offset = velocity.mult(-duration / 2);\n\n this._map.panBy(offset, {\n duration: duration * 1000,\n easing: inertiaEasing,\n noMoveStart: true\n });\n },\n\n _onMouseUp: function () {\n this._onUp();\n document.removeEventListener('mousemove', this._onMove, false);\n document.removeEventListener('mouseup', this._onMouseUp, false);\n },\n\n _onTouchEnd: function () {\n this._onUp();\n document.removeEventListener('touchmove', this._onMove);\n document.removeEventListener('touchend', this._onTouchEnd);\n }\n};\n","'use strict';\n\nmodule.exports = Keyboard;\n\n\nvar panDelta = 80,\n rotateDelta = 2;\n\n/**\n * The `Keyboard` handler responds to keyboard input by zooming, rotating, or panning the\n * map. The following keyboard shortcuts are supported:\n * * `=` / `+`: increase zoom level by 1\n * * `Shift-=` / `Shift-+`: increase zoom level by 2\n * * `-`: decrease zoom level by 1\n * * `Shift--`: decrease zoom level by 2\n * * Arrow keys: pan by 80 pixels\n * * `Shift+⇢`: increase rotation by 2 degrees\n * * `Shift+⇠`: decrease rotation by 2 degrees\n * @class Keyboard\n * @example\n * // Disable the keyboard handler\n * map.keyboard.disable();\n * @example\n * // Enable the keyboard handler\n * map.keyboard.enable();\n */\nfunction Keyboard(map) {\n this._map = map;\n this._el = map.getCanvasContainer();\n\n this._onKeyDown = this._onKeyDown.bind(this);\n}\n\nKeyboard.prototype = {\n enable: function () {\n this._el.addEventListener('keydown', this._onKeyDown, false);\n },\n\n disable: function () {\n this._el.removeEventListener('keydown', this._onKeyDown);\n },\n\n _onKeyDown: function (e) {\n if (e.altKey || e.ctrlKey || e.metaKey) return;\n\n var map = this._map;\n\n switch (e.keyCode) {\n case 61:\n case 107:\n case 171:\n case 187:\n map.zoomTo(Math.round(map.getZoom()) + (e.shiftKey ? 2 : 1));\n break;\n\n case 189:\n case 109:\n case 173:\n map.zoomTo(Math.round(map.getZoom()) - (e.shiftKey ? 2 : 1));\n break;\n\n case 37:\n if (e.shiftKey) {\n map.setBearing(map.getBearing() - rotateDelta);\n } else {\n map.panBy([-panDelta, 0]);\n }\n break;\n\n case 39:\n if (e.shiftKey) {\n map.setBearing(map.getBearing() + rotateDelta);\n } else {\n map.panBy([panDelta, 0]);\n }\n break;\n\n case 38:\n map.panBy([0, -panDelta]);\n break;\n\n case 40:\n map.panBy([0, panDelta]);\n break;\n }\n }\n};\n","'use strict';\n\nmodule.exports = DoubleClickZoom;\n\nfunction DoubleClickZoom(map) {\n this._map = map;\n this._onDblClick = this._onDblClick.bind(this);\n}\n\nDoubleClickZoom.prototype = {\n enable: function () {\n this._map.on('dblclick', this._onDblClick);\n },\n\n disable: function () {\n this._map.off('dblclick', this._onDblClick);\n },\n\n _onDblClick: function (e) {\n this._map.zoomTo(Math.round(this._map.getZoom()) + 1, {around: e.latLng});\n }\n};\n","'use strict';\n\nvar DOM = require('../../util/dom'),\n util = require('../../util/util');\n\nmodule.exports = Pinch;\n\n\nfunction Pinch(map) {\n this._map = map;\n this._el = map.getCanvasContainer();\n\n util.bindHandlers(this);\n}\n\nPinch.prototype = {\n enable: function () {\n this._el.addEventListener('touchstart', this._onStart, false);\n },\n\n disable: function () {\n this._el.removeEventListener('touchstart', this._onStart);\n },\n\n _onStart: function (e) {\n if (e.touches.length !== 2) return;\n\n var p0 = DOM.mousePos(this._el, e.touches[0]),\n p1 = DOM.mousePos(this._el, e.touches[1]);\n\n this._startVec = p0.sub(p1);\n this._startScale = this._map.transform.scale;\n this._startBearing = this._map.transform.bearing;\n\n document.addEventListener('touchmove', this._onMove, false);\n document.addEventListener('touchend', this._onEnd, false);\n },\n\n _onMove: function (e) {\n if (e.touches.length !== 2) return;\n\n var p0 = DOM.mousePos(this._el, e.touches[0]),\n p1 = DOM.mousePos(this._el, e.touches[1]),\n p = p0.add(p1).div(2),\n vec = p0.sub(p1),\n scale = vec.mag() / this._startVec.mag(),\n bearing = vec.angleWith(this._startVec) * 180 / Math.PI,\n map = this._map;\n\n map.easeTo({\n zoom: map.transform.scaleZoom(this._startScale * scale),\n bearing: this._startBearing + bearing,\n duration: 0,\n around: map.unproject(p)\n });\n\n e.preventDefault();\n },\n\n _onEnd: function () {\n this._map.snapToNorth();\n\n document.removeEventListener('touchmove', this._onMove);\n document.removeEventListener('touchend', this._onEnd);\n }\n};\n","'use strict';\n\nvar LineVertexBuffer = require('./line_vertex_buffer');\nvar LineElementBuffer = require('./line_element_buffer');\nvar FillVertexBuffer = require('./fill_vertex_buffer');\nvar FillElementBuffer = require('./triangle_element_buffer');\nvar OutlineElementBuffer = require('./outline_element_buffer');\nvar GlyphVertexBuffer = require('./glyph_vertex_buffer');\nvar GlyphElementBuffer = require('./triangle_element_buffer');\nvar IconVertexBuffer = require('./icon_vertex_buffer');\nvar IconElementBuffer = require('./triangle_element_buffer');\nvar CollisionBoxVertexBuffer = require('./collision_box_vertex_buffer');\n\nmodule.exports = function(bufferset) {\n bufferset = bufferset || {};\n return {\n glyphVertex: new GlyphVertexBuffer(bufferset.glyphVertex),\n glyphElement: new GlyphElementBuffer(bufferset.glyphElement),\n iconVertex: new IconVertexBuffer(bufferset.iconVertex),\n iconElement: new IconElementBuffer(bufferset.iconElement),\n fillVertex: new FillVertexBuffer(bufferset.fillVertex),\n fillElement: new FillElementBuffer(bufferset.fillElement),\n outlineElement: new OutlineElementBuffer(bufferset.outlineElement),\n lineVertex: new LineVertexBuffer(bufferset.lineVertex),\n lineElement: new LineElementBuffer(bufferset.lineElement),\n collisionBoxVertex: new CollisionBoxVertexBuffer(bufferset.collisionBoxVertex)\n };\n};\n","/**\n * @fileoverview gl-matrix - High performance matrix and vector operations\n * @author Brandon Jones\n * @author Colin MacKenzie IV\n * @version 2.3.0\n */\n\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n// END HEADER\n\nexports.glMatrix = require(\"./gl-matrix/common.js\");\nexports.mat2 = require(\"./gl-matrix/mat2.js\");\nexports.mat2d = require(\"./gl-matrix/mat2d.js\");\nexports.mat3 = require(\"./gl-matrix/mat3.js\");\nexports.mat4 = require(\"./gl-matrix/mat4.js\");\nexports.quat = require(\"./gl-matrix/quat.js\");\nexports.vec2 = require(\"./gl-matrix/vec2.js\");\nexports.vec3 = require(\"./gl-matrix/vec3.js\");\nexports.vec4 = require(\"./gl-matrix/vec4.js\");","'use strict';\n\nmodule.exports = Pbf;\n\nvar Buffer = global.Buffer || require('./buffer');\n\nfunction Pbf(buf) {\n this.buf = !Buffer.isBuffer(buf) ? new Buffer(buf || 0) : buf;\n this.pos = 0;\n this.length = this.buf.length;\n}\n\nPbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum\nPbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64\nPbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields\nPbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32\n\nvar SHIFT_LEFT_32 = (1 << 16) * (1 << 16),\n SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32,\n POW_2_63 = Math.pow(2, 63);\n\nPbf.prototype = {\n\n destroy: function() {\n this.buf = null;\n },\n\n // === READING =================================================================\n\n readFields: function(readField, result, end) {\n end = end || this.length;\n\n while (this.pos < end) {\n var val = this.readVarint(),\n tag = val >> 3,\n startPos = this.pos;\n\n readField(tag, result, this);\n\n if (this.pos === startPos) this.skip(val);\n }\n return result;\n },\n\n readMessage: function(readField, result) {\n return this.readFields(readField, result, this.readVarint() + this.pos);\n },\n\n readFixed32: function() {\n var val = this.buf.readUInt32LE(this.pos);\n this.pos += 4;\n return val;\n },\n\n readSFixed32: function() {\n var val = this.buf.readInt32LE(this.pos);\n this.pos += 4;\n return val;\n },\n\n // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)\n\n readFixed64: function() {\n var val = this.buf.readUInt32LE(this.pos) + this.buf.readUInt32LE(this.pos + 4) * SHIFT_LEFT_32;\n this.pos += 8;\n return val;\n },\n\n readSFixed64: function() {\n var val = this.buf.readUInt32LE(this.pos) + this.buf.readInt32LE(this.pos + 4) * SHIFT_LEFT_32;\n this.pos += 8;\n return val;\n },\n\n readFloat: function() {\n var val = this.buf.readFloatLE(this.pos);\n this.pos += 4;\n return val;\n },\n\n readDouble: function() {\n var val = this.buf.readDoubleLE(this.pos);\n this.pos += 8;\n return val;\n },\n\n readVarint: function() {\n var buf = this.buf,\n val, b, b0, b1, b2, b3;\n\n b0 = buf[this.pos++]; if (b0 < 0x80) return b0; b0 = b0 & 0x7f;\n b1 = buf[this.pos++]; if (b1 < 0x80) return b0 | b1 << 7; b1 = (b1 & 0x7f) << 7;\n b2 = buf[this.pos++]; if (b2 < 0x80) return b0 | b1 | b2 << 14; b2 = (b2 & 0x7f) << 14;\n b3 = buf[this.pos++]; if (b3 < 0x80) return b0 | b1 | b2 | b3 << 21;\n\n val = b0 | b1 | b2 | (b3 & 0x7f) << 21;\n\n b = buf[this.pos++]; val += (b & 0x7f) * 0x10000000; if (b < 0x80) return val;\n b = buf[this.pos++]; val += (b & 0x7f) * 0x800000000; if (b < 0x80) return val;\n b = buf[this.pos++]; val += (b & 0x7f) * 0x40000000000; if (b < 0x80) return val;\n b = buf[this.pos++]; val += (b & 0x7f) * 0x2000000000000; if (b < 0x80) return val;\n b = buf[this.pos++]; val += (b & 0x7f) * 0x100000000000000; if (b < 0x80) return val;\n b = buf[this.pos++]; val += (b & 0x7f) * 0x8000000000000000; if (b < 0x80) return val;\n\n throw new Error('Expected varint not more than 10 bytes');\n },\n\n readVarint64: function() {\n var startPos = this.pos,\n val = this.readVarint();\n\n if (val < POW_2_63) return val;\n\n var pos = this.pos - 2;\n while (this.buf[pos] === 0xff) pos--;\n if (pos < startPos) pos = startPos;\n\n val = 0;\n for (var i = 0; i < pos - startPos + 1; i++) {\n var b = ~this.buf[startPos + i] & 0x7f;\n val += i < 4 ? b << i * 7 : b * Math.pow(2, i * 7);\n }\n\n return -val - 1;\n },\n\n readSVarint: function() {\n var num = this.readVarint();\n return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding\n },\n\n readBoolean: function() {\n return Boolean(this.readVarint());\n },\n\n readString: function() {\n var end = this.readVarint() + this.pos,\n str = this.buf.toString('utf8', this.pos, end);\n this.pos = end;\n return str;\n },\n\n readBytes: function() {\n var end = this.readVarint() + this.pos,\n buffer = this.buf.slice(this.pos, end);\n this.pos = end;\n return buffer;\n },\n\n // verbose for performance reasons; doesn't affect gzipped size\n\n readPackedVarint: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readVarint());\n return arr;\n },\n readPackedSVarint: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readSVarint());\n return arr;\n },\n readPackedBoolean: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readBoolean());\n return arr;\n },\n readPackedFloat: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readFloat());\n return arr;\n },\n readPackedDouble: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readDouble());\n return arr;\n },\n readPackedFixed32: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readFixed32());\n return arr;\n },\n readPackedSFixed32: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readSFixed32());\n return arr;\n },\n readPackedFixed64: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readFixed64());\n return arr;\n },\n readPackedSFixed64: function() {\n var end = this.readVarint() + this.pos, arr = [];\n while (this.pos < end) arr.push(this.readSFixed64());\n return arr;\n },\n\n skip: function(val) {\n var type = val & 0x7;\n if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}\n else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;\n else if (type === Pbf.Fixed32) this.pos += 4;\n else if (type === Pbf.Fixed64) this.pos += 8;\n else throw new Error('Unimplemented type: ' + type);\n },\n\n // === WRITING =================================================================\n\n writeTag: function(tag, type) {\n this.writeVarint((tag << 3) | type);\n },\n\n realloc: function(min) {\n var length = this.length || 16;\n\n while (length < this.pos + min) length *= 2;\n\n if (length !== this.length) {\n var buf = new Buffer(length);\n this.buf.copy(buf);\n this.buf = buf;\n this.length = length;\n }\n },\n\n finish: function() {\n this.length = this.pos;\n this.pos = 0;\n return this.buf.slice(0, this.length);\n },\n\n writeFixed32: function(val) {\n this.realloc(4);\n this.buf.writeUInt32LE(val, this.pos);\n this.pos += 4;\n },\n\n writeSFixed32: function(val) {\n this.realloc(4);\n this.buf.writeInt32LE(val, this.pos);\n this.pos += 4;\n },\n\n writeFixed64: function(val) {\n this.realloc(8);\n this.buf.writeInt32LE(val & -1, this.pos);\n this.buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);\n this.pos += 8;\n },\n\n writeSFixed64: function(val) {\n this.realloc(8);\n this.buf.writeInt32LE(val & -1, this.pos);\n this.buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);\n this.pos += 8;\n },\n\n writeVarint: function(val) {\n val = +val;\n\n if (val <= 0x7f) {\n this.realloc(1);\n this.buf[this.pos++] = val;\n\n } else if (val <= 0x3fff) {\n this.realloc(2);\n this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80;\n this.buf[this.pos++] = ((val >>> 7) & 0x7f);\n\n } else if (val <= 0x1fffff) {\n this.realloc(3);\n this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80;\n this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80;\n this.buf[this.pos++] = ((val >>> 14) & 0x7f);\n\n } else if (val <= 0xfffffff) {\n this.realloc(4);\n this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80;\n this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80;\n this.buf[this.pos++] = ((val >>> 14) & 0x7f) | 0x80;\n this.buf[this.pos++] = ((val >>> 21) & 0x7f);\n\n } else {\n var pos = this.pos;\n while (val >= 0x80) {\n this.realloc(1);\n this.buf[this.pos++] = (val & 0xff) | 0x80;\n val /= 0x80;\n }\n this.realloc(1);\n this.buf[this.pos++] = val | 0;\n if (this.pos - pos > 10) throw new Error('Given varint doesn\\'t fit into 10 bytes');\n }\n },\n\n writeSVarint: function(val) {\n this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);\n },\n\n writeBoolean: function(val) {\n this.writeVarint(Boolean(val));\n },\n\n writeString: function(str) {\n str = String(str);\n var bytes = Buffer.byteLength(str);\n this.writeVarint(bytes);\n this.realloc(bytes);\n this.buf.write(str, this.pos);\n this.pos += bytes;\n },\n\n writeFloat: function(val) {\n this.realloc(4);\n this.buf.writeFloatLE(val, this.pos);\n this.pos += 4;\n },\n\n writeDouble: function(val) {\n this.realloc(8);\n this.buf.writeDoubleLE(val, this.pos);\n this.pos += 8;\n },\n\n writeBytes: function(buffer) {\n var len = buffer.length;\n this.writeVarint(len);\n this.realloc(len);\n for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];\n },\n\n writeMessage: function(tag, fn, obj) {\n this.writeTag(tag, Pbf.Bytes);\n\n this.pos++; // reserve 1 byte for short message length\n\n // write the message directly to the buffer and see how much was written\n var startPos = this.pos;\n fn(obj, this);\n var len = this.pos - startPos;\n\n var varintLen =\n len <= 0x7f ? 1 :\n len <= 0x3fff ? 2 :\n len <= 0x1fffff ? 3 :\n len <= 0xfffffff ? 4 : Math.ceil(Math.log(len) / (Math.LN2 * 7));\n\n // if 1 byte isn't enough for encoding message length, shift the data to the right\n if (varintLen > 1) {\n this.realloc(varintLen - 1);\n for (var i = this.pos - 1; i >= startPos; i--) this.buf[i + varintLen - 1] = this.buf[i];\n }\n\n // finally, write the message length in the reserved place and restore the position\n this.pos = startPos - 1;\n this.writeVarint(len);\n this.pos += len;\n },\n\n writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); },\n writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); },\n writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); },\n writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); },\n writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); },\n writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); },\n writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },\n writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); },\n writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },\n\n writeBytesField: function(tag, buffer) {\n this.writeTag(tag, Pbf.Bytes);\n this.writeBytes(buffer);\n },\n writeFixed32Field: function(tag, val) {\n this.writeTag(tag, Pbf.Fixed32);\n this.writeFixed32(val);\n },\n writeSFixed32Field: function(tag, val) {\n this.writeTag(tag, Pbf.Fixed32);\n this.writeSFixed32(val);\n },\n writeFixed64Field: function(tag, val) {\n this.writeTag(tag, Pbf.Fixed64);\n this.writeFixed64(val);\n },\n writeSFixed64Field: function(tag, val) {\n this.writeTag(tag, Pbf.Fixed64);\n this.writeSFixed64(val);\n },\n writeVarintField: function(tag, val) {\n this.writeTag(tag, Pbf.Varint);\n this.writeVarint(val);\n },\n writeSVarintField: function(tag, val) {\n this.writeTag(tag, Pbf.Varint);\n this.writeSVarint(val);\n },\n writeStringField: function(tag, str) {\n this.writeTag(tag, Pbf.Bytes);\n this.writeString(str);\n },\n writeFloatField: function(tag, val) {\n this.writeTag(tag, Pbf.Fixed32);\n this.writeFloat(val);\n },\n writeDoubleField: function(tag, val) {\n this.writeTag(tag, Pbf.Fixed64);\n this.writeDouble(val);\n },\n writeBooleanField: function(tag, val) {\n this.writeVarintField(tag, Boolean(val));\n }\n};\n\nfunction writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); }\nfunction writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); }\nfunction writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); }\nfunction writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); }\nfunction writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); }\nfunction writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); }\nfunction writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }\nfunction writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); }\nfunction writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }\n","'use strict';\n\nvar Actor = require('../util/actor');\nvar WorkerTile = require('./worker_tile');\nvar util = require('../util/util');\nvar ajax = require('../util/ajax');\nvar vt = require('vector-tile');\nvar Protobuf = require('pbf');\n\nvar geojsonvt = require('geojson-vt');\nvar GeoJSONWrapper = require('./geojson_wrapper');\n\nmodule.exports = function(self) {\n return new Worker(self);\n};\n\nfunction Worker(self) {\n this.self = self;\n this.actor = new Actor(self, this);\n this.loading = {};\n\n this.loaded = {};\n this.layers = [];\n this.geoJSONIndexes = {};\n}\n\nutil.extend(Worker.prototype, {\n 'set layers': function(layers) {\n this.layers = layers;\n },\n\n 'load tile': function(params, callback) {\n var source = params.source,\n uid = params.uid;\n\n if (!this.loading[source])\n this.loading[source] = {};\n\n\n var tile = this.loading[source][uid] = new WorkerTile(params);\n\n tile.xhr = ajax.getArrayBuffer(params.url, done.bind(this));\n\n function done(err, data) {\n delete this.loading[source][uid];\n\n if (err) return callback(err);\n\n tile.data = new vt.VectorTile(new Protobuf(new Uint8Array(data)));\n tile.parse(tile.data, this.layers, this.actor, callback);\n\n this.loaded[source] = this.loaded[source] || {};\n this.loaded[source][uid] = tile;\n }\n },\n\n 'reload tile': function(params, callback) {\n var loaded = this.loaded[params.source],\n uid = params.uid;\n if (loaded && loaded[uid]) {\n var tile = loaded[uid];\n tile.parse(tile.data, this.layers, this.actor, callback);\n }\n },\n\n 'abort tile': function(params) {\n var loading = this.loading[params.source],\n uid = params.uid;\n if (loading && loading[uid]) {\n loading[uid].xhr.abort();\n delete loading[uid];\n }\n },\n\n 'remove tile': function(params) {\n var loaded = this.loaded[params.source],\n uid = params.uid;\n if (loaded && loaded[uid]) {\n delete loaded[uid];\n }\n },\n\n 'redo placement': function(params, callback) {\n var loaded = this.loaded[params.source],\n loading = this.loading[params.source],\n uid = params.uid;\n\n if (loaded && loaded[uid]) {\n var tile = loaded[uid];\n var result = tile.redoPlacement(params.angle, params.pitch, params.collisionDebug);\n\n if (result.result) {\n callback(null, result.result, result.transferables);\n }\n\n } else if (loading && loading[uid]) {\n loading[uid].angle = params.angle;\n }\n },\n\n 'parse geojson': function(params, callback) {\n var indexData = function(err, data) {\n if (err) return callback(err);\n this.geoJSONIndexes[params.source] = geojsonvt(data, params.geojsonVtOptions);\n callback(null);\n }.bind(this);\n\n // TODO accept params.url for urls instead\n\n // Not, because of same origin issues, urls must either include an\n // explicit origin or absolute path.\n // ie: /foo/bar.json or http://example.com/bar.json\n // but not ../foo/bar.json\n if (typeof params.data === 'string') {\n ajax.getJSON(params.data, indexData);\n }\n else indexData(null, params.data);\n },\n\n 'load geojson tile': function(params, callback) {\n var source = params.source,\n coord = params.coord;\n\n // console.time('tile ' + coord.z + ' ' + coord.x + ' ' + coord.y);\n\n var geoJSONTile = this.geoJSONIndexes[source].getTile(coord.z, coord.x, coord.y);\n\n // console.timeEnd('tile ' + coord.z + ' ' + coord.x + ' ' + coord.y);\n\n // if (!geoJSONTile) console.log('not found', this.geoJSONIndexes[source], coord);\n\n if (!geoJSONTile) return callback(null, null); // nothing in the given tile\n\n var tile = new WorkerTile(params);\n tile.parse(new GeoJSONWrapper(geoJSONTile.features), this.layers, this.actor, callback);\n\n this.loaded[source] = this.loaded[source] || {};\n this.loaded[source][params.uid] = tile;\n },\n\n 'query features': function(params, callback) {\n var tile = this.loaded[params.source] && this.loaded[params.source][params.uid];\n if (tile) {\n tile.featureTree.query(params, callback);\n } else {\n callback(null, []);\n }\n }\n});\n","'use strict';\n\nmodule.exports = Actor;\n\n/**\n * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model)\n * that maintains the relationship between asynchronous tasks and the objects\n * that spin them off - in this case, tasks like parsing parts of styles,\n * owned by the styles\n *\n * @param {WebWorker} target\n * @param {WebWorker} parent\n * @private\n */\nfunction Actor(target, parent) {\n this.target = target;\n this.parent = parent;\n this.callbacks = {};\n this.callbackID = 0;\n this.receive = this.receive.bind(this);\n this.target.addEventListener('message', this.receive, false);\n}\n\nActor.prototype.receive = function(message) {\n var data = message.data,\n callback;\n\n if (data.type === '') {\n callback = this.callbacks[data.id];\n delete this.callbacks[data.id];\n callback(data.error || null, data.data);\n } else if (typeof data.id !== 'undefined') {\n var id = data.id;\n this.parent[data.type](data.data, function(err, data, buffers) {\n this.postMessage({\n type: '',\n id: String(id),\n error: err ? String(err) : null,\n data: data\n }, buffers);\n }.bind(this));\n } else {\n this.parent[data.type](data.data);\n }\n};\n\nActor.prototype.send = function(type, data, callback, buffers) {\n var id = null;\n if (callback) this.callbacks[id = this.callbackID++] = callback;\n this.postMessage({ type: type, id: String(id), data: data }, buffers);\n};\n\n/**\n * Wrapped postMessage API that abstracts around IE's lack of\n * `transferList` support.\n *\n * @param {Object} message\n * @param {Object} transferList\n * @private\n */\nActor.prototype.postMessage = function(message, transferList) {\n try {\n this.target.postMessage(message, transferList);\n } catch (e) {\n this.target.postMessage(message); // No support for transferList on IE\n }\n};\n","'use strict';\n\nvar reference = require('../../reference/latest.js');\nvar validate = require('./parsed');\n\nmodule.exports = function(style) {\n return validate(style, reference);\n};\n","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\n/**\n * @class Common utilities\n * @name glMatrix\n */\nvar glMatrix = {};\n\n// Constants\nglMatrix.EPSILON = 0.000001;\nglMatrix.ARRAY_TYPE = (typeof Float32Array !== 'undefined') ? Float32Array : Array;\nglMatrix.RANDOM = Math.random;\n\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Type} type Array type, such as Float32Array or Array\n */\nglMatrix.setMatrixArrayType = function(type) {\n GLMAT_ARRAY_TYPE = type;\n}\n\nvar degree = Math.PI / 180;\n\n/**\n* Convert Degree To Radian\n*\n* @param {Number} Angle in Degrees\n*/\nglMatrix.toRadian = function(a){\n return a * degree;\n}\n\nmodule.exports = glMatrix;\n","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 2x2 Matrix\n * @name mat2\n */\nvar mat2 = {};\n\n/**\n * Creates a new identity mat2\n *\n * @returns {mat2} a new 2x2 matrix\n */\nmat2.create = function() {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n};\n\n/**\n * Creates a new mat2 initialized with values from an existing matrix\n *\n * @param {mat2} a matrix to clone\n * @returns {mat2} a new 2x2 matrix\n */\nmat2.clone = function(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Copy the values from one mat2 to another\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Set a mat2 to the identity matrix\n *\n * @param {mat2} out the receiving matrix\n * @returns {mat2} out\n */\nmat2.identity = function(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n};\n\n/**\n * Transpose the values of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.transpose = function(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a1 = a[1];\n out[1] = a[2];\n out[2] = a1;\n } else {\n out[0] = a[0];\n out[1] = a[2];\n out[2] = a[1];\n out[3] = a[3];\n }\n \n return out;\n};\n\n/**\n * Inverts a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.invert = function(out, a) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n\n // Calculate the determinant\n det = a0 * a3 - a2 * a1;\n\n if (!det) {\n return null;\n }\n det = 1.0 / det;\n \n out[0] = a3 * det;\n out[1] = -a1 * det;\n out[2] = -a2 * det;\n out[3] = a0 * det;\n\n return out;\n};\n\n/**\n * Calculates the adjugate of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.adjoint = function(out, a) {\n // Caching this value is nessecary if out == a\n var a0 = a[0];\n out[0] = a[3];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a0;\n\n return out;\n};\n\n/**\n * Calculates the determinant of a mat2\n *\n * @param {mat2} a the source matrix\n * @returns {Number} determinant of a\n */\nmat2.determinant = function (a) {\n return a[0] * a[3] - a[2] * a[1];\n};\n\n/**\n * Multiplies two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @returns {mat2} out\n */\nmat2.multiply = function (out, a, b) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n out[0] = a0 * b0 + a2 * b1;\n out[1] = a1 * b0 + a3 * b1;\n out[2] = a0 * b2 + a2 * b3;\n out[3] = a1 * b2 + a3 * b3;\n return out;\n};\n\n/**\n * Alias for {@link mat2.multiply}\n * @function\n */\nmat2.mul = mat2.multiply;\n\n/**\n * Rotates a mat2 by the given angle\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\nmat2.rotate = function (out, a, rad) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = a0 * c + a2 * s;\n out[1] = a1 * c + a3 * s;\n out[2] = a0 * -s + a2 * c;\n out[3] = a1 * -s + a3 * c;\n return out;\n};\n\n/**\n * Scales the mat2 by the dimensions in the given vec2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat2} out\n **/\nmat2.scale = function(out, a, v) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n v0 = v[0], v1 = v[1];\n out[0] = a0 * v0;\n out[1] = a1 * v0;\n out[2] = a2 * v1;\n out[3] = a3 * v1;\n return out;\n};\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat2.identity(dest);\n * mat2.rotate(dest, dest, rad);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\nmat2.fromRotation = function(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = -s;\n out[3] = c;\n return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat2.identity(dest);\n * mat2.scale(dest, dest, vec);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat2} out\n */\nmat2.fromScaling = function(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = v[1];\n return out;\n}\n\n/**\n * Returns a string representation of a mat2\n *\n * @param {mat2} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat2.str = function (a) {\n return 'mat2(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat2\n *\n * @param {mat2} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat2.frob = function (a) {\n return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2)))\n};\n\n/**\n * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix\n * @param {mat2} L the lower triangular matrix \n * @param {mat2} D the diagonal matrix \n * @param {mat2} U the upper triangular matrix \n * @param {mat2} a the input matrix to factorize\n */\n\nmat2.LDU = function (L, D, U, a) { \n L[2] = a[2]/a[0]; \n U[0] = a[0]; \n U[1] = a[1]; \n U[3] = a[3] - L[2] * U[1]; \n return [L, D, U]; \n}; \n\n\nmodule.exports = mat2;\n","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 2x3 Matrix\n * @name mat2d\n * \n * @description \n * A mat2d contains six elements defined as:\n *
\n * [a, c, tx,\n *  b, d, ty]\n * 
\n * This is a short form for the 3x3 matrix:\n *
\n * [a, c, tx,\n *  b, d, ty,\n *  0, 0, 1]\n * 
\n * The last row is ignored so the array is shorter and operations are faster.\n */\nvar mat2d = {};\n\n/**\n * Creates a new identity mat2d\n *\n * @returns {mat2d} a new 2x3 matrix\n */\nmat2d.create = function() {\n var out = new glMatrix.ARRAY_TYPE(6);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = 0;\n out[5] = 0;\n return out;\n};\n\n/**\n * Creates a new mat2d initialized with values from an existing matrix\n *\n * @param {mat2d} a matrix to clone\n * @returns {mat2d} a new 2x3 matrix\n */\nmat2d.clone = function(a) {\n var out = new glMatrix.ARRAY_TYPE(6);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n return out;\n};\n\n/**\n * Copy the values from one mat2d to another\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the source matrix\n * @returns {mat2d} out\n */\nmat2d.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n return out;\n};\n\n/**\n * Set a mat2d to the identity matrix\n *\n * @param {mat2d} out the receiving matrix\n * @returns {mat2d} out\n */\nmat2d.identity = function(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = 0;\n out[5] = 0;\n return out;\n};\n\n/**\n * Inverts a mat2d\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the source matrix\n * @returns {mat2d} out\n */\nmat2d.invert = function(out, a) {\n var aa = a[0], ab = a[1], ac = a[2], ad = a[3],\n atx = a[4], aty = a[5];\n\n var det = aa * ad - ab * ac;\n if(!det){\n return null;\n }\n det = 1.0 / det;\n\n out[0] = ad * det;\n out[1] = -ab * det;\n out[2] = -ac * det;\n out[3] = aa * det;\n out[4] = (ac * aty - ad * atx) * det;\n out[5] = (ab * atx - aa * aty) * det;\n return out;\n};\n\n/**\n * Calculates the determinant of a mat2d\n *\n * @param {mat2d} a the source matrix\n * @returns {Number} determinant of a\n */\nmat2d.determinant = function (a) {\n return a[0] * a[3] - a[1] * a[2];\n};\n\n/**\n * Multiplies two mat2d's\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @returns {mat2d} out\n */\nmat2d.multiply = function (out, a, b) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5];\n out[0] = a0 * b0 + a2 * b1;\n out[1] = a1 * b0 + a3 * b1;\n out[2] = a0 * b2 + a2 * b3;\n out[3] = a1 * b2 + a3 * b3;\n out[4] = a0 * b4 + a2 * b5 + a4;\n out[5] = a1 * b4 + a3 * b5 + a5;\n return out;\n};\n\n/**\n * Alias for {@link mat2d.multiply}\n * @function\n */\nmat2d.mul = mat2d.multiply;\n\n/**\n * Rotates a mat2d by the given angle\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\nmat2d.rotate = function (out, a, rad) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = a0 * c + a2 * s;\n out[1] = a1 * c + a3 * s;\n out[2] = a0 * -s + a2 * c;\n out[3] = a1 * -s + a3 * c;\n out[4] = a4;\n out[5] = a5;\n return out;\n};\n\n/**\n * Scales the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to translate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat2d} out\n **/\nmat2d.scale = function(out, a, v) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n v0 = v[0], v1 = v[1];\n out[0] = a0 * v0;\n out[1] = a1 * v0;\n out[2] = a2 * v1;\n out[3] = a3 * v1;\n out[4] = a4;\n out[5] = a5;\n return out;\n};\n\n/**\n * Translates the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to translate\n * @param {vec2} v the vec2 to translate the matrix by\n * @returns {mat2d} out\n **/\nmat2d.translate = function(out, a, v) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n v0 = v[0], v1 = v[1];\n out[0] = a0;\n out[1] = a1;\n out[2] = a2;\n out[3] = a3;\n out[4] = a0 * v0 + a2 * v1 + a4;\n out[5] = a1 * v0 + a3 * v1 + a5;\n return out;\n};\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat2d.identity(dest);\n * mat2d.rotate(dest, dest, rad);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\nmat2d.fromRotation = function(out, rad) {\n var s = Math.sin(rad), c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = -s;\n out[3] = c;\n out[4] = 0;\n out[5] = 0;\n return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat2d.identity(dest);\n * mat2d.scale(dest, dest, vec);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat2d} out\n */\nmat2d.fromScaling = function(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = v[1];\n out[4] = 0;\n out[5] = 0;\n return out;\n}\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat2d.identity(dest);\n * mat2d.translate(dest, dest, vec);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {vec2} v Translation vector\n * @returns {mat2d} out\n */\nmat2d.fromTranslation = function(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = v[0];\n out[5] = v[1];\n return out;\n}\n\n/**\n * Returns a string representation of a mat2d\n *\n * @param {mat2d} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat2d.str = function (a) {\n return 'mat2d(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + \n a[3] + ', ' + a[4] + ', ' + a[5] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat2d\n *\n * @param {mat2d} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat2d.frob = function (a) { \n return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + 1))\n}; \n\nmodule.exports = mat2d;\n","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 3x3 Matrix\n * @name mat3\n */\nvar mat3 = {};\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\nmat3.create = function() {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n};\n\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {mat4} a the source 4x4 matrix\n * @returns {mat3} out\n */\nmat3.fromMat4 = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n};\n\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {mat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\nmat3.clone = function(a) {\n var out = new glMatrix.ARRAY_TYPE(9);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n};\n\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n};\n\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\nmat3.identity = function(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n};\n\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.transpose = function(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1], a02 = a[2], a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n \n return out;\n};\n\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.invert = function(out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8],\n\n b01 = a22 * a11 - a12 * a21,\n b11 = -a22 * a10 + a12 * a20,\n b21 = a21 * a10 - a11 * a20,\n\n // Calculate the determinant\n det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) { \n return null; \n }\n det = 1.0 / det;\n\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n};\n\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.adjoint = function(out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8];\n\n out[0] = (a11 * a22 - a12 * a21);\n out[1] = (a02 * a21 - a01 * a22);\n out[2] = (a01 * a12 - a02 * a11);\n out[3] = (a12 * a20 - a10 * a22);\n out[4] = (a00 * a22 - a02 * a20);\n out[5] = (a02 * a10 - a00 * a12);\n out[6] = (a10 * a21 - a11 * a20);\n out[7] = (a01 * a20 - a00 * a21);\n out[8] = (a00 * a11 - a01 * a10);\n return out;\n};\n\n/**\n * Calculates the determinant of a mat3\n *\n * @param {mat3} a the source matrix\n * @returns {Number} determinant of a\n */\nmat3.determinant = function (a) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8];\n\n return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n};\n\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nmat3.multiply = function (out, a, b) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8],\n\n b00 = b[0], b01 = b[1], b02 = b[2],\n b10 = b[3], b11 = b[4], b12 = b[5],\n b20 = b[6], b21 = b[7], b22 = b[8];\n\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n};\n\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\nmat3.mul = mat3.multiply;\n\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to translate\n * @param {vec2} v vector to translate by\n * @returns {mat3} out\n */\nmat3.translate = function(out, a, v) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8],\n x = v[0], y = v[1];\n\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n};\n\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\nmat3.rotate = function (out, a, rad) {\n var a00 = a[0], a01 = a[1], a02 = a[2],\n a10 = a[3], a11 = a[4], a12 = a[5],\n a20 = a[6], a21 = a[7], a22 = a[8],\n\n s = Math.sin(rad),\n c = Math.cos(rad);\n\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n};\n\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\nmat3.scale = function(out, a, v) {\n var x = v[0], y = v[1];\n\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n};\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {vec2} v Translation vector\n * @returns {mat3} out\n */\nmat3.fromTranslation = function(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = v[0];\n out[7] = v[1];\n out[8] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\nmat3.fromRotation = function(out, rad) {\n var s = Math.sin(rad), c = Math.cos(rad);\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n\n out[3] = -s;\n out[4] = c;\n out[5] = 0;\n\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat3} out\n */\nmat3.fromScaling = function(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n\n out[3] = 0;\n out[4] = v[1];\n out[5] = 0;\n\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat2d} a the matrix to copy\n * @returns {mat3} out\n **/\nmat3.fromMat2d = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = 0;\n\n out[3] = a[2];\n out[4] = a[3];\n out[5] = 0;\n\n out[6] = a[4];\n out[7] = a[5];\n out[8] = 1;\n return out;\n};\n\n/**\n* Calculates a 3x3 matrix from the given quaternion\n*\n* @param {mat3} out mat3 receiving operation result\n* @param {quat} q Quaternion to create matrix from\n*\n* @returns {mat3} out\n*/\nmat3.fromQuat = function (out, q) {\n var x = q[0], y = q[1], z = q[2], w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\n\n xx = x * x2,\n yx = y * x2,\n yy = y * y2,\n zx = z * x2,\n zy = z * y2,\n zz = z * z2,\n wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n\n out[0] = 1 - yy - zz;\n out[3] = yx - wz;\n out[6] = zx + wy;\n\n out[1] = yx + wz;\n out[4] = 1 - xx - zz;\n out[7] = zy - wx;\n\n out[2] = zx - wy;\n out[5] = zy + wx;\n out[8] = 1 - xx - yy;\n\n return out;\n};\n\n/**\n* Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n*\n* @param {mat3} out mat3 receiving operation result\n* @param {mat4} a Mat4 to derive the normal matrix from\n*\n* @returns {mat3} out\n*/\nmat3.normalFromMat4 = function (out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32,\n\n // Calculate the determinant\n det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) { \n return null; \n }\n det = 1.0 / det;\n\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n\n out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n\n out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n\n return out;\n};\n\n/**\n * Returns a string representation of a mat3\n *\n * @param {mat3} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat3.str = function (a) {\n return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + \n a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + \n a[6] + ', ' + a[7] + ', ' + a[8] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {mat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat3.frob = function (a) {\n return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2)))\n};\n\n\nmodule.exports = mat3;\n","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 4x4 Matrix\n * @name mat4\n */\nvar mat4 = {};\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\nmat4.create = function() {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n};\n\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {mat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\nmat4.clone = function(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n};\n\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n};\n\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\nmat4.identity = function(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n};\n\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.transpose = function(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1], a02 = a[2], a03 = a[3],\n a12 = a[6], a13 = a[7],\n a23 = a[11];\n\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n \n return out;\n};\n\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.invert = function(out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32,\n\n // Calculate the determinant\n det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) { \n return null; \n }\n det = 1.0 / det;\n\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n\n return out;\n};\n\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.adjoint = function(out, a) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n out[0] = (a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22));\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = (a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12));\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = (a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22));\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = (a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12));\n out[8] = (a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21));\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = (a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11));\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = (a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21));\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = (a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11));\n return out;\n};\n\n/**\n * Calculates the determinant of a mat4\n *\n * @param {mat4} a the source matrix\n * @returns {Number} determinant of a\n */\nmat4.determinant = function (a) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n b00 = a00 * a11 - a01 * a10,\n b01 = a00 * a12 - a02 * a10,\n b02 = a00 * a13 - a03 * a10,\n b03 = a01 * a12 - a02 * a11,\n b04 = a01 * a13 - a03 * a11,\n b05 = a02 * a13 - a03 * a12,\n b06 = a20 * a31 - a21 * a30,\n b07 = a20 * a32 - a22 * a30,\n b08 = a20 * a33 - a23 * a30,\n b09 = a21 * a32 - a22 * a31,\n b10 = a21 * a33 - a23 * a31,\n b11 = a22 * a33 - a23 * a32;\n\n // Calculate the determinant\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n};\n\n/**\n * Multiplies two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.multiply = function (out, a, b) {\n var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n // Cache only the current line of the second matrix\n var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; \n out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7];\n out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11];\n out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15];\n out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n return out;\n};\n\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\nmat4.mul = mat4.multiply;\n\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nmat4.translate = function (out, a, v) {\n var x = v[0], y = v[1], z = v[2],\n a00, a01, a02, a03,\n a10, a11, a12, a13,\n a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n\n out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03;\n out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13;\n out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23;\n\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n};\n\n/**\n * Scales the mat4 by the dimensions in the given vec3\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\nmat4.scale = function(out, a, v) {\n var x = v[0], y = v[1], z = v[2];\n\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n};\n\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nmat4.rotate = function (out, a, rad, axis) {\n var x = axis[0], y = axis[1], z = axis[2],\n len = Math.sqrt(x * x + y * y + z * z),\n s, c, t,\n a00, a01, a02, a03,\n a10, a11, a12, a13,\n a20, a21, a22, a23,\n b00, b01, b02,\n b10, b11, b12,\n b20, b21, b22;\n\n if (Math.abs(len) < glMatrix.EPSILON) { return null; }\n \n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n\n a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n\n // Construct the elements of the rotation matrix\n b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s;\n b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s;\n b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c;\n\n // Perform rotation-specific matrix multiplication\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) { // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.rotateX = function (out, a, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad),\n a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7],\n a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n\n if (a !== out) { // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.rotateY = function (out, a, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad),\n a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3],\n a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n\n if (a !== out) { // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.rotateZ = function (out, a, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad),\n a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3],\n a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n\n if (a !== out) { // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n};\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {vec3} v Translation vector\n * @returns {mat4} out\n */\nmat4.fromTranslation = function(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {vec3} v Scaling vector\n * @returns {mat4} out\n */\nmat4.fromScaling = function(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nmat4.fromRotation = function(out, rad, axis) {\n var x = axis[0], y = axis[1], z = axis[2],\n len = Math.sqrt(x * x + y * y + z * z),\n s, c, t;\n \n if (Math.abs(len) < glMatrix.EPSILON) { return null; }\n \n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n \n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n \n // Perform rotation-specific matrix multiplication\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromXRotation = function(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n \n // Perform axis-specific matrix multiplication\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromYRotation = function(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n \n // Perform axis-specific matrix multiplication\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromZRotation = function(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n \n // Perform axis-specific matrix multiplication\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * var quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @returns {mat4} out\n */\nmat4.fromRotationTranslation = function (out, q, v) {\n // Quaternion math\n var x = q[0], y = q[1], z = q[2], w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\n\n xx = x * x2,\n xy = x * y2,\n xz = x * z2,\n yy = y * y2,\n yz = y * z2,\n zz = z * z2,\n wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n \n return out;\n};\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * var quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @param {vec3} s Scaling vector\n * @returns {mat4} out\n */\nmat4.fromRotationTranslationScale = function (out, q, v, s) {\n // Quaternion math\n var x = q[0], y = q[1], z = q[2], w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\n\n xx = x * x2,\n xy = x * y2,\n xz = x * z2,\n yy = y * y2,\n yz = y * z2,\n zz = z * z2,\n wx = w * x2,\n wy = w * y2,\n wz = w * z2,\n sx = s[0],\n sy = s[1],\n sz = s[2];\n\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n \n return out;\n};\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * mat4.translate(dest, origin);\n * var quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n * mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @param {vec3} s Scaling vector\n * @param {vec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\nmat4.fromRotationTranslationScaleOrigin = function (out, q, v, s, o) {\n // Quaternion math\n var x = q[0], y = q[1], z = q[2], w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\n\n xx = x * x2,\n xy = x * y2,\n xz = x * z2,\n yy = y * y2,\n yz = y * z2,\n zz = z * z2,\n wx = w * x2,\n wy = w * y2,\n wz = w * z2,\n \n sx = s[0],\n sy = s[1],\n sz = s[2],\n\n ox = o[0],\n oy = o[1],\n oz = o[2];\n \n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0] + ox - (out[0] * ox + out[4] * oy + out[8] * oz);\n out[13] = v[1] + oy - (out[1] * ox + out[5] * oy + out[9] * oz);\n out[14] = v[2] + oz - (out[2] * ox + out[6] * oy + out[10] * oz);\n out[15] = 1;\n \n return out;\n};\n\nmat4.fromQuat = function (out, q) {\n var x = q[0], y = q[1], z = q[2], w = q[3],\n x2 = x + x,\n y2 = y + y,\n z2 = z + z,\n\n xx = x * x2,\n yx = y * x2,\n yy = y * y2,\n zx = z * x2,\n zy = z * y2,\n zz = z * z2,\n wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n\n return out;\n};\n\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.frustum = function (out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left),\n tb = 1 / (top - bottom),\n nf = 1 / (near - far);\n out[0] = (near * 2) * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = (near * 2) * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = (far * near * 2) * nf;\n out[15] = 0;\n return out;\n};\n\n/**\n * Generates a perspective projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.perspective = function (out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf = 1 / (near - far);\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = (2 * far * near) * nf;\n out[15] = 0;\n return out;\n};\n\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.perspectiveFromFieldOfView = function (out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI/180.0),\n downTan = Math.tan(fov.downDegrees * Math.PI/180.0),\n leftTan = Math.tan(fov.leftDegrees * Math.PI/180.0),\n rightTan = Math.tan(fov.rightDegrees * Math.PI/180.0),\n xScale = 2.0 / (leftTan + rightTan),\n yScale = 2.0 / (upTan + downTan);\n\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = ((upTan - downTan) * yScale * 0.5);\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = (far * near) / (near - far);\n out[15] = 0.0;\n return out;\n}\n\n/**\n * Generates a orthogonal projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.ortho = function (out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right),\n bt = 1 / (bottom - top),\n nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n};\n\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {vec3} eye Position of the viewer\n * @param {vec3} center Point the viewer is looking at\n * @param {vec3} up vec3 pointing up\n * @returns {mat4} out\n */\nmat4.lookAt = function (out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len,\n eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2],\n centerx = center[0],\n centery = center[1],\n centerz = center[2];\n\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON &&\n Math.abs(eyey - centery) < glMatrix.EPSILON &&\n Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return mat4.identity(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n\n len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n\n len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n\n return out;\n};\n\n/**\n * Returns a string representation of a mat4\n *\n * @param {mat4} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat4.str = function (a) {\n return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' +\n a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' +\n a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' + \n a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {mat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat4.frob = function (a) {\n return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2) + Math.pow(a[9], 2) + Math.pow(a[10], 2) + Math.pow(a[11], 2) + Math.pow(a[12], 2) + Math.pow(a[13], 2) + Math.pow(a[14], 2) + Math.pow(a[15], 2) ))\n};\n\n\nmodule.exports = mat4;\n","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\nvar mat3 = require(\"./mat3.js\");\nvar vec3 = require(\"./vec3.js\");\nvar vec4 = require(\"./vec4.js\");\n\n/**\n * @class Quaternion\n * @name quat\n */\nvar quat = {};\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\nquat.create = function() {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n};\n\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {vec3} a the initial vector\n * @param {vec3} b the destination vector\n * @returns {quat} out\n */\nquat.rotationTo = (function() {\n var tmpvec3 = vec3.create();\n var xUnitVec3 = vec3.fromValues(1,0,0);\n var yUnitVec3 = vec3.fromValues(0,1,0);\n\n return function(out, a, b) {\n var dot = vec3.dot(a, b);\n if (dot < -0.999999) {\n vec3.cross(tmpvec3, xUnitVec3, a);\n if (vec3.length(tmpvec3) < 0.000001)\n vec3.cross(tmpvec3, yUnitVec3, a);\n vec3.normalize(tmpvec3, tmpvec3);\n quat.setAxisAngle(out, tmpvec3, Math.PI);\n return out;\n } else if (dot > 0.999999) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n } else {\n vec3.cross(tmpvec3, a, b);\n out[0] = tmpvec3[0];\n out[1] = tmpvec3[1];\n out[2] = tmpvec3[2];\n out[3] = 1 + dot;\n return quat.normalize(out, out);\n }\n };\n})();\n\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {vec3} view the vector representing the viewing direction\n * @param {vec3} right the vector representing the local \"right\" direction\n * @param {vec3} up the vector representing the local \"up\" direction\n * @returns {quat} out\n */\nquat.setAxes = (function() {\n var matr = mat3.create();\n\n return function(out, view, right, up) {\n matr[0] = right[0];\n matr[3] = right[1];\n matr[6] = right[2];\n\n matr[1] = up[0];\n matr[4] = up[1];\n matr[7] = up[2];\n\n matr[2] = -view[0];\n matr[5] = -view[1];\n matr[8] = -view[2];\n\n return quat.normalize(out, quat.fromMat3(out, matr));\n };\n})();\n\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {quat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\nquat.clone = vec4.clone;\n\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\nquat.fromValues = vec4.fromValues;\n\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the source quaternion\n * @returns {quat} out\n * @function\n */\nquat.copy = vec4.copy;\n\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\nquat.set = vec4.set;\n\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\nquat.identity = function(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n};\n\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {vec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\nquat.setAxisAngle = function(out, axis, rad) {\n rad = rad * 0.5;\n var s = Math.sin(rad);\n out[0] = s * axis[0];\n out[1] = s * axis[1];\n out[2] = s * axis[2];\n out[3] = Math.cos(rad);\n return out;\n};\n\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n * @function\n */\nquat.add = vec4.add;\n\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n */\nquat.multiply = function(out, a, b) {\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n out[0] = ax * bw + aw * bx + ay * bz - az * by;\n out[1] = ay * bw + aw * by + az * bx - ax * bz;\n out[2] = az * bw + aw * bz + ax * by - ay * bx;\n out[3] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n};\n\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\nquat.mul = quat.multiply;\n\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {quat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\nquat.scale = vec4.scale;\n\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateX = function (out, a, rad) {\n rad *= 0.5; \n\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n bx = Math.sin(rad), bw = Math.cos(rad);\n\n out[0] = ax * bw + aw * bx;\n out[1] = ay * bw + az * bx;\n out[2] = az * bw - ay * bx;\n out[3] = aw * bw - ax * bx;\n return out;\n};\n\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateY = function (out, a, rad) {\n rad *= 0.5; \n\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n by = Math.sin(rad), bw = Math.cos(rad);\n\n out[0] = ax * bw - az * by;\n out[1] = ay * bw + aw * by;\n out[2] = az * bw + ax * by;\n out[3] = aw * bw - ay * by;\n return out;\n};\n\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateZ = function (out, a, rad) {\n rad *= 0.5; \n\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n bz = Math.sin(rad), bw = Math.cos(rad);\n\n out[0] = ax * bw + ay * bz;\n out[1] = ay * bw - ax * bz;\n out[2] = az * bw + aw * bz;\n out[3] = aw * bw - az * bz;\n return out;\n};\n\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate W component of\n * @returns {quat} out\n */\nquat.calculateW = function (out, a) {\n var x = a[0], y = a[1], z = a[2];\n\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n return out;\n};\n\n/**\n * Calculates the dot product of two quat's\n *\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\nquat.dot = vec4.dot;\n\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n * @function\n */\nquat.lerp = vec4.lerp;\n\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n */\nquat.slerp = function (out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n\n var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n var omega, cosom, sinom, scale0, scale1;\n\n // calc cosine\n cosom = ax * bx + ay * by + az * bz + aw * bw;\n // adjust signs (if necessary)\n if ( cosom < 0.0 ) {\n cosom = -cosom;\n bx = - bx;\n by = - by;\n bz = - bz;\n bw = - bw;\n }\n // calculate coefficients\n if ( (1.0 - cosom) > 0.000001 ) {\n // standard case (slerp)\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else { \n // \"from\" and \"to\" quaternions are very close \n // ... so we can do a linear interpolation\n scale0 = 1.0 - t;\n scale1 = t;\n }\n // calculate final values\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n \n return out;\n};\n\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {quat} c the third operand\n * @param {quat} d the fourth operand\n * @param {Number} t interpolation amount\n * @returns {quat} out\n */\nquat.sqlerp = (function () {\n var temp1 = quat.create();\n var temp2 = quat.create();\n \n return function (out, a, b, c, d, t) {\n quat.slerp(temp1, a, d, t);\n quat.slerp(temp2, b, c, t);\n quat.slerp(out, temp1, temp2, 2 * t * (1 - t));\n \n return out;\n };\n}());\n\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate inverse of\n * @returns {quat} out\n */\nquat.invert = function(out, a) {\n var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n dot = a0*a0 + a1*a1 + a2*a2 + a3*a3,\n invDot = dot ? 1.0/dot : 0;\n \n // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n out[0] = -a0*invDot;\n out[1] = -a1*invDot;\n out[2] = -a2*invDot;\n out[3] = a3*invDot;\n return out;\n};\n\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate conjugate of\n * @returns {quat} out\n */\nquat.conjugate = function (out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Calculates the length of a quat\n *\n * @param {quat} a vector to calculate length of\n * @returns {Number} length of a\n * @function\n */\nquat.length = vec4.length;\n\n/**\n * Alias for {@link quat.length}\n * @function\n */\nquat.len = quat.length;\n\n/**\n * Calculates the squared length of a quat\n *\n * @param {quat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\nquat.squaredLength = vec4.squaredLength;\n\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\nquat.sqrLen = quat.squaredLength;\n\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\nquat.normalize = vec4.normalize;\n\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {mat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\nquat.fromMat3 = function(out, m) {\n // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n // article \"Quaternion Calculus and Fast Animation\".\n var fTrace = m[0] + m[4] + m[8];\n var fRoot;\n\n if ( fTrace > 0.0 ) {\n // |w| > 1/2, may as well choose w > 1/2\n fRoot = Math.sqrt(fTrace + 1.0); // 2w\n out[3] = 0.5 * fRoot;\n fRoot = 0.5/fRoot; // 1/(4w)\n out[0] = (m[5]-m[7])*fRoot;\n out[1] = (m[6]-m[2])*fRoot;\n out[2] = (m[1]-m[3])*fRoot;\n } else {\n // |w| <= 1/2\n var i = 0;\n if ( m[4] > m[0] )\n i = 1;\n if ( m[8] > m[i*3+i] )\n i = 2;\n var j = (i+1)%3;\n var k = (i+2)%3;\n \n fRoot = Math.sqrt(m[i*3+i]-m[j*3+j]-m[k*3+k] + 1.0);\n out[i] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot;\n out[3] = (m[j*3+k] - m[k*3+j]) * fRoot;\n out[j] = (m[j*3+i] + m[i*3+j]) * fRoot;\n out[k] = (m[k*3+i] + m[i*3+k]) * fRoot;\n }\n \n return out;\n};\n\n/**\n * Returns a string representation of a quatenion\n *\n * @param {quat} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nquat.str = function (a) {\n return 'quat(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\nmodule.exports = quat;\n","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 2 Dimensional Vector\n * @name vec2\n */\nvar vec2 = {};\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\nvec2.create = function() {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = 0;\n out[1] = 0;\n return out;\n};\n\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {vec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\nvec2.clone = function(a) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n};\n\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\nvec2.fromValues = function(x, y) {\n var out = new glMatrix.ARRAY_TYPE(2);\n out[0] = x;\n out[1] = y;\n return out;\n};\n\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the source vector\n * @returns {vec2} out\n */\nvec2.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n};\n\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\nvec2.set = function(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n};\n\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.add = function(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.subtract = function(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n};\n\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\nvec2.sub = vec2.subtract;\n\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.multiply = function(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n};\n\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\nvec2.mul = vec2.multiply;\n\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.divide = function(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n};\n\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\nvec2.div = vec2.divide;\n\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.min = function(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n};\n\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.max = function(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n};\n\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\nvec2.scale = function(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n};\n\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\nvec2.scaleAndAdd = function(out, a, b, scale) {\n out[0] = a[0] + (b[0] * scale);\n out[1] = a[1] + (b[1] * scale);\n return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} distance between a and b\n */\nvec2.distance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.sqrt(x*x + y*y);\n};\n\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\nvec2.dist = vec2.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec2.squaredDistance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x*x + y*y;\n};\n\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\nvec2.sqrDist = vec2.squaredDistance;\n\n/**\n * Calculates the length of a vec2\n *\n * @param {vec2} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec2.length = function (a) {\n var x = a[0],\n y = a[1];\n return Math.sqrt(x*x + y*y);\n};\n\n/**\n * Alias for {@link vec2.length}\n * @function\n */\nvec2.len = vec2.length;\n\n/**\n * Calculates the squared length of a vec2\n *\n * @param {vec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec2.squaredLength = function (a) {\n var x = a[0],\n y = a[1];\n return x*x + y*y;\n};\n\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\nvec2.sqrLen = vec2.squaredLength;\n\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to negate\n * @returns {vec2} out\n */\nvec2.negate = function(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n};\n\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to invert\n * @returns {vec2} out\n */\nvec2.inverse = function(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n return out;\n};\n\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to normalize\n * @returns {vec2} out\n */\nvec2.normalize = function(out, a) {\n var x = a[0],\n y = a[1];\n var len = x*x + y*y;\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n }\n return out;\n};\n\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec2.dot = function (a, b) {\n return a[0] * b[0] + a[1] * b[1];\n};\n\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec3} out\n */\nvec2.cross = function(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n};\n\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec2} out\n */\nvec2.lerp = function (out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\nvec2.random = function (out, scale) {\n scale = scale || 1.0;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n out[0] = Math.cos(r) * scale;\n out[1] = Math.sin(r) * scale;\n return out;\n};\n\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat2 = function(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n};\n\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2d} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat2d = function(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n};\n\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat3} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat3 = function(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n};\n\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat4 = function(out, a, m) {\n var x = a[0], \n y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n};\n\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec2.forEach = (function() {\n var vec = vec2.create();\n\n return function(a, stride, offset, count, fn, arg) {\n var i, l;\n if(!stride) {\n stride = 2;\n }\n\n if(!offset) {\n offset = 0;\n }\n \n if(count) {\n l = Math.min((count * stride) + offset, a.length);\n } else {\n l = a.length;\n }\n\n for(i = offset; i < l; i += stride) {\n vec[0] = a[i]; vec[1] = a[i+1];\n fn(vec, vec, arg);\n a[i] = vec[0]; a[i+1] = vec[1];\n }\n \n return a;\n };\n})();\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec2} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec2.str = function (a) {\n return 'vec2(' + a[0] + ', ' + a[1] + ')';\n};\n\nmodule.exports = vec2;\n","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 3 Dimensional Vector\n * @name vec3\n */\nvar vec3 = {};\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nvec3.create = function() {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n return out;\n};\n\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {vec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\nvec3.clone = function(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n};\n\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\nvec3.fromValues = function(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n};\n\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the source vector\n * @returns {vec3} out\n */\nvec3.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n};\n\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\nvec3.set = function(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n};\n\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.add = function(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.subtract = function(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n};\n\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\nvec3.sub = vec3.subtract;\n\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.multiply = function(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n};\n\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\nvec3.mul = vec3.multiply;\n\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.divide = function(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n};\n\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\nvec3.div = vec3.divide;\n\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.min = function(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n};\n\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.max = function(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n};\n\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\nvec3.scale = function(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n};\n\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\nvec3.scaleAndAdd = function(out, a, b, scale) {\n out[0] = a[0] + (b[0] * scale);\n out[1] = a[1] + (b[1] * scale);\n out[2] = a[2] + (b[2] * scale);\n return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} distance between a and b\n */\nvec3.distance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1],\n z = b[2] - a[2];\n return Math.sqrt(x*x + y*y + z*z);\n};\n\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\nvec3.dist = vec3.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec3.squaredDistance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1],\n z = b[2] - a[2];\n return x*x + y*y + z*z;\n};\n\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\nvec3.sqrDist = vec3.squaredDistance;\n\n/**\n * Calculates the length of a vec3\n *\n * @param {vec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec3.length = function (a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n return Math.sqrt(x*x + y*y + z*z);\n};\n\n/**\n * Alias for {@link vec3.length}\n * @function\n */\nvec3.len = vec3.length;\n\n/**\n * Calculates the squared length of a vec3\n *\n * @param {vec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec3.squaredLength = function (a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n return x*x + y*y + z*z;\n};\n\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\nvec3.sqrLen = vec3.squaredLength;\n\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to negate\n * @returns {vec3} out\n */\nvec3.negate = function(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n};\n\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to invert\n * @returns {vec3} out\n */\nvec3.inverse = function(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n};\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to normalize\n * @returns {vec3} out\n */\nvec3.normalize = function(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var len = x*x + y*y + z*z;\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n }\n return out;\n};\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec3.dot = function (a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n};\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.cross = function(out, a, b) {\n var ax = a[0], ay = a[1], az = a[2],\n bx = b[0], by = b[1], bz = b[2];\n\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n};\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.lerp = function (out, a, b, t) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n};\n\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {vec3} c the third operand\n * @param {vec3} d the fourth operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.hermite = function (out, a, b, c, d, t) {\n var factorTimes2 = t * t,\n factor1 = factorTimes2 * (2 * t - 3) + 1,\n factor2 = factorTimes2 * (t - 2) + t,\n factor3 = factorTimes2 * (t - 1),\n factor4 = factorTimes2 * (3 - 2 * t);\n \n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n \n return out;\n};\n\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {vec3} c the third operand\n * @param {vec3} d the fourth operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.bezier = function (out, a, b, c, d, t) {\n var inverseFactor = 1 - t,\n inverseFactorTimesTwo = inverseFactor * inverseFactor,\n factorTimes2 = t * t,\n factor1 = inverseFactorTimesTwo * inverseFactor,\n factor2 = 3 * t * inverseFactorTimesTwo,\n factor3 = 3 * factorTimes2 * inverseFactor,\n factor4 = factorTimes2 * t;\n \n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n \n return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\nvec3.random = function (out, scale) {\n scale = scale || 1.0;\n\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = (glMatrix.RANDOM() * 2.0) - 1.0;\n var zScale = Math.sqrt(1.0-z*z) * scale;\n\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n};\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec3} out\n */\nvec3.transformMat4 = function(out, a, m) {\n var x = a[0], y = a[1], z = a[2],\n w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n};\n\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat4} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\nvec3.transformMat3 = function(out, a, m) {\n var x = a[0], y = a[1], z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n};\n\n/**\n * Transforms the vec3 with a quat\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec3} out\n */\nvec3.transformQuat = function(out, a, q) {\n // benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations\n\n var x = a[0], y = a[1], z = a[2],\n qx = q[0], qy = q[1], qz = q[2], qw = q[3],\n\n // calculate quat * vec\n ix = qw * x + qy * z - qz * y,\n iy = qw * y + qz * x - qx * z,\n iz = qw * z + qx * y - qy * x,\n iw = -qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n return out;\n};\n\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateX = function(out, a, b, c){\n var p = [], r=[];\n\t //Translate point to the origin\n\t p[0] = a[0] - b[0];\n\t p[1] = a[1] - b[1];\n \tp[2] = a[2] - b[2];\n\n\t //perform rotation\n\t r[0] = p[0];\n\t r[1] = p[1]*Math.cos(c) - p[2]*Math.sin(c);\n\t r[2] = p[1]*Math.sin(c) + p[2]*Math.cos(c);\n\n\t //translate to correct position\n\t out[0] = r[0] + b[0];\n\t out[1] = r[1] + b[1];\n\t out[2] = r[2] + b[2];\n\n \treturn out;\n};\n\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateY = function(out, a, b, c){\n \tvar p = [], r=[];\n \t//Translate point to the origin\n \tp[0] = a[0] - b[0];\n \tp[1] = a[1] - b[1];\n \tp[2] = a[2] - b[2];\n \n \t//perform rotation\n \tr[0] = p[2]*Math.sin(c) + p[0]*Math.cos(c);\n \tr[1] = p[1];\n \tr[2] = p[2]*Math.cos(c) - p[0]*Math.sin(c);\n \n \t//translate to correct position\n \tout[0] = r[0] + b[0];\n \tout[1] = r[1] + b[1];\n \tout[2] = r[2] + b[2];\n \n \treturn out;\n};\n\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateZ = function(out, a, b, c){\n \tvar p = [], r=[];\n \t//Translate point to the origin\n \tp[0] = a[0] - b[0];\n \tp[1] = a[1] - b[1];\n \tp[2] = a[2] - b[2];\n \n \t//perform rotation\n \tr[0] = p[0]*Math.cos(c) - p[1]*Math.sin(c);\n \tr[1] = p[0]*Math.sin(c) + p[1]*Math.cos(c);\n \tr[2] = p[2];\n \n \t//translate to correct position\n \tout[0] = r[0] + b[0];\n \tout[1] = r[1] + b[1];\n \tout[2] = r[2] + b[2];\n \n \treturn out;\n};\n\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec3.forEach = (function() {\n var vec = vec3.create();\n\n return function(a, stride, offset, count, fn, arg) {\n var i, l;\n if(!stride) {\n stride = 3;\n }\n\n if(!offset) {\n offset = 0;\n }\n \n if(count) {\n l = Math.min((count * stride) + offset, a.length);\n } else {\n l = a.length;\n }\n\n for(i = offset; i < l; i += stride) {\n vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2];\n fn(vec, vec, arg);\n a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2];\n }\n \n return a;\n };\n})();\n\n/**\n * Get the angle between two 3D vectors\n * @param {vec3} a The first operand\n * @param {vec3} b The second operand\n * @returns {Number} The angle in radians\n */\nvec3.angle = function(a, b) {\n \n var tempA = vec3.fromValues(a[0], a[1], a[2]);\n var tempB = vec3.fromValues(b[0], b[1], b[2]);\n \n vec3.normalize(tempA, tempA);\n vec3.normalize(tempB, tempB);\n \n var cosine = vec3.dot(tempA, tempB);\n\n if(cosine > 1.0){\n return 0;\n } else {\n return Math.acos(cosine);\n } \n};\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec3} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec3.str = function (a) {\n return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')';\n};\n\nmodule.exports = vec3;\n","/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 4 Dimensional Vector\n * @name vec4\n */\nvar vec4 = {};\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\nvec4.create = function() {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n return out;\n};\n\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {vec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\nvec4.clone = function(a) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\nvec4.fromValues = function(x, y, z, w) {\n var out = new glMatrix.ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n};\n\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the source vector\n * @returns {vec4} out\n */\nvec4.copy = function(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n};\n\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\nvec4.set = function(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n};\n\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.add = function(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.subtract = function(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n};\n\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\nvec4.sub = vec4.subtract;\n\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.multiply = function(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n};\n\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\nvec4.mul = vec4.multiply;\n\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.divide = function(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n};\n\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\nvec4.div = vec4.divide;\n\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.min = function(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n};\n\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.max = function(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n};\n\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\nvec4.scale = function(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n};\n\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\nvec4.scaleAndAdd = function(out, a, b, scale) {\n out[0] = a[0] + (b[0] * scale);\n out[1] = a[1] + (b[1] * scale);\n out[2] = a[2] + (b[2] * scale);\n out[3] = a[3] + (b[3] * scale);\n return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} distance between a and b\n */\nvec4.distance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1],\n z = b[2] - a[2],\n w = b[3] - a[3];\n return Math.sqrt(x*x + y*y + z*z + w*w);\n};\n\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\nvec4.dist = vec4.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec4.squaredDistance = function(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1],\n z = b[2] - a[2],\n w = b[3] - a[3];\n return x*x + y*y + z*z + w*w;\n};\n\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\nvec4.sqrDist = vec4.squaredDistance;\n\n/**\n * Calculates the length of a vec4\n *\n * @param {vec4} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec4.length = function (a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n return Math.sqrt(x*x + y*y + z*z + w*w);\n};\n\n/**\n * Alias for {@link vec4.length}\n * @function\n */\nvec4.len = vec4.length;\n\n/**\n * Calculates the squared length of a vec4\n *\n * @param {vec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec4.squaredLength = function (a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n return x*x + y*y + z*z + w*w;\n};\n\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\nvec4.sqrLen = vec4.squaredLength;\n\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to negate\n * @returns {vec4} out\n */\nvec4.negate = function(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n};\n\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to invert\n * @returns {vec4} out\n */\nvec4.inverse = function(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n};\n\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to normalize\n * @returns {vec4} out\n */\nvec4.normalize = function(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var len = x*x + y*y + z*z + w*w;\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n }\n return out;\n};\n\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec4.dot = function (a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n};\n\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec4} out\n */\nvec4.lerp = function (out, a, b, t) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\nvec4.random = function (out, scale) {\n scale = scale || 1.0;\n\n //TODO: This is a pretty awful way of doing this. Find something better.\n out[0] = glMatrix.RANDOM();\n out[1] = glMatrix.RANDOM();\n out[2] = glMatrix.RANDOM();\n out[3] = glMatrix.RANDOM();\n vec4.normalize(out, out);\n vec4.scale(out, out, scale);\n return out;\n};\n\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec4} out\n */\nvec4.transformMat4 = function(out, a, m) {\n var x = a[0], y = a[1], z = a[2], w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n};\n\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec4} out\n */\nvec4.transformQuat = function(out, a, q) {\n var x = a[0], y = a[1], z = a[2],\n qx = q[0], qy = q[1], qz = q[2], qw = q[3],\n\n // calculate quat * vec\n ix = qw * x + qy * z - qz * y,\n iy = qw * y + qz * x - qx * z,\n iz = qw * z + qx * y - qy * x,\n iw = -qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n};\n\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec4.forEach = (function() {\n var vec = vec4.create();\n\n return function(a, stride, offset, count, fn, arg) {\n var i, l;\n if(!stride) {\n stride = 4;\n }\n\n if(!offset) {\n offset = 0;\n }\n \n if(count) {\n l = Math.min((count * stride) + offset, a.length);\n } else {\n l = a.length;\n }\n\n for(i = offset; i < l; i += stride) {\n vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; vec[3] = a[i+3];\n fn(vec, vec, arg);\n a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; a[i+3] = vec[3];\n }\n \n return a;\n };\n})();\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec4} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec4.str = function (a) {\n return 'vec4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\nmodule.exports = vec4;\n","'use strict';\n\n// lightweight Buffer shim for pbf browser build\n// based on code from github.com/feross/buffer (MIT-licensed)\n\nmodule.exports = Buffer;\n\nvar ieee754 = require('ieee754');\n\nvar BufferMethods;\n\nfunction Buffer(length) {\n var arr;\n if (length && length.length) {\n arr = length;\n length = arr.length;\n }\n var buf = new Uint8Array(length || 0);\n if (arr) buf.set(arr);\n\n buf.readUInt32LE = BufferMethods.readUInt32LE;\n buf.writeUInt32LE = BufferMethods.writeUInt32LE;\n buf.readInt32LE = BufferMethods.readInt32LE;\n buf.writeInt32LE = BufferMethods.writeInt32LE;\n buf.readFloatLE = BufferMethods.readFloatLE;\n buf.writeFloatLE = BufferMethods.writeFloatLE;\n buf.readDoubleLE = BufferMethods.readDoubleLE;\n buf.writeDoubleLE = BufferMethods.writeDoubleLE;\n buf.toString = BufferMethods.toString;\n buf.write = BufferMethods.write;\n buf.slice = BufferMethods.slice;\n buf.copy = BufferMethods.copy;\n\n buf._isBuffer = true;\n return buf;\n}\n\nvar lastStr, lastStrEncoded;\n\nBufferMethods = {\n readUInt32LE: function(pos) {\n return ((this[pos]) |\n (this[pos + 1] << 8) |\n (this[pos + 2] << 16)) +\n (this[pos + 3] * 0x1000000);\n },\n\n writeUInt32LE: function(val, pos) {\n this[pos] = val;\n this[pos + 1] = (val >>> 8);\n this[pos + 2] = (val >>> 16);\n this[pos + 3] = (val >>> 24);\n },\n\n readInt32LE: function(pos) {\n return ((this[pos]) |\n (this[pos + 1] << 8) |\n (this[pos + 2] << 16)) +\n (this[pos + 3] << 24);\n },\n\n readFloatLE: function(pos) { return ieee754.read(this, pos, true, 23, 4); },\n readDoubleLE: function(pos) { return ieee754.read(this, pos, true, 52, 8); },\n\n writeFloatLE: function(val, pos) { return ieee754.write(this, val, pos, true, 23, 4); },\n writeDoubleLE: function(val, pos) { return ieee754.write(this, val, pos, true, 52, 8); },\n\n toString: function(encoding, start, end) {\n var str = '',\n tmp = '';\n\n start = start || 0;\n end = Math.min(this.length, end || this.length);\n\n for (var i = start; i < end; i++) {\n var ch = this[i];\n if (ch <= 0x7F) {\n str += decodeURIComponent(tmp) + String.fromCharCode(ch);\n tmp = '';\n } else {\n tmp += '%' + ch.toString(16);\n }\n }\n\n str += decodeURIComponent(tmp);\n\n return str;\n },\n\n write: function(str, pos) {\n var bytes = str === lastStr ? lastStrEncoded : encodeString(str);\n for (var i = 0; i < bytes.length; i++) {\n this[pos + i] = bytes[i];\n }\n },\n\n slice: function(start, end) {\n return this.subarray(start, end);\n },\n\n copy: function(buf, pos) {\n pos = pos || 0;\n for (var i = 0; i < this.length; i++) {\n buf[pos + i] = this[i];\n }\n }\n};\n\nBufferMethods.writeInt32LE = BufferMethods.writeUInt32LE;\n\nBuffer.byteLength = function(str) {\n lastStr = str;\n lastStrEncoded = encodeString(str);\n return lastStrEncoded.length;\n};\n\nBuffer.isBuffer = function(buf) {\n return !!(buf && buf._isBuffer);\n};\n\nfunction encodeString(str) {\n var length = str.length,\n bytes = [];\n\n for (var i = 0, c, lead; i < length; i++) {\n c = str.charCodeAt(i); // code point\n\n if (c > 0xD7FF && c < 0xE000) {\n\n if (lead) {\n if (c < 0xDC00) {\n bytes.push(0xEF, 0xBF, 0xBD);\n lead = c;\n continue;\n\n } else {\n c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;\n lead = null;\n }\n\n } else {\n if (c > 0xDBFF || (i + 1 === length)) bytes.push(0xEF, 0xBF, 0xBD);\n else lead = c;\n\n continue;\n }\n\n } else if (lead) {\n bytes.push(0xEF, 0xBF, 0xBD);\n lead = null;\n }\n\n if (c < 0x80) bytes.push(c);\n else if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80);\n else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80);\n else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80);\n }\n return bytes;\n}\n","module.exports = require('./v7.json');\n","'use strict';\n\nvar parseCSSColor = require('csscolorparser').parseCSSColor;\nvar format = require('util').format;\n\nmodule.exports = function(style, reference) {\n\n var constants = style.constants || {},\n layers = {},\n errors = [];\n\n function error(key, val /*, message, ...*/) {\n var err = {\n message: (key ? key + ': ' : '') +\n format.apply(format, Array.prototype.slice.call(arguments, 2))\n };\n\n if (val !== null && val !== undefined && val.__line__) {\n err.line = val.__line__;\n }\n\n errors.push(err);\n }\n\n // Main recursive validation function. Tracks:\n //\n // - key: string representing location of validation in style tree. Used only\n // for more informative error reporting.\n // - val: current value from style being evaluated. May be anything from a\n // high level object that needs to be descended into deeper or a simple\n // scalar value.\n // - spec: current spec being evaluated. Tracks val.\n //\n function validate(key, val, spec) {\n var type = typeof_(val);\n\n // Constants\n if (type === 'string' && val[0] === '@') {\n if (!(val in constants)) {\n return error(key, val, 'constant \"%s\" not found', val);\n }\n val = constants[val];\n type = typeof_(val);\n }\n\n // Functions\n if (spec.function && type === 'object') {\n return validate.function(key, val, spec);\n }\n\n if (spec.type) {\n var validator = validate[spec.type];\n if (validator) {\n return validator(key, val, spec);\n }\n spec = reference[spec.type];\n }\n\n validate.object(key, val, spec);\n }\n\n validate.constants = function(key, val) {\n var type = typeof_(val);\n if (type !== 'object') {\n return error(key, val, 'object expected, %s found', type);\n }\n\n for (var k in val) {\n if (k[0] !== '@') {\n error(key + '.' + k, val[k], 'constants must start with \"@\"');\n }\n }\n };\n\n validate.source = function(key, val) {\n if (!val.type) {\n error(key, val, '\"type\" is required');\n return;\n }\n\n var type = unbundle(val.type);\n switch (type) {\n case 'vector':\n case 'raster':\n validate.object(key, val, reference.source_tile);\n\n if ('url' in val) {\n for (var prop in val) {\n if (['type', 'url', 'tileSize'].indexOf(prop) < 0) {\n error(key + '.' + prop, val[prop], 'a source with a \"url\" property may not include a \"%s\" property', prop);\n }\n }\n }\n\n break;\n case 'geojson':\n validate.object(key, val, reference.source_geojson);\n break;\n case 'video':\n validate.object(key, val, reference.source_video);\n break;\n default:\n validate.enum(key + '.type', val.type, {values: ['vector', 'raster', 'geojson', 'video']});\n }\n };\n\n validate.layer = function(key, val) {\n if (!val.type && !val.ref) {\n error(key, val, 'either \"type\" or \"ref\" is required');\n }\n\n var type = unbundle(val.type),\n ref = unbundle(val.ref);\n\n if (val.id) {\n if (layers[val.id]) {\n error(key, val.id, 'duplicate layer id \"%s\", previously used at line %d', val.id, layers[val.id]);\n } else {\n layers[val.id] = val.id.__line__;\n }\n }\n\n if ('ref' in val) {\n ['type', 'source', 'source-layer', 'filter', 'layout'].forEach(function (p) {\n if (p in val) {\n error(key, val[p], '\"%s\" is prohibited for ref layers', p);\n }\n });\n\n var parent;\n\n style.layers.forEach(function(layer) {\n if (layer.id == ref) parent = layer;\n });\n\n if (!parent) {\n error(key, val.ref, 'ref layer \"%s\" not found', ref);\n } else if (parent.ref) {\n error(key, val.ref, 'ref cannot reference another ref layer');\n } else {\n type = parent.type;\n }\n } else if (type !== 'background') {\n if (!val.source) {\n error(key, val, 'missing required property \"source\"');\n } else {\n var source = style.sources[val.source];\n if (!source) {\n error(key, val.source, 'source \"%s\" not found', val.source);\n } else if (source.type == 'vector' && type == 'raster') {\n error(key, val.source, 'layer \"%s\" requires a raster source', val.id);\n } else if (source.type == 'raster' && type != 'raster') {\n error(key, val.source, 'layer \"%s\" requires a vector source', val.id);\n }\n }\n }\n\n validate.object(key, val, reference.layer, {\n filter: validate.filter,\n layout: function(key, val) {\n var spec = reference['layout_' + type];\n return type && spec && validate(key, val, spec);\n },\n paint: function(key, val) {\n var spec = reference['paint_' + type];\n return type && spec && validate(key, val, spec);\n }\n });\n };\n\n validate.object = function (key, val, spec, validators) {\n validators = validators || {};\n\n var type = typeof_(val);\n if (type !== 'object') {\n return error(key, val, 'object expected, %s found', type);\n }\n\n for (var k in val) {\n var speckey = k.split('.')[0]; // treat 'paint.*' as 'paint'\n var def = spec[speckey] || spec['*'];\n var transition = speckey.match(/^(.*)-transition$/);\n\n if (def) {\n (validators[speckey] || validate)((key ? key + '.' : key) + k, val[k], def);\n } else if (transition && spec[transition[1]] && spec[transition[1]].transition) {\n validate((key ? key + '.' : key) + k, val[k], reference.transition);\n // tolerate root-level extra keys & arbitrary layer properties\n } else if (key !== '' && key.split('.').length !== 1) {\n error(key, val[k], 'unknown property \"%s\"', k);\n }\n }\n\n for (var l in spec) {\n if (spec[l].required && spec[l]['default'] === undefined && val[l] === undefined) {\n error(key, val, 'missing required property \"%s\"', l);\n }\n }\n };\n\n validate.array = function (key, val, spec, validator) {\n if (typeof_(val) !== 'array') {\n return error(key, val, 'array expected, %s found', typeof_(val));\n }\n\n if (spec.length && val.length !== spec.length) {\n return error(key, val, 'array length %d expected, length %d found', spec.length, val.length);\n }\n\n var value = {\n \"type\": spec.value\n };\n\n if (style.version < 7) {\n value.function = spec.function;\n }\n\n if (typeof_(spec.value) === 'object') {\n value = spec.value;\n }\n\n for (var i = 0; i < val.length; i++) {\n (validator || validate)(key + '[' + i + ']', val[i], value);\n }\n };\n\n validate.filter = function(key, val) {\n var type;\n\n if (typeof_(val) !== 'array') {\n return error(key, val, 'array expected, %s found', typeof_(val));\n }\n\n if (val.length < 1) {\n return error(key, val, 'filter array must have at least 1 element');\n }\n\n validate.enum(key + '[0]', val[0], reference.filter_operator);\n\n switch (unbundle(val[0])) {\n case '<':\n case '<=':\n case '>':\n case '>=':\n if (val.length >= 2 && val[1] == '$type') {\n error(key, val, '\"$type\" cannot be use with operator \"%s\"', val[0]);\n }\n /* falls through */\n case '==':\n case '!=':\n if (val.length != 3) {\n error(key, val, 'filter array for operator \"%s\" must have 3 elements', val[0]);\n }\n /* falls through */\n case 'in':\n case '!in':\n if (val.length >= 2) {\n type = typeof_(val[1]);\n if (type !== 'string') {\n error(key + '[1]', val[1], 'string expected, %s found', type);\n } else if (val[1][0] === '@') {\n error(key + '[1]', val[1], 'filter key cannot be a constant');\n }\n }\n for (var i = 2; i < val.length; i++) {\n type = typeof_(val[i]);\n if (val[1] == '$type') {\n validate.enum(key + '[' + i + ']', val[i], reference.geometry_type);\n } else if (type === 'string' && val[i][0] === '@') {\n error(key + '[' + i + ']', val[i], 'filter value cannot be a constant');\n } else if (type !== 'string' && type !== 'number' && type !== 'boolean') {\n error(key + '[' + i + ']', val[i], 'string, number, or boolean expected, %s found', type);\n }\n }\n break;\n\n case 'any':\n case 'all':\n case 'none':\n for (i = 1; i < val.length; i++) {\n validate.filter(key + '[' + i + ']', val[i]);\n }\n break;\n }\n };\n\n validate.function = function(key, val, spec) {\n validate.object(key, val, reference.function, {\n stops: function (key, val, arraySpec) {\n var lastStop = -Infinity;\n validate.array(key, val, arraySpec, function validateStop(key, val) {\n if (typeof_(val) !== 'array') {\n return error(key, val, 'array expected, %s found', typeof_(val));\n }\n\n if (val.length !== 2) {\n return error(key, val, 'array length %d expected, length %d found', 2, val.length);\n }\n\n validate(key + '[0]', val[0], {type: 'number'});\n validate(key + '[1]', val[1], spec);\n\n if (typeof_(val[0]) === 'number') {\n if (spec.function === 'piecewise-constant' && val[0] % 1 !== 0) {\n error(key + '[0]', val[0], 'zoom level for piecewise-constant functions must be an integer');\n }\n\n if (val[0] < lastStop) {\n error(key + '[0]', val[0], 'array stops must appear in ascending order');\n }\n\n lastStop = val[0];\n }\n });\n\n if (typeof_(val) === 'array' && val.length === 0) {\n error(key, val, 'array must have at least one stop');\n }\n }\n });\n };\n\n validate.enum = function (key, val, spec) {\n if (spec.values.indexOf(unbundle(val)) === -1) {\n error(key, val, 'expected one of [%s], %s found', spec.values.join(', '), val);\n }\n };\n\n validate.color = function(key, val) {\n var type = typeof_(val);\n if (type !== 'string') {\n error(key, val, 'color expected, %s found', type);\n } else if (parseCSSColor(val) === null) {\n error(key, val, 'color expected, \"%s\" found', val);\n }\n };\n\n function typeValidator(expected) {\n return function(key, val, spec) {\n var actual = typeof_(val);\n if (actual !== expected) {\n error(key, val, '%s expected, %s found', expected, actual);\n }\n\n if ('minimum' in spec && val < spec.minimum) {\n error(key, val, '%s is less than the minimum value %s', val, spec.minimum);\n }\n\n if ('maximum' in spec && val > spec.maximum) {\n error(key, val, '%s is greater than the maximum value %s', val, spec.maximum);\n }\n };\n }\n\n validate.number = typeValidator('number');\n validate.string = typeValidator('string');\n validate.boolean = typeValidator('boolean');\n\n validate['*'] = function() {};\n\n validate('', style, reference.$root);\n\n return errors;\n};\n\nfunction typeof_(val) {\n if (val instanceof Number)\n return 'number';\n if (val instanceof String)\n return 'string';\n if (val instanceof Boolean)\n return 'boolean';\n if (Array.isArray(val))\n return 'array';\n if (val === null)\n return 'null';\n return typeof val;\n}\n\nfunction unbundle(_) {\n if (_ instanceof Number ||\n _ instanceof String ||\n _ instanceof Boolean) {\n return _.valueOf();\n } else {\n return _;\n }\n}\n","var bundleFn = arguments[3];\nvar sources = arguments[4];\nvar cache = arguments[5];\n\nvar stringify = JSON.stringify;\n\nmodule.exports = function (fn) {\n var keys = [];\n var wkey;\n var cacheKeys = Object.keys(cache);\n \n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n if (cache[key].exports === fn) {\n wkey = key;\n break;\n }\n }\n \n if (!wkey) {\n wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n var wcache = {};\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n wcache[key] = key;\n }\n sources[wkey] = [\n Function(['require','module','exports'], '(' + fn + ')(self)'),\n wcache\n ];\n }\n var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n \n var scache = {}; scache[wkey] = wkey;\n sources[skey] = [\n Function(['require'],'require(' + stringify(wkey) + ')(self)'),\n scache\n ];\n \n var src = '(' + bundleFn + ')({'\n + Object.keys(sources).map(function (key) {\n return stringify(key) + ':['\n + sources[key][0]\n + ',' + stringify(sources[key][1]) + ']'\n ;\n }).join(',')\n + '},{},[' + stringify(skey) + '])'\n ;\n \n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;\n \n return new Worker(URL.createObjectURL(\n new Blob([src], { type: 'text/javascript' })\n ));\n};\n","'use strict';\n\nvar glify = undefined;\n\nmodule.exports = {\n \"debug\": {\"vertex\":\"precision mediump float;attribute vec2 a_pos;uniform float u_pointsize;uniform mat4 u_matrix;void main(){gl_Position=u_matrix*vec4(a_pos,step(32767.,a_pos.x),1);gl_PointSize=u_pointsize;}\",\"fragment\":\"precision mediump float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}\"},\n \"dot\": {\"vertex\":\"precision mediump float;uniform mat4 u_matrix;uniform float u_size;attribute vec2 a_pos;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);gl_PointSize=u_size;}\",\"fragment\":\"precision mediump float;uniform vec4 u_color;uniform float u_blur;void main(){float a,b;a=length(gl_PointCoord-.5);b=smoothstep(.5,.5-u_blur,a);gl_FragColor=u_color*b;}\"},\n \"fill\": {\"vertex\":\"precision mediump float;uniform mat4 u_matrix;attribute vec2 a_pos;attribute vec4 a_color;varying vec4 a;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);gl_PointSize=2.;a=a_color;}\",\"fragment\":\"precision mediump float;varying vec4 a;void main(){gl_FragColor=a;}\"},\n \"gaussian\": {\"vertex\":\"precision mediump float;attribute vec2 a_pos;uniform mat4 u_matrix;uniform vec2 u_offset;varying vec2 a[3];void main(){gl_Position=u_matrix*vec4(a_pos,0,1);vec2 b=gl_Position.xy/2.+.5;a[0]=b;a[1]=b+u_offset*1.1824255238063563;a[2]=b-u_offset*1.1824255238063563;}\",\"fragment\":\"precision mediump float;uniform sampler2D u_image;varying vec2 a[3];void main(){vec4 b=vec4(0);b+=texture2D(u_image,a[0])*.40261994689424746;b+=texture2D(u_image,a[1])*.2986900265528763;b+=texture2D(u_image,a[2])*.2986900265528763;gl_FragColor=b;}\"},\n \"line\": {\"vertex\":\"precision mediump float;attribute vec2 a_pos,a_linewidth;attribute vec4 a_data,a_color;attribute float a_blur;uniform highp mat4 u_matrix;uniform float u_ratio,u_extra;uniform mat2 u_antialiasingmatrix;varying vec2 a,e;varying float b,d,f;varying vec4 c;void main(){vec2 g,h;g=a_data.xy;h=mod(a_pos,2.);h.y=sign(h.y-.5);a=h;vec4 i=vec4(a_linewidth.s*g*.015873016,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5)+i.xy/u_ratio,0,1);float j,k,l;j=gl_Position.y/gl_Position.w;k=length(g)/length(u_antialiasingmatrix*g);l=1./(1.-j*u_extra);d=l*k;c=a_color;e=a_linewidth;f=a_blur;}\",\"fragment\":\"precision mediump float;uniform vec2 u_dasharray;varying vec4 c;varying vec2 a,e;varying float b,d,f;void main(){float g,h,i;g=length(a)*e.s;h=f*d;i=clamp(min(g-(e.t-h),e.s-g)/h,0.,1.);gl_FragColor=c*i;}\"},\n \"linepattern\": {\"vertex\":\"precision mediump float;attribute vec2 a_pos,a_linewidth;attribute vec4 a_data;attribute float a_blur,a_opacity;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_ratio;varying vec2 a,c;varying float b,d,e;void main(){vec2 f,h,i,j;f=a_data.xy;float g=a_data.z*128.+a_data.w;h=mod(a_pos,2.);h.y=sign(h.y-.5);a=h;i=f*.015873016;j=a_linewidth.s*i;gl_Position=u_matrix*vec4(floor(a_pos*.5)+j.xy/u_ratio,0,1);b=g;c=a_linewidth;d=a_blur;e=a_opacity;}\",\"fragment\":\"precision mediump float;uniform float u_point,u_fade;uniform vec2 u_pattern_size_a,u_pattern_size_b,u_pattern_tl_a,u_pattern_br_a,u_pattern_tl_b,u_pattern_br_b;uniform sampler2D u_image;varying vec2 a,c;varying float b,d,e;void main(){float f,g,h,i,j,k;f=length(a)*c.s;g=clamp(min(f-(c.t-d),c.s-f)/d,0.,1.);h=mod(b/u_pattern_size_a.x,1.);i=mod(b/u_pattern_size_b.x,1.);j=.5+a.y*c.s/u_pattern_size_a.y;k=.5+a.y*c.s/u_pattern_size_b.y;vec2 l,m;l=mix(u_pattern_tl_a,u_pattern_br_a,vec2(h,j));m=mix(u_pattern_tl_b,u_pattern_br_b,vec2(i,k));vec4 n=mix(texture2D(u_image,l),texture2D(u_image,m),u_fade);g*=e;gl_FragColor=n*g;}\"},\n \"linesdfpattern\": {\"vertex\":\"precision mediump float;attribute vec2 a_pos,a_linewidth;attribute vec4 a_data,a_color;attribute float a_blur;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_ratio,u_tex_y_a,u_tex_y_b;uniform vec2 u_patternscale_a,u_patternscale_b;varying vec2 a,b,c,e;varying vec4 d;varying float f;void main(){vec2 g,i;g=a_data.xy;float h=a_data.z*128.+a_data.w;i=mod(a_pos,2.);i.y=sign(i.y-.5);a=i;vec4 j=vec4(a_linewidth.s*g*.015873016,0,0);gl_Position=u_matrix*vec4(floor(a_pos*.5)+j.xy/u_ratio,0,1);b=vec2(h*u_patternscale_a.x,i.y*u_patternscale_a.y+u_tex_y_a);c=vec2(h*u_patternscale_b.x,i.y*u_patternscale_b.y+u_tex_y_b);d=a_color;e=a_linewidth;f=a_blur;}\",\"fragment\":\"precision mediump float;uniform sampler2D u_image;uniform float u_sdfgamma,u_mix;varying vec2 a,b,c,e;varying vec4 d;varying float f;void main(){float g,h,i,j,k;g=length(a)*e.s;h=clamp(min(g-(e.t-f),e.s-g)/f,0.,1.);i=texture2D(u_image,b).a;j=texture2D(u_image,c).a;k=mix(i,j,u_mix);h*=smoothstep(.5-u_sdfgamma,.5+u_sdfgamma,k);gl_FragColor=d*h;}\"},\n \"outline\": {\"vertex\":\"precision mediump float;attribute vec2 a_pos;attribute vec4 a_color;uniform highp mat4 u_matrix;uniform vec2 u_world;varying vec4 a;varying vec2 b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);b=(gl_Position.xy/gl_Position.w+1.)/2.*u_world;a=a_color;}\",\"fragment\":\"precision mediump float;varying vec4 a;varying vec2 b;void main(){float c,d;c=length(b-gl_FragCoord.xy);d=smoothstep(1.,0.,c);gl_FragColor=a*d;}\"},\n \"pattern\": {\"vertex\":\"precision mediump float;uniform mat4 u_matrix;uniform mat3 u_patternmatrix_a,u_patternmatrix_b;attribute vec2 a_pos;varying vec2 a,b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(u_patternmatrix_a*vec3(a_pos,1)).xy;b=(u_patternmatrix_b*vec3(a_pos,1)).xy;}\",\"fragment\":\"precision mediump float;uniform float u_opacity,u_mix;uniform vec2 u_pattern_tl_a,u_pattern_br_a,u_pattern_tl_b,u_pattern_br_b;uniform sampler2D u_image;varying vec2 a,b;void main(){vec2 c,d,f,g;c=mod(a,1.);d=mix(u_pattern_tl_a,u_pattern_br_a,c);vec4 e,h;e=texture2D(u_image,d);f=mod(b,1.);g=mix(u_pattern_tl_b,u_pattern_br_b,f);h=texture2D(u_image,g);gl_FragColor=mix(e,h,u_mix)*u_opacity;}\"},\n \"raster\": {\"vertex\":\"precision mediump float;uniform mat4 u_matrix;uniform vec2 u_tl_parent;uniform float u_scale_parent,u_buffer_scale;attribute vec2 a_pos,a_texture_pos;varying vec2 a,b;void main(){gl_Position=u_matrix*vec4(a_pos,0,1);a=(a_texture_pos/32767.-.5)/u_buffer_scale+.5;b=a*u_scale_parent+u_tl_parent;}\",\"fragment\":\"precision mediump float;uniform float u_opacity0,u_opacity1,u_brightness_low,u_brightness_high,u_saturation_factor,u_contrast_factor;uniform sampler2D u_image0,u_image1;varying vec2 a,b;uniform vec3 u_spin_weights;void main(){vec4 c,d,e;c=texture2D(u_image0,a);d=texture2D(u_image1,b);e=c*u_opacity0+d*u_opacity1;vec3 f,h,i;f=e.rgb;f=vec3(dot(f,u_spin_weights.xyz),dot(f,u_spin_weights.zxy),dot(f,u_spin_weights.yzx));float g=(e.r+e.g+e.b)/3.;f+=(g-f)*u_saturation_factor;f=(f-.5)*u_contrast_factor+.5;h=vec3(u_brightness_low);i=vec3(u_brightness_high);gl_FragColor=vec4(mix(h,i,f),e.a);}\"},\n \"icon\": {\"vertex\":\"precision mediump float;attribute vec2 a_pos,a_offset;attribute vec4 a_data1,a_data2;attribute float a_opacity;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_zoom,u_fadedist,u_minfadezoom,u_maxfadezoom,u_fadezoom,u_extra;uniform bool u_skewed;uniform vec2 u_texsize;varying vec2 a;varying float b;void main(){vec2 c,e;c=a_data1.xy;float d,f,g,h,i,j;d=a_data1[2];e=a_data2.st;f=e[0];g=e[1];h=10.;i=2.-step(f,u_zoom)-(1.-step(g,u_zoom));j=clamp((u_fadezoom-d)/u_fadedist,0.,1.);if(u_fadedist>=0.)b=j;else b=1.-j;if(u_maxfadezoom=d)b=1.;i+=step(b,0.);if(u_skewed){vec4 k=u_exmatrix*vec4(a_offset/64.,0,0);gl_Position=u_matrix*vec4(a_pos+k.xy,0,1);gl_Position.z+=i*gl_Position.w;}else{vec4 k=u_exmatrix*vec4(a_offset/64.,i,0);gl_Position=u_matrix*vec4(a_pos,0,1)+k;}a=c/u_texsize;b*=a_opacity;}\",\"fragment\":\"precision mediump float;uniform sampler2D u_texture;varying vec2 a;varying float b;void main(){gl_FragColor=texture2D(u_texture,a)*b;}\"},\n \"sdf\": {\"vertex\":\"precision mediump float;attribute vec2 a_pos,a_offset;attribute vec4 a_data1,a_data2,a_color;attribute float a_buffer,a_gamma;uniform highp mat4 u_matrix;uniform mat4 u_exmatrix;uniform float u_zoom,u_fadedist,u_minfadezoom,u_maxfadezoom,u_fadezoom,u_extra;uniform bool u_skewed;uniform vec2 u_texsize;varying vec2 a;varying float b,c,e,f;varying vec4 d;void main(){vec2 g,i;g=a_data1.xy;float h,j,k,l,m,n,o;h=a_data1[2];i=a_data2.st;j=i[0];k=i[1];l=2.-step(j,u_zoom)-(1.-step(k,u_zoom));m=clamp((u_fadezoom-h)/u_fadedist,0.,1.);if(u_fadedist>=0.)b=m;else b=1.-m;if(u_maxfadezoom=h)b=1.;l+=step(b,0.);if(u_skewed){vec4 n=u_exmatrix*vec4(a_offset/64.,0,0);gl_Position=u_matrix*vec4(a_pos+n.xy,0,1);gl_Position.z+=l*gl_Position.w;}else{vec4 n=u_exmatrix*vec4(a_offset/64.,l,0);gl_Position=u_matrix*vec4(a_pos,0,1)+n;}n=gl_Position.y/gl_Position.w;o=1./(1.-n*u_extra);c=o;a=g/u_texsize;d=a_color;e=a_buffer;f=a_gamma;}\",\"fragment\":\"precision mediump float;uniform sampler2D u_texture;varying vec2 a;varying float b,c,e,f;varying vec4 d;void main(){float g,h,i;g=f*c;h=texture2D(u_texture,a).a;i=smoothstep(e-g,e+g,h)*b;gl_FragColor=d*i;}\"},\n \"collisionbox\": {\"vertex\":\"precision mediump float;attribute vec2 a_pos,a_extrude,a_data;uniform mat4 u_matrix;uniform float u_scale;varying float a,b;void main(){gl_Position=u_matrix*vec4(a_pos+a_extrude/u_scale,0,1);a=a_data.x;b=a_data.y;}\",\"fragment\":\"precision mediump float;uniform float u_zoom,u_maxzoom;varying float a,b;void main(){float c=.5;gl_FragColor=vec4(0,1,0,1)*c;if(b>u_zoom)gl_FragColor=vec4(1,0,0,1)*c;if(u_zoom>=a)gl_FragColor=vec4(0,0,0,1)*c*.25;if(b>=u_maxzoom)gl_FragColor=vec4(0,0,1,1)*c*.2;}\"}\n};\n","'use strict';\n\nmodule.exports = drawPlacementDebug;\n\nfunction drawPlacementDebug(painter, layer, posMatrix, tile) {\n\n var elementGroups = tile.elementGroups[layer.ref || layer.id].collisionBox;\n if (!elementGroups) return;\n\n var gl = painter.gl;\n var buffer = tile.buffers.collisionBoxVertex;\n var shader = painter.collisionBoxShader;\n\n gl.enable(gl.STENCIL_TEST);\n\n gl.switchShader(shader, posMatrix);\n buffer.bind(gl, shader);\n gl.lineWidth(1);\n\n var stride = 12;\n gl.vertexAttribPointer(shader.a_pos, 2, gl.SHORT, false, stride, 0);\n gl.vertexAttribPointer(shader.a_extrude, 2, gl.SHORT, false, stride, 4);\n gl.vertexAttribPointer(shader.a_data, 2, gl.UNSIGNED_BYTE, false, stride, 8);\n\n gl.uniform1f(shader.u_scale, Math.pow(2, painter.transform.zoom - tile.coord.z));\n gl.uniform1f(shader.u_zoom, painter.transform.zoom * 10);\n gl.uniform1f(shader.u_maxzoom, (tile.coord.z + 1) * 10);\n\n var begin = elementGroups.groups[0].vertexStartIndex;\n var len = elementGroups.groups[0].vertexLength;\n gl.drawArrays(gl.LINES, begin, len);\n\n gl.disable(gl.STENCIL_TEST);\n}\n","'use strict';\n\n// Font data From Hershey Simplex Font\n// http://paulbourke.net/dataformats/hershey/\nvar simplexFont = {\n \" \": [16, []],\n \"!\": [10, [5, 21, 5, 7, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n \"\\\"\": [16, [4, 21, 4, 14, -1, -1, 12, 21, 12, 14]],\n \"#\": [21, [11, 25, 4, -7, -1, -1, 17, 25, 10, -7, -1, -1, 4, 12, 18, 12, -1, -1, 3, 6, 17, 6]],\n \"$\": [20, [8, 25, 8, -4, -1, -1, 12, 25, 12, -4, -1, -1, 17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]],\n \"%\": [24, [21, 21, 3, 0, -1, -1, 8, 21, 10, 19, 10, 17, 9, 15, 7, 14, 5, 14, 3, 16, 3, 18, 4, 20, 6, 21, 8, 21, 10, 20, 13, 19, 16, 19, 19, 20, 21, 21, -1, -1, 17, 7, 15, 6, 14, 4, 14, 2, 16, 0, 18, 0, 20, 1, 21, 3, 21, 5, 19, 7, 17, 7]],\n \"&\": [26, [23, 12, 23, 13, 22, 14, 21, 14, 20, 13, 19, 11, 17, 6, 15, 3, 13, 1, 11, 0, 7, 0, 5, 1, 4, 2, 3, 4, 3, 6, 4, 8, 5, 9, 12, 13, 13, 14, 14, 16, 14, 18, 13, 20, 11, 21, 9, 20, 8, 18, 8, 16, 9, 13, 11, 10, 16, 3, 18, 1, 20, 0, 22, 0, 23, 1, 23, 2]],\n \"'\": [10, [5, 19, 4, 20, 5, 21, 6, 20, 6, 18, 5, 16, 4, 15]],\n \"(\": [14, [11, 25, 9, 23, 7, 20, 5, 16, 4, 11, 4, 7, 5, 2, 7, -2, 9, -5, 11, -7]],\n \")\": [14, [3, 25, 5, 23, 7, 20, 9, 16, 10, 11, 10, 7, 9, 2, 7, -2, 5, -5, 3, -7]],\n \"*\": [16, [8, 21, 8, 9, -1, -1, 3, 18, 13, 12, -1, -1, 13, 18, 3, 12]],\n \"+\": [26, [13, 18, 13, 0, -1, -1, 4, 9, 22, 9]],\n \",\": [10, [6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]],\n \"-\": [26, [4, 9, 22, 9]],\n \".\": [10, [5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n \"/\": [22, [20, 25, 2, -7]],\n \"0\": [20, [9, 21, 6, 20, 4, 17, 3, 12, 3, 9, 4, 4, 6, 1, 9, 0, 11, 0, 14, 1, 16, 4, 17, 9, 17, 12, 16, 17, 14, 20, 11, 21, 9, 21]],\n \"1\": [20, [6, 17, 8, 18, 11, 21, 11, 0]],\n \"2\": [20, [4, 16, 4, 17, 5, 19, 6, 20, 8, 21, 12, 21, 14, 20, 15, 19, 16, 17, 16, 15, 15, 13, 13, 10, 3, 0, 17, 0]],\n \"3\": [20, [5, 21, 16, 21, 10, 13, 13, 13, 15, 12, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]],\n \"4\": [20, [13, 21, 3, 7, 18, 7, -1, -1, 13, 21, 13, 0]],\n \"5\": [20, [15, 21, 5, 21, 4, 12, 5, 13, 8, 14, 11, 14, 14, 13, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]],\n \"6\": [20, [16, 18, 15, 20, 12, 21, 10, 21, 7, 20, 5, 17, 4, 12, 4, 7, 5, 3, 7, 1, 10, 0, 11, 0, 14, 1, 16, 3, 17, 6, 17, 7, 16, 10, 14, 12, 11, 13, 10, 13, 7, 12, 5, 10, 4, 7]],\n \"7\": [20, [17, 21, 7, 0, -1, -1, 3, 21, 17, 21]],\n \"8\": [20, [8, 21, 5, 20, 4, 18, 4, 16, 5, 14, 7, 13, 11, 12, 14, 11, 16, 9, 17, 7, 17, 4, 16, 2, 15, 1, 12, 0, 8, 0, 5, 1, 4, 2, 3, 4, 3, 7, 4, 9, 6, 11, 9, 12, 13, 13, 15, 14, 16, 16, 16, 18, 15, 20, 12, 21, 8, 21]],\n \"9\": [20, [16, 14, 15, 11, 13, 9, 10, 8, 9, 8, 6, 9, 4, 11, 3, 14, 3, 15, 4, 18, 6, 20, 9, 21, 10, 21, 13, 20, 15, 18, 16, 14, 16, 9, 15, 4, 13, 1, 10, 0, 8, 0, 5, 1, 4, 3]],\n \":\": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]],\n \";\": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]],\n \"<\": [24, [20, 18, 4, 9, 20, 0]],\n \"=\": [26, [4, 12, 22, 12, -1, -1, 4, 6, 22, 6]],\n \">\": [24, [4, 18, 20, 9, 4, 0]],\n \"?\": [18, [3, 16, 3, 17, 4, 19, 5, 20, 7, 21, 11, 21, 13, 20, 14, 19, 15, 17, 15, 15, 14, 13, 13, 12, 9, 10, 9, 7, -1, -1, 9, 2, 8, 1, 9, 0, 10, 1, 9, 2]],\n \"@\": [27, [18, 13, 17, 15, 15, 16, 12, 16, 10, 15, 9, 14, 8, 11, 8, 8, 9, 6, 11, 5, 14, 5, 16, 6, 17, 8, -1, -1, 12, 16, 10, 14, 9, 11, 9, 8, 10, 6, 11, 5, -1, -1, 18, 16, 17, 8, 17, 6, 19, 5, 21, 5, 23, 7, 24, 10, 24, 12, 23, 15, 22, 17, 20, 19, 18, 20, 15, 21, 12, 21, 9, 20, 7, 19, 5, 17, 4, 15, 3, 12, 3, 9, 4, 6, 5, 4, 7, 2, 9, 1, 12, 0, 15, 0, 18, 1, 20, 2, 21, 3, -1, -1, 19, 16, 18, 8, 18, 6, 19, 5]],\n \"A\": [18, [9, 21, 1, 0, -1, -1, 9, 21, 17, 0, -1, -1, 4, 7, 14, 7]],\n \"B\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, -1, -1, 4, 11, 13, 11, 16, 10, 17, 9, 18, 7, 18, 4, 17, 2, 16, 1, 13, 0, 4, 0]],\n \"C\": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5]],\n \"D\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 11, 21, 14, 20, 16, 18, 17, 16, 18, 13, 18, 8, 17, 5, 16, 3, 14, 1, 11, 0, 4, 0]],\n \"E\": [19, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11, -1, -1, 4, 0, 17, 0]],\n \"F\": [18, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11]],\n \"G\": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 18, 8, -1, -1, 13, 8, 18, 8]],\n \"H\": [22, [4, 21, 4, 0, -1, -1, 18, 21, 18, 0, -1, -1, 4, 11, 18, 11]],\n \"I\": [8, [4, 21, 4, 0]],\n \"J\": [16, [12, 21, 12, 5, 11, 2, 10, 1, 8, 0, 6, 0, 4, 1, 3, 2, 2, 5, 2, 7]],\n \"K\": [21, [4, 21, 4, 0, -1, -1, 18, 21, 4, 7, -1, -1, 9, 12, 18, 0]],\n \"L\": [17, [4, 21, 4, 0, -1, -1, 4, 0, 16, 0]],\n \"M\": [24, [4, 21, 4, 0, -1, -1, 4, 21, 12, 0, -1, -1, 20, 21, 12, 0, -1, -1, 20, 21, 20, 0]],\n \"N\": [22, [4, 21, 4, 0, -1, -1, 4, 21, 18, 0, -1, -1, 18, 21, 18, 0]],\n \"O\": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21]],\n \"P\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 14, 17, 12, 16, 11, 13, 10, 4, 10]],\n \"Q\": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, -1, -1, 12, 4, 18, -2]],\n \"R\": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, 4, 11, -1, -1, 11, 11, 18, 0]],\n \"S\": [20, [17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]],\n \"T\": [16, [8, 21, 8, 0, -1, -1, 1, 21, 15, 21]],\n \"U\": [22, [4, 21, 4, 6, 5, 3, 7, 1, 10, 0, 12, 0, 15, 1, 17, 3, 18, 6, 18, 21]],\n \"V\": [18, [1, 21, 9, 0, -1, -1, 17, 21, 9, 0]],\n \"W\": [24, [2, 21, 7, 0, -1, -1, 12, 21, 7, 0, -1, -1, 12, 21, 17, 0, -1, -1, 22, 21, 17, 0]],\n \"X\": [20, [3, 21, 17, 0, -1, -1, 17, 21, 3, 0]],\n \"Y\": [18, [1, 21, 9, 11, 9, 0, -1, -1, 17, 21, 9, 11]],\n \"Z\": [20, [17, 21, 3, 0, -1, -1, 3, 21, 17, 21, -1, -1, 3, 0, 17, 0]],\n \"[\": [14, [4, 25, 4, -7, -1, -1, 5, 25, 5, -7, -1, -1, 4, 25, 11, 25, -1, -1, 4, -7, 11, -7]],\n \"\\\\\": [14, [0, 21, 14, -3]],\n \"]\": [14, [9, 25, 9, -7, -1, -1, 10, 25, 10, -7, -1, -1, 3, 25, 10, 25, -1, -1, 3, -7, 10, -7]],\n \"^\": [16, [6, 15, 8, 18, 10, 15, -1, -1, 3, 12, 8, 17, 13, 12, -1, -1, 8, 17, 8, 0]],\n \"_\": [16, [0, -2, 16, -2]],\n \"`\": [10, [6, 21, 5, 20, 4, 18, 4, 16, 5, 15, 6, 16, 5, 17]],\n \"a\": [19, [15, 14, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n \"b\": [19, [4, 21, 4, 0, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]],\n \"c\": [18, [15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n \"d\": [19, [15, 21, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n \"e\": [18, [3, 8, 15, 8, 15, 10, 14, 12, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n \"f\": [12, [10, 21, 8, 21, 6, 20, 5, 17, 5, 0, -1, -1, 2, 14, 9, 14]],\n \"g\": [19, [15, 14, 15, -2, 14, -5, 13, -6, 11, -7, 8, -7, 6, -6, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n \"h\": [19, [4, 21, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]],\n \"i\": [8, [3, 21, 4, 20, 5, 21, 4, 22, 3, 21, -1, -1, 4, 14, 4, 0]],\n \"j\": [10, [5, 21, 6, 20, 7, 21, 6, 22, 5, 21, -1, -1, 6, 14, 6, -3, 5, -6, 3, -7, 1, -7]],\n \"k\": [17, [4, 21, 4, 0, -1, -1, 14, 14, 4, 4, -1, -1, 8, 8, 15, 0]],\n \"l\": [8, [4, 21, 4, 0]],\n \"m\": [30, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0, -1, -1, 15, 10, 18, 13, 20, 14, 23, 14, 25, 13, 26, 10, 26, 0]],\n \"n\": [19, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]],\n \"o\": [19, [8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3, 16, 6, 16, 8, 15, 11, 13, 13, 11, 14, 8, 14]],\n \"p\": [19, [4, 14, 4, -7, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]],\n \"q\": [19, [15, 14, 15, -7, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]],\n \"r\": [13, [4, 14, 4, 0, -1, -1, 4, 8, 5, 11, 7, 13, 9, 14, 12, 14]],\n \"s\": [17, [14, 11, 13, 13, 10, 14, 7, 14, 4, 13, 3, 11, 4, 9, 6, 8, 11, 7, 13, 6, 14, 4, 14, 3, 13, 1, 10, 0, 7, 0, 4, 1, 3, 3]],\n \"t\": [12, [5, 21, 5, 4, 6, 1, 8, 0, 10, 0, -1, -1, 2, 14, 9, 14]],\n \"u\": [19, [4, 14, 4, 4, 5, 1, 7, 0, 10, 0, 12, 1, 15, 4, -1, -1, 15, 14, 15, 0]],\n \"v\": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0]],\n \"w\": [22, [3, 14, 7, 0, -1, -1, 11, 14, 7, 0, -1, -1, 11, 14, 15, 0, -1, -1, 19, 14, 15, 0]],\n \"x\": [17, [3, 14, 14, 0, -1, -1, 14, 14, 3, 0]],\n \"y\": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0, 6, -4, 4, -6, 2, -7, 1, -7]],\n \"z\": [17, [14, 14, 3, 0, -1, -1, 3, 14, 14, 14, -1, -1, 3, 0, 14, 0]],\n \"{\": [14, [9, 25, 7, 24, 6, 23, 5, 21, 5, 19, 6, 17, 7, 16, 8, 14, 8, 12, 6, 10, -1, -1, 7, 24, 6, 22, 6, 20, 7, 18, 8, 17, 9, 15, 9, 13, 8, 11, 4, 9, 8, 7, 9, 5, 9, 3, 8, 1, 7, 0, 6, -2, 6, -4, 7, -6, -1, -1, 6, 8, 8, 6, 8, 4, 7, 2, 6, 1, 5, -1, 5, -3, 6, -5, 7, -6, 9, -7]],\n \"|\": [8, [4, 25, 4, -7]],\n \"}\": [14, [5, 25, 7, 24, 8, 23, 9, 21, 9, 19, 8, 17, 7, 16, 6, 14, 6, 12, 8, 10, -1, -1, 7, 24, 8, 22, 8, 20, 7, 18, 6, 17, 5, 15, 5, 13, 6, 11, 10, 9, 6, 7, 5, 5, 5, 3, 6, 1, 7, 0, 8, -2, 8, -4, 7, -6, -1, -1, 8, 8, 6, 6, 6, 4, 7, 2, 8, 1, 9, -1, 9, -3, 8, -5, 7, -6, 5, -7]],\n \"~\": [24, [3, 6, 3, 8, 4, 11, 6, 12, 8, 12, 10, 11, 14, 8, 16, 7, 18, 7, 20, 8, 21, 10, -1, -1, 3, 8, 4, 10, 6, 11, 8, 11, 10, 10, 14, 7, 16, 6, 18, 6, 20, 7, 21, 10, 21, 12]]\n};\n\nmodule.exports = function textVertices(text, left, baseline, scale) {\n scale = scale || 1;\n\n var strokes = [],\n i, len, j, len2, glyph, x, y, prev;\n\n for (i = 0, len = text.length; i < len; i++) {\n glyph = simplexFont[text[i]];\n if (!glyph) continue;\n prev = null;\n\n for (j = 0, len2 = glyph[1].length; j < len2; j += 2) {\n if (glyph[1][j] === -1 && glyph[1][j + 1] === -1) {\n prev = null;\n\n } else {\n x = left + glyph[1][j] * scale;\n y = baseline - glyph[1][j + 1] * scale;\n if (prev) {\n strokes.push(prev.x, prev.y, x, y);\n }\n prev = {x: x, y: y};\n }\n }\n left += glyph[0] * scale;\n }\n\n return strokes;\n};\n","module.exports = require('mapbox-gl-style-spec/reference/latest');\n","'use strict';\n\nvar parseCSSColor = require('csscolorparser').parseCSSColor;\nvar mapboxGLFunction = require('mapbox-gl-function');\nvar util = require('../util/util');\n\nmodule.exports = StyleDeclaration;\n\nfunction StyleDeclaration(reference, value) {\n this.type = reference.type;\n this.transitionable = reference.transition;\n\n // immutable representation of value. used for comparison\n this.json = JSON.stringify(value);\n\n if (this.type !== 'color') {\n this.value = value;\n } else if (value.stops) {\n this.value = prepareColorFunction(value);\n } else {\n this.value = parseColor(value);\n }\n\n if (reference.function === 'interpolated') {\n this.calculate = mapboxGLFunction.interpolated(this.value);\n } else {\n this.calculate = mapboxGLFunction['piecewise-constant'](this.value);\n if (reference.transition) {\n this.calculate = transitioned(this.calculate);\n }\n }\n}\n\nfunction transitioned(calculate) {\n return function(z, zh, duration) {\n var fraction = z % 1;\n var t = Math.min((Date.now() - zh.lastIntegerZoomTime) / duration, 1);\n var fromScale = 1;\n var toScale = 1;\n var mix, from, to;\n\n if (z > zh.lastIntegerZoom) {\n mix = fraction + (1 - fraction) * t;\n fromScale *= 2;\n from = calculate(z - 1);\n to = calculate(z);\n } else {\n mix = 1 - (1 - t) * fraction;\n to = calculate(z);\n from = calculate(z + 1);\n fromScale /= 2;\n }\n\n return {\n from: from,\n fromScale: fromScale,\n to: to,\n toScale: toScale,\n t: mix\n };\n };\n}\n\nvar colorCache = {};\n\nfunction parseColor(value) {\n if (colorCache[value]) return colorCache[value];\n var color = prepareColor(parseCSSColor(value));\n colorCache[value] = color;\n return color;\n}\n\nfunction prepareColor(c) {\n return [c[0] / 255, c[1] / 255, c[2] / 255, c[3] / 1];\n}\n\nfunction prepareColorFunction(f) {\n return util.extend({}, f, {stops: f.stops.map(function(stop) {\n return [stop[0], parseColor(stop[1])];\n })});\n}\n","exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = nBytes * 8 - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = nBytes * 8 - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","// (c) Dean McNamee , 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) { // Clamp to integer 0 .. 255.\n i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) { // Clamp to float 0.0 .. 1.0.\n return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) { // int or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_byte(parseFloat(str) / 100 * 255);\n return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) { // float or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_float(parseFloat(str) / 100);\n return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n if (h < 0) h += 1;\n else if (h > 1) h -= 1;\n\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n return m1;\n}\n\nfunction parseCSSColor(css_str) {\n // Remove all whitespace, not compliant, but should just be more accepting.\n var str = css_str.replace(/ /g, '').toLowerCase();\n\n // Color keywords (and transparent) lookup.\n if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.\n\n // #abc and #abc123 syntax.\n if (str[0] === '#') {\n if (str.length === 4) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.\n return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n (iv & 0xf0) | ((iv & 0xf0) >> 4),\n (iv & 0xf) | ((iv & 0xf) << 4),\n 1];\n } else if (str.length === 7) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.\n return [(iv & 0xff0000) >> 16,\n (iv & 0xff00) >> 8,\n iv & 0xff,\n 1];\n }\n\n return null;\n }\n\n var op = str.indexOf('('), ep = str.indexOf(')');\n if (op !== -1 && ep + 1 === str.length) {\n var fname = str.substr(0, op);\n var params = str.substr(op+1, ep-(op+1)).split(',');\n var alpha = 1; // To allow case fallthrough.\n switch (fname) {\n case 'rgba':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'rgb':\n if (params.length !== 3) return null;\n return [parse_css_int(params[0]),\n parse_css_int(params[1]),\n parse_css_int(params[2]),\n alpha];\n case 'hsla':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'hsl':\n if (params.length !== 3) return null;\n var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1\n // NOTE(deanm): According to the CSS spec s/l should only be\n // percentages, but we don't bother and let float or percentage.\n var s = parse_css_float(params[1]);\n var l = parse_css_float(params[2]);\n var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var m1 = l * 2 - m2;\n return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n alpha];\n default:\n return null;\n }\n }\n\n return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n","'use strict';\n\nvar FeatureTree = require('../data/feature_tree');\nvar CollisionTile = require('../symbol/collision_tile');\nvar BufferSet = require('../data/buffer/buffer_set');\nvar createBucket = require('../data/create_bucket');\n\nmodule.exports = WorkerTile;\n\nfunction WorkerTile(params) {\n this.coord = params.coord;\n this.uid = params.uid;\n this.zoom = params.zoom;\n this.maxZoom = params.maxZoom;\n this.tileSize = params.tileSize;\n this.source = params.source;\n this.overscaling = params.overscaling;\n this.angle = params.angle;\n this.pitch = params.pitch;\n this.collisionDebug = params.collisionDebug;\n\n this.stacks = {};\n}\n\nWorkerTile.prototype.parse = function(data, layers, actor, callback) {\n\n this.status = 'parsing';\n\n this.featureTree = new FeatureTree(this.coord, this.overscaling);\n\n var i, k,\n tile = this,\n layer,\n bucket,\n buffers = new BufferSet(),\n collisionTile = new CollisionTile(this.angle, this.pitch),\n buckets = {},\n bucketsInOrder = this.bucketsInOrder = [],\n bucketsBySourceLayer = {};\n\n // Map non-ref layers to buckets.\n for (i = 0; i < layers.length; i++) {\n layer = layers[i];\n\n if (layer.source !== this.source)\n continue;\n\n if (layer.ref)\n continue;\n\n var minzoom = layer.minzoom;\n if (minzoom && this.zoom < minzoom && minzoom < this.maxZoom)\n continue;\n\n var maxzoom = layer.maxzoom;\n if (maxzoom && this.zoom >= maxzoom)\n continue;\n\n var visibility = layer.layout.visibility;\n if (visibility === 'none')\n continue;\n\n bucket = createBucket(layer, buffers, this.zoom, this.overscaling, this.collisionDebug);\n bucket.layers = [layer.id];\n\n buckets[bucket.id] = bucket;\n bucketsInOrder.push(bucket);\n\n if (data.layers) {\n // vectortile\n var sourceLayer = layer['source-layer'];\n if (!bucketsBySourceLayer[sourceLayer])\n bucketsBySourceLayer[sourceLayer] = {};\n bucketsBySourceLayer[sourceLayer][bucket.id] = bucket;\n } else {\n // geojson tile\n bucketsBySourceLayer[bucket.id] = bucket;\n }\n }\n\n // Index ref layers.\n for (i = 0; i < layers.length; i++) {\n layer = layers[i];\n\n if (layer.source !== this.source)\n continue;\n\n if (!layer.ref)\n continue;\n\n bucket = buckets[layer.ref];\n if (!bucket)\n continue;\n\n bucket.layers.push(layer.id);\n }\n\n var extent = 4096;\n\n // read each layer, and sort its features into buckets\n if (data.layers) {\n // vectortile\n for (k in bucketsBySourceLayer) {\n layer = data.layers[k];\n if (!layer) continue;\n if (layer.extent) extent = layer.extent;\n sortLayerIntoBuckets(layer, bucketsBySourceLayer[k]);\n }\n } else {\n // geojson\n sortLayerIntoBuckets(data, bucketsBySourceLayer);\n }\n\n function sortLayerIntoBuckets(layer, buckets) {\n for (var i = 0; i < layer.length; i++) {\n var feature = layer.feature(i);\n for (var key in buckets) {\n var bucket = buckets[key];\n if (bucket.filter(feature)) {\n bucket.features.push(feature);\n }\n }\n }\n }\n\n var prevPlacementBucket;\n var remaining = bucketsInOrder.length;\n\n /*\n * The async parsing here is a bit tricky.\n * Some buckets depend on resources that may need to be loaded async (glyphs).\n * Some buckets need to be parsed in order (to get collision priorities right).\n *\n * Dependencies calls are initiated first to get those rolling.\n * Buckets that don't need to be parsed in order, aren't to save time.\n */\n\n for (i = 0; i < bucketsInOrder.length; i++) {\n bucket = bucketsInOrder[i];\n\n // Link buckets that need to be parsed in order\n if (bucket.needsPlacement) {\n if (prevPlacementBucket) {\n prevPlacementBucket.next = bucket;\n } else {\n bucket.previousPlaced = true;\n }\n prevPlacementBucket = bucket;\n }\n\n if (bucket.getDependencies) {\n bucket.getDependencies(this, actor, dependenciesDone(bucket));\n }\n\n // immediately parse buckets where order doesn't matter and no dependencies\n if (!bucket.needsPlacement && !bucket.getDependencies) {\n parseBucket(tile, bucket);\n }\n }\n\n function dependenciesDone(bucket) {\n return function(err) {\n bucket.dependenciesLoaded = true;\n parseBucket(tile, bucket, err);\n };\n }\n\n function parseBucket(tile, bucket, skip) {\n if (bucket.getDependencies && !bucket.dependenciesLoaded) return;\n if (bucket.needsPlacement && !bucket.previousPlaced) return;\n\n if (!skip) {\n var now = Date.now();\n if (bucket.features.length) bucket.addFeatures(collisionTile);\n var time = Date.now() - now;\n if (bucket.interactive) {\n for (var i = 0; i < bucket.features.length; i++) {\n var feature = bucket.features[i];\n tile.featureTree.insert(feature.bbox(), bucket.layers, feature);\n }\n }\n if (typeof self !== 'undefined') {\n self.bucketStats = self.bucketStats || {_total: 0};\n self.bucketStats._total += time;\n self.bucketStats[bucket.id] = (self.bucketStats[bucket.id] || 0) + time;\n }\n }\n\n remaining--;\n\n if (!remaining) {\n done();\n return;\n }\n\n // try parsing the next bucket, if it is ready\n if (bucket.next) {\n bucket.next.previousPlaced = true;\n parseBucket(tile, bucket.next);\n }\n }\n\n function done() {\n\n tile.status = 'done';\n\n if (tile.redoPlacementAfterDone) {\n var result = tile.redoPlacement(tile.angle, tile.pitch).result;\n buffers.glyphVertex = result.buffers.glyphVertex;\n buffers.iconVertex = result.buffers.iconVertex;\n buffers.collisionBoxVertex = result.buffers.collisionBoxVertex;\n }\n\n var transferables = [],\n elementGroups = {};\n\n for (k in buffers) {\n transferables.push(buffers[k].array);\n }\n\n for (k in buckets) {\n elementGroups[k] = buckets[k].elementGroups;\n }\n\n callback(null, {\n elementGroups: elementGroups,\n buffers: buffers,\n extent: extent\n }, transferables);\n }\n};\n\nWorkerTile.prototype.redoPlacement = function(angle, pitch, collisionDebug) {\n\n if (this.status !== 'done') {\n this.redoPlacementAfterDone = true;\n this.angle = angle;\n return {};\n }\n\n var buffers = new BufferSet();\n var transferables = [];\n var elementGroups = {};\n var collisionTile = new CollisionTile(angle, pitch);\n\n var bucketsInOrder = this.bucketsInOrder;\n for (var i = 0; i < bucketsInOrder.length; i++) {\n var bucket = bucketsInOrder[i];\n\n if (bucket.type === 'symbol') {\n bucket.placeFeatures(collisionTile, buffers, collisionDebug);\n elementGroups[bucket.id] = bucket.elementGroups;\n }\n }\n\n for (var k in buffers) {\n transferables.push(buffers[k].array);\n }\n\n return {\n result: {\n elementGroups: elementGroups,\n buffers: buffers\n },\n transferables: transferables\n };\n\n};\n","'use strict';\n\nvar Point = require('point-geometry');\nvar VectorTileFeature = require('vector-tile').VectorTileFeature;\n\nmodule.exports = GeoJSONWrapper;\n\n// conform to vectortile api\nfunction GeoJSONWrapper(features) {\n this.features = features;\n this.length = features.length;\n}\n\nGeoJSONWrapper.prototype.feature = function(i) {\n return new FeatureWrapper(this.features[i]);\n};\n\nfunction FeatureWrapper(feature) {\n this.type = feature.type;\n this.rawGeometry = feature.type === 1 ? [feature.geometry] : feature.geometry;\n this.properties = feature.tags;\n this.extent = 4096;\n}\n\nFeatureWrapper.prototype.loadGeometry = function() {\n var rings = this.rawGeometry;\n this.geometry = [];\n\n for (var i = 0; i < rings.length; i++) {\n var ring = rings[i],\n newRing = [];\n for (var j = 0; j < ring.length; j++) {\n newRing.push(new Point(ring[j][0], ring[j][1]));\n }\n this.geometry.push(newRing);\n }\n return this.geometry;\n};\n\nFeatureWrapper.prototype.bbox = function() {\n if (!this.geometry) this.loadGeometry();\n\n var rings = this.geometry,\n x1 = Infinity,\n x2 = -Infinity,\n y1 = Infinity,\n y2 = -Infinity;\n\n for (var i = 0; i < rings.length; i++) {\n var ring = rings[i];\n\n for (var j = 0; j < ring.length; j++) {\n var coord = ring[j];\n\n x1 = Math.min(x1, coord.x);\n x2 = Math.max(x2, coord.x);\n y1 = Math.min(y1, coord.y);\n y2 = Math.max(y2, coord.y);\n }\n }\n\n return [x1, y1, x2, y2];\n};\n\nFeatureWrapper.prototype.toGeoJSON = VectorTileFeature.prototype.toGeoJSON;\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n","'use strict';\n\nvar util = require('../../util/util');\nvar Buffer = require('./buffer');\n\nmodule.exports = LineVertexBuffer;\n\nfunction LineVertexBuffer(buffer) {\n Buffer.call(this, buffer);\n}\n\n// scale the extrusion vector so that the normal length is this value.\n// contains the \"texture\" normals (-1..1). this is distinct from the extrude\n// normals for line joins, because the x-value remains 0 for the texture\n// normal array, while the extrude normal actually moves the vertex to create\n// the acute/bevelled line join.\nLineVertexBuffer.extrudeScale = 63;\n\nLineVertexBuffer.prototype = util.inherit(Buffer, {\n itemSize: 8, // bytes per vertex (2 * short + 1 * short + 2 * byte = 8 bytes)\n defaultLength: 32768,\n\n // add a vertex to this buffer;\n // x, y - vertex position\n // ex, ey - extrude normal\n // tx, ty - texture normal\n add: function(point, extrude, tx, ty, linesofar) {\n var pos = this.pos,\n pos2 = pos / 2,\n index = this.index,\n extrudeScale = LineVertexBuffer.extrudeScale;\n\n this.resize();\n\n this.shorts[pos2 + 0] = (Math.floor(point.x) * 2) | tx;\n this.shorts[pos2 + 1] = (Math.floor(point.y) * 2) | ty;\n\n this.bytes[pos + 4] = Math.round(extrudeScale * extrude.x);\n this.bytes[pos + 5] = Math.round(extrudeScale * extrude.y);\n this.bytes[pos + 6] = (linesofar || 0) / 128;\n this.bytes[pos + 7] = (linesofar || 0) % 128;\n\n this.pos += this.itemSize;\n return index;\n }\n});\n","'use strict';\n\nvar util = require('../../util/util');\nvar Buffer = require('./buffer');\n\nmodule.exports = LineElementBuffer;\n\nfunction LineElementBuffer(buffer) {\n Buffer.call(this, buffer);\n}\n\nLineElementBuffer.prototype = util.inherit(Buffer, {\n itemSize: 6, // bytes per triangle (3 * unsigned short == 6 bytes)\n arrayType: 'ELEMENT_ARRAY_BUFFER',\n\n add: function(a, b, c) {\n var pos2 = this.pos / 2;\n\n this.resize();\n\n this.ushorts[pos2 + 0] = a;\n this.ushorts[pos2 + 1] = b;\n this.ushorts[pos2 + 2] = c;\n\n this.pos += this.itemSize;\n }\n});\n","'use strict';\n\nvar util = require('../../util/util');\nvar Buffer = require('./buffer');\n\nmodule.exports = FillVertexBuffer;\n\nfunction FillVertexBuffer(buffer) {\n Buffer.call(this, buffer);\n}\n\nFillVertexBuffer.prototype = util.inherit(Buffer, {\n itemSize: 4, // bytes per vertex (2 * short == 4 bytes)\n\n add: function(x, y) {\n var pos2 = this.pos / 2;\n\n this.resize();\n\n this.shorts[pos2 + 0] = x;\n this.shorts[pos2 + 1] = y;\n\n this.pos += this.itemSize;\n }\n});\n","'use strict';\n\nvar util = require('../../util/util');\nvar Buffer = require('./buffer');\n\nmodule.exports = TriangleElementBuffer;\n\nfunction TriangleElementBuffer(buffer) {\n Buffer.call(this, buffer);\n}\n\nTriangleElementBuffer.prototype = util.inherit(Buffer, {\n itemSize: 6, // bytes per triangle (3 * unsigned short == 6 bytes)\n arrayType: 'ELEMENT_ARRAY_BUFFER',\n\n add: function(a, b, c) {\n var pos2 = this.pos / 2;\n\n this.resize();\n\n this.ushorts[pos2 + 0] = a;\n this.ushorts[pos2 + 1] = b;\n this.ushorts[pos2 + 2] = c;\n\n this.pos += this.itemSize;\n }\n});\n","'use strict';\n\nvar util = require('../../util/util');\nvar Buffer = require('./buffer');\n\nmodule.exports = OutlineElementBuffer;\n\nfunction OutlineElementBuffer(buffer) {\n Buffer.call(this, buffer);\n}\n\nOutlineElementBuffer.prototype = util.inherit(Buffer, {\n itemSize: 4, // bytes per line (2 * unsigned short == 4 bytes)\n arrayType: 'ELEMENT_ARRAY_BUFFER',\n\n add: function(a, b) {\n var pos2 = this.pos / 2;\n\n this.resize();\n\n this.ushorts[pos2 + 0] = a;\n this.ushorts[pos2 + 1] = b;\n\n this.pos += this.itemSize;\n }\n});\n","'use strict';\n\nvar util = require('../../util/util');\nvar Buffer = require('./buffer');\n\nmodule.exports = GlyphVertexBuffer;\n\nfunction GlyphVertexBuffer(buffer) {\n Buffer.call(this, buffer);\n}\n\n\nGlyphVertexBuffer.prototype = util.inherit(Buffer, {\n defaultLength: 2048 * 16,\n itemSize: 16,\n\n add: function(x, y, ox, oy, tx, ty, minzoom, maxzoom, labelminzoom) {\n var pos = this.pos,\n pos2 = pos / 2;\n\n this.resize();\n\n this.shorts[pos2 + 0] = x;\n this.shorts[pos2 + 1] = y;\n this.shorts[pos2 + 2] = Math.round(ox * 64); // use 1/64 pixels for placement\n this.shorts[pos2 + 3] = Math.round(oy * 64);\n\n // a_data1\n this.ubytes[pos + 8] /* tex */ = Math.floor(tx / 4);\n this.ubytes[pos + 9] /* tex */ = Math.floor(ty / 4);\n this.ubytes[pos + 10] /* labelminzoom */ = Math.floor((labelminzoom) * 10);\n\n // a_data2\n this.ubytes[pos + 12] /* minzoom */ = Math.floor((minzoom) * 10); // 1/10 zoom levels: z16 == 160.\n this.ubytes[pos + 13] /* maxzoom */ = Math.floor(Math.min(maxzoom, 25) * 10); // 1/10 zoom levels: z16 == 160.\n\n this.pos += this.itemSize;\n },\n\n bind: function(gl, shader, offset) {\n Buffer.prototype.bind.call(this, gl);\n\n var stride = this.itemSize;\n\n gl.vertexAttribPointer(shader.a_pos, 2, gl.SHORT, false, stride, offset + 0);\n gl.vertexAttribPointer(shader.a_offset, 2, gl.SHORT, false, stride, offset + 4);\n\n gl.vertexAttribPointer(shader.a_data1, 4, gl.UNSIGNED_BYTE, false, stride, offset + 8);\n gl.vertexAttribPointer(shader.a_data2, 2, gl.UNSIGNED_BYTE, false, stride, offset + 12);\n }\n});\n","'use strict';\n\nvar util = require('../../util/util');\nvar Buffer = require('./buffer');\n\nmodule.exports = IconVertexBuffer;\n\nfunction IconVertexBuffer(buffer) {\n Buffer.call(this, buffer);\n}\n\nIconVertexBuffer.prototype = util.inherit(Buffer, {\n defaultLength: 2048 * 16,\n itemSize: 16,\n\n add: function(x, y, ox, oy, tx, ty, minzoom, maxzoom, labelminzoom) {\n var pos = this.pos,\n pos2 = pos / 2;\n\n this.resize();\n\n this.shorts[pos2 + 0] = x;\n this.shorts[pos2 + 1] = y;\n this.shorts[pos2 + 2] = Math.round(ox * 64); // use 1/64 pixels for placement\n this.shorts[pos2 + 3] = Math.round(oy * 64);\n\n // a_data1\n this.ubytes[pos + 8] /* tex */ = tx / 4;\n this.ubytes[pos + 9] /* tex */ = ty / 4;\n this.ubytes[pos + 10] /* labelminzoom */ = Math.floor((labelminzoom || 0) * 10);\n\n // a_data2\n this.ubytes[pos + 12] /* minzoom */ = Math.floor((minzoom || 0) * 10); // 1/10 zoom levels: z16 == 160.\n this.ubytes[pos + 13] /* maxzoom */ = Math.floor(Math.min(maxzoom || 25, 25) * 10); // 1/10 zoom levels: z16 == 160.\n\n this.pos += this.itemSize;\n },\n\n bind: function(gl, shader, offset) {\n Buffer.prototype.bind.call(this, gl);\n\n var stride = this.itemSize;\n\n gl.vertexAttribPointer(shader.a_pos, 2, gl.SHORT, false, stride, offset + 0);\n gl.vertexAttribPointer(shader.a_offset, 2, gl.SHORT, false, stride, offset + 4);\n gl.vertexAttribPointer(shader.a_data1, 4, gl.UNSIGNED_BYTE, false, stride, offset + 8);\n gl.vertexAttribPointer(shader.a_data2, 2, gl.UNSIGNED_BYTE, false, stride, offset + 12);\n }\n});\n","'use strict';\n\nvar util = require('../../util/util');\nvar Buffer = require('./buffer');\n\nmodule.exports = CollisionBoxVertexBuffer;\n\nfunction CollisionBoxVertexBuffer(buffer) {\n Buffer.call(this, buffer);\n}\n\nCollisionBoxVertexBuffer.prototype = util.inherit(Buffer, {\n itemSize: 12, // bytes per vertex (2 * short + 1 * short + 2 * byte = 8 bytes)\n defaultLength: 32768,\n\n // add a vertex to this buffer;\n // x, y - vertex position\n // ex, ey - extrude normal\n add: function(point, extrude, maxZoom, placementZoom) {\n var pos = this.pos,\n pos2 = pos / 2,\n index = this.index;\n\n this.resize();\n\n this.shorts[pos2 + 0] = point.x;\n this.shorts[pos2 + 1] = point.y;\n\n this.shorts[pos2 + 2] = Math.round(extrude.x);\n this.shorts[pos2 + 3] = Math.round(extrude.y);\n this.ubytes[pos + 8] = Math.floor(maxZoom * 10);\n this.ubytes[pos + 9] = Math.floor(placementZoom * 10);\n\n this.pos += this.itemSize;\n return index;\n }\n});\n","module.exports.VectorTile = require('./lib/vectortile.js');\nmodule.exports.VectorTileFeature = require('./lib/vectortilefeature.js');\nmodule.exports.VectorTileLayer = require('./lib/vectortilelayer.js');\n","'use strict';\n\nmodule.exports = geojsonvt;\n\nvar convert = require('./convert'), // GeoJSON conversion and preprocessing\n clip = require('./clip'), // stripe clipping algorithm\n wrap = require('./wrap'), // date line processing\n createTile = require('./tile'); // final simplified tile generation\n\n\nfunction geojsonvt(data, options) {\n return new GeoJSONVT(data, options);\n}\n\nfunction GeoJSONVT(data, options) {\n options = this.options = extend(Object.create(this.options), options);\n\n var debug = options.debug;\n\n if (debug) console.time('preprocess data');\n\n var z2 = 1 << options.maxZoom, // 2^z\n features = convert(data, options.tolerance / (z2 * options.extent));\n\n this.tiles = {};\n\n if (debug) {\n console.timeEnd('preprocess data');\n console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints);\n console.time('generate tiles');\n this.stats = {};\n this.total = 0;\n }\n\n features = wrap(features, options.buffer / options.extent, intersectX);\n\n // start slicing from the top tile down\n this.splitTile(features, 0, 0, 0);\n\n if (debug) {\n console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints);\n console.timeEnd('generate tiles');\n console.log('tiles generated:', this.total, JSON.stringify(this.stats));\n }\n}\n\nGeoJSONVT.prototype.options = {\n maxZoom: 14, // max zoom to preserve detail on\n indexMaxZoom: 5, // max zoom in the tile index\n indexMaxPoints: 100000, // max number of points per tile in the tile index\n tolerance: 3, // simplification tolerance (higher means simpler)\n extent: 4096, // tile extent\n buffer: 64, // tile buffer on each side\n debug: 0 // logging level (0, 1 or 2)\n};\n\nGeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) {\n\n var stack = [features, z, x, y],\n options = this.options,\n debug = options.debug,\n extent = options.extent,\n buffer = options.buffer;\n\n // avoid recursion by using a processing queue\n while (stack.length) {\n features = stack.shift();\n z = stack.shift();\n x = stack.shift();\n y = stack.shift();\n\n var z2 = 1 << z,\n id = toID(z, x, y),\n tile = this.tiles[id],\n tileTolerance = z === options.maxZoom ? 0 : options.tolerance / (z2 * extent);\n\n if (!tile) {\n if (debug > 1) console.time('creation');\n\n tile = this.tiles[id] = createTile(features, z2, x, y, tileTolerance, z === options.maxZoom);\n\n if (debug) {\n if (debug > 1) {\n console.log('tile z%d-%d-%d (features: %d, points: %d, simplified: %d)',\n z, x, y, tile.numFeatures, tile.numPoints, tile.numSimplified);\n console.timeEnd('creation');\n }\n var key = 'z' + z;\n this.stats[key] = (this.stats[key] || 0) + 1;\n this.total++;\n }\n }\n\n // save reference to original geometry in tile so that we can drill down later if we stop now\n tile.source = features;\n\n // stop tiling if the tile is degenerate\n if (isClippedSquare(tile.features, extent, buffer)) continue;\n\n // if it's the first-pass tiling\n if (!cz) {\n // stop tiling if we reached max zoom, or if the tile is too simple\n if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) continue;\n\n // if a drilldown to a specific tile\n } else {\n // stop tiling if we reached base zoom or our target tile zoom\n if (z === options.maxZoom || z === cz) continue;\n\n // stop tiling if it's not an ancestor of the target tile\n var m = 1 << (cz - z);\n if (x !== Math.floor(cx / m) && y !== Math.floor(cy / m)) continue;\n }\n\n // if we slice further down, no need to keep source geometry\n tile.source = null;\n\n if (debug > 1) console.time('clipping');\n\n // values we'll use for clipping\n var k1 = 0.5 * buffer / extent,\n k2 = 0.5 - k1,\n k3 = 0.5 + k1,\n k4 = 1 + k1,\n tl, bl, tr, br, left, right;\n\n tl = bl = tr = br = null;\n\n left = clip(features, z2, x - k1, x + k3, 0, intersectX, tile.min[0], tile.max[0]);\n right = clip(features, z2, x + k2, x + k4, 0, intersectX, tile.min[0], tile.max[0]);\n\n if (left) {\n tl = clip(left, z2, y - k1, y + k3, 1, intersectY, tile.min[1], tile.max[1]);\n bl = clip(left, z2, y + k2, y + k4, 1, intersectY, tile.min[1], tile.max[1]);\n }\n\n if (right) {\n tr = clip(right, z2, y - k1, y + k3, 1, intersectY, tile.min[1], tile.max[1]);\n br = clip(right, z2, y + k2, y + k4, 1, intersectY, tile.min[1], tile.max[1]);\n }\n\n if (debug > 1) console.timeEnd('clipping');\n\n if (tl) stack.push(tl, z + 1, x * 2, y * 2);\n if (bl) stack.push(bl, z + 1, x * 2, y * 2 + 1);\n if (tr) stack.push(tr, z + 1, x * 2 + 1, y * 2);\n if (br) stack.push(br, z + 1, x * 2 + 1, y * 2 + 1);\n }\n};\n\nGeoJSONVT.prototype.getTile = function (z, x, y) {\n var options = this.options,\n extent = options.extent,\n debug = options.debug;\n\n var z2 = 1 << z;\n x = ((x % z2) + z2) % z2; // wrap tile x coordinate\n\n var id = toID(z, x, y);\n if (this.tiles[id]) return transformTile(this.tiles[id], extent);\n\n if (debug > 1) console.log('drilling down to z%d-%d-%d', z, x, y);\n\n var z0 = z,\n x0 = x,\n y0 = y,\n parent;\n\n while (!parent && z0 > 0) {\n z0--;\n x0 = Math.floor(x0 / 2);\n y0 = Math.floor(y0 / 2);\n parent = this.tiles[toID(z0, x0, y0)];\n }\n\n if (debug > 1) console.log('found parent tile z%d-%d-%d', z0, x0, y0);\n\n // if we found a parent tile containing the original geometry, we can drill down from it\n if (parent.source) {\n if (isClippedSquare(parent.features, options.extent, options.buffer)) return transformTile(parent, extent);\n\n if (debug > 1) console.time('drilling down');\n this.splitTile(parent.source, z0, x0, y0, z, x, y);\n if (debug > 1) console.timeEnd('drilling down');\n }\n\n return transformTile(this.tiles[id], extent);\n};\n\nfunction transformTile(tile, extent) {\n if (!tile || tile.transformed) return tile;\n\n var z2 = tile.z2,\n tx = tile.x,\n ty = tile.y,\n i, j, k;\n\n for (i = 0; i < tile.features.length; i++) {\n var feature = tile.features[i],\n geom = feature.geometry,\n type = feature.type;\n\n if (type === 1) {\n for (j = 0; j < geom.length; j++) geom[j] = transformPoint(geom[j], extent, z2, tx, ty);\n\n } else {\n for (j = 0; j < geom.length; j++) {\n var ring = geom[j];\n for (k = 0; k < ring.length; k++) ring[k] = transformPoint(ring[k], extent, z2, tx, ty);\n }\n }\n }\n\n tile.transformed = true;\n\n return tile;\n}\n\nfunction transformPoint(p, extent, z2, tx, ty) {\n var x = Math.round(extent * (p[0] * z2 - tx)),\n y = Math.round(extent * (p[1] * z2 - ty));\n return [x, y];\n}\n\n// checks whether a tile is a whole-area fill after clipping; if it is, there's no sense slicing it further\nfunction isClippedSquare(features, extent, buffer) {\n if (features.length !== 1) return false;\n\n var feature = features[0];\n if (feature.type !== 3 || feature.geometry.length > 1) return false;\n\n for (var i = 0; i < feature.geometry[0].length; i++) {\n var p = feature.geometry[0][i];\n if ((p[0] !== -buffer && p[0] !== extent + buffer) ||\n (p[1] !== -buffer && p[1] !== extent + buffer)) return false;\n }\n return true;\n}\n\nfunction toID(z, x, y) {\n return (((1 << z) * y + x) * 32) + z;\n}\n\nfunction intersectX(a, b, x) {\n return [x, (x - a[0]) * (b[1] - a[1]) / (b[0] - a[0]) + a[1], 1];\n}\nfunction intersectY(a, b, y) {\n return [(y - a[1]) * (b[0] - a[0]) / (b[1] - a[1]) + a[0], y, 1];\n}\n\nfunction extend(dest, src) {\n for (var i in src) dest[i] = src[i];\n return dest;\n}\n","module.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n currentQueue[queueIndex].run();\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\n// TODO(shtylman)\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","'use strict';\n\nvar VectorTileLayer = require('./vectortilelayer');\n\nmodule.exports = VectorTile;\n\nfunction VectorTile(pbf, end) {\n this.layers = pbf.readFields(readTile, {}, end);\n}\n\nfunction readTile(tag, layers, pbf) {\n if (tag === 3) {\n var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos);\n if (layer.length) layers[layer.name] = layer;\n }\n}\n\n","'use strict';\n\nvar Point = require('point-geometry');\n\nmodule.exports = VectorTileFeature;\n\nfunction VectorTileFeature(pbf, end, extent, keys, values) {\n // Public\n this.properties = {};\n this.extent = extent;\n this.type = 0;\n\n // Private\n this._pbf = pbf;\n this._geometry = -1;\n this._keys = keys;\n this._values = values;\n\n pbf.readFields(readFeature, this, end);\n}\n\nfunction readFeature(tag, feature, pbf) {\n if (tag == 1) feature._id = pbf.readVarint();\n else if (tag == 2) readTag(pbf, feature);\n else if (tag == 3) feature.type = pbf.readVarint();\n else if (tag == 4) feature._geometry = pbf.pos;\n}\n\nfunction readTag(pbf, feature) {\n var end = pbf.readVarint() + pbf.pos;\n\n while (pbf.pos < end) {\n var key = feature._keys[pbf.readVarint()],\n value = feature._values[pbf.readVarint()];\n feature.properties[key] = value;\n }\n}\n\nVectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];\n\nVectorTileFeature.prototype.loadGeometry = function() {\n var pbf = this._pbf;\n pbf.pos = this._geometry;\n\n var end = pbf.readVarint() + pbf.pos,\n cmd = 1,\n length = 0,\n x = 0,\n y = 0,\n lines = [],\n line;\n\n while (pbf.pos < end) {\n if (!length) {\n var cmdLen = pbf.readVarint();\n cmd = cmdLen & 0x7;\n length = cmdLen >> 3;\n }\n\n length--;\n\n if (cmd === 1 || cmd === 2) {\n x += pbf.readSVarint();\n y += pbf.readSVarint();\n\n if (cmd === 1) { // moveTo\n if (line) lines.push(line);\n line = [];\n }\n\n line.push(new Point(x, y));\n\n } else if (cmd === 7) {\n\n // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90\n if (line) {\n line.push(line[0].clone()); // closePolygon\n }\n\n } else {\n throw new Error('unknown command ' + cmd);\n }\n }\n\n if (line) lines.push(line);\n\n return lines;\n};\n\nVectorTileFeature.prototype.bbox = function() {\n var pbf = this._pbf;\n pbf.pos = this._geometry;\n\n var end = pbf.readVarint() + pbf.pos,\n cmd = 1,\n length = 0,\n x = 0,\n y = 0,\n x1 = Infinity,\n x2 = -Infinity,\n y1 = Infinity,\n y2 = -Infinity;\n\n while (pbf.pos < end) {\n if (!length) {\n var cmdLen = pbf.readVarint();\n cmd = cmdLen & 0x7;\n length = cmdLen >> 3;\n }\n\n length--;\n\n if (cmd === 1 || cmd === 2) {\n x += pbf.readSVarint();\n y += pbf.readSVarint();\n if (x < x1) x1 = x;\n if (x > x2) x2 = x;\n if (y < y1) y1 = y;\n if (y > y2) y2 = y;\n\n } else if (cmd !== 7) {\n throw new Error('unknown command ' + cmd);\n }\n }\n\n return [x1, y1, x2, y2];\n};\n\nVectorTileFeature.prototype.toGeoJSON = function(x, y, z) {\n var size = this.extent * Math.pow(2, z),\n x0 = this.extent * x,\n y0 = this.extent * y,\n coords = this.loadGeometry(),\n type = VectorTileFeature.types[this.type];\n\n for (var i = 0; i < coords.length; i++) {\n var line = coords[i];\n for (var j = 0; j < line.length; j++) {\n var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;\n line[j] = [\n (p.x + x0) * 360 / size - 180,\n 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90\n ];\n }\n }\n\n if (type === 'Point' && coords.length === 1) {\n coords = coords[0][0];\n } else if (type === 'Point') {\n coords = coords[0];\n type = 'MultiPoint';\n } else if (type === 'LineString' && coords.length === 1) {\n coords = coords[0];\n } else if (type === 'LineString') {\n type = 'MultiLineString';\n }\n\n return {\n type: \"Feature\",\n geometry: {\n type: type,\n coordinates: coords\n },\n properties: this.properties\n };\n};\n","'use strict';\n\nvar VectorTileFeature = require('./vectortilefeature.js');\n\nmodule.exports = VectorTileLayer;\n\nfunction VectorTileLayer(pbf, end) {\n // Public\n this.version = 1;\n this.name = null;\n this.extent = 4096;\n this.length = 0;\n\n // Private\n this._pbf = pbf;\n this._keys = [];\n this._values = [];\n this._features = [];\n\n pbf.readFields(readLayer, this, end);\n\n this.length = this._features.length;\n}\n\nfunction readLayer(tag, layer, pbf) {\n if (tag === 15) layer.version = pbf.readVarint();\n else if (tag === 1) layer.name = pbf.readString();\n else if (tag === 5) layer.extent = pbf.readVarint();\n else if (tag === 2) layer._features.push(pbf.pos);\n else if (tag === 3) layer._keys.push(pbf.readString());\n else if (tag === 4) layer._values.push(readValueMessage(pbf));\n}\n\nfunction readValueMessage(pbf) {\n var value = null,\n end = pbf.readVarint() + pbf.pos;\n\n while (pbf.pos < end) {\n var tag = pbf.readVarint() >> 3;\n\n value = tag === 1 ? pbf.readString() :\n tag === 2 ? pbf.readFloat() :\n tag === 3 ? pbf.readDouble() :\n tag === 4 ? pbf.readVarint64() :\n tag === 5 ? pbf.readVarint() :\n tag === 6 ? pbf.readSVarint() :\n tag === 7 ? pbf.readBoolean() : null;\n }\n\n return value;\n}\n\n// return feature `i` from this layer as a `VectorTileFeature`\nVectorTileLayer.prototype.feature = function(i) {\n if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');\n\n this._pbf.pos = this._features[i];\n\n var end = this._pbf.readVarint() + this._pbf.pos;\n return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values);\n};\n","'use strict';\n\nmodule.exports = convert;\n\nvar simplify = require('./simplify');\n\n// converts GeoJSON feature into an intermediate projected JSON vector format with simplification data\n\nfunction convert(data, tolerance) {\n var features = [];\n\n if (data.type === 'FeatureCollection') {\n for (var i = 0; i < data.features.length; i++) {\n convertFeature(features, data.features[i], tolerance);\n }\n } else if (data.type === 'Feature') {\n convertFeature(features, data, tolerance);\n\n } else {\n // single geometry or a geometry collection\n convertFeature(features, {geometry: data}, tolerance);\n }\n return features;\n}\n\nfunction convertFeature(features, feature, tolerance) {\n var geom = feature.geometry,\n type = geom.type,\n coords = geom.coordinates,\n tags = feature.properties,\n i, j, rings;\n\n if (type === 'Point') {\n features.push(create(tags, 1, [projectPoint(coords)]));\n\n } else if (type === 'MultiPoint') {\n features.push(create(tags, 1, project(coords)));\n\n } else if (type === 'LineString') {\n features.push(create(tags, 2, [project(coords, tolerance)]));\n\n } else if (type === 'MultiLineString' || type === 'Polygon') {\n rings = [];\n for (i = 0; i < coords.length; i++) {\n rings.push(project(coords[i], tolerance));\n }\n features.push(create(tags, type === 'Polygon' ? 3 : 2, rings));\n\n } else if (type === 'MultiPolygon') {\n rings = [];\n for (i = 0; i < coords.length; i++) {\n for (j = 0; j < coords[i].length; j++) {\n rings.push(project(coords[i][j], tolerance));\n }\n }\n features.push(create(tags, 3, rings));\n\n } else if (type === 'GeometryCollection') {\n for (i = 0; i < geom.geometries.length; i++) {\n convertFeature(features, {\n geometry: geom.geometries[i],\n properties: tags\n }, tolerance);\n }\n\n } else {\n console.warn('Unsupported GeoJSON type: ' + geom.type);\n }\n}\n\nfunction create(tags, type, geometry) {\n var feature = {\n geometry: geometry,\n type: type,\n tags: tags || null,\n min: [2, 1], // initial bbox values;\n max: [-1, 0] // note that coords are usually in [0..1] range\n };\n calcBBox(feature);\n return feature;\n}\n\nfunction project(lonlats, tolerance) {\n var projected = [];\n for (var i = 0; i < lonlats.length; i++) {\n projected.push(projectPoint(lonlats[i]));\n }\n if (tolerance) {\n simplify(projected, tolerance);\n calcSize(projected);\n }\n return projected;\n}\n\nfunction projectPoint(p) {\n var sin = Math.sin(p[1] * Math.PI / 180),\n x = (p[0] / 360 + 0.5),\n y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI);\n\n y = y < -1 ? -1 :\n y > 1 ? 1 : y;\n\n return [x, y, 0];\n}\n\n// calculate area and length of the poly\nfunction calcSize(points) {\n var area = 0,\n dist = 0;\n\n for (var i = 0, a, b; i < points.length - 1; i++) {\n a = b || points[i];\n b = points[i + 1];\n\n area += a[0] * b[1] - b[0] * a[1];\n\n // use Manhattan distance instead of Euclidian one to avoid expensive square root computation\n dist += Math.abs(b[0] - a[0]) + Math.abs(b[1] - a[1]);\n }\n points.area = Math.abs(area / 2);\n points.dist = dist;\n}\n\n// calculate the feature bounding box for faster clipping later\nfunction calcBBox(feature) {\n var geometry = feature.geometry,\n min = feature.min,\n max = feature.max;\n\n if (feature.type === 1) calcRingBBox(min, max, geometry);\n else for (var i = 0; i < geometry.length; i++) calcRingBBox(min, max, geometry[i]);\n\n return feature;\n}\n\nfunction calcRingBBox(min, max, points) {\n for (var i = 0, p; i < points.length; i++) {\n p = points[i];\n min[0] = Math.min(p[0], min[0]);\n max[0] = Math.max(p[0], max[0]);\n min[1] = Math.min(p[1], min[1]);\n max[1] = Math.max(p[1], max[1]);\n }\n}\n","'use strict';\n\nmodule.exports = clip;\n\n/* clip features between two axis-parallel lines:\n * | |\n * ___|___ | /\n * / | \\____|____/\n * | |\n */\n\nfunction clip(features, scale, k1, k2, axis, intersect, minAll, maxAll) {\n\n k1 /= scale;\n k2 /= scale;\n\n if (minAll >= k1 && maxAll <= k2) return features; // trivial accept\n else if (minAll > k2 || maxAll < k1) return null; // trivial reject\n\n var clipped = [];\n\n for (var i = 0; i < features.length; i++) {\n\n var feature = features[i],\n geometry = feature.geometry,\n type = feature.type,\n min, max;\n\n min = feature.min[axis];\n max = feature.max[axis];\n\n if (min >= k1 && max <= k2) { // trivial accept\n clipped.push(feature);\n continue;\n } else if (min > k2 || max < k1) continue; // trivial reject\n\n var slices = type === 1 ?\n clipPoints(geometry, k1, k2, axis) :\n clipGeometry(geometry, k1, k2, axis, intersect, type === 3);\n\n if (slices.length) {\n // if a feature got clipped, it will likely get clipped on the next zoom level as well,\n // so there's no need to recalculate bboxes\n clipped.push({\n geometry: slices,\n type: type,\n tags: features[i].tags || null,\n min: feature.min,\n max: feature.max\n });\n }\n }\n\n return clipped.length ? clipped : null;\n}\n\nfunction clipPoints(geometry, k1, k2, axis) {\n var slice = [];\n\n for (var i = 0; i < geometry.length; i++) {\n var a = geometry[i],\n ak = a[axis];\n\n if (ak >= k1 && ak <= k2) slice.push(a);\n }\n return slice;\n}\n\nfunction clipGeometry(geometry, k1, k2, axis, intersect, closed) {\n\n var slices = [];\n\n for (var i = 0; i < geometry.length; i++) {\n\n var ak = 0,\n bk = 0,\n b = null,\n points = geometry[i],\n area = points.area,\n dist = points.dist,\n len = points.length,\n a, j;\n\n var slice = [];\n\n for (j = 0; j < len - 1; j++) {\n a = b || points[j];\n b = points[j + 1];\n ak = bk || a[axis];\n bk = b[axis];\n\n if (ak < k1) {\n\n if ((bk > k2)) { // ---|-----|-->\n slice.push(intersect(a, b, k1), intersect(a, b, k2));\n if (!closed) slice = newSlice(slices, slice, area, dist);\n\n } else if (bk >= k1) slice.push(intersect(a, b, k1)); // ---|--> |\n\n } else if (ak > k2) {\n\n if ((bk < k1)) { // <--|-----|---\n slice.push(intersect(a, b, k2), intersect(a, b, k1));\n if (!closed) slice = newSlice(slices, slice, area, dist);\n\n } else if (bk <= k2) slice.push(intersect(a, b, k2)); // | <--|---\n\n } else {\n\n slice.push(a);\n\n if (bk < k1) { // <--|--- |\n slice.push(intersect(a, b, k1));\n if (!closed) slice = newSlice(slices, slice, area, dist);\n\n } else if (bk > k2) { // | ---|-->\n slice.push(intersect(a, b, k2));\n if (!closed) slice = newSlice(slices, slice, area, dist);\n }\n // | --> |\n }\n }\n\n // add the last point\n a = points[len - 1];\n ak = a[axis];\n if (ak >= k1 && ak <= k2) slice.push(a);\n\n // close the polygon if its endpoints are not the same after clipping\n if (closed && slice[0] !== slice[slice.length - 1]) slice.push(slice[0]);\n\n // add the final slice\n newSlice(slices, slice, area, dist);\n }\n\n return slices;\n}\n\nfunction newSlice(slices, slice, area, dist) {\n if (slice.length) {\n // we don't recalculate the area/length of the unclipped geometry because the case where it goes\n // below the visibility threshold as a result of clipping is rare, so we avoid doing unnecessary work\n slice.area = area;\n slice.dist = dist;\n\n slices.push(slice);\n }\n return [];\n}\n","'use strict';\n\nvar clip = require('./clip');\n\nmodule.exports = wrap;\n\nfunction wrap(features, buffer, intersectX) {\n var merged = features,\n left = clip(features, 1, -1 - buffer, buffer, 0, intersectX, -1, 2), // left world copy\n right = clip(features, 1, 1 - buffer, 2 + buffer, 0, intersectX, -1, 2); // right world copy\n\n if (left || right) {\n merged = clip(features, 1, -buffer, 1 + buffer, 0, intersectX, -1, 2); // center world copy\n\n if (left) merged = shiftFeatureCoords(left, 1).concat(merged); // merge left into center\n if (right) merged = merged.concat(shiftFeatureCoords(right, -1)); // merge right into center\n }\n\n return merged;\n}\n\nfunction shiftFeatureCoords(features, offset) {\n var newFeatures = [];\n\n for (var i = 0; i < features.length; i++) {\n var feature = features[i],\n type = feature.type;\n\n var newGeometry;\n\n if (type === 1) {\n newGeometry = shiftCoords(feature.geometry, offset);\n } else {\n newGeometry = [];\n for (var j = 0; j < feature.geometry.length; j++) {\n newGeometry.push(shiftCoords(feature.geometry[j], offset));\n }\n }\n\n newFeatures.push({\n geometry: newGeometry,\n type: type,\n tags: feature.tags,\n min: [feature.min[0] + offset, feature.min[1]],\n max: [feature.max[0] + offset, feature.max[1]]\n });\n }\n\n return newFeatures;\n}\n\nfunction shiftCoords(points, offset) {\n var newPoints = [];\n newPoints.area = points.area;\n newPoints.dist = points.dist;\n\n for (var i = 0; i < points.length; i++) {\n newPoints.push([points[i][0] + offset, points[i][1], points[i][2]]);\n }\n return newPoints;\n}\n","'use strict';\n\nmodule.exports = createTile;\n\nfunction createTile(features, z2, tx, ty, tolerance, noSimplify) {\n var tile = {\n features: [],\n numPoints: 0,\n numSimplified: 0,\n numFeatures: 0,\n source: null,\n x: tx,\n y: ty,\n z2: z2,\n transformed: false,\n min: [2, 1],\n max: [-1, 0]\n };\n for (var i = 0; i < features.length; i++) {\n tile.numFeatures++;\n addFeature(tile, features[i], tolerance, noSimplify);\n\n var min = features[i].min,\n max = features[i].max;\n\n if (min[0] < tile.min[0]) tile.min[0] = min[0];\n if (min[1] < tile.min[1]) tile.min[1] = min[1];\n if (max[0] > tile.max[0]) tile.max[0] = max[0];\n if (max[1] > tile.max[1]) tile.max[1] = max[1];\n }\n return tile;\n}\n\nfunction addFeature(tile, feature, tolerance, noSimplify) {\n\n var geom = feature.geometry,\n type = feature.type,\n simplified = [],\n sqTolerance = tolerance * tolerance,\n i, j, ring, p;\n\n if (type === 1) {\n for (i = 0; i < geom.length; i++) {\n simplified.push(geom[i]);\n tile.numPoints++;\n tile.numSimplified++;\n }\n\n } else {\n\n // simplify and transform projected coordinates for tile geometry\n for (i = 0; i < geom.length; i++) {\n ring = geom[i];\n\n // filter out tiny polylines & polygons\n if (!noSimplify && ((type === 2 && ring.dist < tolerance) ||\n (type === 3 && ring.area < sqTolerance))) {\n tile.numPoints += ring.length;\n continue;\n }\n\n var simplifiedRing = [];\n\n for (j = 0; j < ring.length; j++) {\n p = ring[j];\n // keep points with importance > tolerance\n if (noSimplify || p[2] > sqTolerance) {\n simplifiedRing.push(p);\n tile.numSimplified++;\n }\n tile.numPoints++;\n }\n\n simplified.push(simplifiedRing);\n }\n }\n\n if (simplified.length) {\n tile.features.push({\n geometry: simplified,\n type: type,\n tags: feature.tags || null\n });\n }\n}\n","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n","'use strict';\n\nmodule.exports = simplify;\n\n// calculate simplification data using optimized Douglas-Peucker algorithm\n\nfunction simplify(points, tolerance) {\n\n var sqTolerance = tolerance * tolerance,\n len = points.length,\n first = 0,\n last = len - 1,\n stack = [],\n i, maxSqDist, sqDist, index;\n\n // always retain the endpoints (1 is the max value)\n points[first][2] = 1;\n points[last][2] = 1;\n\n // avoid recursion by using a stack\n while (last) {\n\n maxSqDist = 0;\n\n for (i = first + 1; i < last; i++) {\n sqDist = getSqSegDist(points[i], points[first], points[last]);\n\n if (sqDist > maxSqDist) {\n index = i;\n maxSqDist = sqDist;\n }\n }\n\n if (maxSqDist > sqTolerance) {\n points[index][2] = maxSqDist; // save the point importance in squared pixels as a z coordinate\n stack.push(first);\n stack.push(index);\n first = index;\n\n } else {\n last = stack.pop();\n first = stack.pop();\n }\n }\n}\n\n// square distance from a point to a segment\nfunction getSqSegDist(p, a, b) {\n\n var x = a[0], y = a[1],\n bx = b[0], by = b[1],\n px = p[0], py = p[1],\n dx = bx - x,\n dy = by - y;\n\n if (dx !== 0 || dy !== 0) {\n\n var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy);\n\n if (t > 1) {\n x = bx;\n y = by;\n\n } else if (t > 0) {\n x += dx * t;\n y += dy * t;\n }\n }\n\n dx = px - x;\n dy = py - y;\n\n return dx * dx + dy * dy;\n}\n","'use strict';\n\nvar rbush = require('rbush');\nvar Point = require('point-geometry');\nvar vt = require('vector-tile');\nvar util = require('../util/util');\n\nmodule.exports = FeatureTree;\n\nfunction FeatureTree(coord, overscaling) {\n this.x = coord.x;\n this.y = coord.y;\n this.z = coord.z - Math.log(overscaling) / Math.LN2;\n this.rtree = rbush(9);\n this.toBeInserted = [];\n}\n\nFeatureTree.prototype.insert = function(bbox, layers, feature) {\n bbox.layers = layers;\n bbox.feature = feature;\n this.toBeInserted.push(bbox);\n};\n\n// bulk insert into tree\nFeatureTree.prototype._load = function() {\n this.rtree.load(this.toBeInserted);\n this.toBeInserted = [];\n};\n\n// Finds features in this tile at a particular position.\nFeatureTree.prototype.query = function(args, callback) {\n if (this.toBeInserted.length) this._load();\n\n var params = args.params || {},\n radius = (params.radius || 0) * 4096 / args.scale,\n x = args.x,\n y = args.y,\n result = [];\n\n var matching = this.rtree.search([ x - radius, y - radius, x + radius, y + radius ]);\n for (var i = 0; i < matching.length; i++) {\n var feature = matching[i].feature,\n layers = matching[i].layers,\n type = vt.VectorTileFeature.types[feature.type];\n\n if (params.$type && type !== params.$type)\n continue;\n if (!geometryContainsPoint(feature.loadGeometry(), type, new Point(x, y), radius))\n continue;\n\n var geoJSON = feature.toGeoJSON(this.x, this.y, this.z);\n\n if (!params.includeGeometry) {\n geoJSON.geometry = null;\n }\n\n for (var l = 0; l < layers.length; l++) {\n var layer = layers[l];\n\n if (params.layer && layer !== params.layer.id)\n continue;\n\n result.push(util.extend({layer: layer}, geoJSON));\n }\n }\n\n callback(null, result);\n};\n\nfunction geometryContainsPoint(rings, type, p, radius) {\n return type === 'Point' ? pointContainsPoint(rings, p, radius) :\n type === 'LineString' ? lineContainsPoint(rings, p, radius) :\n type === 'Polygon' ? polyContainsPoint(rings, p) || lineContainsPoint(rings, p, radius) : false;\n}\n\n// Code from http://stackoverflow.com/a/1501725/331379.\nfunction distToSegmentSquared(p, v, w) {\n var l2 = v.distSqr(w);\n if (l2 === 0) return p.distSqr(v);\n var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;\n if (t < 0) return p.distSqr(v);\n if (t > 1) return p.distSqr(w);\n return p.distSqr(w.sub(v)._mult(t)._add(v));\n}\n\nfunction lineContainsPoint(rings, p, radius) {\n var r = radius * radius;\n\n for (var i = 0; i < rings.length; i++) {\n var ring = rings[i];\n for (var j = 1; j < ring.length; j++) {\n // Find line segments that have a distance <= radius^2 to p\n // In that case, we treat the line as \"containing point p\".\n var v = ring[j - 1], w = ring[j];\n if (distToSegmentSquared(p, v, w) < r) return true;\n }\n }\n return false;\n}\n\n// point in polygon ray casting algorithm\nfunction polyContainsPoint(rings, p) {\n var c = false,\n ring, p1, p2;\n\n for (var k = 0; k < rings.length; k++) {\n ring = rings[k];\n for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n p1 = ring[i];\n p2 = ring[j];\n if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\n c = !c;\n }\n }\n }\n return c;\n}\n\nfunction pointContainsPoint(rings, p, radius) {\n var r = radius * radius;\n\n for (var i = 0; i < rings.length; i++) {\n var ring = rings[i];\n for (var j = 0; j < ring.length; j++) {\n if (ring[j].distSqr(p) <= r) return true;\n }\n }\n return false;\n}\n","'use strict';\n\nvar rbush = require('rbush');\n\nmodule.exports = CollisionTile;\n\n/**\n * A collision tile used to prevent symbols from overlapping. It keep tracks of\n * where previous symbols have been placed and is used to check if a new\n * symbol overlaps with any previously added symbols.\n *\n * @class CollisionTile\n * @param {number} angle\n * @param {number} pitch\n * @private\n */\nfunction CollisionTile(angle, pitch) {\n this.tree = rbush();\n this.angle = angle;\n\n var sin = Math.sin(angle),\n cos = Math.cos(angle);\n this.rotationMatrix = [cos, -sin, sin, cos];\n\n // Stretch boxes in y direction to account for the map tilt.\n this.yStretch = 1 / Math.cos(pitch / 180 * Math.PI);\n\n // The amount the map is squished depends on the y position.\n // Sort of account for this by making all boxes a bit bigger.\n this.yStretch = Math.pow(this.yStretch, 1.3);\n}\n\nCollisionTile.prototype.minScale = 0.25;\nCollisionTile.prototype.maxScale = 2;\n\n\n/**\n * Find the scale at which the collisionFeature can be shown without\n * overlapping with other features.\n *\n * @param {CollisionFeature} collisionFeature\n * @returns {number} placementScale\n * @private\n */\nCollisionTile.prototype.placeCollisionFeature = function(collisionFeature) {\n\n var minPlacementScale = this.minScale;\n var rotationMatrix = this.rotationMatrix;\n var yStretch = this.yStretch;\n\n for (var b = 0; b < collisionFeature.boxes.length; b++) {\n\n var box = collisionFeature.boxes[b];\n\n var anchorPoint = box.anchorPoint.matMult(rotationMatrix);\n var x = anchorPoint.x;\n var y = anchorPoint.y;\n\n box[0] = x + box.x1;\n box[1] = y + box.y1 * yStretch;\n box[2] = x + box.x2;\n box[3] = y + box.y2 * yStretch;\n\n var blockingBoxes = this.tree.search(box);\n\n for (var i = 0; i < blockingBoxes.length; i++) {\n var blocking = blockingBoxes[i];\n var blockingAnchorPoint = blocking.anchorPoint.matMult(rotationMatrix);\n\n // Find the lowest scale at which the two boxes can fit side by side without overlapping.\n // Original algorithm:\n var s1 = (blocking.x1 - box.x2) / (x - blockingAnchorPoint.x); // scale at which new box is to the left of old box\n var s2 = (blocking.x2 - box.x1) / (x - blockingAnchorPoint.x); // scale at which new box is to the right of old box\n var s3 = (blocking.y1 - box.y2) * yStretch / (y - blockingAnchorPoint.y); // scale at which new box is to the top of old box\n var s4 = (blocking.y2 - box.y1) * yStretch / (y - blockingAnchorPoint.y); // scale at which new box is to the bottom of old box\n\n if (isNaN(s1) || isNaN(s2)) s1 = s2 = 1;\n if (isNaN(s3) || isNaN(s4)) s3 = s4 = 1;\n\n var collisionFreeScale = Math.min(Math.max(s1, s2), Math.max(s3, s4));\n\n if (collisionFreeScale > blocking.maxScale) {\n // After a box's maxScale the label has shrunk enough that the box is no longer needed to cover it,\n // so unblock the new box at the scale that the old box disappears.\n collisionFreeScale = blocking.maxScale;\n }\n\n if (collisionFreeScale > box.maxScale) {\n // If the box can only be shown after it is visible, then the box can never be shown.\n // But the label can be shown after this box is not visible.\n collisionFreeScale = box.maxScale;\n }\n\n if (collisionFreeScale > minPlacementScale &&\n collisionFreeScale >= blocking.placementScale) {\n // If this collision occurs at a lower scale than previously found collisions\n // and the collision occurs while the other label is visible\n\n // this this is the lowest scale at which the label won't collide with anything\n minPlacementScale = collisionFreeScale;\n }\n\n if (minPlacementScale >= this.maxScale) return minPlacementScale;\n }\n }\n\n return minPlacementScale;\n};\n\n/**\n * Remember this collisionFeature and what scale it was placed at to block\n * later features from overlapping with it.\n *\n * @param {CollisionFeature} collisionFeature\n * @param {number} minPlacementScale\n * @private\n */\nCollisionTile.prototype.insertCollisionFeature = function(collisionFeature, minPlacementScale) {\n\n var boxes = collisionFeature.boxes;\n for (var k = 0; k < boxes.length; k++) {\n boxes[k].placementScale = minPlacementScale;\n }\n\n if (minPlacementScale < this.maxScale) {\n this.tree.load(boxes);\n }\n};\n","'use strict';\n\nmodule.exports = createBucket;\n\nvar LineBucket = require('./line_bucket');\nvar FillBucket = require('./fill_bucket');\nvar SymbolBucket = require('./symbol_bucket');\nvar LayoutProperties = require('../style/layout_properties');\nvar featureFilter = require('feature-filter');\nvar StyleDeclarationSet = require('../style/style_declaration_set');\n\nfunction createBucket(layer, buffers, z, overscaling, collisionDebug) {\n var values = new StyleDeclarationSet('layout', layer.type, layer.layout, {}).values(),\n fakeZoomHistory = { lastIntegerZoom: Infinity, lastIntegerZoomTime: 0, lastZoom: 0 },\n layout = {};\n\n for (var k in values) {\n layout[k] = values[k].calculate(z, fakeZoomHistory);\n }\n\n var BucketClass =\n layer.type === 'line' ? LineBucket :\n layer.type === 'fill' ? FillBucket :\n layer.type === 'symbol' ? SymbolBucket : null;\n\n var bucket = new BucketClass(buffers, new LayoutProperties[layer.type](layout), overscaling, z, collisionDebug);\n\n bucket.id = layer.id;\n bucket.type = layer.type;\n bucket['source-layer'] = layer['source-layer'];\n bucket.interactive = layer.interactive;\n bucket.minZoom = layer.minzoom;\n bucket.maxZoom = layer.maxzoom;\n bucket.filter = featureFilter(layer.filter);\n bucket.features = [];\n\n return bucket;\n}\n","'use strict';\n\nfunction constant(value) {\n return function() {\n return value;\n }\n}\n\nfunction interpolateNumber(a, b, t) {\n return (a * (1 - t)) + (b * t);\n}\n\nfunction interpolateArray(a, b, t) {\n var result = [];\n for (var i = 0; i < a.length; i++) {\n result[i] = interpolateNumber(a[i], b[i], t);\n }\n return result;\n}\n\nexports['interpolated'] = function(f) {\n if (!f.stops) {\n return constant(f);\n }\n\n var stops = f.stops,\n base = f.base || 1,\n interpolate = Array.isArray(stops[0][1]) ? interpolateArray : interpolateNumber;\n\n return function(z) {\n // find the two stops which the current z is between\n var low, high;\n\n for (var i = 0; i < stops.length; i++) {\n var stop = stops[i];\n\n if (stop[0] <= z) {\n low = stop;\n }\n\n if (stop[0] > z) {\n high = stop;\n break;\n }\n }\n\n if (low && high) {\n var zoomDiff = high[0] - low[0],\n zoomProgress = z - low[0],\n\n t = base === 1 ?\n zoomProgress / zoomDiff :\n (Math.pow(base, zoomProgress) - 1) / (Math.pow(base, zoomDiff) - 1);\n\n return interpolate(low[1], high[1], t);\n\n } else if (low) {\n return low[1];\n\n } else if (high) {\n return high[1];\n }\n };\n};\n\nexports['piecewise-constant'] = function(f) {\n if (!f.stops) {\n return constant(f);\n }\n\n var stops = f.stops;\n\n return function(z) {\n for (var i = 0; i < stops.length; i++) {\n if (stops[i][0] > z) {\n return stops[i === 0 ? 0 : i - 1][1];\n }\n }\n\n return stops[stops.length - 1][1];\n }\n};\n","'use strict';\n\n// a simple wrapper around a single arraybuffer\n\nmodule.exports = Buffer;\n\nfunction Buffer(buffer) {\n if (!buffer) {\n this.array = new ArrayBuffer(this.defaultLength);\n this.length = this.defaultLength;\n this.setupViews();\n\n } else {\n // we only recreate buffers after receiving them from workers for binding to gl,\n // so we only need these 2 properties\n this.array = buffer.array;\n this.pos = buffer.pos;\n }\n}\n\nBuffer.prototype = {\n pos: 0,\n itemSize: 4, // bytes in one item\n defaultLength: 8192, // initial buffer size\n arrayType: 'ARRAY_BUFFER', // gl buffer type\n\n get index() {\n return this.pos / this.itemSize;\n },\n\n setupViews: function() {\n // set up views for each type to add data of different types to the same buffer\n this.ubytes = new Uint8Array(this.array);\n this.bytes = new Int8Array(this.array);\n this.ushorts = new Uint16Array(this.array);\n this.shorts = new Int16Array(this.array);\n },\n\n // binds the buffer to a webgl context\n bind: function(gl) {\n var type = gl[this.arrayType];\n if (!this.buffer) {\n this.buffer = gl.createBuffer();\n gl.bindBuffer(type, this.buffer);\n gl.bufferData(type, this.array.slice(0, this.pos), gl.STATIC_DRAW);\n\n // dump array buffer once it's bound to gl\n this.array = null;\n } else {\n gl.bindBuffer(type, this.buffer);\n }\n },\n\n destroy: function(gl) {\n if (this.buffer) {\n gl.deleteBuffer(this.buffer);\n }\n },\n\n // increase the buffer size by 50% if a new item doesn't fit\n resize: function() {\n if (this.length < this.pos + this.itemSize) {\n\n while (this.length < this.pos + this.itemSize) {\n // increase the length by 50% but keep it even\n this.length = Math.round(this.length * 1.5 / 2) * 2;\n }\n\n // array buffers can't be resized, so we create a new one and reset all bytes there\n this.array = new ArrayBuffer(this.length);\n\n var ubytes = new Uint8Array(this.array);\n ubytes.set(this.ubytes);\n\n this.setupViews();\n }\n }\n};\n","'use strict';\n\nvar ElementGroups = require('./element_groups');\n\nmodule.exports = LineBucket;\n\n/**\n * @class LineBucket\n * @private\n */\nfunction LineBucket(buffers, layoutProperties) {\n this.buffers = buffers;\n this.elementGroups = new ElementGroups(buffers.lineVertex, buffers.lineElement);\n this.layoutProperties = layoutProperties;\n}\n\nLineBucket.prototype.addFeatures = function() {\n var features = this.features;\n for (var i = 0; i < features.length; i++) {\n var feature = features[i];\n this.addFeature(feature.loadGeometry());\n }\n};\n\nLineBucket.prototype.addFeature = function(lines) {\n var layoutProperties = this.layoutProperties;\n for (var i = 0; i < lines.length; i++) {\n this.addLine(lines[i],\n layoutProperties['line-join'],\n layoutProperties['line-cap'],\n layoutProperties['line-miter-limit'],\n layoutProperties['line-round-limit']);\n }\n};\n\nLineBucket.prototype.addLine = function(vertices, join, cap, miterLimit, roundLimit) {\n\n var len = vertices.length;\n // If the line has duplicate vertices at the end, adjust length to remove them.\n while (len > 2 && vertices[len - 1].equals(vertices[len - 2])) {\n len--;\n }\n\n if (vertices.length < 2) {\n //console.warn('a line must have at least two vertices');\n return;\n }\n\n if (join === 'bevel') miterLimit = 1.05;\n\n var firstVertex = vertices[0],\n lastVertex = vertices[len - 1],\n closed = firstVertex.equals(lastVertex);\n\n // we could be more precise, but it would only save a negligible amount of space\n this.elementGroups.makeRoomFor(len * 10);\n\n if (len === 2 && closed) {\n // console.warn('a line may not have coincident points');\n return;\n }\n\n var beginCap = cap,\n endCap = closed ? 'butt' : cap,\n flip = 1,\n distance = 0,\n startOfLine = true,\n currentVertex, prevVertex, nextVertex, prevNormal, nextNormal, offsetA, offsetB;\n\n // the last three vertices added\n this.e1 = this.e2 = this.e3 = -1;\n\n if (closed) {\n currentVertex = vertices[len - 2];\n nextNormal = firstVertex.sub(currentVertex)._unit()._perp();\n }\n\n for (var i = 0; i < len; i++) {\n\n nextVertex = closed && i === len - 1 ?\n vertices[1] : // if the line is closed, we treat the last vertex like the first\n vertices[i + 1]; // just the next vertex\n\n // if two consecutive vertices exist, skip the current one\n if (nextVertex && vertices[i].equals(nextVertex)) continue;\n\n if (nextNormal) prevNormal = nextNormal;\n if (currentVertex) prevVertex = currentVertex;\n\n currentVertex = vertices[i];\n\n // Calculate how far along the line the currentVertex is\n if (prevVertex) distance += currentVertex.dist(prevVertex);\n\n // Calculate the normal towards the next vertex in this line. In case\n // there is no next vertex, pretend that the line is continuing straight,\n // meaning that we are just using the previous normal.\n nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal;\n\n // If we still don't have a previous normal, this is the beginning of a\n // non-closed line, so we're doing a straight \"join\".\n prevNormal = prevNormal || nextNormal;\n\n // Determine the normal of the join extrusion. It is the angle bisector\n // of the segments between the previous line and the next line.\n var joinNormal = prevNormal.add(nextNormal)._unit();\n\n /* joinNormal prevNormal\n * ↖ ↑\n * .________. prevVertex\n * |\n * nextNormal ← | currentVertex\n * |\n * nextVertex !\n *\n */\n\n // Calculate the length of the miter (the ratio of the miter to the width).\n // Find the cosine of the angle between the next and join normals\n // using dot product. The inverse of that is the miter length.\n var cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y;\n var miterLength = 1 / cosHalfAngle;\n\n // The join if a middle vertex, otherwise the cap.\n var middleVertex = prevVertex && nextVertex;\n var currentJoin = middleVertex ? join : nextVertex ? beginCap : endCap;\n\n if (middleVertex && currentJoin === 'round') {\n if (miterLength < roundLimit) {\n currentJoin = 'miter';\n } else if (miterLength <= 2) {\n currentJoin = 'fakeround';\n }\n }\n\n if (currentJoin === 'miter' && miterLength > miterLimit) {\n currentJoin = 'bevel';\n }\n\n if (currentJoin === 'bevel') {\n // The maximum extrude length is 128 / 63 = 2 times the width of the line\n // so if miterLength >= 2 we need to draw a different type of bevel where.\n if (miterLength > 2) currentJoin = 'flipbevel';\n\n // If the miterLength is really small and the line bevel wouldn't be visible,\n // just draw a miter join to save a triangle.\n if (miterLength < miterLimit) currentJoin = 'miter';\n }\n\n if (currentJoin === 'miter') {\n joinNormal._mult(miterLength);\n this.addCurrentVertex(currentVertex, flip, distance, joinNormal, 0, 0, false);\n\n } else if (currentJoin === 'flipbevel') {\n // miter is too big, flip the direction to make a beveled join\n\n if (miterLength > 100) {\n // Almost parallel lines\n joinNormal = nextNormal.clone();\n\n } else {\n var direction = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0 ? -1 : 1;\n var bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag();\n joinNormal._perp()._mult(bevelLength * direction);\n }\n this.addCurrentVertex(currentVertex, flip, distance, joinNormal, 0, 0, false);\n flip = -flip;\n\n } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') {\n var lineTurnsLeft = flip * (prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x) > 0;\n var offset = -Math.sqrt(miterLength * miterLength - 1);\n if (lineTurnsLeft) {\n offsetB = 0;\n offsetA = offset;\n } else {\n offsetA = 0;\n offsetB = offset;\n }\n\n // Close previous segment with a bevel\n if (!startOfLine) {\n this.addCurrentVertex(currentVertex, flip, distance, prevNormal, offsetA, offsetB, false);\n }\n\n if (currentJoin === 'fakeround') {\n // The join angle is sharp enough that a round join would be visible.\n // Bevel joins fill the gap between segments with a single pie slice triangle.\n // Create a round join by adding multiple pie slices. The join isn't actually round, but\n // it looks like it is at the sizes we render lines at.\n\n // Add more triangles for sharper angles.\n // This math is just a good enough approximation. It isn't \"correct\".\n var n = Math.floor((0.5 - (cosHalfAngle - 0.5)) * 8);\n var approxFractionalJoinNormal;\n\n for (var m = 0; m < n; m++) {\n approxFractionalJoinNormal = nextNormal.mult((m + 1) / (n + 1))._add(prevNormal)._unit();\n this.addPieSliceVertex(currentVertex, flip, distance, approxFractionalJoinNormal, lineTurnsLeft);\n }\n\n this.addPieSliceVertex(currentVertex, flip, distance, joinNormal, lineTurnsLeft);\n\n for (var k = n - 1; k >= 0; k--) {\n approxFractionalJoinNormal = prevNormal.mult((k + 1) / (n + 1))._add(nextNormal)._unit();\n this.addPieSliceVertex(currentVertex, flip, distance, approxFractionalJoinNormal, lineTurnsLeft);\n }\n }\n\n // Start next segment\n if (nextVertex) {\n this.addCurrentVertex(currentVertex, flip, distance, nextNormal, -offsetA, -offsetB, false);\n }\n\n } else if (currentJoin === 'butt') {\n if (!startOfLine) {\n // Close previous segment with a butt\n this.addCurrentVertex(currentVertex, flip, distance, prevNormal, 0, 0, false);\n }\n\n // Start next segment with a butt\n if (nextVertex) {\n this.addCurrentVertex(currentVertex, flip, distance, nextNormal, 0, 0, false);\n }\n\n } else if (currentJoin === 'square') {\n\n if (!startOfLine) {\n // Close previous segment with a square cap\n this.addCurrentVertex(currentVertex, flip, distance, prevNormal, 1, 1, false);\n\n // The segment is done. Unset vertices to disconnect segments.\n this.e1 = this.e2 = -1;\n flip = 1;\n }\n\n // Start next segment\n if (nextVertex) {\n this.addCurrentVertex(currentVertex, flip, distance, nextNormal, -1, -1, false);\n }\n\n } else if (currentJoin === 'round') {\n\n if (!startOfLine) {\n // Close previous segment with butt\n this.addCurrentVertex(currentVertex, flip, distance, prevNormal, 0, 0, false);\n\n // Add round cap or linejoin at end of segment\n this.addCurrentVertex(currentVertex, flip, distance, prevNormal, 1, 1, true);\n\n // The segment is done. Unset vertices to disconnect segments.\n this.e1 = this.e2 = -1;\n flip = 1;\n }\n\n\n // Start next segment with a butt\n if (nextVertex) {\n // Add round cap before first segment\n this.addCurrentVertex(currentVertex, flip, distance, nextNormal, -1, -1, true);\n\n this.addCurrentVertex(currentVertex, flip, distance, nextNormal, 0, 0, false);\n }\n }\n\n startOfLine = false;\n }\n\n\n};\n\n/**\n * Add two vertices to the buffers.\n *\n * @param {Object} currentVertex the line vertex to add buffer vertices for\n * @param {number} flip -1 if the vertices should be flipped, 1 otherwise\n * @param {number} distance the distance from the beggining of the line to the vertex\n * @param {number} endLeft extrude to shift the left vertex along the line\n * @param {number} endRight extrude to shift the left vertex along the line\n * @param {boolean} round whether this is a round cap\n * @private\n */\nLineBucket.prototype.addCurrentVertex = function(currentVertex, flip, distance, normal, endLeft, endRight, round) {\n var tx = round ? 1 : 0;\n var extrude;\n\n var lineVertex = this.buffers.lineVertex;\n var lineElement = this.buffers.lineElement;\n var elementGroup = this.elementGroups.current;\n var vertexStartIndex = this.elementGroups.current.vertexStartIndex;\n\n extrude = normal.mult(flip);\n if (endLeft) extrude._sub(normal.perp()._mult(endLeft));\n this.e3 = lineVertex.add(currentVertex, extrude, tx, 0, distance) - vertexStartIndex;\n if (this.e1 >= 0 && this.e2 >= 0) {\n lineElement.add(this.e1, this.e2, this.e3);\n elementGroup.elementLength++;\n }\n this.e1 = this.e2;\n this.e2 = this.e3;\n\n extrude = normal.mult(-flip);\n if (endRight) extrude._sub(normal.perp()._mult(endRight));\n this.e3 = lineVertex.add(currentVertex, extrude, tx, 1, distance) - vertexStartIndex;\n if (this.e1 >= 0 && this.e2 >= 0) {\n lineElement.add(this.e1, this.e2, this.e3);\n elementGroup.elementLength++;\n }\n this.e1 = this.e2;\n this.e2 = this.e3;\n\n elementGroup.vertexLength += 2;\n};\n\n/**\n * Add a single new vertex and a triangle using two previous vertices.\n * This adds a pie slice triangle near a join to simulate round joins\n *\n * @param {Object} currentVertex the line vertex to add buffer vertices for\n * @param {number} flip -1 if the vertices should be flipped, 1 otherwise\n * @param {number} distance the distance from the beggining of the line to the vertex\n * @param {Object} extrude the offset of the new vertex from the currentVertex\n * @param {boolean} whether the line is turning left or right at this angle\n * @private\n */\nLineBucket.prototype.addPieSliceVertex = function(currentVertex, flip, distance, extrude, lineTurnsLeft) {\n var lineVertex = this.buffers.lineVertex;\n var lineElement = this.buffers.lineElement;\n var elementGroup = this.elementGroups.current;\n var vertexStartIndex = this.elementGroups.current.vertexStartIndex;\n\n var ty = lineTurnsLeft;\n extrude = extrude.mult(flip * (lineTurnsLeft ? -1 : 1));\n\n this.e3 = lineVertex.add(currentVertex, extrude, 0, ty, distance) - vertexStartIndex;\n elementGroup.vertexLength += 1;\n\n if (this.e1 >= 0 && this.e2 >= 0) {\n lineElement.add(this.e1, this.e2, this.e3);\n elementGroup.elementLength++;\n }\n\n\n if (lineTurnsLeft) {\n this.e2 = this.e3;\n } else {\n this.e1 = this.e3;\n }\n};\n","'use strict';\n\nvar ElementGroups = require('./element_groups');\n\nmodule.exports = FillBucket;\n\nfunction FillBucket(buffers) {\n this.buffers = buffers;\n this.elementGroups = new ElementGroups(buffers.fillVertex, buffers.fillElement, buffers.outlineElement);\n}\n\nFillBucket.prototype.addFeatures = function() {\n var features = this.features;\n for (var i = 0; i < features.length; i++) {\n var feature = features[i];\n this.addFeature(feature.loadGeometry());\n }\n};\n\nFillBucket.prototype.addFeature = function(lines) {\n for (var i = 0; i < lines.length; i++) {\n this.addFill(lines[i]);\n }\n};\n\nFillBucket.prototype.addFill = function(vertices) {\n if (vertices.length < 3) {\n //console.warn('a fill must have at least three vertices');\n return;\n }\n\n // Calculate the total number of vertices we're going to produce so that we\n // can resize the buffer beforehand, or detect whether the current line\n // won't fit into the buffer anymore.\n // In order to be able to use the vertex buffer for drawing the antialiased\n // outlines, we separate all polygon vertices with a degenerate (out-of-\n // viewplane) vertex.\n\n var len = vertices.length;\n\n // Check whether this geometry buffer can hold all the required vertices.\n this.elementGroups.makeRoomFor(len + 1);\n var elementGroup = this.elementGroups.current;\n\n var fillVertex = this.buffers.fillVertex;\n var fillElement = this.buffers.fillElement;\n var outlineElement = this.buffers.outlineElement;\n\n // We're generating triangle fans, so we always start with the first coordinate in this polygon.\n var firstIndex = fillVertex.index - elementGroup.vertexStartIndex,\n prevIndex, currentIndex, currentVertex;\n\n for (var i = 0; i < vertices.length; i++) {\n currentIndex = fillVertex.index - elementGroup.vertexStartIndex;\n currentVertex = vertices[i];\n\n fillVertex.add(currentVertex.x, currentVertex.y);\n elementGroup.vertexLength++;\n\n // Only add triangles that have distinct vertices.\n if (i >= 2 && (currentVertex.x !== vertices[0].x || currentVertex.y !== vertices[0].y)) {\n fillElement.add(firstIndex, prevIndex, currentIndex);\n elementGroup.elementLength++;\n }\n\n if (i >= 1) {\n outlineElement.add(prevIndex, currentIndex);\n elementGroup.secondElementLength++;\n }\n\n prevIndex = currentIndex;\n }\n};\n","'use strict';\n\nvar ElementGroups = require('./element_groups');\nvar Anchor = require('../symbol/anchor');\nvar getAnchors = require('../symbol/get_anchors');\nvar resolveTokens = require('../util/token');\nvar Quads = require('../symbol/quads');\nvar Shaping = require('../symbol/shaping');\nvar resolveText = require('../symbol/resolve_text');\nvar resolveIcons = require('../symbol/resolve_icons');\nvar mergeLines = require('../symbol/mergelines');\nvar shapeText = Shaping.shapeText;\nvar shapeIcon = Shaping.shapeIcon;\nvar getGlyphQuads = Quads.getGlyphQuads;\nvar getIconQuads = Quads.getIconQuads;\nvar clipLine = require('../symbol/clip_line');\nvar Point = require('point-geometry');\n\nvar CollisionFeature = require('../symbol/collision_feature');\n\nmodule.exports = SymbolBucket;\n\nfunction SymbolBucket(buffers, layoutProperties, overscaling, zoom, collisionDebug) {\n this.buffers = buffers;\n this.layoutProperties = layoutProperties;\n this.overscaling = overscaling;\n this.zoom = zoom;\n this.collisionDebug = collisionDebug;\n var tileSize = 512 * overscaling;\n var tileExtent = 4096;\n this.tilePixelRatio = tileExtent / tileSize;\n this.compareText = {};\n this.symbolInstances = [];\n\n}\n\nSymbolBucket.prototype.needsPlacement = true;\n\nSymbolBucket.prototype.addFeatures = function(collisionTile) {\n var layout = this.layoutProperties;\n var features = this.features;\n var textFeatures = this.textFeatures;\n\n var horizontalAlign = 0.5,\n verticalAlign = 0.5;\n\n switch (layout['text-anchor']) {\n case 'right':\n case 'top-right':\n case 'bottom-right':\n horizontalAlign = 1;\n break;\n case 'left':\n case 'top-left':\n case 'bottom-left':\n horizontalAlign = 0;\n break;\n }\n\n switch (layout['text-anchor']) {\n case 'bottom':\n case 'bottom-right':\n case 'bottom-left':\n verticalAlign = 1;\n break;\n case 'top':\n case 'top-right':\n case 'top-left':\n verticalAlign = 0;\n break;\n }\n\n var justify = layout['text-justify'] === 'right' ? 1 :\n layout['text-justify'] === 'left' ? 0 :\n 0.5;\n\n var oneEm = 24;\n var lineHeight = layout['text-line-height'] * oneEm;\n var maxWidth = layout['symbol-placement'] !== 'line' ? layout['text-max-width'] * oneEm : 0;\n var spacing = layout['text-letter-spacing'] * oneEm;\n var textOffset = [layout['text-offset'][0] * oneEm, layout['text-offset'][1] * oneEm];\n var fontstack = layout['text-font'];\n\n var geometries = [];\n for (var g = 0; g < features.length; g++) {\n geometries.push(features[g].loadGeometry());\n }\n\n if (layout['symbol-placement'] === 'line') {\n // Merge adjacent lines with the same text to improve labelling.\n // It's better to place labels on one long line than on many short segments.\n var merged = mergeLines(features, textFeatures, geometries);\n\n geometries = merged.geometries;\n features = merged.features;\n textFeatures = merged.textFeatures;\n }\n\n var shapedText, shapedIcon;\n\n for (var k = 0; k < features.length; k++) {\n if (!geometries[k]) continue;\n\n if (textFeatures[k]) {\n shapedText = shapeText(textFeatures[k], this.stacks[fontstack], maxWidth,\n lineHeight, horizontalAlign, verticalAlign, justify, spacing, textOffset);\n } else {\n shapedText = null;\n }\n\n if (layout['icon-image']) {\n var iconName = resolveTokens(features[k].properties, layout['icon-image']);\n var image = this.icons[iconName];\n shapedIcon = shapeIcon(image, layout);\n\n if (image) {\n if (this.sdfIcons === undefined) {\n this.sdfIcons = image.sdf;\n } else if (this.sdfIcons !== image.sdf) {\n console.warn('Style sheet warning: Cannot mix SDF and non-SDF icons in one bucket');\n }\n }\n } else {\n shapedIcon = null;\n }\n\n if (shapedText || shapedIcon) {\n this.addFeature(geometries[k], shapedText, shapedIcon);\n }\n }\n\n this.placeFeatures(collisionTile, this.buffers, this.collisionDebug);\n};\n\nSymbolBucket.prototype.addFeature = function(lines, shapedText, shapedIcon) {\n var layout = this.layoutProperties;\n\n var glyphSize = 24;\n\n var fontScale = layout['text-max-size'] / glyphSize,\n textBoxScale = this.tilePixelRatio * fontScale,\n iconBoxScale = this.tilePixelRatio * layout['icon-max-size'],\n symbolMinDistance = this.tilePixelRatio * layout['symbol-min-distance'],\n avoidEdges = layout['symbol-avoid-edges'],\n textPadding = layout['text-padding'] * this.tilePixelRatio,\n iconPadding = layout['icon-padding'] * this.tilePixelRatio,\n textMaxAngle = layout['text-max-angle'] / 180 * Math.PI,\n textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line',\n iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line',\n mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] ||\n layout['text-ignore-placement'] || layout['icon-ignore-placement'],\n isLine = layout['symbol-placement'] === 'line',\n textRepeatDistance = symbolMinDistance / 2;\n\n if (isLine) {\n lines = clipLine(lines, 0, 0, 4096, 4096);\n }\n\n for (var i = 0; i < lines.length; i++) {\n var line = lines[i];\n\n // Calculate the anchor points around which you want to place labels\n var anchors = isLine ?\n getAnchors(line, symbolMinDistance, textMaxAngle, shapedText, shapedIcon, glyphSize, textBoxScale, this.overscaling) :\n [ new Anchor(line[0].x, line[0].y, 0) ];\n\n // For each potential label, create the placement features used to check for collisions, and the quads use for rendering.\n for (var j = 0, len = anchors.length; j < len; j++) {\n var anchor = anchors[j];\n\n if (shapedText && isLine) {\n if (this.anchorIsTooClose(shapedText.text, textRepeatDistance, anchor)) {\n continue;\n }\n }\n\n var inside = !(anchor.x < 0 || anchor.x > 4096 || anchor.y < 0 || anchor.y > 4096);\n\n if (avoidEdges && !inside) continue;\n\n // Normally symbol layers are drawn across tile boundaries. Only symbols\n // with their anchors within the tile boundaries are added to the buffers\n // to prevent symbols from being drawn twice.\n //\n // Symbols in layers with overlap are sorted in the y direction so that\n // symbols lower on the canvas are drawn on top of symbols near the top.\n // To preserve this order across tile boundaries these symbols can't\n // be drawn across tile boundaries. Instead they need to be included in\n // the buffers for both tiles and clipped to tile boundaries at draw time.\n var addToBuffers = inside || mayOverlap;\n\n this.symbolInstances.push(new SymbolInstance(anchor, line, shapedText, shapedIcon, layout, addToBuffers,\n textBoxScale, textPadding, textAlongLine,\n iconBoxScale, iconPadding, iconAlongLine));\n }\n }\n};\n\n// Check if any other anchors with the same text are closer than repeatDistance\nSymbolBucket.prototype.anchorIsTooClose = function(text, repeatDistance, anchor) {\n var compareText = this.compareText;\n if (!(text in compareText)) {\n compareText[text] = [];\n } else {\n var otherAnchors = compareText[text];\n for (var k = otherAnchors.length - 1; k >= 0; k--) {\n if (anchor.dist(otherAnchors[k]) < repeatDistance) {\n // If it's within repeatDistance of one anchor, stop looking\n return true;\n }\n }\n }\n // If anchor is not within repeatDistance of any other anchor, add to array\n compareText[text].push(anchor);\n return false;\n};\n\nSymbolBucket.prototype.placeFeatures = function(collisionTile, buffers, collisionDebug) {\n\n // Calculate which labels can be shown and when they can be shown and\n // create the bufers used for rendering.\n\n this.buffers = buffers;\n\n var elementGroups = this.elementGroups = {\n text: new ElementGroups(buffers.glyphVertex, buffers.glyphElement),\n icon: new ElementGroups(buffers.iconVertex, buffers.iconElement),\n sdfIcons: this.sdfIcons\n };\n\n var layout = this.layoutProperties;\n var maxScale = collisionTile.maxScale;\n\n var textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line';\n var iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line';\n\n var mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] ||\n layout['text-ignore-placement'] || layout['icon-ignore-placement'];\n\n // Sort symbols by their y position on the canvas so that they lower symbols\n // are drawn on top of higher symbols.\n // Don't sort symbols that won't overlap because it isn't necessary and\n // because it causes more labels to pop in and out when rotating.\n if (mayOverlap) {\n var angle = collisionTile.angle;\n var sin = Math.sin(angle),\n cos = Math.cos(angle);\n\n this.symbolInstances.sort(function(a, b) {\n var aRotated = sin * a.x + cos * a.y;\n var bRotated = sin * b.x + cos * b.y;\n return bRotated - aRotated;\n });\n }\n\n for (var p = 0; p < this.symbolInstances.length; p++) {\n var symbolInstance = this.symbolInstances[p];\n var hasText = symbolInstance.hasText;\n var hasIcon = symbolInstance.hasIcon;\n\n var iconWithoutText = layout['text-optional'] || !hasText,\n textWithoutIcon = layout['icon-optional'] || !hasIcon;\n\n\n // Calculate the scales at which the text and icon can be placed without collision.\n\n var glyphScale = hasText && !layout['text-allow-overlap'] ?\n collisionTile.placeCollisionFeature(symbolInstance.textCollisionFeature) :\n collisionTile.minScale;\n\n var iconScale = hasIcon && !layout['icon-allow-overlap'] ?\n collisionTile.placeCollisionFeature(symbolInstance.iconCollisionFeature) :\n collisionTile.minScale;\n\n\n // Combine the scales for icons and text.\n\n if (!iconWithoutText && !textWithoutIcon) {\n iconScale = glyphScale = Math.max(iconScale, glyphScale);\n } else if (!textWithoutIcon && glyphScale) {\n glyphScale = Math.max(iconScale, glyphScale);\n } else if (!iconWithoutText && iconScale) {\n iconScale = Math.max(iconScale, glyphScale);\n }\n\n\n // Insert final placement into collision tree and add glyphs/icons to buffers\n\n if (hasText) {\n if (!layout['text-ignore-placement']) {\n collisionTile.insertCollisionFeature(symbolInstance.textCollisionFeature, glyphScale);\n }\n if (glyphScale <= maxScale) {\n this.addSymbols(buffers.glyphVertex, buffers.glyphElement, elementGroups.text,\n symbolInstance.glyphQuads, glyphScale, layout['text-keep-upright'], textAlongLine,\n collisionTile.angle);\n }\n }\n\n if (hasIcon) {\n if (!layout['icon-ignore-placement']) {\n collisionTile.insertCollisionFeature(symbolInstance.iconCollisionFeature, iconScale);\n }\n if (iconScale <= maxScale) {\n this.addSymbols(buffers.iconVertex, buffers.iconElement, elementGroups.icon,\n symbolInstance.iconQuads, iconScale, layout['icon-keep-upright'], iconAlongLine,\n collisionTile.angle);\n }\n }\n\n }\n\n if (collisionDebug) this.addToDebugBuffers(collisionTile);\n};\n\nSymbolBucket.prototype.addSymbols = function(vertex, element, elementGroups, quads, scale, keepUpright, alongLine, placementAngle) {\n\n elementGroups.makeRoomFor(4 * quads.length);\n var elementGroup = elementGroups.current;\n\n var zoom = this.zoom;\n var placementZoom = Math.max(Math.log(scale) / Math.LN2 + zoom, 0);\n\n for (var k = 0; k < quads.length; k++) {\n\n var symbol = quads[k],\n angle = symbol.angle;\n\n // drop upside down versions of glyphs\n var a = (angle + placementAngle + Math.PI) % (Math.PI * 2);\n if (keepUpright && alongLine && (a <= Math.PI / 2 || a > Math.PI * 3 / 2)) continue;\n\n var tl = symbol.tl,\n tr = symbol.tr,\n bl = symbol.bl,\n br = symbol.br,\n tex = symbol.tex,\n anchorPoint = symbol.anchorPoint,\n\n minZoom = Math.max(zoom + Math.log(symbol.minScale) / Math.LN2, placementZoom),\n maxZoom = Math.min(zoom + Math.log(symbol.maxScale) / Math.LN2, 25);\n\n if (maxZoom <= minZoom) continue;\n\n // Lower min zoom so that while fading out the label it can be shown outside of collision-free zoom levels\n if (minZoom === placementZoom) minZoom = 0;\n\n var triangleIndex = vertex.index - elementGroup.vertexStartIndex;\n\n vertex.add(anchorPoint.x, anchorPoint.y, tl.x, tl.y, tex.x, tex.y, minZoom, maxZoom, placementZoom);\n vertex.add(anchorPoint.x, anchorPoint.y, tr.x, tr.y, tex.x + tex.w, tex.y, minZoom, maxZoom, placementZoom);\n vertex.add(anchorPoint.x, anchorPoint.y, bl.x, bl.y, tex.x, tex.y + tex.h, minZoom, maxZoom, placementZoom);\n vertex.add(anchorPoint.x, anchorPoint.y, br.x, br.y, tex.x + tex.w, tex.y + tex.h, minZoom, maxZoom, placementZoom);\n elementGroup.vertexLength += 4;\n\n element.add(triangleIndex, triangleIndex + 1, triangleIndex + 2);\n element.add(triangleIndex + 1, triangleIndex + 2, triangleIndex + 3);\n elementGroup.elementLength += 2;\n }\n\n};\n\nSymbolBucket.prototype.getDependencies = function(tile, actor, callback) {\n var firstdone = false;\n this.getTextDependencies(tile, actor, done);\n this.getIconDependencies(tile, actor, done);\n function done(err) {\n if (err || firstdone) return callback(err);\n firstdone = true;\n }\n};\n\nSymbolBucket.prototype.getIconDependencies = function(tile, actor, callback) {\n if (this.layoutProperties['icon-image']) {\n var features = this.features;\n var icons = resolveIcons(features, this.layoutProperties);\n\n if (icons.length) {\n actor.send('get icons', { icons: icons }, setIcons.bind(this));\n } else {\n callback();\n }\n } else {\n callback();\n }\n\n function setIcons(err, newicons) {\n if (err) return callback(err);\n this.icons = newicons;\n callback();\n }\n};\n\nSymbolBucket.prototype.getTextDependencies = function(tile, actor, callback) {\n var features = this.features;\n var fontstack = this.layoutProperties['text-font'];\n\n var stacks = this.stacks = tile.stacks;\n if (stacks[fontstack] === undefined) {\n stacks[fontstack] = {};\n }\n var stack = stacks[fontstack];\n\n var data = resolveText(features, this.layoutProperties, stack);\n this.textFeatures = data.textFeatures;\n\n actor.send('get glyphs', {\n uid: tile.uid,\n fontstack: fontstack,\n codepoints: data.codepoints\n }, function(err, newstack) {\n if (err) return callback(err);\n\n for (var codepoint in newstack) {\n stack[codepoint] = newstack[codepoint];\n }\n\n callback();\n });\n};\n\nSymbolBucket.prototype.addToDebugBuffers = function(collisionTile) {\n\n this.elementGroups.collisionBox = new ElementGroups(this.buffers.collisionBoxVertex);\n this.elementGroups.collisionBox.makeRoomFor(0);\n var buffer = this.buffers.collisionBoxVertex;\n var angle = -collisionTile.angle;\n var yStretch = collisionTile.yStretch;\n\n for (var j = 0; j < this.symbolInstances.length; j++) {\n for (var i = 0; i < 2; i++) {\n var feature = this.symbolInstances[j][i === 0 ? 'textCollisionFeature' : 'iconCollisionFeature'];\n if (!feature) continue;\n var boxes = feature.boxes;\n\n for (var b = 0; b < boxes.length; b++) {\n var box = boxes[b];\n var anchorPoint = box.anchorPoint;\n\n var tl = new Point(box.x1, box.y1 * yStretch)._rotate(angle);\n var tr = new Point(box.x2, box.y1 * yStretch)._rotate(angle);\n var bl = new Point(box.x1, box.y2 * yStretch)._rotate(angle);\n var br = new Point(box.x2, box.y2 * yStretch)._rotate(angle);\n\n var maxZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.maxScale) / Math.LN2));\n var placementZoom = Math.max(0, Math.min(25, this.zoom + Math.log(box.placementScale) / Math.LN2));\n\n buffer.add(anchorPoint, tl, maxZoom, placementZoom);\n buffer.add(anchorPoint, tr, maxZoom, placementZoom);\n buffer.add(anchorPoint, tr, maxZoom, placementZoom);\n buffer.add(anchorPoint, br, maxZoom, placementZoom);\n buffer.add(anchorPoint, br, maxZoom, placementZoom);\n buffer.add(anchorPoint, bl, maxZoom, placementZoom);\n buffer.add(anchorPoint, bl, maxZoom, placementZoom);\n buffer.add(anchorPoint, tl, maxZoom, placementZoom);\n\n this.elementGroups.collisionBox.current.vertexLength += 8;\n }\n }\n }\n};\n\nfunction SymbolInstance(anchor, line, shapedText, shapedIcon, layout, addToBuffers,\n textBoxScale, textPadding, textAlongLine,\n iconBoxScale, iconPadding, iconAlongLine) {\n\n this.x = anchor.x;\n this.y = anchor.y;\n this.hasText = !!shapedText;\n this.hasIcon = !!shapedIcon;\n\n if (this.hasText) {\n this.glyphQuads = addToBuffers ? getGlyphQuads(anchor, shapedText, textBoxScale, line, layout, textAlongLine) : [];\n this.textCollisionFeature = new CollisionFeature(line, anchor, shapedText, textBoxScale, textPadding, textAlongLine);\n }\n\n if (this.hasIcon) {\n this.iconQuads = addToBuffers ? getIconQuads(anchor, shapedIcon, iconBoxScale, line, layout, iconAlongLine) : [];\n this.iconCollisionFeature = new CollisionFeature(line, anchor, shapedIcon, iconBoxScale, iconPadding, iconAlongLine);\n }\n}\n","/*\n (c) 2013, Vladimir Agafonkin\n RBush, a JavaScript library for high-performance 2D spatial indexing of points and rectangles.\n https://github.com/mourner/rbush\n*/\n\n(function () { 'use strict';\n\nfunction rbush(maxEntries, format) {\n\n // jshint newcap: false, validthis: true\n if (!(this instanceof rbush)) return new rbush(maxEntries, format);\n\n // max entries in a node is 9 by default; min node fill is 40% for best performance\n this._maxEntries = Math.max(4, maxEntries || 9);\n this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));\n\n if (format) {\n this._initFormat(format);\n }\n\n this.clear();\n}\n\nrbush.prototype = {\n\n all: function () {\n return this._all(this.data, []);\n },\n\n search: function (bbox) {\n\n var node = this.data,\n result = [],\n toBBox = this.toBBox;\n\n if (!intersects(bbox, node.bbox)) return result;\n\n var nodesToSearch = [],\n i, len, child, childBBox;\n\n while (node) {\n for (i = 0, len = node.children.length; i < len; i++) {\n\n child = node.children[i];\n childBBox = node.leaf ? toBBox(child) : child.bbox;\n\n if (intersects(bbox, childBBox)) {\n if (node.leaf) result.push(child);\n else if (contains(bbox, childBBox)) this._all(child, result);\n else nodesToSearch.push(child);\n }\n }\n node = nodesToSearch.pop();\n }\n\n return result;\n },\n\n collides: function (bbox) {\n\n var node = this.data,\n toBBox = this.toBBox;\n\n if (!intersects(bbox, node.bbox)) return false;\n\n var nodesToSearch = [],\n i, len, child, childBBox;\n\n while (node) {\n for (i = 0, len = node.children.length; i < len; i++) {\n\n child = node.children[i];\n childBBox = node.leaf ? toBBox(child) : child.bbox;\n\n if (intersects(bbox, childBBox)) {\n if (node.leaf || contains(bbox, childBBox)) return true;\n nodesToSearch.push(child);\n }\n }\n node = nodesToSearch.pop();\n }\n\n return false;\n },\n\n load: function (data) {\n if (!(data && data.length)) return this;\n\n if (data.length < this._minEntries) {\n for (var i = 0, len = data.length; i < len; i++) {\n this.insert(data[i]);\n }\n return this;\n }\n\n // recursively build the tree with the given data from stratch using OMT algorithm\n var node = this._build(data.slice(), 0, data.length - 1, 0);\n\n if (!this.data.children.length) {\n // save as is if tree is empty\n this.data = node;\n\n } else if (this.data.height === node.height) {\n // split root if trees have the same height\n this._splitRoot(this.data, node);\n\n } else {\n if (this.data.height < node.height) {\n // swap trees if inserted one is bigger\n var tmpNode = this.data;\n this.data = node;\n node = tmpNode;\n }\n\n // insert the small tree into the large tree at appropriate level\n this._insert(node, this.data.height - node.height - 1, true);\n }\n\n return this;\n },\n\n insert: function (item) {\n if (item) this._insert(item, this.data.height - 1);\n return this;\n },\n\n clear: function () {\n this.data = {\n children: [],\n height: 1,\n bbox: empty(),\n leaf: true\n };\n return this;\n },\n\n remove: function (item) {\n if (!item) return this;\n\n var node = this.data,\n bbox = this.toBBox(item),\n path = [],\n indexes = [],\n i, parent, index, goingUp;\n\n // depth-first iterative tree traversal\n while (node || path.length) {\n\n if (!node) { // go up\n node = path.pop();\n parent = path[path.length - 1];\n i = indexes.pop();\n goingUp = true;\n }\n\n if (node.leaf) { // check current node\n index = node.children.indexOf(item);\n\n if (index !== -1) {\n // item found, remove the item and condense tree upwards\n node.children.splice(index, 1);\n path.push(node);\n this._condense(path);\n return this;\n }\n }\n\n if (!goingUp && !node.leaf && contains(node.bbox, bbox)) { // go down\n path.push(node);\n indexes.push(i);\n i = 0;\n parent = node;\n node = node.children[0];\n\n } else if (parent) { // go right\n i++;\n node = parent.children[i];\n goingUp = false;\n\n } else node = null; // nothing found\n }\n\n return this;\n },\n\n toBBox: function (item) { return item; },\n\n compareMinX: function (a, b) { return a[0] - b[0]; },\n compareMinY: function (a, b) { return a[1] - b[1]; },\n\n toJSON: function () { return this.data; },\n\n fromJSON: function (data) {\n this.data = data;\n return this;\n },\n\n _all: function (node, result) {\n var nodesToSearch = [];\n while (node) {\n if (node.leaf) result.push.apply(result, node.children);\n else nodesToSearch.push.apply(nodesToSearch, node.children);\n\n node = nodesToSearch.pop();\n }\n return result;\n },\n\n _build: function (items, left, right, height) {\n\n var N = right - left + 1,\n M = this._maxEntries,\n node;\n\n if (N <= M) {\n // reached leaf level; return leaf\n node = {\n children: items.slice(left, right + 1),\n height: 1,\n bbox: null,\n leaf: true\n };\n calcBBox(node, this.toBBox);\n return node;\n }\n\n if (!height) {\n // target height of the bulk-loaded tree\n height = Math.ceil(Math.log(N) / Math.log(M));\n\n // target number of root entries to maximize storage utilization\n M = Math.ceil(N / Math.pow(M, height - 1));\n }\n\n // TODO eliminate recursion?\n\n node = {\n children: [],\n height: height,\n bbox: null\n };\n\n // split the items into M mostly square tiles\n\n var N2 = Math.ceil(N / M),\n N1 = N2 * Math.ceil(Math.sqrt(M)),\n i, j, right2, right3;\n\n multiSelect(items, left, right, N1, this.compareMinX);\n\n for (i = left; i <= right; i += N1) {\n\n right2 = Math.min(i + N1 - 1, right);\n\n multiSelect(items, i, right2, N2, this.compareMinY);\n\n for (j = i; j <= right2; j += N2) {\n\n right3 = Math.min(j + N2 - 1, right2);\n\n // pack each entry recursively\n node.children.push(this._build(items, j, right3, height - 1));\n }\n }\n\n calcBBox(node, this.toBBox);\n\n return node;\n },\n\n _chooseSubtree: function (bbox, node, level, path) {\n\n var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;\n\n while (true) {\n path.push(node);\n\n if (node.leaf || path.length - 1 === level) break;\n\n minArea = minEnlargement = Infinity;\n\n for (i = 0, len = node.children.length; i < len; i++) {\n child = node.children[i];\n area = bboxArea(child.bbox);\n enlargement = enlargedArea(bbox, child.bbox) - area;\n\n // choose entry with the least area enlargement\n if (enlargement < minEnlargement) {\n minEnlargement = enlargement;\n minArea = area < minArea ? area : minArea;\n targetNode = child;\n\n } else if (enlargement === minEnlargement) {\n // otherwise choose one with the smallest area\n if (area < minArea) {\n minArea = area;\n targetNode = child;\n }\n }\n }\n\n node = targetNode;\n }\n\n return node;\n },\n\n _insert: function (item, level, isNode) {\n\n var toBBox = this.toBBox,\n bbox = isNode ? item.bbox : toBBox(item),\n insertPath = [];\n\n // find the best node for accommodating the item, saving all nodes along the path too\n var node = this._chooseSubtree(bbox, this.data, level, insertPath);\n\n // put the item into the node\n node.children.push(item);\n extend(node.bbox, bbox);\n\n // split on node overflow; propagate upwards if necessary\n while (level >= 0) {\n if (insertPath[level].children.length > this._maxEntries) {\n this._split(insertPath, level);\n level--;\n } else break;\n }\n\n // adjust bboxes along the insertion path\n this._adjustParentBBoxes(bbox, insertPath, level);\n },\n\n // split overflowed node into two\n _split: function (insertPath, level) {\n\n var node = insertPath[level],\n M = node.children.length,\n m = this._minEntries;\n\n this._chooseSplitAxis(node, m, M);\n\n var newNode = {\n children: node.children.splice(this._chooseSplitIndex(node, m, M)),\n height: node.height\n };\n\n if (node.leaf) newNode.leaf = true;\n\n calcBBox(node, this.toBBox);\n calcBBox(newNode, this.toBBox);\n\n if (level) insertPath[level - 1].children.push(newNode);\n else this._splitRoot(node, newNode);\n },\n\n _splitRoot: function (node, newNode) {\n // split root node\n this.data = {\n children: [node, newNode],\n height: node.height + 1\n };\n calcBBox(this.data, this.toBBox);\n },\n\n _chooseSplitIndex: function (node, m, M) {\n\n var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;\n\n minOverlap = minArea = Infinity;\n\n for (i = m; i <= M - m; i++) {\n bbox1 = distBBox(node, 0, i, this.toBBox);\n bbox2 = distBBox(node, i, M, this.toBBox);\n\n overlap = intersectionArea(bbox1, bbox2);\n area = bboxArea(bbox1) + bboxArea(bbox2);\n\n // choose distribution with minimum overlap\n if (overlap < minOverlap) {\n minOverlap = overlap;\n index = i;\n\n minArea = area < minArea ? area : minArea;\n\n } else if (overlap === minOverlap) {\n // otherwise choose distribution with minimum area\n if (area < minArea) {\n minArea = area;\n index = i;\n }\n }\n }\n\n return index;\n },\n\n // sorts node children by the best axis for split\n _chooseSplitAxis: function (node, m, M) {\n\n var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,\n compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,\n xMargin = this._allDistMargin(node, m, M, compareMinX),\n yMargin = this._allDistMargin(node, m, M, compareMinY);\n\n // if total distributions margin value is minimal for x, sort by minX,\n // otherwise it's already sorted by minY\n if (xMargin < yMargin) node.children.sort(compareMinX);\n },\n\n // total margin of all possible split distributions where each node is at least m full\n _allDistMargin: function (node, m, M, compare) {\n\n node.children.sort(compare);\n\n var toBBox = this.toBBox,\n leftBBox = distBBox(node, 0, m, toBBox),\n rightBBox = distBBox(node, M - m, M, toBBox),\n margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),\n i, child;\n\n for (i = m; i < M - m; i++) {\n child = node.children[i];\n extend(leftBBox, node.leaf ? toBBox(child) : child.bbox);\n margin += bboxMargin(leftBBox);\n }\n\n for (i = M - m - 1; i >= m; i--) {\n child = node.children[i];\n extend(rightBBox, node.leaf ? toBBox(child) : child.bbox);\n margin += bboxMargin(rightBBox);\n }\n\n return margin;\n },\n\n _adjustParentBBoxes: function (bbox, path, level) {\n // adjust bboxes along the given tree path\n for (var i = level; i >= 0; i--) {\n extend(path[i].bbox, bbox);\n }\n },\n\n _condense: function (path) {\n // go through the path, removing empty nodes and updating bboxes\n for (var i = path.length - 1, siblings; i >= 0; i--) {\n if (path[i].children.length === 0) {\n if (i > 0) {\n siblings = path[i - 1].children;\n siblings.splice(siblings.indexOf(path[i]), 1);\n\n } else this.clear();\n\n } else calcBBox(path[i], this.toBBox);\n }\n },\n\n _initFormat: function (format) {\n // data format (minX, minY, maxX, maxY accessors)\n\n // uses eval-type function compilation instead of just accepting a toBBox function\n // because the algorithms are very sensitive to sorting functions performance,\n // so they should be dead simple and without inner calls\n\n // jshint evil: true\n\n var compareArr = ['return a', ' - b', ';'];\n\n this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));\n this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));\n\n this.toBBox = new Function('a', 'return [a' + format.join(', a') + '];');\n }\n};\n\n\n// calculate node's bbox from bboxes of its children\nfunction calcBBox(node, toBBox) {\n node.bbox = distBBox(node, 0, node.children.length, toBBox);\n}\n\n// min bounding rectangle of node children from k to p-1\nfunction distBBox(node, k, p, toBBox) {\n var bbox = empty();\n\n for (var i = k, child; i < p; i++) {\n child = node.children[i];\n extend(bbox, node.leaf ? toBBox(child) : child.bbox);\n }\n\n return bbox;\n}\n\nfunction empty() { return [Infinity, Infinity, -Infinity, -Infinity]; }\n\nfunction extend(a, b) {\n a[0] = Math.min(a[0], b[0]);\n a[1] = Math.min(a[1], b[1]);\n a[2] = Math.max(a[2], b[2]);\n a[3] = Math.max(a[3], b[3]);\n return a;\n}\n\nfunction compareNodeMinX(a, b) { return a.bbox[0] - b.bbox[0]; }\nfunction compareNodeMinY(a, b) { return a.bbox[1] - b.bbox[1]; }\n\nfunction bboxArea(a) { return (a[2] - a[0]) * (a[3] - a[1]); }\nfunction bboxMargin(a) { return (a[2] - a[0]) + (a[3] - a[1]); }\n\nfunction enlargedArea(a, b) {\n return (Math.max(b[2], a[2]) - Math.min(b[0], a[0])) *\n (Math.max(b[3], a[3]) - Math.min(b[1], a[1]));\n}\n\nfunction intersectionArea(a, b) {\n var minX = Math.max(a[0], b[0]),\n minY = Math.max(a[1], b[1]),\n maxX = Math.min(a[2], b[2]),\n maxY = Math.min(a[3], b[3]);\n\n return Math.max(0, maxX - minX) *\n Math.max(0, maxY - minY);\n}\n\nfunction contains(a, b) {\n return a[0] <= b[0] &&\n a[1] <= b[1] &&\n b[2] <= a[2] &&\n b[3] <= a[3];\n}\n\nfunction intersects(a, b) {\n return b[0] <= a[2] &&\n b[1] <= a[3] &&\n b[2] >= a[0] &&\n b[3] >= a[1];\n}\n\n// sort an array so that items come in groups of n unsorted items, with groups sorted between each other;\n// combines selection algorithm with binary divide & conquer approach\n\nfunction multiSelect(arr, left, right, n, compare) {\n var stack = [left, right],\n mid;\n\n while (stack.length) {\n right = stack.pop();\n left = stack.pop();\n\n if (right - left <= n) continue;\n\n mid = left + Math.ceil((right - left) / n / 2) * n;\n select(arr, left, right, mid, compare);\n\n stack.push(left, mid, mid, right);\n }\n}\n\n// Floyd-Rivest selection algorithm:\n// sort an array between left and right (inclusive) so that the smallest k elements come first (unordered)\nfunction select(arr, left, right, k, compare) {\n var n, i, z, s, sd, newLeft, newRight, t, j;\n\n while (right > left) {\n if (right - left > 600) {\n n = right - left + 1;\n i = k - left + 1;\n z = Math.log(n);\n s = 0.5 * Math.exp(2 * z / 3);\n sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (i - n / 2 < 0 ? -1 : 1);\n newLeft = Math.max(left, Math.floor(k - i * s / n + sd));\n newRight = Math.min(right, Math.floor(k + (n - i) * s / n + sd));\n select(arr, newLeft, newRight, k, compare);\n }\n\n t = arr[k];\n i = left;\n j = right;\n\n swap(arr, left, k);\n if (compare(arr[right], t) > 0) swap(arr, left, right);\n\n while (i < j) {\n swap(arr, i, j);\n i++;\n j--;\n while (compare(arr[i], t) < 0) i++;\n while (compare(arr[j], t) > 0) j--;\n }\n\n if (compare(arr[left], t) === 0) swap(arr, left, j);\n else {\n j++;\n swap(arr, j, right);\n }\n\n if (j <= k) left = j + 1;\n if (k <= j) right = j - 1;\n }\n}\n\nfunction swap(arr, i, j) {\n var tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n}\n\n\n// export as AMD/CommonJS module or global variable\nif (typeof define === 'function' && define.amd) define('rbush', function() { return rbush; });\nelse if (typeof module !== 'undefined') module.exports = rbush;\nelse if (typeof self !== 'undefined') self.rbush = rbush;\nelse window.rbush = rbush;\n\n})();\n","'use strict';\n\nvar VectorTileFeatureTypes = ['Unknown', 'Point', 'LineString', 'Polygon'];\n\nfunction infix(operator) {\n return function(_, key, value) {\n if (key === '$type') {\n return 't' + operator + VectorTileFeatureTypes.indexOf(value);\n } else {\n return 'p[' + JSON.stringify(key) + ']' + operator + JSON.stringify(value);\n }\n };\n}\n\nfunction strictInfix(operator) {\n var nonstrictInfix = infix(operator);\n return function(_, key, value) {\n if (key === '$type') {\n return nonstrictInfix(_, key, value);\n } else {\n return 'typeof(p[' + JSON.stringify(key) + ']) === typeof(' + JSON.stringify(value) + ') && ' +\n nonstrictInfix(_, key, value);\n }\n };\n}\n\nvar operators = {\n '==': infix('==='),\n '!=': infix('!=='),\n '>': strictInfix('>'),\n '<': strictInfix('<'),\n '<=': strictInfix('<='),\n '>=': strictInfix('>='),\n 'in': function(_, key) {\n return Array.prototype.slice.call(arguments, 2).map(function(value) {\n return '(' + operators['=='](_, key, value) + ')';\n }).join('||') || 'false';\n },\n '!in': function() {\n return '!(' + operators.in.apply(this, arguments) + ')';\n },\n 'any': function() {\n return Array.prototype.slice.call(arguments, 1).map(function(filter) {\n return '(' + compile(filter) + ')';\n }).join('||') || 'false';\n },\n 'all': function() {\n return Array.prototype.slice.call(arguments, 1).map(function(filter) {\n return '(' + compile(filter) + ')';\n }).join('&&') || 'true';\n },\n 'none': function() {\n return '!(' + operators.any.apply(this, arguments) + ')';\n }\n};\n\nfunction compile(filter) {\n return operators[filter[0]].apply(filter, filter);\n}\n\nfunction truth() {\n return true;\n}\n\n/**\n * Given a filter expressed as nested arrays, return a new function\n * that evaluates whether a given feature (with a .properties or .tags property)\n * passes its test.\n *\n * @param {Array} filter mapbox gl filter\n * @returns {Function} filter-evaluating function\n */\nmodule.exports = function (filter) {\n if (!filter) return truth;\n var filterStr = 'var p = f.properties || f.tags || {}, t = f.type; return ' + compile(filter) + ';';\n // jshint evil: true\n return new Function('f', filterStr);\n};\n","'use strict';\n\nmodule.exports = ElementGroups;\n\nfunction ElementGroups(vertexBuffer, elementBuffer, secondElementBuffer) {\n\n this.vertexBuffer = vertexBuffer;\n this.elementBuffer = elementBuffer;\n this.secondElementBuffer = secondElementBuffer;\n this.groups = [];\n}\n\nElementGroups.prototype.makeRoomFor = function(numVertices) {\n if (!this.current || this.current.vertexLength + numVertices > 65535) {\n this.current = new ElementGroup(this.vertexBuffer.index,\n this.elementBuffer && this.elementBuffer.index,\n this.secondElementBuffer && this.secondElementBuffer.index);\n this.groups.push(this.current);\n }\n};\n\nfunction ElementGroup(vertexStartIndex, elementStartIndex, secondElementStartIndex) {\n // the offset into the vertex buffer of the first vertex in this group\n this.vertexStartIndex = vertexStartIndex;\n this.elementStartIndex = elementStartIndex;\n this.secondElementStartIndex = secondElementStartIndex;\n this.elementLength = 0;\n this.vertexLength = 0;\n this.secondElementLength = 0;\n}\n","'use strict';\n\nvar Point = require('point-geometry');\n\nmodule.exports = Anchor;\n\nfunction Anchor(x, y, angle, segment) {\n this.x = x;\n this.y = y;\n this.angle = angle;\n\n if (segment !== undefined) {\n this.segment = segment;\n }\n}\n\nAnchor.prototype = Object.create(Point.prototype);\n\nAnchor.prototype.clone = function() {\n return new Anchor(this.x, this.y, this.angle, this.segment);\n};\n","'use strict';\n\nvar interpolate = require('../util/interpolate');\nvar Anchor = require('../symbol/anchor');\nvar checkMaxAngle = require('./check_max_angle');\n\nmodule.exports = getAnchors;\n\nfunction getAnchors(line, spacing, maxAngle, shapedText, shapedIcon, glyphSize, boxScale, overscaling) {\n\n // Resample a line to get anchor points for labels and check that each\n // potential label passes text-max-angle check and has enough froom to fit\n // on the line.\n\n var angleWindowSize = shapedText ?\n 3 / 5 * glyphSize * boxScale :\n 0;\n\n var labelLength = Math.max(\n shapedText ? shapedText.right - shapedText.left : 0,\n shapedIcon ? shapedIcon.right - shapedIcon.left : 0);\n\n // Is the line continued from outside the tile boundary?\n if (line[0].x === 0 || line[0].x === 4096 || line[0].y === 0 || line[0].y === 4096) {\n var continuedLine = true;\n }\n\n // Is the label long, relative to the spacing?\n // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges.\n if (spacing - labelLength * boxScale < spacing / 4) {\n spacing = labelLength * boxScale + spacing / 4;\n }\n\n // Offset the first anchor by:\n // Either half the label length plus a fixed extra offset if the line is not continued\n // Or half the spacing if the line is continued.\n\n // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections.\n var fixedExtraOffset = glyphSize * 2;\n\n var offset = !continuedLine ?\n ((labelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing :\n (spacing / 2 * overscaling) % spacing;\n\n return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength * boxScale, continuedLine, false);\n}\n\n\nfunction resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, continuedLine, placeAtMiddle) {\n\n var distance = 0,\n markedDistance = offset - spacing;\n\n var anchors = [];\n\n for (var i = 0; i < line.length - 1; i++) {\n\n var a = line[i],\n b = line[i + 1];\n\n var segmentDist = a.dist(b),\n angle = b.angleTo(a);\n\n while (markedDistance + spacing < distance + segmentDist) {\n markedDistance += spacing;\n\n var t = (markedDistance - distance) / segmentDist,\n x = interpolate(a.x, b.x, t),\n y = interpolate(a.y, b.y, t);\n\n if (x >= 0 && x < 4096 && y >= 0 && y < 4096) {\n x = Math.round(x);\n y = Math.round(y);\n var anchor = new Anchor(x, y, angle, i);\n\n if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) {\n anchors.push(anchor);\n }\n }\n }\n\n distance += segmentDist;\n }\n\n if (!placeAtMiddle && !anchors.length && !continuedLine) {\n // The first attempt at finding anchors at which labels can be placed failed.\n // Try again, but this time just try placing one anchor at the middle of the line.\n // This has the most effect for short lines in overscaled tiles, since the\n // initial offset used in overscaled tiles is calculated to align labels with positions in\n // parent tiles instead of placing the label as close to the beginning as possible.\n anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, continuedLine, true);\n }\n\n return anchors;\n}\n","'use strict';\n\nmodule.exports = resolveTokens;\n\n/**\n * Replace tokens in a string template with values in an object\n *\n * @param {Object} properties a key/value relationship between tokens and replacements\n * @param {string} text the template string\n * @returns {string} the template with tokens replaced\n * @private\n */\nfunction resolveTokens(properties, text) {\n return text.replace(/{([^{}()\\[\\]<>$=:;.,^]+)}/g, function(match, key) {\n return key in properties ? properties[key] : '';\n });\n}\n","'use strict';\n\nvar Point = require('point-geometry');\n\nmodule.exports = {\n getIconQuads: getIconQuads,\n getGlyphQuads: getGlyphQuads\n};\n\nvar minScale = 0.5; // underscale by 1 zoom level\n\n/**\n * A textured quad for rendering a single icon or glyph.\n *\n * The zoom range the glyph can be shown is defined by minScale and maxScale.\n *\n * @param {Point} anchorPoint the point the symbol is anchored around\n * @param {Point} tl The offset of the top left corner from the anchor.\n * @param {Point} tr The offset of the top right corner from the anchor.\n * @param {Point} bl The offset of the bottom left corner from the anchor.\n * @param {Point} br The offset of the bottom right corner from the anchor.\n * @param {Object} tex The texture coordinates.\n * @param {number} angle The angle of the label at it's center, not the angle of this quad.\n * @param {number} minScale The minimum scale, relative to the tile's intended scale, that the glyph can be shown at.\n * @param {number} maxScale The maximum scale, relative to the tile's intended scale, that the glyph can be shown at.\n *\n * @class SymbolQuad\n * @private\n */\nfunction SymbolQuad(anchorPoint, tl, tr, bl, br, tex, angle, minScale, maxScale) {\n this.anchorPoint = anchorPoint;\n this.tl = tl;\n this.tr = tr;\n this.bl = bl;\n this.br = br;\n this.tex = tex;\n this.angle = angle;\n this.minScale = minScale;\n this.maxScale = maxScale;\n}\n\n/**\n * Create the quads used for rendering an icon.\n *\n * @param {Anchor} anchor\n * @param {PositionedIcon} shapedIcon\n * @param {number} boxScale A magic number for converting glyph metric units to geometry units.\n * @param {Array>} line\n * @param {LayoutProperties} layout\n * @param {boolean} alongLine Whether the icon should be placed along the line.\n * @returns {Array}\n * @private\n */\nfunction getIconQuads(anchor, shapedIcon, boxScale, line, layout, alongLine) {\n\n var rect = shapedIcon.image.rect;\n\n var border = 1;\n var left = shapedIcon.left - border;\n var right = left + rect.w;\n var top = shapedIcon.top - border;\n var bottom = top + rect.h;\n var tl = new Point(left, top);\n var tr = new Point(right, top);\n var br = new Point(right, bottom);\n var bl = new Point(left, bottom);\n\n var angle = layout['icon-rotate'] * Math.PI / 180;\n if (alongLine) {\n var prev = line[anchor.segment];\n angle += Math.atan2(anchor.y - prev.y, anchor.x - prev.x);\n }\n\n if (angle) {\n var sin = Math.sin(angle),\n cos = Math.cos(angle),\n matrix = [cos, -sin, sin, cos];\n\n tl = tl.matMult(matrix);\n tr = tr.matMult(matrix);\n bl = bl.matMult(matrix);\n br = br.matMult(matrix);\n }\n\n return [new SymbolQuad(new Point(anchor.x, anchor.y), tl, tr, bl, br, shapedIcon.image.rect, 0, minScale, Infinity)];\n}\n\n/**\n * Create the quads used for rendering a text label.\n *\n * @param {Anchor} anchor\n * @param {Shaping} shaping\n * @param {number} boxScale A magic number for converting from glyph metric units to geometry units.\n * @param {Array>} line\n * @param {LayoutProperties} layout\n * @param {boolean} alongLine Whether the label should be placed along the line.\n * @returns {Array}\n * @private\n */\nfunction getGlyphQuads(anchor, shaping, boxScale, line, layout, alongLine) {\n\n var textRotate = layout['text-rotate'] * Math.PI / 180;\n var keepUpright = layout['text-keep-upright'];\n\n var positionedGlyphs = shaping.positionedGlyphs;\n var quads = [];\n\n for (var k = 0; k < positionedGlyphs.length; k++) {\n var positionedGlyph = positionedGlyphs[k];\n var glyph = positionedGlyph.glyph;\n var rect = glyph.rect;\n\n if (!rect) continue;\n\n var centerX = (positionedGlyph.x + glyph.advance / 2) * boxScale;\n\n var glyphInstances;\n var labelMinScale = minScale;\n if (alongLine) {\n glyphInstances = [];\n labelMinScale = getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, true);\n if (keepUpright) {\n labelMinScale = Math.min(labelMinScale, getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, false));\n }\n\n } else {\n glyphInstances = [{\n anchorPoint: new Point(anchor.x, anchor.y),\n offset: 0,\n angle: 0,\n maxScale: Infinity,\n minScale: minScale\n }];\n }\n\n var x1 = positionedGlyph.x + glyph.left,\n y1 = positionedGlyph.y - glyph.top,\n x2 = x1 + rect.w,\n y2 = y1 + rect.h,\n\n otl = new Point(x1, y1),\n otr = new Point(x2, y1),\n obl = new Point(x1, y2),\n obr = new Point(x2, y2);\n\n for (var i = 0; i < glyphInstances.length; i++) {\n\n var instance = glyphInstances[i],\n tl = otl,\n tr = otr,\n bl = obl,\n br = obr,\n angle = instance.angle + textRotate;\n\n if (angle) {\n var sin = Math.sin(angle),\n cos = Math.cos(angle),\n matrix = [cos, -sin, sin, cos];\n\n tl = tl.matMult(matrix);\n tr = tr.matMult(matrix);\n bl = bl.matMult(matrix);\n br = br.matMult(matrix);\n }\n\n // Prevent label from extending past the end of the line\n var glyphMinScale = Math.max(instance.minScale, labelMinScale);\n\n var glyphAngle = (anchor.angle + textRotate + instance.offset + 2 * Math.PI) % (2 * Math.PI);\n quads.push(new SymbolQuad(instance.anchorPoint, tl, tr, bl, br, rect, glyphAngle, glyphMinScale, instance.maxScale));\n\n }\n }\n\n return quads;\n}\n\n/**\n * We can only render glyph quads that slide along a straight line. To draw\n * curved lines we need an instance of a glyph for each segment it appears on.\n * This creates all the instances of a glyph that are necessary to render a label.\n *\n * We need a\n * @param {Array} glyphInstances An empty array that glyphInstances are added to.\n * @param {Anchor} anchor\n * @param {number} offset The glyph's offset from the center of the label.\n * @param {Array} line\n * @param {number} segment The index of the segment of the line on which the anchor exists.\n * @param {boolean} forward If true get the glyphs that come later on the line, otherwise get the glyphs that come earlier.\n *\n * @returns {Array} glyphInstances\n * @private\n */\nfunction getSegmentGlyphs(glyphs, anchor, offset, line, segment, forward) {\n var upsideDown = !forward;\n\n if (offset < 0) forward = !forward;\n\n if (forward) segment++;\n\n var newAnchorPoint = new Point(anchor.x, anchor.y);\n var end = line[segment];\n var prevScale = Infinity;\n\n offset = Math.abs(offset);\n\n var placementScale = minScale;\n\n while (true) {\n var distance = newAnchorPoint.dist(end);\n var scale = offset / distance;\n\n // Get the angle of the line segment\n var angle = Math.atan2(end.y - newAnchorPoint.y, end.x - newAnchorPoint.x);\n if (!forward) angle += Math.PI;\n if (upsideDown) angle += Math.PI;\n\n glyphs.push({\n anchorPoint: newAnchorPoint,\n offset: upsideDown ? Math.PI : 0,\n minScale: scale,\n maxScale: prevScale,\n angle: (angle + 2 * Math.PI) % (2 * Math.PI)\n });\n\n if (scale <= placementScale) break;\n\n newAnchorPoint = end;\n\n // skip duplicate nodes\n while (newAnchorPoint.equals(end)) {\n segment += forward ? 1 : -1;\n end = line[segment];\n if (!end) {\n return scale;\n }\n }\n\n var unit = end.sub(newAnchorPoint)._unit();\n newAnchorPoint = newAnchorPoint.sub(unit._mult(distance));\n\n prevScale = scale;\n }\n\n return placementScale;\n}\n","'use strict';\n\nmodule.exports = {\n shapeText: shapeText,\n shapeIcon: shapeIcon\n};\n\n\n// The position of a glyph relative to the text's anchor point.\nfunction PositionedGlyph(codePoint, x, y, glyph) {\n this.codePoint = codePoint;\n this.x = x;\n this.y = y;\n this.glyph = glyph;\n}\n\n// A collection of positioned glyphs and some metadata\nfunction Shaping(positionedGlyphs, text, top, bottom, left, right) {\n this.positionedGlyphs = positionedGlyphs;\n this.text = text;\n this.top = top;\n this.bottom = bottom;\n this.left = left;\n this.right = right;\n}\n\nfunction shapeText(text, glyphs, maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, translate) {\n\n var positionedGlyphs = [];\n var shaping = new Shaping(positionedGlyphs, text, translate[1], translate[1], translate[0], translate[0]);\n\n // the y offset *should* be part of the font metadata\n var yOffset = -17;\n\n var x = translate[0];\n var y = translate[1] + yOffset;\n\n for (var i = 0; i < text.length; i++) {\n var codePoint = text.charCodeAt(i);\n var glyph = glyphs[codePoint];\n\n if (!glyph) continue;\n\n positionedGlyphs.push(new PositionedGlyph(codePoint, x, y, glyph));\n x += glyph.advance + spacing;\n }\n\n if (!positionedGlyphs.length) return false;\n\n linewrap(shaping, glyphs, lineHeight, maxWidth, horizontalAlign, verticalAlign, justify);\n\n return shaping;\n}\n\nvar breakable = { 32: true }; // Currently only breaks at regular spaces\n\nfunction linewrap(shaping, glyphs, lineHeight, maxWidth, horizontalAlign, verticalAlign, justify) {\n var lastSafeBreak = null;\n\n var lengthBeforeCurrentLine = 0;\n var lineStartIndex = 0;\n var line = 0;\n\n var maxLineLength = 0;\n\n var positionedGlyphs = shaping.positionedGlyphs;\n\n if (maxWidth) {\n for (var i = 0; i < positionedGlyphs.length; i++) {\n var positionedGlyph = positionedGlyphs[i];\n\n positionedGlyph.x -= lengthBeforeCurrentLine;\n positionedGlyph.y += lineHeight * line;\n\n if (positionedGlyph.x > maxWidth && lastSafeBreak !== null) {\n\n var lineLength = positionedGlyphs[lastSafeBreak + 1].x;\n maxLineLength = Math.max(lineLength, maxLineLength);\n\n for (var k = lastSafeBreak + 1; k <= i; k++) {\n positionedGlyphs[k].y += lineHeight;\n positionedGlyphs[k].x -= lineLength;\n }\n\n if (justify) {\n justifyLine(positionedGlyphs, glyphs, lineStartIndex, lastSafeBreak - 1, justify);\n }\n\n lineStartIndex = lastSafeBreak + 1;\n lastSafeBreak = null;\n lengthBeforeCurrentLine += lineLength;\n line++;\n }\n\n if (breakable[positionedGlyph.codePoint]) {\n lastSafeBreak = i;\n }\n }\n }\n\n var lastPositionedGlyph = positionedGlyphs[positionedGlyphs.length - 1];\n var lastLineLength = lastPositionedGlyph.x + glyphs[lastPositionedGlyph.codePoint].advance;\n maxLineLength = Math.max(maxLineLength, lastLineLength);\n\n var height = (line + 1) * lineHeight;\n\n justifyLine(positionedGlyphs, glyphs, lineStartIndex, positionedGlyphs.length - 1, justify);\n align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, line);\n\n // Calculate the bounding box\n shaping.top += -verticalAlign * height;\n shaping.bottom = shaping.top + height;\n shaping.left += -horizontalAlign * maxLineLength;\n shaping.right = shaping.left + maxLineLength;\n}\n\nfunction justifyLine(positionedGlyphs, glyphs, start, end, justify) {\n var lastAdvance = glyphs[positionedGlyphs[end].codePoint].advance;\n var lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify;\n\n for (var j = start; j <= end; j++) {\n positionedGlyphs[j].x -= lineIndent;\n }\n\n}\n\nfunction align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, line) {\n var shiftX = (justify - horizontalAlign) * maxLineLength;\n var shiftY = (-verticalAlign * (line + 1) + 0.5) * lineHeight;\n\n for (var j = 0; j < positionedGlyphs.length; j++) {\n positionedGlyphs[j].x += shiftX;\n positionedGlyphs[j].y += shiftY;\n }\n}\n\n\nfunction shapeIcon(image, layout) {\n if (!image || !image.rect) return null;\n\n var dx = layout['icon-offset'][0];\n var dy = layout['icon-offset'][1];\n var x1 = dx - image.width / 2;\n var x2 = x1 + image.width;\n var y1 = dy - image.height / 2;\n var y2 = y1 + image.height;\n\n return new PositionedIcon(image, y1, y2, x1, x2);\n}\n\nfunction PositionedIcon(image, top, bottom, left, right) {\n this.image = image;\n this.top = top;\n this.bottom = bottom;\n this.left = left;\n this.right = right;\n}\n","'use strict';\n\nvar resolveTokens = require('../util/token');\n\nmodule.exports = resolveText;\n\n/**\n * For an array of features determine what glyph ranges need to be loaded\n * and apply any text preprocessing. The remaining users of text should\n * use the `textFeatures` key returned by this function rather than accessing\n * feature text directly.\n * @private\n */\nfunction resolveText(features, layoutProperties, glyphs) {\n var textFeatures = [];\n var codepoints = [];\n\n for (var i = 0, fl = features.length; i < fl; i++) {\n var text = resolveTokens(features[i].properties, layoutProperties['text-field']);\n if (!text) {\n textFeatures[i] = null;\n continue;\n }\n text = text.toString();\n\n var transform = layoutProperties['text-transform'];\n if (transform === 'uppercase') {\n text = text.toLocaleUpperCase();\n } else if (transform === 'lowercase') {\n text = text.toLocaleLowerCase();\n }\n\n for (var j = 0, jl = text.length; j < jl; j++) {\n codepoints.push(text.charCodeAt(j));\n }\n\n // Track indexes of features with text.\n textFeatures[i] = text;\n }\n\n // get a list of unique codepoints we are missing\n codepoints = uniq(codepoints, glyphs);\n\n return {\n textFeatures: textFeatures,\n codepoints: codepoints\n };\n}\n\nfunction uniq(ids, alreadyHave) {\n var u = [];\n var last;\n ids.sort(sortNumbers);\n for (var i = 0; i < ids.length; i++) {\n if (ids[i] !== last) {\n last = ids[i];\n if (!alreadyHave[last]) u.push(ids[i]);\n }\n }\n return u;\n}\n\nfunction sortNumbers(a, b) {\n return a - b;\n}\n","'use strict';\n\nvar resolveTokens = require('../util/token');\n\nmodule.exports = resolveIcons;\n\n// For an array of features determine what icons need to be loaded.\nfunction resolveIcons(features, layoutProperties) {\n var icons = [];\n\n for (var i = 0, fl = features.length; i < fl; i++) {\n var text = resolveTokens(features[i].properties, layoutProperties['icon-image']);\n if (!text) continue;\n\n if (icons.indexOf(text) < 0) {\n icons.push(text);\n }\n }\n\n return icons;\n}\n","'use strict';\n\nmodule.exports = function (features, textFeatures, geometries) {\n\n var leftIndex = {},\n rightIndex = {},\n mergedFeatures = [],\n mergedGeom = [],\n mergedTexts = [],\n mergedIndex = 0,\n k;\n\n function add(k) {\n mergedFeatures.push(features[k]);\n mergedGeom.push(geometries[k]);\n mergedTexts.push(textFeatures[k]);\n mergedIndex++;\n }\n\n function mergeFromRight(leftKey, rightKey, geom) {\n var i = rightIndex[leftKey];\n delete rightIndex[leftKey];\n rightIndex[rightKey] = i;\n\n mergedGeom[i][0].pop();\n mergedGeom[i][0] = mergedGeom[i][0].concat(geom[0]);\n return i;\n }\n\n function mergeFromLeft(leftKey, rightKey, geom) {\n var i = leftIndex[rightKey];\n delete leftIndex[rightKey];\n leftIndex[leftKey] = i;\n\n mergedGeom[i][0].shift();\n mergedGeom[i][0] = geom[0].concat(mergedGeom[i][0]);\n return i;\n }\n\n function getKey(text, geom, onRight) {\n var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0];\n return text + ':' + point.x + ':' + point.y;\n }\n\n for (k = 0; k < features.length; k++) {\n var geom = geometries[k],\n text = textFeatures[k];\n\n if (!text) {\n add(k);\n continue;\n }\n\n var leftKey = getKey(text, geom),\n rightKey = getKey(text, geom, true);\n\n if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) {\n // found lines with the same text adjacent to both ends of the current line, merge all three\n var j = mergeFromLeft(leftKey, rightKey, geom);\n var i = mergeFromRight(leftKey, rightKey, mergedGeom[j]);\n\n delete leftIndex[leftKey];\n delete rightIndex[rightKey];\n\n rightIndex[getKey(text, mergedGeom[i], true)] = i;\n mergedGeom[j] = null;\n\n } else if (leftKey in rightIndex) {\n // found mergeable line adjacent to the start of the current line, merge\n mergeFromRight(leftKey, rightKey, geom);\n\n } else if (rightKey in leftIndex) {\n // found mergeable line adjacent to the end of the current line, merge\n mergeFromLeft(leftKey, rightKey, geom);\n\n } else {\n // no adjacent lines, add as a new item\n add(k);\n leftIndex[leftKey] = mergedIndex - 1;\n rightIndex[rightKey] = mergedIndex - 1;\n }\n }\n\n return {\n features: mergedFeatures,\n textFeatures: mergedTexts,\n geometries: mergedGeom\n };\n};\n","'use strict';\n\nvar Point = require('point-geometry');\n\nmodule.exports = clipLine;\n\n/**\n * Returns the part of a multiline that intersects with the provided rectangular box.\n *\n * @param {Array>} lines\n * @param {number} x1 the left edge of the box\n * @param {number} y1 the top edge of the box\n * @param {number} x2 the right edge of the box\n * @param {number} y2 the bottom edge of the box\n * @returns {Array>} lines\n * @private\n */\nfunction clipLine(lines, x1, y1, x2, y2) {\n var clippedLines = [];\n\n for (var l = 0; l < lines.length; l++) {\n var line = lines[l];\n var clippedLine;\n\n for (var i = 0; i < line.length - 1; i++) {\n var p0 = line[i];\n var p1 = line[i + 1];\n\n\n if (p0.x < x1 && p1.x < x1) {\n continue;\n } else if (p0.x < x1) {\n p0 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)));\n } else if (p1.x < x1) {\n p1 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)));\n }\n\n if (p0.y < y1 && p1.y < y1) {\n continue;\n } else if (p0.y < y1) {\n p0 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1);\n } else if (p1.y < y1) {\n p1 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1);\n }\n\n if (p0.x >= x2 && p1.x >= x2) {\n continue;\n } else if (p0.x >= x2) {\n p0 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)));\n } else if (p1.x >= x2) {\n p1 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)));\n }\n\n if (p0.y >= y2 && p1.y >= y2) {\n continue;\n } else if (p0.y >= y2) {\n p0 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2);\n } else if (p1.y >= y2) {\n p1 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2);\n }\n\n if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) {\n clippedLine = [p0];\n clippedLines.push(clippedLine);\n }\n\n clippedLine.push(p1);\n }\n }\n\n return clippedLines;\n}\n","'use strict';\n\nvar CollisionBox = require('./collision_box');\nvar Point = require('point-geometry');\n\nmodule.exports = CollisionFeature;\n\n/**\n * A CollisionFeature represents the area of the tile covered by a single label.\n * It is used with CollisionTile to check if the label overlaps with any\n * previous labels. A CollisionFeature is mostly just a set of CollisionBox\n * objects.\n *\n * @class CollisionFeature\n * @param {Array} line The geometry the label is placed on.\n * @param {Anchor} anchor The point along the line around which the label is anchored.\n * @param {Object} shaped The text or icon shaping results.\n * @param {number} boxScale A magic number used to convert from glyph metrics units to geometry units.\n * @param {number} padding The amount of padding to add around the label edges.\n * @param {boolean} alignLine Whether the label is aligned with the line or the viewport.\n *\n * @private\n */\nfunction CollisionFeature(line, anchor, shaped, boxScale, padding, alignLine) {\n\n var y1 = shaped.top * boxScale - padding;\n var y2 = shaped.bottom * boxScale + padding;\n var x1 = shaped.left * boxScale - padding;\n var x2 = shaped.right * boxScale + padding;\n\n this.boxes = [];\n\n if (alignLine) {\n\n var height = y2 - y1;\n var length = x2 - x1;\n\n if (height <= 0) return;\n\n // set minimum box height to avoid very many small labels\n height = Math.max(10 * boxScale, height);\n\n this._addLineCollisionBoxes(line, anchor, length, height);\n\n } else {\n this.boxes.push(new CollisionBox(new Point(anchor.x, anchor.y), x1, y1, x2, y2, Infinity));\n }\n}\n\n/**\n * Create a set of CollisionBox objects for a line.\n *\n * @param {Array} line\n * @param {Anchor} anchor\n * @param {number} labelLength The length of the label in geometry units.\n * @param {number} boxSize The size of the collision boxes that will be created.\n *\n * @private\n */\nCollisionFeature.prototype._addLineCollisionBoxes = function(line, anchor, labelLength, boxSize) {\n var step = boxSize / 2;\n var nBoxes = Math.floor(labelLength / step);\n\n // offset the center of the first box by half a box so that the edge of the\n // box is at the edge of the label.\n var firstBoxOffset = -boxSize / 2;\n\n var bboxes = this.boxes;\n\n var p = anchor;\n var index = anchor.segment + 1;\n var anchorDistance = firstBoxOffset;\n\n // move backwards along the line to the first segment the label appears on\n do {\n index--;\n\n // there isn't enough room for the label after the beginning of the line\n // checkMaxAngle should have already caught this\n if (index < 0) return bboxes;\n\n anchorDistance -= line[index].dist(p);\n p = line[index];\n } while (anchorDistance > -labelLength / 2);\n\n var segmentLength = line[index].dist(line[index + 1]);\n\n for (var i = 0; i < nBoxes; i++) {\n // the distance the box will be from the anchor\n var boxDistanceToAnchor = -labelLength / 2 + i * step;\n\n // the box is not on the current segment. Move to the next segment.\n while (anchorDistance + segmentLength < boxDistanceToAnchor) {\n anchorDistance += segmentLength;\n index++;\n\n // There isn't enough room before the end of the line.\n if (index + 1 >= line.length) return bboxes;\n\n segmentLength = line[index].dist(line[index + 1]);\n }\n\n // the distance the box will be from the beginning of the segment\n var segmentBoxDistance = boxDistanceToAnchor - anchorDistance;\n\n var p0 = line[index];\n var p1 = line[index + 1];\n var boxAnchorPoint = p1.sub(p0)._unit()._mult(segmentBoxDistance)._add(p0);\n\n var distanceToInnerEdge = Math.max(Math.abs(boxDistanceToAnchor - firstBoxOffset) - step / 2, 0);\n var maxScale = labelLength / 2 / distanceToInnerEdge;\n\n bboxes.push(new CollisionBox(boxAnchorPoint, -boxSize / 2, -boxSize / 2, boxSize / 2, boxSize / 2, maxScale));\n }\n\n return bboxes;\n};\n","'use strict';\n\nmodule.exports = checkMaxAngle;\n\n/**\n * Labels placed around really sharp angles aren't readable. Check if any\n * part of the potential label has a combined angle that is too big.\n *\n * @param {Array} line\n * @param {Anchor} anchor The point on the line around which the label is anchored.\n * @param {number} labelLength The length of the label in geometry units.\n * @param {number} windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big.\n * @param {number} maxAngle The maximum combined angle that any window along the label is allowed to have.\n *\n * @returns {boolean} whether the label should be placed\n * @private\n */\nfunction checkMaxAngle(line, anchor, labelLength, windowSize, maxAngle) {\n\n // horizontal labels always pass\n if (anchor.segment === undefined) return true;\n\n var p = anchor;\n var index = anchor.segment + 1;\n var anchorDistance = 0;\n\n // move backwards along the line to the first segment the label appears on\n while (anchorDistance > -labelLength / 2) {\n index--;\n\n // there isn't enough room for the label after the beginning of the line\n if (index < 0) return false;\n\n anchorDistance -= line[index].dist(p);\n p = line[index];\n }\n\n anchorDistance += line[index].dist(line[index + 1]);\n index++;\n\n // store recent corners and their total angle difference\n var recentCorners = [];\n var recentAngleDelta = 0;\n\n // move forwards by the length of the label and check angles along the way\n while (anchorDistance < labelLength / 2) {\n var prev = line[index - 1];\n var current = line[index];\n var next = line[index + 1];\n\n // there isn't enough room for the label before the end of the line\n if (!next) return false;\n\n var angleDelta = prev.angleTo(current) - current.angleTo(next);\n // restrict angle to -pi..pi range\n angleDelta = ((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI;\n\n recentCorners.push({\n distance: anchorDistance,\n angleDelta: angleDelta\n });\n recentAngleDelta += angleDelta;\n\n // remove corners that are far enough away from the list of recent anchors\n while (anchorDistance - recentCorners[0].distance > windowSize) {\n recentAngleDelta -= recentCorners.shift().angleDelta;\n }\n\n // the sum of angles within the window area exceeds the maximum allowed value. check fails.\n if (Math.abs(recentAngleDelta) > maxAngle) return false;\n\n index++;\n anchorDistance += current.dist(next);\n }\n\n // no part of the line had an angle greater than the maximum allowed. check passes.\n return true;\n}\n","'use strict';\n\nmodule.exports = CollisionBox;\n\n/**\n * A collision box represents an area of the map that that is covered by a\n * label. CollisionFeature uses one or more of these collision boxes to\n * represent all the area covered by a single label. They are used to\n * prevent collisions between labels.\n *\n * A collision box actually represents a 3d volume. The first two dimensions,\n * x and y, are specified with `anchor` along with `x1`, `y1`, `x2`, `y2`.\n * The third dimension, zoom, is limited by `maxScale` which determines\n * how far in the z dimensions the box extends.\n *\n * As you zoom in on a map, all points on the map get further and further apart\n * but labels stay roughly the same size. Labels cover less real world area on\n * the map at higher zoom levels than they do at lower zoom levels. This is why\n * areas are are represented with an anchor point and offsets from that point\n * instead of just using four absolute points.\n *\n * Line labels are represented by a set of these boxes spaced out along a line.\n * When you zoom in, line labels cover less real world distance along the line\n * than they used to. Collision boxes near the edges that used to cover label\n * no longer do. If a box doesn't cover the label anymore it should be ignored\n * when doing collision checks. `maxScale` is how much you can scale the map\n * before the label isn't within the box anymore.\n * For example\n * lower zoom:\n * https://cloud.githubusercontent.com/assets/1421652/8060094/4d975f76-0e91-11e5-84b1-4edeb30a5875.png\n * slightly higher zoom:\n * https://cloud.githubusercontent.com/assets/1421652/8060061/26ae1c38-0e91-11e5-8c5a-9f380bf29f0a.png\n * In the zoomed in image the two grey boxes on either side don't cover the\n * label anymore. Their maxScale is smaller than the current scale.\n *\n *\n * @class CollisionBox\n * @param {Point} anchorPoint The anchor point the box is centered around.\n * @param {number} x1 The distance from the anchor to the left edge.\n * @param {number} y1 The distance from the anchor to the top edge.\n * @param {number} x2 The distance from the anchor to the right edge.\n * @param {number} y2 The distance from the anchor to the bottom edge.\n * @param {number} maxScale The maximum scale this box can block other boxes at.\n * @private\n */\nfunction CollisionBox(anchorPoint, x1, y1, x2, y2, maxScale) {\n // the box is centered around the anchor point\n this.anchorPoint = anchorPoint;\n\n // distances to the edges from the anchor\n this.x1 = x1;\n this.y1 = y1;\n this.x2 = x2;\n this.y2 = y2;\n\n // the box is only valid for scales < maxScale.\n // The box does not block other boxes at scales >= maxScale;\n this.maxScale = maxScale;\n\n // the scale at which the label can first be shown\n this.placementScale = 0;\n\n // rotated and scaled bbox used for indexing\n this[0] = this[1] = this[2] = this[3] = 0;\n}\n"]}